跳至主要內容

十万个Why:向量库明明搜到匹配结果,大模型为什么还会胡说八道?

程序员小富大约 4 分钟

大家好,我是小富~

正在做一个问数系统,从项目开始到现在遇到过不少问题,最先碰到的就是 RAG 过程中,我明明查了向量数据库,Top-K 返回的片段确实包含了答案相关的关键词,可大模型拿到这些参考资料后,还是一本正经地胡说八道?

这种情况,一开始我们第一反应就是大模型智商不行,或者是 Embedding 模型精度不够。

但后来整个流程排查发现,问题出在检索出来的向量数据上,向量搜索搜到了不代表能答对。

向量相似度不等于语义相关性

这是最核心的一个误区,向量搜索的底层是数学。

把一段文本转成 Embedding 向量存入数据库,比如 QdrantMilvus,它本质上是空间里的一个坐标。所谓的搜索,就是找离用户提问最近的几个点。

但近不代表对!!!

举个例子。用户问:“公司去年哪个月亏损最严重?” 向量搜索可能会返回一段话:“公司去年业绩增长迅猛,但在 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 属于交叉编码器,它会把用户的提问和候选文档拼在一起,进行深度比对。能看出来,虽然这段话里关键词很多,但它其实根本没回答用户的问题。

开发标准流程应该是:

  1. 向量搜索召回 50 个潜在相关的片段。

  2. Rerank 模型对这 50 个片段进行精准打分,把真正能回答问题的 3-5 个片段排到最前面。

  3. 只把这最有把握的 3-5 个片段喂给大模型。

通过这一步,能过滤掉 90% 以上的干扰信息,准确率会有质的飞跃。

说在最后

向量数据库只是一个模糊索引,如果你的 RAG 系统还在胡说八道,别急着换大模型。去查查切片是不是丢了上下文?去看看你的 Top-K 里是不是全是噪音?

给大模型喂的数据,质量永远比数量重要。

能用 3 个精准片段说清楚的事,绝对不要塞给它 10 个片段。如果发现召回的内容总是差那么一点点意思,可以加上 Rerank,这或许比你调优一个月 Prompt 都管用。

上次编辑于: