原文:https://zhuanlan.zhihu.com/p/13962398269
RAG(Retrieval-Augmented Generation)之所以被关注,有两方面原因:
1、没有跑大模型的资源:大多数人没有GPU集群搞LLM的预训练。
2、大模型缺乏知识:大模型往往缺乏某些知识,如私域或最新的知识。
RAG方法让LLM能够获取内化知识之外的信息,并允许LLM在专业知识库的基础上,以更准确的方式回答问题,并且不会特别消耗资源。
在大模型时代,是用于解决幻觉问题、知识时效问题、超长文本问题等各种大模型本身制约或不足的必要技术。
RAG主要通过检索语义匹配的文档,然后将文档知识传递给大模型,基于大模型推理获取争取的答案。RAG可以减少预训练LLM或者通用LLM的幻觉问题,消除文档标注。
通常,基于RAG的LLM应用可以表述为一个映射过程,即基于给定数据D,将用户输入(查询Q)映射到预期响应(答案A)。
本文总结了RAG的整体技术方案及过去2年在RAG实践成果,希望本文总结对大家有一定的帮助。
1. RAG的问题与挑战
但是,不少人提出RAG的“原罪”--一周出demo,半年用不好。主要存在如下7方面的问题:
问题1:内容缺失(Missing Content)。提问的问题,无法在被检索文档库中找到,最准确的答案是缺失的。理想情况下,RAG系统回应应该是“抱歉,我不知道答案”。然而,对于检索内容相关但没有相关答案的问题,系统可能被误导,给出一个respone。
问题2:检索的TopK内容缺失(Missed the Top Ranked Documents)。问题的答案在文档库中,但排名得分不够高,无法返回给用户。理论上,检索过程中所有文档都会被排名得分。然而,在实际操作中,会返回排名前K个文档,为了提高召回率,K不可能设置的无限大,必须基于LLM大模型的能力,折中选择的一个值。
问题3:未在上下文中(Not in Context) - 整合策略局限性。从数据库中检索到了包含答案的文档,但在生成答案的过程中,这些文档并未被纳入上下文。当数据库返回许多文档时,会进行整合过程以获取答案,此时会发生这种情况。
问题4:未提取(Not Extracted)答案存在于上下文中,但大型语言模型未能提取出正确的答案。通常,这是因为上下文中存在太多噪声或矛盾信息。简而言之,Retrival命名是对的,但是LLM根据Retrival回答问题出错。睁眼说瞎话的概率明显大于用户可以接受的概率(用户一般只能接收0.1%的错误概率)
问题5:错误格式(Wrong Format)。问题涉及以某种格式(如表格或列表)提取信息,而大型语言模型忽略了这一指示。
问题6:错误的特异性(Incorrect Specificity)。返回的答案包含在响应中,但不够具体或过于具体,无法满足用户需求。这种情况发生在RAG系统设计者对某个问题有期望的结果,例如教师对学生。在这种情况下,应该提供具体的教育内容和答案,而不仅仅是答案。当用户不确定如何提问并过于笼统时,也会出现特异性错误。
问题7:不完整(Incomplete)。不完整的答案并非错误,但缺少一些信息,尽管这些信息存在于上下文中并可供提取。
面对这些问题,我先对RAG技术的应用和优化提出整体开发建议和思路:
1、RAG系统的验证只能在运行过程中进行。
2、RAG系统的稳健性是演进而非一开始就设计好的。
2.RAG整体架构
2.1 产品架构
RAG技术应用的产品架构包含四层:
- 最底层是模型层。在模型层屏蔽掉了模型的差异,不仅可以支持自有私域的LLM,也可以支持线上商用大模型,第三方的模型。此外,embedding的优化,有效的解决语言表达差异导致的检索问题,同时提高了模型的效果。
- 离线理解层。该层主要围绕知识库和搜索增强两个模块设计的。关于智能知识库主要负责将非结构化的文本进行处理,从而转化为检索知识库,主要包括文本解析,表格读取,OCR识别等。搜索增强通过引入问句改写、重排等模块,保证检索的精准度。
- 在线问答层,为了满足产品设计和交互体验需要,这里支持多文档、多轮次、多模态等。
- 场景层(顶层应用),针对不同行业的特点,预制多种场景类角色,降低产品使用门槛。
2.2 技术架构
目前,LLM可以生成富有创意且连贯的文本,但它们可能会在事实准确性或与特定上下文的相关性方面遇到困难。检索增强生成结合了检索模型和生成模型优势,克服它们各自的局限性。 在此框架中,基于检索的模型用于根据给定的查询或上下文从知识库或一组文档中检索相关信息。 然后,检索到的信息将用作生成模型的输入或附加上下文。通过整合检索到的信息,生成模型可以利用基于检索的模型的准确性和特异性来生成更相关、更准确的文本。这有助于生成模型立足于现有知识,生成与检索信息一致的文本。
RAG检索增强生成框架分为三个主要组成部分:query理解、检索模块和生成模型。
- query理解:该模块旨在对用户的query进行理解或者将用户的query生成结构化的