[Bug]: TokenChunker never terminates when chunking overlap >= size (no validation of size/overlap)

Abierto Apto para principiantes
#2,593 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 5 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
data

Línea de trabajo

Empieza en TokenChunker.__init__ en graphrag_chunking/token_chunker.py y en el bucle de ventanas de split_text_on_tokens, donde el paso chunk_size - chunk_overlap puede ser cero o negativo. Revisa también los campos size y overlap en graphrag_chunking/chunking_config.py. Reproduce el problema con un envoltorio de decode que cuente las llamadas y se detenga tras 1000. Está terminado cuando el constructor lanza ValueError si size no es positivo o si overlap está fuera de 0 <= overlap < size, con pruebas unitarias para valores iguales, mayores, cero y negativos.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Do you need to file an issue?
  • I have searched the existing issues and this bug is not already filed.
  • My model is hosted on OpenAI or Azure. If not, please look at the "model providers" issue and don't file a new one here. (Not applicable: the bug is in chunking, before any model call.)
  • I believe this is a legitimate bug, not just a question. If this is a question, please use the Discussions area.
Describe the bug

split_text_on_tokens advances the window with start_idx += chunk_size - chunk_overlap (token_chunker.py#L65). When overlap == size the step is 0, so cur_idx never reaches len(input_tokens) and the while loop keeps appending chunks to result without ever exiting. When overlap > size the step is negative, start_idx moves backwards, and the loop also never terminates. size <= 0 has the same problem.

ChunkingConfig.size and ChunkingConfig.overlap are bare int fields with no validators (chunking_config.py#L25-L32), and TokenChunker.__init__ does not check them either (token_chunker.py#L20-L29). A settings.yaml with, say, size: 100 and overlap: 100 therefore gives a chunking step that hangs with no error message. The config value is operator-controlled, so this is a usability/robustness problem, not a security one.

A negative overlap is also accepted and silently skips tokens between consecutive windows.

Steps to reproduce
from graphrag_chunking.token_chunker import TokenChunker

enc = lambda s: [ord(c) for c in s]
dec = lambda t: "".join(chr(x) for x in t)
TokenChunker(size=10, overlap=10, encode=enc, decode=dec).chunk("abcdefghijklmnopqrstuvwxyz")  # never returns

The same happens with overlap=15 or size=0.

I did not let the real call run to exhaustion. Instead I ran split_text_on_tokens with a decode wrapper that raises after 1000 calls: for both overlap=10 and overlap=15 (size 10) the cap was hit, i.e. the loop kept calling decode and appending chunks well past the 3 windows that 26 characters need. In the real loop result grows without bound.

Expected Behavior

A clear ValueError at config load / chunker construction when the values are invalid: require size > 0 and 0 <= overlap < size.

GraphRAG Config Used
chunking:
  type: tokens
  size: 100
  overlap: 100
Logs and screenshots

No output: the process does not return.

Additional Information
  • GraphRAG Version: 3.3.0 (graphrag-chunking at 5faaaf4f)
  • Operating System: macOS
  • Python Version: 3.11
  • Related Issues: #2589 (a different TokenChunker bug, about decoding at token boundaries, in the same function)

Suggested minimal fix: validate in ChunkingConfig (Field(gt=0) on size, Field(ge=0) on overlap, plus a validator enforcing overlap < size) and raise ValueError in TokenChunker.__init__ so direct library use is covered too, with unit tests for equal, greater, zero and negative values. Happy to open a PR if that approach is fine.

Lenguaje dominante
Python
Estrellas
36.6k
Forks
3.9k
Merge medio
4 d 11 h
PR fusionados (30 d)
1

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/graphrag

Todos los issues de microsoft/graphrag

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.