最近在做一个基于本地知识库的问答机器人,用的LangChain+OpenAI。文档是几十份PDF技术手册,各种格式都有。我按固定chunk_size=500、overlap=50切分,embedding用的bge-large。现在问题是:用户问“如何配置数据库连接”,检索出来的片段经常是“错误代码列表”或者“常见故障排查”里的内容,相关性打分也还行,但就是答非所问。我怀疑是分块太机械,把上下文逻辑切断了,但换成按章节切又怕块太大超token限制。有没有踩过坑的朋友分享下,你们一般怎么处理这种结构复杂的文档?还是说问题根本不在分块,在检索策略上?
楼主
2026-08-09
RAG系统检索到的都是垃圾内容,是不是我的分块策略有问题?
请 登录 后发表回复
全部回复
共 82 条
2楼
22天前
我最近也踩过类似的坑,感觉你这情况不一定是分块的问题,反而更像是检索阶段把“关键词相似”误当成了“语义相关”。技术手册里“数据库连接”和“错误代码列表”经常共享一堆术语,比如 connection、timeout、failed,embedding 打分自然不低,但意图完全不对。固定 chunk_size=500 确实容易把配置步骤和上下文切断,不过换成按章节切也不一定就好,因为章节内部可能还是很长,关键是你得让每个 chunk 尽量围绕一个可独立回答的问题。可以试试语义分块或者按标题层级递归切,再给每个 chunk 加上文档名、章节路径这类元数据,检索时先过滤再排序。另外纯向量检索对这种结构化文档不太够,最好加个 BM25 混合检索,或者用 rerank 模型过一遍,能把那种“看着像但答非所问”的结果压下去。还有个小技巧是给用户 query 做一下意图改写,比如把“如何配置数据库连接”扩成“数据库连接配置步骤 参数说明”,检索命中率会明显不一样。
3楼
18天前
我碰到过几乎一样的问题,后来发现光调chunk_size治标不治本。PDF里表格和列表被切碎后,bge对这种碎片语义本来就抓不准,打分高但内容不对路。你可以试试按标题层级做递归切分,保留段落完整性,再给每个块拼上所属章节路径当上下文。另外检索阶段加个rerank模型,或者用混合检索补一下关键词匹配,往往比死磕分块管用。