[Bug]: TextChunk.start_char/end_char are wrong for overlapping token chunks (and for SentenceChunker in some cases)
I maintainer di solito rispondono entro 5 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 52/100
Direzione di ricerca
Start in packages/graphrag-chunking: create_chunk_results.py assigns start_char from the previous end_char, which is wrong for TokenChunker's overlapping windows in token_chunker.py. The SentenceChunker correction in sentence_chunker.py uses text.find on the transformed text. Run the TokenChunker snippet from the issue and check that text[start_char:end_char+1] equals original. Done means the offsets match for overlapping and transformed chunks, or the docstring in text_chunk.py states they only hold for non-overlapping chunks. The maintainers still need to choose between the two.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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
TextChunk.start_char / end_char are documented as the position of the raw chunk text in the source document (text_chunk.py). Severity is low: nothing else in packages/graphrag reads these fields (I grepped for start_char / end_char outside graphrag-chunking), so current indexing output is not affected. It is a wrong value in a public data class.
-
TokenChunker with overlap (the case I ran).
create_chunk_results(create_chunk_results.py#L18-L31) sets eachstart_charto the previousend_char + 1, i.e. it assumes the chunks are consecutive and non-overlapping.TokenChunkerpasses it overlapping windows (token_chunker.py#L42, default overlap 100), so every chunk after the first drifts by aboutoverlap * indexandend_charcan run past the end of the text. -
SentenceChunker with a transform (checked with a stubbed splitter only).
SentenceChunker.chunk(sentence_chunker.py#L35-L47) corrects offsets withtext.find(result.text, start).result.textis the transformed text (e.g. withprepend_metadata), sofindreturns -1,deltais negative, and thedelta > 0guard silently skips the correction. Usingresult.originalwould match the source. -
SentenceChunker with repeated sentences (weakest of the three). The correction only bumps
results[index + 1], not later chunks, so for repeated sentences separated by wide whitespacefindcan match an earlier occurrence.
I did not have nltk installed, so cases 2 and 3 were checked by reading the code and running it with a stubbed sent_tokenize, not against the real tokenizer. Case 1 was run as shown below.
Steps to reproduce
from graphrag_chunking.token_chunker import TokenChunker
enc = lambda s: [ord(c) for c in s]
dec = lambda t: "".join(map(chr, t))
text = "abcdefghijklmnopqrstuvwxyz"
for c in TokenChunker(size=10, overlap=4, encode=enc, decode=dec).chunk(text):
print(c.start_char, c.end_char, repr(text[c.start_char:c.end_char + 1]), repr(c.original))
Output:
0 9 'abcdefghij' 'abcdefghij'
10 19 'klmnopqrst' 'ghijklmnop' <- true span is 6..15
20 29 'uvwxyz' 'mnopqrstuv' <- true span is 12..21
30 37 '' 'stuvwxyz' <- start is past the end of the text
For case 2, with the splitter stubbed: "One. Two. Three." with add_metadata({"t": "x"}) gives 'Two.' the span (4, 7), which slices ' Two'. For case 3, "Go. Go. Go. Go." gives spans (0,2), (6,8), (12,14), (12,14); the 4th duplicates the 3rd and its correct start is 18.
Expected Behavior
text[chunk.start_char : chunk.end_char + 1] == chunk.original when the chunker does not strip or alter the text.
GraphRAG Config Used
chunking:
type: tokens
size: 1200
overlap: 100
(Library-level behaviour; the repro calls the chunker directly with small values.)
Logs and screenshots
No errors; the offsets are just wrong.
Additional Information
- GraphRAG Version: 3.3.0 (graphrag-chunking at 5faaaf4f)
- Operating System: macOS
- Python Version: 3.11
- Related Issues: #2589 (another TokenChunker defect, about decoding at token boundaries)
Possible fix: have split_text_on_tokens also return the real character offset of each window (e.g. the length of decode(tokens[:start_idx])), and in SentenceChunker use a running cursor with text.find(result.original, cursor). If the maintainers consider the offsets unused and not worth fixing, documenting that they are only valid for non-overlapping chunks would also resolve this.
- Lingua principale
- Python
- Stelle
- 36.6k
- Fork
- 3.9k
- Merge medio
- 4g 11h
- PR unite (30g)
- 1
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/graphrag
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
microsoft/graphrag#2626 · 1 commento ·
I maintainer di solito rispondono entro 5 giorni
-
[Bug]: response_format_json_object=True is silently dropped, so JSON mode never reaches the modelApertabug triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
microsoft/graphrag#2625 · 1 commento ·
I maintainer di solito rispondono entro 5 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 95/100
I maintainer di solito rispondono entro 5 giorni
-
[Bug]: JsonCache.get() crashes with unhandled AttributeError on non-dict or invalid envelope JSON payloadsForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
microsoft/graphrag#2614 · 2 commenti ·
I maintainer di solito rispondono entro 5 giorni
-
[Bug]: JSONLinesFileReader drops rows containing U+2028, U+2029 or U+0085 (uses str.splitlines)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
microsoft/graphrag#2594 · 1 commento ·
I maintainer di solito rispondono entro 5 giorni
Tutte le issue di microsoft/graphrag
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
deepchem/deepchem#5289 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Pull Request for pretty_macAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 60/100
UKGovernmentBEIS/inspect_evals#2892 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Versioning docs: say that no output from the 0.46 warning check means nothing is affectedForse già presa @grelinfo l’ha presa oggi. Apertadocumentation priority:low size:S
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
alphacrack/readme2demo#293 ·