当前位置:首页|资讯|ChatGPT|Copilot

10.如何让大模型回答更准确?RAG检索增强生成是个好办法

作者:人工智能大讲堂发布时间:2024-03-26


在前面多轮对话聊天机器人中,为了得到更准确的回答,我们将历史聊天记录作为上下文传递给大模型,逐渐地,这种模式发展成为RAG,也就是检索增强生成。

像ChatGPT这类大模型,它的原理是学习训练数据的分布来生成新内容,在训练数据不足或者上下文不充分的情况下,就会产生幻觉,也就是胡编乱造;除了幻觉问题,如果你问它最近的新闻,它可能完全不知道,因为它的训练数据只包括一两年以前的。

为了解决这个问题,像Copilot或者Kimi Chat都会先搜索互联网,然后根据搜索内容进行回答,我们称这种模式为搜索增强生成

除了搜索互联网数据,也可以搭建本地知识库,这种模式被称为RAG,或者检索增强生成。也就是让大模型基于本地知识库中的内容进行回答。

上面这张图展示了构成RAG的模块以及它们之间的交互。

我们使用llama-index这个开源库搭建知识库,其它与大模型交互的部分仍然使用langchain。

为了方便演示,我们使用鲁迅的《藤野先生》作为知识库中的内容,假设我们把txt放到了./data/tysir目录下。仅通过下面这几句代码就搭建好了知识库。

输出结果:

首先,我们通过一个叫做SimpleDirectoryReader的数据加载器加载目录,目录里面的每一个文件,都会被当成是一篇文档。

然后,我们将所有的文档交给了 GPTSimpleVectorIndex 构建索引。顾名思义,它会把文档分段转换成一个个向量,然后存储成一个索引。

如果不知道如何将文本段转换成向量,请回头看看下面这篇文章。


最后,把对应的索引存下来,存储的结果就是一个json文件。后面,我们就可以用这个索引来进行相应的问答。


结果:

要进行问答也没有几行代码,我们通过 GPTSimpleVectorIndex 的 load_from_disk 函数,可以把刚才生成的索引加载到内存里面来。然后对着Index索引调用Query函数,就能够获得问题的答案。可以看到,通过外部的索引,我们可以正确地获得问题的答案。

Query函数先计算"鲁迅先生在日本学习医学的老师是谁?"的Embedding向量,然后与index_mr_fujino.json中索引挨个计算余弦夹角。取出距离最近的索引内容作为context_str与用户问题query_str按照一定格式组织成prompt传递给大模型。

总结:

本文通过langchain和llama-index搭建了一个RAG系统。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1