RAG为什么会一本正经瞎编?召回这步决定生死
我搭了个会查公司制度的小助手,问它"年假能不能跨年清零",它答得头头是道,引经据典,结果——公司压根没这条规定,它现编的。当时我一身冷汗,这要是给 HR 用了得闹笑话。
这事让我去把 RAG 这套东西的原理重新捋了一遍。今天不讲怎么搭,讲讲为什么它会瞎编,搞懂了你才知道该往哪儿使劲。
模型本身就是个"擅长接话的人"
大语言模型的本质是预测下一个词,它追求的是"读起来通顺、像那么回事",而不是"说的是真的"。你问它一个它不知道的东西,它不会说"我不知道",它会顺着语感给你编一个最像答案的答案。这是它的天性,不是 bug。
所以光有模型不够。RAG(检索增强生成)干的事,就是在模型张嘴之前,先从你的知识库里把相关资料捞出来,塞到它面前,跟它说:"你就照着这些材料答,别自己发挥。"
召回不准,后面全白搭
关键就在"捞资料"这一步,也就是召回。这是整条链路里最容易出问题、又最被忽视的环节。
我那个年假的乌龙就出在这儿。公司制度库里其实有《考勤与休假管理办法》,但里头用的词是"法定年休假折算",跟我问的"年假跨年清零"字面差太远,向量没匹配上,召回回来的是几篇不相干的福利文档。模型一看材料里没年假的事,又被迫得答,于是发挥天性——编了。
召回这步要是把错的材料、或者没材料给到模型,模型再聪明也是巧妇难为无米之炊,只能瞎编。召回回来的东西质量,直接决定了答案的上限。
怎么让召回更靠谱
我后来做了几件事,明显见效:
问题改写:用户问得口语,文档写得书面,中间隔着一层。让模型先把"年假跨年清零"扩写成几个近义说法再去检索,召回率立马上去。
召回兜底:设了相似度阈值,要是捞回来的材料都低于这个分,就别硬答,直接回"这个我没查到,建议问 HR"。宁可不答,不可错答。
把出处亮出来:让小助手答完附上引用的是哪篇文档第几节。它一旦得标出处,瞎编的成本就高了,乱答会露馅。
加了这几手,那个年假的问题它现在老老实实回"未查询到相关规定"。我心里踏实多了。
搭这套我用的是个零代码配智能体的平台,召回参数都是界面上调,不用写检索代码,省心。但原理你还是得懂,不然参数瞎调,照样翻车。
(背后的生成模型我接的是讯飞 MaaS 的现成 API,模型这块没让我操心,我精力全花在调召回上了。)
