Commit Graph

2 Commits

Author SHA1 Message Date
Blizzard 1d23bdf0a3 feat(rag): Markdown 标题感知切块(块带章节面包屑、不跨章节、跳过代码围栏)
chunk() 分流:检测到 ATX 标题(#~######)走 chunkMarkdown,否则走原纯语义
切块(packSection)——纯文本行为不变,向后兼容。

- splitMarkdownSections:按标题层级切段,维护标题栈生成面包屑路径
  (如「部署指南 > 环境要求 > 端口」);块绝不跨章节边界。
- 正确跳过代码围栏(``` / ~~~)内的 #,避免 #define、bash 注释被误判为标题。
- 每块前缀完整标题路径 → 检索到的块自带章节语境,提升命中质量与 LLM 理解。
- 节内仍复用原语义打包(句界收口)+ 块间重叠,rune 安全不变。

测试 12/12(7 原有 + 5 新):面包屑、不跨章节、层级出栈重置、代码围栏忽略、
纯文本与语义切块一致。实测 ingest 一篇 Markdown 切出正确三级面包屑,
kb_search「Gateway 监听哪个端口」top 命中即带面包屑的块。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 12:49:41 +08:00
Blizzard ddc2265c5b feat(mcp-go): RAG 语义切块 —— 递归 + 句界 + 重叠 + rune 安全
替换朴素切块(按行切 + 字节硬截)为工业级语义切块:
- 修真 bug:旧版 s[:2000] 按字节切,中文 UTF-8(3 字节/字)会被切碎成乱码;
  新版全程按 rune 操作。
- 算法:splitToAtoms(换行/中英句末标点切原子,超大无标点原子按 rune 窗口兜底)
  → packAtoms(贪心打包到 target=500 字、句末收口,尾块 <100 字并入相邻)
  → addOverlap(块间 80 字重叠,保跨块上下文)。硬上限 1000。
- chunk.go 独立成文件 + chunk_test.go(空/短/rune安全/大小上界/句界/重叠/超大无标点)。

收益:检索片段语义完整(不再断句)、中文不乱码、跨块上下文不丢 → RAG 召回质量。
make test-go 全绿。后续可加 Markdown 标题路径前缀(结构化文档增强)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 15:21:17 +08:00