广智救我!RAG 技术让 AI 大模型知道广智是谁

《黑神话:悟空》这个游戏有多火,不用我多说了。如果你问这些天命人,当没血快死的时候怎么办?大喊一声:广智救我。

5762f70a692e454269970c50a4a591d0.png

广智是《黑神话:悟空》里面的一个小boss,玩家击败它之后,可以获得变身为广智的能力。变身之后有新的血条,非常适合于没血的时候来保命和反杀。

连西游记电视剧的弹幕,都是广智救我。

957e5a0f116e8fec222c89029dd72bc7.jpeg


那么,广智到底是谁?

估计很多人第一时间都想不起来这个人物。广智出自西游记第十六回:“观音院僧谋宝贝 黑风山怪窃袈裟”。就是他提议让观音禅院的金池长老去谋取唐僧的袈裟。

正说话处,有一个小和尚名唤广智,出头道:“公公,要得长远也容易。” 老僧闻言,就欢喜起来道:“我儿,你有甚么高见?”广智道:“那唐僧两个是走路的人,辛苦之甚,如今已睡着了。我们想几个有力量的,拿了枪刀,打开禅堂,将他杀了,把尸首埋在后园,只我一家知道,却又谋了他的白马、行囊,却把那袈裟留下,以为传家之宝,岂非子孙长久之计耶?”老和尚见说,满心欢喜,却才揩了眼泪道:“好!好!好!此计绝妙!”即便收拾枪刀。内中又有一个小和尚,名唤广谋,就是那广智的师弟,上前来道:“此计不妙。若要杀他,须要看看动静。那个白脸的似易,那个毛脸的似难。万一杀他不得,却不反招己祸?

西游记第十六回

如果你不知道广智是谁,去问 AI 模型的话,这些模型多半也不知道广智是谁。

我问了 Claude 3.5 Sonnet,它说西游记没有这个人物。

bb680f8dfe8bb263c3da4a64545bc00f.png

通义千问 2 告诉我,广智是羊力大仙。9e0cab7d0c108cccfbee579a6e770750.png

ca5af190decaa47b0008fd8038f46fa3.png

这其实并不是大模型本身的问题,只是刚好问到了它的知识盲区。大模型是使用海量的材料训练出来的。即便是材料再全,也不可能包含所有的内容。当你问了大模型一个问题,如果它的训练材料没有这方面的信息时,它的回答就开始变得不知所云了。在这个例子中,Claude 还好点,就说没这个人物。通义千问 2 就是一本正经的胡说八道了。这种情况下,我们说大模型出现了幻觉


那怎么解决幻觉的问题呢?通常有两种办法,一种办法是模型微调,把整本西游记小说直接扔给大模型,让它好好学习,自然就懂西游记了。市面上很多针对特定领域的模型,就是这么训练出来的。不过模型微调的门槛比较高,比较耗时费力,成本比较高。

另外一种办法是检索增强生成,也就是 Retrieval-Augmented Generation,RAG。RAG 的解决办法很简单,既然大模型缺乏一些信息,就从外部把这些信息检索出来,连着问题一块告诉大模型,它就可以从中推理出答案。

这里有一个关键问题,是怎么找到与输入问题相关的信息。我想知道广智是谁,检索到的内容里面,应该包含与广智相关的内容。

RAG 技术用向量之间的相似性来表示文本内容的相似性。使用文本嵌入模型把文本内容转换成向量,再计算向量之间的距离。根据向量之间的距离,来判断内容的相似性。这些并不需要自己来实现,可以直接使用已有的向量数据库。随着 RAG 技术的流行,目前市面上的向量数据库非常多,包括开源的和商用的。可以部署在自己的内部环境上,也可以直接用云平台的服务。

具体到“广智是谁”的例子,首先把整本西游记的小说切分这若干个分块,保存到向量数据库中,作为查询时的参考内容。在保存时,使用文本嵌入模型计算出文本内容的向量。在检索时,把用户的问题也使用同样的文本嵌入模型转换为向量,再与向量数据库中保存的向量,逐个计算两者的距离,把距离最近的几个向量找出来。所对应的内容,就是作为结果的相似内容了。

当然了,这只是示意的说明。在真正的实现中,向量数据库会采用更高效的算法来获取到相似的内容。

检索到的相似内容,与用户输入的问题组合在一起,发送给大模型,大模型就知道怎么回答问题了。

下面是一个发送给大模型的提示模板,其中 { 参考内容 } 表示从向量数据库检索到的相似内容,{ 用户输入 } 表示用户的原始输入。

根据参考资料的内容,回答下面的问题:


参考资料:{ 参考内容 } 
问题:{ 用户输入 } 
回答:

在广智是谁这个例子中,问题是“广智是谁”,检索到的最相似的是西游记第十六回中的内容。有了这段内容,大模型就知道广智是谁了。

这是 Claude 的回答。

cb4b124186073a40f3075a358e893449.png

这是 ChatGPT 的回答。

5a5dbb036162e5143fba55b8629f051f.png

这样的回答就挺像回事了。


即便有了参考内容,也需要强大一点的大模型,才能给出合理的结果。我测试了几个不同的大模型的不同参数版本,输出的结果很有意思。

通义千问 2.5 的 0.5b 参数版本,给出的结果很简单。

2abe4e8344e35c13ad6289f030cec25a.png

Llama 3.2 的 1b 和 3b 参数版本,坚持认为广智是个唐朝人,同时出现在三国演义中。

21075ec988cdcc485b603505207b08ba.png

1f47849c772ad47190701a27177042dd.png

通义千问 2.5 的 3b 和 7b 参数版本,所给出的回答才多少像那么回事了。

309068dffc7ae90b717dc4ba83ddc7e1.png

c6bdd17eb574e77204b60ad916acd62b.png

完整的示例应用,使用 Java 和Spring AI 开发,代码在 GitHub (alexcheng1982/journey-to-west-rag)。

如果你对使用 Java 和 Spring AI 开发 RAG 技术感兴趣,可以关注一下我的付费课程:AI 大模型的检索增强生成 - Spring AI 实现 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值