2.3 KiB
2.3 KiB
RAG 切片上下文重建缺失
状态:待规划
严重程度:高
发现时间:2026-07-04
范围:知识库上传、切片、向量召回、Agent 上下文组装
现象
同一个 Markdown 章节在内容较长时会被拆成多个 chunk。当前检索命中其中一个 chunk 后,返回给 Agent 的主要是单个 chunk 内容,不会自动把同章节的前后片段、章节标题链路、相邻 chunk 一起恢复出来。
这会导致两个问题:
- 命中片段只包含局部语义,缺少前置定义、约束条件或后续步骤。
- 同章节被分段后,检索结果之间缺少可追溯的关联,Agent 不一定知道它们属于同一章节。
当前实现
DocumentChunkService会按 Markdown 标题建立title和breadcrumb,再按段落累积切片。- 超过阈值时仍会切断同一章节,只是尽量避免打断代码块和列表。
VectorIndexService会把chunkIndex、totalChunks、title、breadcrumb放入 metadata。VectorSearchService查询 Milvus 后直接返回命中的 chunk,没有做相邻 chunk 扩展或 section 级聚合。LookupKnowledgeTool消费 L1 结果时,也没有根据docId + chunkIndex + breadcrumb回补上下文。
影响
- RAG 回答容易漏掉同章节中的约束条件。
- 长流程类文档会被拆散,Agent 看到的是“片段证据”,不是“完整流程”。
- 面试解释中需要承认:当前系统有 metadata 基础,但还没有把它用于上下文重建。
建议修复
优先做命中后的上下文扩展:
- L1 命中 chunk 后,按
docId + chunkIndex拉取前后 N 个相邻 chunk。 - 如果 metadata 中
breadcrumb相同,允许扩展到同章节的多个 chunk。 - 上下文打包时标记
命中片段、前文、后文,避免 Agent 把扩展内容误认为全部都是高置信命中。 - 增加 token budget 控制,超过预算时优先保留命中 chunk 和标题链路。
相关文件
src/main/java/com/superbiz/agent/service/DocumentChunkService.javasrc/main/java/com/superbiz/agent/service/VectorIndexService.javasrc/main/java/com/superbiz/agent/service/VectorSearchService.javasrc/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java