01
解构RAG
1.Context
最近,OpenAI的联合创始人Andrej Karpathy提出了一个观点,他认为大型语言模型(LLM)就像是一个新型操作系统的核心处理器。就像现代计算机系统具备内存(RAM)和文件系统访问能力一样,LLM也拥有一个名为Context Window的功能,它能够整合并加载来自不同数据源的信息。如下图所示。
这些信息被整合进Context Window之后,便用于辅助LLM生成输出内容,这一过程被广泛称为检索增强生成(RAG)。在LLM应用开发领域,RAG是一个关键概念,因为它提供了一种简洁有效的方式来向LLM传递外部数据,这在某些方面比复杂的微调过程更为高效。一个典型的RAG系统通常包括以下几个步骤:首先,确定用户提出的问题中需要检索的信息;其次,从相应的数据源中检索这些信息;最后,将这些信息作为提示词(prompt)的一部分,直接输入到LLM中。
2.挑战
随着检索增强生成(RAG)技术的普及,它也带来了一系列新的挑战!用户常常面临如何着手以及如何有效利用各种策略的困惑。接下来,我们将深入探讨一些关键概念和最新进展,旨在为大家提供清晰的指导和实用的解决方案。
3.查询转换
考虑RAG落地时要问的第一个问题是:我们如何使检索对用户输入的变异性稳健?
查询扩展
例如,用户的问题可能措辞不当,不严谨。查询转换是一套专注于修改用户输入以改善检索的方法。下面我们想象一个应用场景,用户的问题是:
“谁最近赢得了冠军,红袜队还是爱国者队?”
回答这个问题可以通过询问两个具体的子问题中而获得更加精准的答案:
“红袜队上一次赢得冠军是什么时候?”
“爱国者队上一次赢得冠军是什么时候?”
查询扩展将输入分解为子问题,每个子问题都是范围更小更加具体的检索挑战。multi-query retriever执行子问题生成、检索,并返回检索到的文档。
查询重写
针对用户输入可能存在框架或表述问题的情况,Rewrite-Retrieve-Read(RRR)方法通过重构用户的问题来提升检索质量。这种方法可以帮助系统更好地理解用户的意图,并提供更准确的信息。
查询压缩
在一些RAG应用程序中,如WebLang(open source research assistant),用户问题遵循更广泛的聊天对话。为了正确回答问题,可能需要完整的对话上下文。为了解决这个问题,我们使用此 提示 将聊天历史记录压缩为最后一个问题以供检索。
4.Routing(路由)
在实际部署RAG时,我们需要考虑的第二个关键问题是:数据的来源在哪里?在许多RAG的演示案例中,数据往往集中在一个单一的数据存储系统中,但在实际的生产环境中,情况往往更为复杂。当数据分散在多个不同的数据存储中时,就需要一个有效的路由机制来处理传入的查询。
5.查询构建
在实施RAG时,第三个需要考虑的问题是:如何构建有效的查询语法以检索数据?尽管用户的问题通常以自然语言的形式提出,但数据通常存储在关系型数据库、图数据库等结构化数据源中,这些数据源要求使用特定的查询语言。即使是向量存储系统,也需要利用结构化的元数据来进行数据过滤。在所有这些情况下,自然语言查询都需要被转换成相应的查询语法。
文本到SQL
许多研究工作致力于将自然语言问题转换为SQL查询。通过向大型语言模型(LLM)提供自然语言问题和相关表格信息,可以轻松实现文本到SQL的转换。开源的LLM能够胜任这类任务。
文本到Cypher
虽然向量存储系统擅长处理非结构化数据,但它们无法理解向量之间的复杂关系。尽管SQL数据库能够建模数据关系,但数据库模式的变更可能带来破坏性影响且成本较高。知识图谱通过建模数据间的关系并扩展关系类型来应对这些挑战,尤其适用于那些难以用表格形式表示的复杂关系或层次结构数据。
文本到Metadata Filter
配备了元数据过滤器的向量存储系统能够对嵌入的非结构化文档进行结构化查询。自查询检索器(self-query retriever)可以利用向量存储中的元数据字段规范,通过元数据过滤器将自然语言转换为结构化查询。
6.索引
在部署RAG时,第四个需要考虑的问题是:如何设计索引?对于向量存储系统,可以通过调整块大小和文档嵌入策略等参数来优化索引,以支持不同类型的数据。例如,OpenAI的RAG策略通过在文档嵌入过程中调整块大小,显著提升了性能。这是因为块大小决定了可以加载到上下文窗口(类似于LLM操作系统中的“RAM”)的信息量。鉴于索引构建是核心步骤,推荐使用开源的Streamlit应用程序进行优化。
文档嵌入策略
在索引设计中,一个简单而有效的方法是对检索和答案合成使用不同的嵌入内容。例如,对于包含大量冗余细节的文本,可以采用不同的嵌入策略来改善检索效果。
多向量检索
这种方法同样适用于包含文本和表格的半结构化文档。在这种情况下,可以提取每个表格,生成适合检索的摘要,然后将原始表格传递给LLM进行答案合成。
7.Post-Processing(后处理)
在实际应用RAG时,我们需要考虑的最后一个问题是:如何整合检索到的大量文件?这是关键的,因为内容窗口(Content Windows)的容量是有限的。
重新排名
在处理大量检索结果时,Cohere ReRank端点可以用来精炼文档,减少冗余信息。类似地,RAG-fusion技术能够对检索器返回的精炼文档进行再排序(类似于处理多查询的结果)。
分类
OpenAI会根据检索到的每个文档内容进行分类,然后根据这些分类选择相应的提示词。这种基于标签的内容标记方法,用于逻辑路由(在这种情况下,用于生成提示词)。接下来,我们将探讨RAG与LLM微调的对比,以确定在何时使用RAG,何时采用LLM微调。
02
与LLM微调(fine-tune)对比
RAG和LLM微调各自为大模型提供了实时性和减少幻觉行为的优势,同时也存在各自的劣势。微调有助于让大模型专注于特定领域、词汇或新数据,但这个过程耗时且需要大量计算资源,且存在遗忘旧知识的风险,同时也难以适应互联网的快速变化。RAG则通过利用外部知识库来增强事实性和时效性,尽管它仍然需要面对如何优化检索策略的挑战。
尽管这两种方法都无法完全解决LLM的所有问题,但它们都能在一定程度上提供即时的解决方案。随着LLMs在我们的数字生活中扮演越来越重要的角色,我们可以预见到未来将有更多的尝试将微调、RAG以及其他信息检索技术结合起来,以提供给LLMs更及时、更准确的知识。目前,Meta的研究人员已经开发出了RA-DIT模型,在零样本和少量样本学习领域实现了最先进的性能。想要了解更多详细信息, 请关注我们的课程《LLM外部智能大脑-向量化、RAG、Langchain、Agent技术》。如需进一步咨询,请联系课程老师。
参考文章:
https://www.rungalileo.io/blog/optimizing-llm-performance-rag-vs-finetune-vs-both
https://zhuanlan.zhihu.com/p/676381098
https://blog.langchain.dev/deconstructing-rag/
《LLM外部智能大脑-向量化、RAG、Langchain、Agent技术》
超越大语言模型的局限,开发智能外部大脑
课程亮点
l 学习如何让大模型 拥有专业知识和记忆能力 ;
l 学习通过向量化 连接外部知识;
l 掌握检索增强生成RAG技术;
l 掌握langchain、 MemGPT、Autogen 工具的使用方法;
l 掌握Agent技术;
l 学习构建prompt、设计复杂流程、链接矢量数据库;
l 实现SalesGPT这样的专业商务助手 ;
l 基于LangChain+GPT-4v实现多模态内容查询问答示例;
l Self-RAG高阶技术。
课程形式
录播课学习,共计50课时(约7-8小时),PC端、小程序、APP均可看课,一对一答疑。