乐于分享
好东西不私藏

终于,我让AI不再胡说(上)

终于,我让AI不再胡说(上)

引文

上一章我们聊了为什么 AI 会一本正经地胡说八道。

核心原因是:它不是在查答案,而是在生成它训练时概率最大的答案。

资料不够、信息过期、上下文不清楚的时候,它就开始"补"。

补一个看起来合理的年份。

补一个格式很像的论文标题。

补一个完整的餐厅预约结果——但餐厅那边根本没收到预约。

看起来特别像回事。

但"看起来像"和"真的是",中间隔着一道挺宽的沟。

那既然它会瞎补,我能不能先把资料发给它,让它基于资料来回答?

别让它空手进考场了。

把小抄递给它。

这样它应该就不会乱说了吧?

这个想法没问题。

但很多人很快会发现,事情没这么简单。

你把十份 PDF 扔进去,它未必真用了。

你把公司制度、产品手册、会议纪要都塞进去,它也可能精准地绕开最关键的那一页。

甚至有时候你明明喂了文档,它还是引用了一段文档里根本没有的话。

所以问题不是:

ounter(lineAI 有没有资料?

而是:

ounter(line它回答这一句的时候,到底拿到了哪几段资料?

还有一种场景:如果你的公司制度,分三册、每一册都堪比一本红楼梦, 对 AI 来说,上下文窗口马上就会被塞满,这时候再问问题就相当于大海捞针,且开销很大。

RAG 想解决的,就是这些问题。

RAG 是什么

RAG 的全称是 Retrieval-Augmented Generation,检索增强生成。

听着很技术,但翻译成人话其实很直白:

让 AI 在回答前,先去外部资料里找一找,再带着找到的资料回答。

可以对比着看:

ounter(lineounter(lineounter(lineounter(lineounter(line普通聊天:你问 → 模型根据当前上下文和参数记忆生成回答RAG:你问 → 系统先找资料 → 把资料递给模型 → 模型基于资料生成回答
02-normal-chat-vs-rag.png|300

区别就在那个"先找资料"。

这里要说清楚一件事:

RAG 不是重新训练模型。

训练模型是让它"永久记住"某些东西,把知识烧进参数里。

那个过程很贵,很慢,也不是普通人能做的。

RAG 不是这样。

它更像临时翻书,而不是把整本书都塞进去。

你问一个问题。

系统去知识库里翻几页相关资料。

把这几页放到模型眼前。

然后模型基于这几页来回答。

下次你问别的问题,它再去翻别的几页。

所以 RAG 属于我们第二章讲过的"三类知识"里的第二种:

  • 模型脑子里有的:训练时学到的参数记忆。
  • 产品临时拿来的:搜索、RAG、工具、数据库。
  • 当前对话现场里的:这次上下文窗口里实际放进去的内容。

RAG 不是让模型变聪明。

而是在它回答前,多给它一点依据。

把资料给 AI,不等于它真的会用资料

但这里有个很容易被忽略的问题。

很多人第一次听说 RAG 或者知识库的时候,脑子里的画面是:

我把文件上传。

AI 就有了这些资料。

它回答的时候就会用这些资料。

这个直觉不完全对。

因为:

上传资料,不等于资料真的进入了模型这次回答的上下文。

进入上下文,也不等于它真的抓住了重点。

抓住了重点,也不等于它不会误读。

我们接着第一章的那个比喻继续说。

还记得吗?

第一章说,模型这次回答能看到的,是桌面上的东西。

我们把 Context Window 比作一张桌子。

你刚刚说的话、它刚刚回你的话、你贴进去的资料、系统提前写好的规则,这些东西加在一起,构成了模型这一次回答时能参考的"现场"。

桌子有边界。

东西太多,旧的会被挤出去。

资料太乱,关键信息会被淹没。

03-context-desk-bookshelf.png|300

那 RAG 做的事是什么呢?

在回答前,从书架上帮它翻几页资料,放到桌面上。

但如果翻错页了呢?

如果翻太多页,桌面塞满了,关键句被挤到角落看不清呢?

如果关键的一段话刚好被切断了,前半句在这页,后半句在另一页,而系统只翻到了前半句呢?

那桌面上看起来有资料。

但实际上,它还是会跑偏。

所以 RAG 不是魔法。

它只是多了一个"翻资料"的动作。

翻得到、翻得对,回答才靠谱。

翻不到、翻错了、看错了,它照样会一本正经地胡说。

它到底多做了一件什么事

那 RAG 比普通聊天多做了什么?

可以先看一个最简单的流程:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line用户问题  ↓去外部资料里找相关片段  ↓把片段塞进 Context Window  ↓LLM 根据问题和片段生成回答
04-reimbursement-rag-workflow.png|300

多的那个动作,就是中间那步:

先找。

找到了,再递。

递完了,再让模型答。

听起来很朴素。

但这里面其实有很多细节。

首先,"去外部资料里找相关片段"——怎么找?

你问的是"报销打车票需要什么材料"。

但资料里可能不是这么写的。

资料里写的可能是:

ounter(line市内交通费需提供合规发票,非工作时间出行应附事由说明。

字面上不一样。

但意思很接近。

系统怎么判断"这段资料和用户的问题相关"?

这就要轮到下一篇要讲的 Embedding(向量化)和 Vector Database(向量数据库)了。

但在这一篇,你只需要先建立一个直觉:

系统要有办法,把"意思接近"的资料找出来,而不只是按关键词搜。

然后,"把片段塞进 Context Window"——塞多少?

太少了,信息不够。

太多了,噪音一堆,关键句被淹没。

而且 Context Window 有边界。

你不能把整个知识库都塞进去。

所以系统要有办法,挑出最相关的几段。

最后,"LLM 根据问题和片段生成回答"——它真的会老老实实基于材料回答吗?

不一定。

如果材料里有矛盾,它可能会把两边拼在一起,答出一个自相矛盾的结果。

如果材料写得模糊,它可能推过头。

如果材料恰好没覆盖问题的某个细节,它可能又开始"补"。

所以 RAG 不是一个"装上就灵"的开关。

它更像一个流程。

流程里每一步都可能出问题。

而且就算每一步都对了,最后模型也可能看错。

这就是为什么,给了资料,AI 还是可能答错。

小结

所以到这里,我们先建立一个最基础的认知:

RAG 不是让 AI 突然变成一个事实机器。

它只是让 AI 回答前,多了一个"翻资料"的动作。

翻到对的资料,放到桌上,它确实会好很多。

但如果:

  • 资料本身就是错的、旧的、不完整的。
  • 系统没找到真正相关的资料。
  • 系统找到了很多看起来相关、其实不相关的资料。
  • 资料被切得乱七八糟,上下文断了。
  • 桌面上堆了太多东西,关键句被噪音淹没了。
  • 模型看错了,把 A 文档的结论套到 B 文档的案例上了。

那它还是会一本正经地跑偏。

"有资料"只是第一步,"拿到对的资料"才是关键。

那问题就来了——

系统到底怎么"翻"?

一堆 PDF、Word、网页,是怎么变成它能在回答前精准翻到的那几段的?

中间其实有一条不短的流水线。

下一篇我们就拆开看。

大家端午安康,晚安,我们下一篇见。


参考链接

  • Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, NeurIPS 2020: https://papers.nips.cc/paper/2020/hash/6b493230205f780e1bc26945df7481e5-Abstract.html
  • Gao et al., Retrieval-Augmented Generation for Large Language Models: A Survey: https://arxiv.org/abs/2312.10997