最近在搭一个企业内部的RAG系统,用的开源大模型本地部署,检索部分试了BGE和text2vec的embedding,数据是PDF的合同文本。发现很多问题明明文档里有答案,检索出来的top-5片段却完全不对,甚至答非所问。我目前是固定512字符切块,无重叠。想问问有经验的同学:这种场景下,是分块大小没调好、没做语义切分,还是embedding模型本身就不适合中文合同?另外,有没有必要先做一遍实体识别再检索?卡了好几天了,求指点。
RAG部署时,检索结果老是不准,是分块策略问题还是embedding选错了?
全部回复
共 148 条我觉得你这大概率不是embedding的问题,BGE和text2vec对中文合同都不至于这么拉胯。固定512无重叠切块在合同这种强结构文本上很吃亏,条款被拦腰截断语义就散了,建议先试试按段落或语义切,或者至少搞个200-300的小块加部分重叠。另外你说top-5完全不对,有没有可能检索方式本身是关键词匹配而不是向量召回?合同里“甲方乙方”这种实体高频出现,embedding容易被带偏,先跑个实体识别把关键条款和数字摘出来做辅助过滤,会比直接向量检索靠谱很多。
固定512字符无重叠切合同文本确实容易把条款语义切断,尤其法律条文经常跨段落引用,top-5里出现答非所问太正常了。我建议你先试试按章节或条款切,至少保留段落边界,再考虑加个20%的重叠。embedding方面BGE对中文合同类垂直文本其实不算最优,但问题可能更多出在切块上,你可以先用同样的embedding对比一下不同切块方式的效果。实体识别倒不是必须的,但如果合同里甲方乙方、日期数字很多,做一遍粗粒度实体标注再检索确实能提升精度,不过别一上来就上重武器,先调分块和检索的routing逻辑。
说实话我盲猜大概率是分块策略的问题,512字符硬切对合同这种结构化文本挺伤的,条款经常被拦腰截断,语义就不完整了。之前我处理法规文档也踩过类似的坑,后来改成按标题或条款边界切分,检索准确率明显提上来一截。embedding的话BGE中文效果其实还行,text2vec确实弱一点,但你先别急着换模型,试试把块大小调到300-400带点重叠,再做下关键词加权,可能改善很大。实体识别倒不急,那是后面做重排或过滤用的,现在top-5都找不对,先解决召回源头吧。
512固定切块太粗暴了,合同条款语义本来就长,试试按章节或语义段落切,embedding先别急着换。
512无重叠切合同这种硬文本确实容易把条款拦腰截断,语义直接散了,先改成按条款或段落切、加个10%到20%重叠试试,说不定比换embedding管用。BGE中文其实够用,但合同里一堆甲乙方、金额、日期这种实体,纯向量召回容易飘,可以配个BM25做混合检索。实体识别不一定非得上,但把关键字段抽出来做metadata过滤,命中率会稳不少。
合同文本固定512字符切块确实容易出问题,条款经常被拦腰截断,检索时语义对不上太正常了。建议先换成按条款/段落切,加个几十字符重叠,再试试bge-m3或者bge-large-zh,text2vec在长文本上召回一般。实体识别不是必须的,但合同里甲乙方、金额、日期这些关键信息可以先抽出来做元数据过滤,配合向量检索效果会稳不少。
512固定切合同肯定不行,条款被切碎了语义就散了,先试试按段落或标题切再叠个50字重叠看看。
合同文本这种场景固定512字符切块真的很容易出问题,条款跨块被截断,检索出来的片段语义不完整,top-5不准太正常了。我之前做类似项目时也踩过这个坑,后来改成按条款标题和段落做语义切分,效果提升很明显。embedding这块BGE中文其实不差,但合同里大量专业术语和相似句式,建议你先拿几十个真实query手动测一下召回,看是召回阶段就没捞到还是排序阶段被挤下去了。实体识别不一定非要前置,但合同里甲乙方、金额、日期这些关键实体如果能在chunk里保留完整上下文,对检索帮助挺大的。另外可以试试加个rerank模型做二阶段排序,bge-reranker对中文合同场景通常能拉回不少。还有个容易被忽略的点是PDF解析质量,如果表格和条款编号提取乱了,再好的embedding也白搭。建议先做个小的评测集,把切块、embedding、rerank几个变量分开验证,不然容易瞎调。