[Feature Request]: Go ingestion: generate TOC chunks for directory-enhanced retrieval

这是 Go 摄取链路缺少 TOC 生成能力的特性请求,不是可复现的报错。检索侧已有 toc_kwd="toc" 读取增强,但新摄入文档不会生成对应目录块;需要确认的是当前 Go 摄取是否选中 TOC 字段以及是否已实现该分支。

快速结论:这是 Go 摄取链路缺少 TOC 生成能力的特性请求,不是可复现的报错。检索侧已有 toc_kwd="toc" 读取增强,但新摄入文档不会生成对应目录块;需要确认的是当前 Go 摄取是否选中 TOC 字段以及是否已实现该分支。

适用环境:RAGFlow Go 摄取链路;Issue 提及 Python v0.27.2 的 toc_extraction → build_TOC 作为对照,代码引用基于修订 f1a8781f。Issue 未给出操作系统、Python、CUDA、显卡或依赖版本。

最快修复方案:暂无确认的一步修复方案。Issue 讨论中的实现方向为:在 Go Extractor 中增加 TOC 分支,仅在 field_name == "toc" 时生成目录块;该方案处于提议阶段,尚未见合并或验证记录。

注意事项:目录块依赖内容块最终 ID,生成时机必须在 ID 稳定之后,否则 TOC 引用会失效。重跑、重试、取消、删除都可能留下重复或陈旧 TOC 引用,Issue 中特别将其列为验收条件。旧 TOC 块的处理位置(写入后删除还是纳入编译产物对账)在讨论中仍未定论。

问题场景

使用 RAGFlow Go 摄取链路索引新文档,并希望启用目录增强检索时触发。检索侧的 internal/service/toc_enhancer.go 会查找已存在的 toc_kwd="toc" 块並用其条目定位相关内容,但 Go 摄取链路没有对应的生成步骤,因此新摄入文档在检索时拿不到目录数据。Issue 明确指出,PDF 书签提取或移除印刷目录是另一项独立行为,不能替代本功能。

报错原文

[Feature Request]: Go ingestion: generate TOC chunks for directory-enhanced retrieval
toc_kwd="toc"
toc_extraction
build_TOC

原因分析

核心原因不是运行时异常,而是功能缺口:Go 摄取链路中不存在等价于 Python v0.27.2 toc_extraction → build_TOC 的步骤。该 Python 步骤会在分块 ID 可用后生成目录结构并持久化为目录块。缺少这一步时,toc_enhancer.go 只能查找已有目录块,无法为刚摄入的文档凭空构造目录数据。Issue 中提到 extractor.go 已为未来的 TOC 分支预留 _ERROR,说明该能力被规划但尚未实现。

环境排查

  • 确认 RAGFlow 版本及 Go 摄取链路是否已包含 TOC 生成分支。
  • 确认触发摄入的 field_name 是否为 toc,对应讨论中提议的显式开关。
  • 确认 extractor.go 中 TOC 分支是否存在,以及 _ERROR 预留位置是否仍为占位。
  • 确认 internal/service/toc_enhancer.go 当前读取逻辑所需字段,包括 toc_kwd、available_int 和目录内容的存储形式。
  • 确认摄入配置中是否配置了聊天模型及 llm_id,因为 TOC 生成依赖模型调用。

解决步骤

  1. 先确认需求边界:该 Issue 是 Go 摄入侧生成能力的特性请求,不是检索侧使用问题。Issue 说明相关 #13643 只是检索侧 TOC Enhance 的使用咨询。
  2. 按讨论中的提议方向,在 Go Extractor 中为 field_name == "toc" 增加独立分支;其他 field_name 维持现有路径,从而在未选中 TOC 字段时不发起模型调用。
  3. 在内容块 ID 稳定后生成 TOC 条目:使用 common.ChunkID(docID, text) 为输入块分配最终 ID,并复用 ProcessChunksForPipeline 对已有 id 的保留逻辑,确保目录条目指向最终持久化的内容块 ID。
  4. 目录模型调用沿用 run_toc_from_text 的思路:按章节提取标题、套用相同的标题过滤规则,再完成层级分配;使用 Extractor 现有的聊天模型调用器与 llm_id。
  5. 按讨论中的存储形态写入目录块:条目以 JSON 存入 content_with_weight,设置 toc_kwd="toc"、available_int=0,块 ID 使用 ChunkID(docID, tocJSON),使其符合 toc_enhancer.go 的读取契约,且不被当作普通可检索正文。
  6. 处理重跑一致性:目录内容变化会导致目录块 ID 变化,可能遗留旧块。讨论中提议在新写入成功后删除该文档旧的 toc_kwd="toc" 块,但是否应改为像 reconcileDocumentCompiledProducts 那样纳入对账,仍需维护者确认。
  7. 补充测试:使用 stub 聊天模型调用器、校验持久化 ID 映射、用 parseTOCEntries 回读目录块,并验证重跑后仅保留一个 TOC 块。若还需要覆盖迁移数据集,需先确认 parser_config.toc_extraction 是否也应作为开关。

验证方法

摄入一份新文档后,检查该文档是否只存在一个 toc_kwd="toc" 的目录块,其条目标题、层级和内容块 ID 引用与最终持久化内容一致;确认该块 available_int=0,不会被当作普通正文召回。随后执行目录增强检索,确认 toc_enhancer.go 能通过 parseTOCEntries 读取该目录并定位内容。最后重跑同一文档,确认不会新增重复 TOC 块或残留指向旧 ID 的陈旧引用。未选中 TOC 字段时,确认不触发模型调用且摄入行为不变。

参考来源

infiniflow/ragflow #21031

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29763

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注