向量库明明搜到了匹配结果,大模型为什么还会胡说八道?
正在做一个问数系统从项目开始到现在遇到过不少问题最先碰到的就是 RAG 过程中我明明查了向量数据库Top-K 返回的片段确实包含了答案相关的关键词可大模型拿到这些参考资料后还是一本正经地胡说八道这种情况一开始我们第一反应就是大模型智商不行或者是Embedding模型精度不够。但后来整个流程排查发现问题出在检索出来的向量数据上向量搜索搜到了不代表能答对。向量相似度不等于语义相关性这是最核心的一个误区向量搜索的底层是数学。把一段文本转成Embedding向量存入数据库比如Qdrant或Milvus它本质上是空间里的一个坐标。所谓的搜索就是找离用户提问最近的几个点。但近不代表对举个例子。用户问“公司去年哪个月亏损最严重” 向量搜索可能会返回一段话“公司去年业绩增长迅猛但在 7 月份因为供应链问题导致了小幅亏损相较于 6 月份的盈利……”从数学上看这段话里包含了“去年”、“亏损”、“月份”相似度评分极高。但如果这段话里并没有提到具体的亏损额度或者它的上下文是在讲盈利预测大模型读到这个片段由于缺乏足够的事实支撑为了完成你给它的任务它就开始结合自己的训练数据进行脑补。数学上的距离并不能完全过滤掉逻辑上的噪音。碎小文档切片失去意义我们在做RAG通常会对文档进行分块Chunking。假设你为了省 Token把块的大小设得很小比如 200 字向量搜索确实精准地命中了那包含答案的一句话。可问题是这句话可能是一个孤儿切片比如命中的片段是“它的维护费用大约是每年 5 万元。” 大模型看到这句话是一脸懵逼的它是谁如果向量搜索没有把上下文比如上一段提到的设备型号一起带回来大模型在生成答案由于指代不明就会随机指派一个它认为可能的对象或者干脆瞎编一个。这种由于文档切分导致的上下文断裂是向量检索搜到了也无法准确生成的重灾区。Top-K 噪音干扰了模型的注意力很多时候为了提高召回率喜欢把Top-K设得很大比如一次给大模型塞进去 10 个、甚至 20 个切片。大家觉得只要我喂的数据够多里面总归有正确答案吧实则不然大模型有一个很麻烦的特性叫做Lost in the Middle迷失在中间。当上下文过长且里面掺杂了大量似是而非的无关信息大模型会表现得像一个注意力涣散的学生。它可能会被 Top-1 和 Top-2 里的噪音带偏反而忽略了藏在 Top-5 里的那个关键事实。这种信息过载直接导致即便正确答案就在Prompt里模型还是会给出错误的回答。引入 Rerank 重排器向量搜索粗筛不完全靠谱我们就必须在后端架构里加一层精筛也就是Rerank重排模型。为什么一定要加 Rerank向量搜索Embedding属于双塔模型它是把问题和文档分别编码算个余弦相似度。它快但它看不出深层的逻辑关系。Rerank 模型 比如智源的BGE-Reranker属于交叉编码器它会把用户的提问和候选文档拼在一起进行深度比对。能看出来虽然这段话里关键词很多但它其实根本没回答用户的问题。开发标准流程应该是向量搜索召回 50 个潜在相关的片段。Rerank 模型对这 50 个片段进行精准打分把真正能回答问题的 3-5 个片段排到最前面。只把这最有把握的 3-5 个片段喂给大模型。通过这一步能过滤掉 90% 以上的干扰信息准确率会有质的飞跃。