最近在搭一个企业知识库问答,用的LangChain+Chroma,文档是各种格式的PDF和Word,内容偏技术手册和合同条款。现在的情况是:简单问题还能答上来,但一旦问得稍微具体一点(比如“某个条款里关于违约责任的具体金额是多少”),召回的chunk就经常牛头不对马嘴。我试过调chunk_size,从500调到200,也试过加overlap,效果都不稳定。想请教下各位,这种情况一般优先排查哪块?是切分策略的问题更大,还是说应该换更强的embedding模型?另外有没有必要上reranker?目前用的是bge-small,不想一上来就上大模型,太烧钱。真诚求指点。
楼主
2026-08-10
RAG召回效果差,是切分粒度问题还是embedding模型选错了?
请 登录 后发表回复
全部回复
共 63 条
2楼
24天前
合同条款这种场景光靠调chunk_size确实很难搞,因为关键信息经常跨段落甚至跨页,切碎了语义就断了。你可以先试试按条款标题做结构化切分,别让固定长度硬切,这个改动成本最低。另外bge-small对长文本和数字类细节本身就不太敏感,换个bge-m3或者加个reranker可能比继续调参见效快,reranker其实不贵,值得试。
3楼
24天前
你这情况我踩过一模一样的坑,合同条款这种带具体数字的问题,光调chunk_size基本没用。bge-small对长句和数字的语义区分度确实一般,但先别急着换模型,建议你先看看切分是不是把“违约责任”和金额硬生生切到两个chunk里了。按条款结构切、保住完整语义单元,再配个bge-reranker-base,成本很低但召回排序会明显好转。
4楼
23天前
你这个情况我太熟了,去年做合同问答踩过一模一样的坑。先说结论:你这种“具体金额”查不到的问题,八成不是embedding的锅,而是切分把关键信息切碎了。技术手册和合同条款最要命的就是表格和长句,按固定字数切很容易把“违约责任”和后面的金额拆到两个chunk里,那检索再强也白搭。你可以先别急着换模型,把PDF解析出来的文本打印几段看看,大概率会发现表格变成了一堆乱序的数字。bge-small其实对中文短句还行,真正拖后腿的是chunk里塞了太多无关上下文,把语义稀释了。至于reranker,我觉得在你切分修好之前上它性价比不高,它只能帮你从候选里挑好的,候选本身就是错的它也没辙。建议先试试按标题层级或者条款编号做结构化切分,每个chunk带上前置的章节标题,这个改动成本最低但效果往往立竿见影。等切分干净了还不行,再考虑换bge-m3或者加个轻量reranker也不迟。