记录一下那天晚上的排查过程。技术文档切块后,代码示例经常被切成两半,检索到的片段只有一半代码,回答里给出的命令跑不起来。
刚开始盯着「块大小按字符算,代码密度不同导致长度失控」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。分隔符顺序把换行放在代码块之前。也可能是没有识别 markdown 的代码围栏。
还有一种情况,重叠区域没有覆盖到关键上下文。
第一件事是把段落与代码围栏放在分隔符优先级前面
splitter = RecursiveCharacterTextSplitter(separators=['\n\n```', '\n\n', '\n', ' '], chunk_size=800, chunk_overlap=100)
接着切分前把代码块替换成占位符,切完再还原
python protect_code.py --input doc.md
随后按 token 而不是字符控制块大小
splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=500, chunk_overlap=50)
剩下的就是抽样检查切分结果
python -c "print(chunks[3][:200])")
怎么算真的好了,看的是同一批现象。代码块在切分后保持完整,检索命中的片段可以直接复制执行,回答的可用性明显提升。
容易忽略的是,技术文档的切分粒度和普通文章不同,代码块、表格都应当作不可分割单元处理,否则检索价值会大打折扣。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。