最近在做公司内部文档的RAG问答,用的bge-m3做embedding,chunk_size设的512,overlap设了50,检索用faiss+余弦相似度。但实际效果很拉胯,比如问“报销流程多久到账”,召回的top3全是合同条款或者考勤制度,完全对不上。我怀疑是不是chunk切得太机械了,把语义完整的段落切碎了?或者overlap太小?也试过调top_k,但感觉治标不治本。想请教下各位,有没有比较靠谱的chunk策略?比如按标题/段落结构切是不是更好?或者有没有必要先用LLM做query理解再检索?求指点,感谢!
楼主
2026-08-10
RAG检索老召回无关片段,是不是我chunk切得有问题?
请 登录 后发表回复
全部回复
共 82 条
2楼
3天前
512切太碎了,试试按标题层级切,再给每个chunk带上章节路径,召回准很多。
3楼
2天前
这个召回结果确实挺离谱的,问报销到账给你返回合同条款,基本说明embedding没抓住query的核心意图。bge-m3本身对中文语义还行,但你512的chunk如果正好把“报销流程”和“到账时间”切到两个块里,那检索时确实容易跑偏。我建议先别急着换模型,用几个badcase把召回的chunk原文打出来看看,大概率会发现语义被切碎了,或者块里混了一堆无关的模板文字。按标题和段落结构切通常比固定长度靠谱,尤其是公司制度类文档,标题本身就是很强的语义信号。overlap 50偏小,可以试试100到150,但更关键的是别让一个chunk里出现多个主题。query理解那步如果成本允许可以做,比如先让LLM把“报销多久到账”改写成“差旅报销审批通过后打款周期”,再拿去检索,效果会明显不少。另外faiss加余弦相似度可以补一个关键词召回做混合检索,纯向量对“到账”“周期”这种词有时真不如BM25稳。