avatar

Jacob Morrow

2023-10-20 15:34:54

7211 浏览, 5 min 阅读

简要介绍一下RAG

RAG的一般流程

什么是RAG(retrieval augmented generation)系统?我们用一个简单的场景来说明:在GPT中,用户输入问题,例如让GPT总结几百字的中心思想,GPT可以很快做出答复。但是用户如果用户输入几十万字,GPT就没法处理了。这是现在大语言模型的通病,由于模型设计机制和目前机器的限制,一般的大语言模型只能接受几千-几万个字符的输入。目前虽然有些模型能够通过一些微调方法,例如稀疏注意力,滑动窗口等方法支持20万字级别字符的输入,但是这些方法仍然有一些局限性,例如有些模型输入文本越长,输出效果就越差。而且在现实情况中,用户可能需要在很多个文档中进行查询,这样需要输入的问题长度可能达到几百万几千万字,GPT等LLM(大语言模型)是无力解决这个问题的。

而RAG可以很好地解决这一点,它的方法很简单,如下所示,用户上传文档,我们先将文档解析成文本,然后将文档切成几百字的小切片,然后将切片进行进一步处理(例如将文本转成embedding,我会在后面解释这个概念),存储在向量数据库里。用户问问题时,我们将用户的问题转换成embedding去查询向量数据库,查到和用户问题最相似的几个文本,然后让LLM参考这些文本进行总结。

用更通俗易懂的原理来解释我们为什么要做RAG。假设我们有一个大三学生,他要在没有任何准备的情况下参加一门期末考试。但是我们给他一个宽松的条件,就是把参考资料给他,允许他随时查阅,这些资料就是用户上传的文档,将文档切片相当于把这些资料分成很多的条目,存向量数据库相当于按一定方式把这些条目进行分类,当遇到用户的考试题目时,学生就翻阅这些条目,参考查到的信息给出回复。

RAG还是微调?

我们还有另外一种方法让模型学到文档的信息,这种方法叫微调。微调的原理是通过将文本输入模型,让模型内部的参数发生改变来学习到这些文档的词与词之间的联系。相比于RAG,微调更能学习到输入文本的语言风格,但是RAG对知识的提取性比较好。而且这两者并不是互斥的,还是以上面大三学生为例,RAG相当于他不做任何准备参加开卷考试,而微调相当于让他学习一个学期后参加闭卷考试,虽然他经过学习能够理解课程,但是可能会出现有些细节遗忘了而回答不准。如果同时做了RAG和微调,相当于学习了一个学期,有了一定理解后参加开卷考试。

但是微调相比RAG而言,需要花费大量的算力资源和时间进行训练。而RAG的实现的成本较低。RAG的难点在于如何优化。对此,我们公司将RAG流程整合进新推出的产品GPTbots,并对RAG流程做了如下优化:

GPTBots如何对RAG流程进行优化

主要优化点

总体来说,我们做了这些优化,分为两块:

文件解析和文档切片:

  • 用一定的规则对表格类文件进行更好的切分。
  • 采用更好的embedding模型来进行匹配。
  • 将embedding搜索和关键词搜索结合起来。
  • 比embedding搜索和关键词更好的方案
  • 对prompt进行规范化,以取得更好的搜索效果。

对表格逐行行切分并分别存储

对于CSV等表格类的文件,我们需要不同的处理方法,因为表格类文件的每一行都代表了信息。我们的处理方法是将每一行的数据都切分,用户可以自定义标题是哪几行,我们将标题行和每一个数据存进一个切片。

举个例子,假如我们有如下表格数据:

我们会一行一行地将它们读成如下切片,分别写了表格,这样用户在问某行某列相关的信息时,我们就能快速定位到对应切片并做出相应回答: