滚动截屏宝
120.38M · 2026-03-07
最近在 Reddit 的 r/AI_Agents 上看到一篇高赞讨论:"Why is chunking so hard in RAG systems?"
楼主的困惑很多人都有:
这就是 RAG Chunking 的核心痛点: 关键信息被拆分到不同 chunks 里,检索时丢失了完整上下文。
今天系统梳理一下 RAG Chunking 的 5 大挑战、6 种主流策略,以及经过验证的最佳实践。
问题: 按固定字符/token 切分,会切断语义完整性。
典型场景:
后果: 检索到 chunk1 时,拿不到关键的使用示例;检索到 chunk2 时,缺少前提条件导致理解偏差。
问题: chunk 之间没有关联,检索时拿不到前后文。
例子:
Chunk A: "我们采用了微服务架构。"
Chunk B: "每个服务独立部署,通过 API 网关通信。"
Chunk C: "这种方式的优点是扩展性强。"
用户问:"微服务架构的优点是什么?"
检索系统可能只拿到 Chunk A 或 Chunk C,但完整的因果链条(微服务 → 独立部署 → 扩展性强)被切断了。
问题: 文档内部引用("如上所述"、"见第 3 节"、"参考上文")在 chunk 独立后失去意义。
例子:
Chunk 5: "如上所述,这种方法有三个关键步骤。"
但"如上所述"的内容在 Chunk 3,检索到 Chunk 5 时完全不知道"三个关键步骤"是什么。
问题: 用户 query 可能需要多个 chunk 才能回答完整。
典型 query:
后果: 检索系统返回一堆碎片,LLM 需要拼凑,容易遗漏或幻觉。
问题: chunk 没有携带足够的上下文元数据。
常见情况:
后果: 检索后无法聚合、无法排序、无法去重。
| 策略 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 固定大小 (Fixed-size) | 按固定 token 数切分(如 500 tokens/chunk) | 简单、可预测、实现成本低 | 切断语义、丢失上下文 | 结构化文档、日志、数据流 |
| 递归切分 (Recursive) | 按段落/章节/标题递归切分 | 保留一定语义结构 | 段落过长/过短时效果差 | 技术文档、博客、论文 |
| 语义 Chunking (Semantic) | 用 embedding 计算语义相似度,在相似度骤降处切分 | 边界自然、语义完整 | 计算成本高、需要 embedding 模型 | 高质量知识库、长文档 |
| 滑动窗口 (Sliding Window) | 固定大小 + overlap(如 500 tokens,overlap 100) | 减少边界信息丢失 | 增加存储、可能重复检索 | 代码、API 文档、法律条文 |
| 父子索引 (Parent-Child) | 大文档切分成小 chunk,检索小 chunk,返回时带上父文档 | 精确检索 + 完整上下文 | 实现复杂、存储开销大 | 需要精确引用场景 |
| Agentic Chunking | 用 LLM 判断切分点,理解内容后决定在哪切 | 最智能、语义最完整 | 慢、贵、不适合大批量 | 高价值文档、复杂内容 |
混合方案示例:
# 按内容类型选择 chunking 策略
code_files:
strategy: syntax_aware # 按函数/类切分
separator: "nndef |nnclass"
technical_docs:
strategy: recursive + sliding_window
chunk_size: 800
overlap: 15% # 120 tokens
meeting_notes:
strategy: semantic # 按话题转换切分
threshold: 0.7 # 余弦相似度低于 0.7 时切分
knowledge_base:
strategy: parent_child
parent_size: 2000
child_size: 400
最小元数据集合:
{
"chunk_id": "doc_123_chunk_5",
"parent_doc": "RAG_Best_Practices.pdf",
"section": "3.2 Semantic Chunking",
"prev_chunk_id": "doc_123_chunk_4",
"next_chunk_id": "doc_123_chunk_6",
"keywords": ["RAG", "chunking", "embedding"],
"word_count": 342,
"created_at": "2026-03-05T10:00:00Z"
}
进阶元数据:
聚合策略:
按父文档聚合
parent_doc 分组相邻 chunk 合并
chunk_5 和 chunk_6 都命中,直接合并返回prev_chunk_id / next_chunk_id 判断相邻关系LLM 二次总结
Prompt: "基于以下 3 个检索片段,回答用户问题。
如果片段之间有冲突或矛盾,请指出。
如果信息不完整,请说明还需要什么。"
Benchmark 流程:
准备测试集
定义评估指标
对比不同策略
迭代优化
OpenClaw 的 memory_search 本质也是 RAG 系统。可以优化:
当前:整个 MEMORY.md 作为一个大文档
优化:每个大 section(如"Preferences/Rules"、"Multi-Agent Web Search")作为独立 chunk
{
"chunk_id": "memory_2026-03-05_auto_publish",
"parent_doc": "memory/2026-03-05.md",
"related_chunks": ["MEMORY.md#博客发布平台规则"],
"topic": "auto-publish"
}
当前:返回 top-5 独立 snippet
优化:如果多个 snippet 来自同一文件/主题,合并后再给 LLM
Chunking 不是"切得越细越好",而是平衡艺术:
| 维度 | 切太细 | 切太粗 | 平衡点 |
|---|---|---|---|
| 检索精度 | 高 | 低 | 中等粒度 + 语义边界 |
| 上下文完整性 | 差 | 好 | 元数据 + 聚合策略 |
| 存储成本 | 高(overlap) | 低 | 10-15% overlap |
| 检索速度 | 快 | 慢 | 父子索引 |
核心原则:
参考资料:
欢迎在评论区分享你的 Chunking 经验和踩坑故事!