自从2022年12月 ChatGPT 横空面世以来,AI 领域获得了十足的关注和资本,其实AI的概念在早些年也火过一波,本轮 AI 热潮相比于之前的 AI,最大的区别在于:生成式。通过海量文本训练的、能识别人类语言、执行语言类任务、拥有大量参数的模型,称之为大语言模型。GPT、LLaMA、Mistral、BERT等都是LLM,LLM是对训练文本信息的压缩,同时拥有了泛化能力,不同于数据库和搜索引擎,LLM能创造性地生成历史上没有出现过的文本内容。
虽然LLM很强大,但有以下缺点:
-
知识的局限性:模型自身的知识完全源于它的训练数据,当LLM训练完成后,本身数据已经固化,无法更新,对于一些实时性的、非公开的或离线的数据是无法获取的,周期性的微调耗时耗力。
-
幻觉问题:LLM模型在回答问题时,当遇到训练数据中不存在或存在较少的对话场景,会根据已有知识拼凑出答案,而这种答案很可能是不存在的、不正确的,称之为幻觉。无论训练数据有多大,随着使用使用场景的增加,幻觉问题不可避免。
-
数据安全性:对于企业来说,将自身数据完全训练至LLM模型中,一旦模型泄露会产生重大影响。
现如今解决上面缺点的一种方案就是RAG,即检索增强生成(Retrieval Augmented Generation)。RAG能够将私域数据独立于LLM外,但又能在问答过程中被LLM参考,提高LLM的知识储备和实时更新能力,这样也可以降低LLM幻觉问题。一句话总结:RAG(检索增强生成) = 检索技术 + LLM 提示。
但是RAG方案想真正落地到实际生产上,会遇到很多问题,为了解决这些问题,我们需要很多的优化方案,今天就来分享一些RAG领域常用的优化策略。
最近我们建立了交流群,感兴趣的朋友可以加群一起交流哈,二维码放在文末了
RAG 各模块有哪些优化策略?
-
文档块切分:设置适当的块间重叠、多粒度文档块切分、基于语义的文档切分、文档块摘要。
-
文本嵌入模型:基于新语料微调嵌入模型、动态表征
-
提示工程优化:优化模板增加提示词约束、提示词改写
-
大模型迭代:基于正反馈微调模型、量化感知训练、提供大context window的推理模型。
如何利用 知识图谱进行上下文增强?
在典型的RAG架构中,基于向量数据库进行上下文增强存在如下问题:
-
无法获取长程关联知识
-
信息密度低(尤其当LLM context window较小时不友好)
那么如何利用 知识图谱进行上下文增强呢?
-
一个比较好的方案是增加一路与向量库平行的KG(知识图谱)上下文增强策略。
-
另一种方案是利用NL2Cypher进行KG增加:根据query抽取实体,然后把实体作为种子节点对图进行采样(必要时,可把KG中节点和query中实体先向量化,通过向量相似度设置种子节点),然后把获取的子图转换成文本片段,从而达到上下文增强的效果。
如何有选择地进行知识库召回
经典的RAG模型通过提供与问题相关的上下文信息来支持LLM在回答知识密集型问题。然而,这种方法存在两个主要问题:
-
过度检索:RAG系统并不针对用户意图进行精细的判断,而是对每次输入都执行top-k的知识检索,可能导致引入不必要或偏离主题的信息,从而影响输出的质量。例如,当用户仅是打招呼时(如 “hello”),理想的做法是直接利用LLM的能力来回答,而不需要查询知识库
-
输出一致性问题:无法百分百确定回答的内容就是完全参考检索到的上下文还是来自模型自己的生成,因为大模型本身不能保证绝对的遵循,更何况知识的相关性也会存疑。
在实际应用RAG时,我们常常通过精细化的工作流程设计和创新性的Prompt调整来尽量缓解上述问题。具体来说:
-
我们可以利用LLM的能力,在执行检索步骤之前先判断是否真的需要进行检索。
-
在给出Prompt指令时,我们可以确保LLM严格按照找到的参考知识来形成答案。
-
我们还可能依赖LLM的强大能力对答案进行评估,经过多轮迭代优化,以提升答案的质量。
如何让RAG支持多模态
对多模态RAG而言有三种技术路线,如下我们做个简要说明:
-
选项1:对文本和表格生成summary,然后应用多模态embedding模型把文本/表格summary、原始图片转化成embedding存入多向量检索器。对话时,根据query召回原始文本/表格/图像。然后将其喂给多模态LLM生成应答结果。
-
选项2:首先应用多模态大模型(GPT4-V、LLaVA、FUYU-8b)生成图片summary。然后对文本/表格/图片summary进行向量化存入多向量检索器中。当生成应答的多模态大模型不具备时,可根据query召回原始文本/表格+图片summary。
-
选项3:前置阶段同选项2相同。对话时,根据query召回原始文本/表格/图片。构造完整Prompt,访问多模态大模型生成应答结果。
RAG Fusion 优化策略
思路:检索增强这一块主要借鉴了RAG Fusion技术,这个技术原理比较简单,概括起来就是,当接收用户query时,让大模型生成5-10个相似的query,然后每个query去匹配5-10个文本块,接着对所有返回的文本块再做个倒序融合排序,如果有需求就再加个精排,最后取Top K个文本块拼接至prompt。
优点:
-
增加了相关文本块的召回率;
-
对用户的query自动进行了文本纠错、分解长句等功能
缺点:无法从根本上解决理解用户意图的问题。
模块化 RAG 优化策略
动机:打破了传统的“原始 RAG”框架,这个框架原本涉及索引、检索和生成,现在提供了更广泛的多样性和更高的灵活性。
模块介绍:
-
搜索模块:融合了直接在(附加的)语料库中进行搜索的方法。这些方法包括利用大语言模型(LLM)生成的代码、SQL、Cypher 等查询语言,或是其他定制工具。其搜索数据源多样,涵盖搜索引擎、文本数据、表格数据或知识图等。
-
记忆模块:本模块充分利用大语言模型本身的记忆功能来引导信息检索。其核心原则是寻找与当前输入最为匹配的记忆。这种增强检索的生成模型能够利用其自身的输出来自我提升,在推理过程中使文本更加贴近数据分布,而非仅依赖训练数据。
-
额外生成模块:面对检索内容中的冗余和噪声问题,这个模块通过大语言模型生成必要的上下文,而非直接从数据源进行检索。通过这种方式,由大语言模型生成的内容更可能包含与检索任务相关的
信息。
-
任务适应模块:该模块致力于将 RAG 调整以适应各种下游任务。
-
对齐模块:在 RAG 的应用中,查询与文本之间的对齐一直是影响效果的关键因素。在模块化 RAG的发展中,研究者们发现,在检索器中添加一个可训练的 Adapter 模块能有效解决对齐问题。
-
验证模块:在现实世界中,我们无法总是保证检索到的信息的可靠性。检索到不相关的数据可能会导致大语言模型产生错误信息。因此,可以在检索文档后加入一个额外的验证模块,以评估检索到的
文档与查询之间的相关性,这样做可以提升 RAG的鲁棒性。
查询转换(Query Transformations)
-
动机:在某些情况下,用户的 query 可能出现表述不清、需求复杂、内容无关等问题;
-
查询转换(Query Transformations):利用了大型语言模型(LLM)的强大能力,通过某种提示或方法将原始的用户问题转换或重写为更合适的、能够更准确地返回所需结果的查询。LLM的能力确保了转换后的查询更有可能从文档或数据中获取相关和准确的答案。
-
查询转换的核心思想:用户的原始查询可能不总是最适合检索的,所以我们需要某种方式来改进或扩展它。
RAG 索引优化有哪些优化策略?
微调嵌入
-
影响因素:影响到 RAG 的有效性;
-
目的:让检索到的内容与查询之间的相关性更加紧密;
-
作用:可以比作在语音生成前对“听觉”进行调整,优化检索内容对最终输出的影响。特别是在处理不断变化或罕见术语的专业领域,这些定制化的嵌入方法能够显著提高检索的相关性。
检索处理流程
-
ReRank(重新排序)
-
Prompt 压缩
-
RAG 管道优化
-
混合搜索
-
递归检索与查询引擎
-
StepBack-prompt 方法
-
子查询
-
HyDE 方法
知识库召回率低
-
知识库里面是否有对应答案?如果没有那就是知识库覆盖不全问题
-
知识库有,但是没召回:
-
知识库知识是否被分割掉,导致召回出错,解决方法 修改分割方式 or 利用bert 进行上下句预测保证知识点完整性
-
知识没有被召回,分析 query 和 doc 的特点:字相关还是语义相关,一般建议是先用 es做召回,然后才用模型做精排
chunk大小指定多少
在构建RAG时,确定块大小是关键,它决定从向量存储中检索的文档长度。太小可能缺失关键信息,太大可能带来噪音。找到最佳块大小需要适当平衡,这通常通过反复试验来实现。不过,这并非随机尝试,而是通过在测试集上运行评估并计算指标来找出最佳值。LlamaIndex具有此类功能,详细信息可参考他们的博客。
如何通过 混合检索 提升 RAG 效果
虽然向量搜索有助于找到与查询语义相关的块,但在精确匹配关键词方面可能不足。比如,在数百万电商产品中搜“阿迪达斯 XYZ 参考白色运动鞋”,返回的都是白色阿迪达斯运动鞋,没有精确匹配XYZ参考。针对这种情况,混合检索能提供解决方案。它将矢量搜索和关键词搜索的优势结合起来,既能匹配相关关键字,又能保持查询意图的控制。想了解更多混合搜索信息,可查阅Pinecone的入门指南。
如何通过 重新排名 提升 RAG 效果
查询向量存储时,前K个结果可能并未按相关性排序。在这些相关块中,最相关的可能是第5或第7个,而非第1或第2个,这就需要重新排名。简单说,重新排名就是把最相关的信息调整到提示的前沿。这一概念已在LlamaIndex、LangChain和HayStack等多种框架中实现。比如,Diversity Ranker侧重于按文档多样性重新排序,而LostInTheMiddleRanker则在上下文窗口开始和结束间交替放置最佳文档。
RAG 如何 提升索引数据的质量
索引数据的质量直接影响RAG答案的质量,因此优先工作是在摄取数据前尽可能清理它们——垃圾入则垃圾出。这包括删除重复/冗余信息,识别不相关文档,及时校验事实的准确性。在使用过程中,对RAG的维护和更新过时文档也至关重要。在构建RAG时,我们常常忽视了清理数据这一步骤,直接倒入所有文档而未验证其质量。
以下我建议可以快速解决一些问题:
-
通过清理特殊字符、奇怪的编码、不必要的 HTML 标签来消除文本噪音……还记得使用正则表达式的老的NLP 技术吗?可以把他们重复使用起来;
-
通过实施一些主题提取、降维技术和数据可视化,发现与主题无关的文档,删除它们;
-
通过使用相似性度量删除冗余文档
如何通过添加元数据 提升RAG 效果
将元数据与索引向量结合使用有助于更好地构建它们,同时提高搜索相关性。
以下是一些元数据有用的情景:
-
如果你搜索的项目中,时间是一个维度,你可以根据日期元数据进行排序
-
如果你搜索科学论文,并且你事先知道你要找的信息总是位于特定部分,比如实验部分,你可以将文章部分添加为每个块的元数据并对其进行过滤仅匹配实验
元数据很有用,因为它在向量搜索之上增加了一层结构化搜索。
如何通过 输入查询与文档对齐 提升 RAG 效果
LLMs 和 RAGs 之所以强大,因为它们可以灵活地用自然语言表达查询,从而降低数据探索和更复杂任务的进入
门槛。然而,有时,用户用几个词或短句的形式作为输入查询,查询结果会出现与文档之间存在不一致的情况。通过一个例子来理解这一点。这是关于马达引擎的段落(来源:ChatGPT):
发动机堪称工程奇迹,以其复杂的设计和机械性能驱动着无数的车辆和机械。其核心是,发动机通过一系列精确协调的燃烧事件将燃料转化为机械能。这个过程涉及活塞、曲轴和复杂的阀门网络的同步运动,所有这些都经过仔细校准,以优化效率和功率输出。现代发动机有多种类型,例如内燃机和电动机,每种都有其独特的优点和应用。对创新的不懈追求不断增强汽车发动机技术,突破性能、燃油效率和环境可持续性的界限。无论是在开阔的道路上为汽车提供动力还是驱动工业机械,电机仍然是现代世界动态运动的驱动力。
在这个例子中,我们制定一个简单的查询,“你能简要介绍一下马达引擎的工作原理吗?”,与段落的余弦相似性
为 0.72。其实已经不错了,但还能做得更好吗?
为了做到这一点,我们将不再通过段落的嵌入来索引该段落,而是通过其回答的问题的嵌入来索引该段落。考虑这三个问题,段落分别回答了这些问题:
-
发动机的基本功能是什么?
-
发动机如何将燃料转化为机械能?
-
发动机运行涉及哪些关键部件,它们如何提高发动机的效率?
通过计算得出,它们与输入查询的相似性分别为:
-
0.864
-
0.841
-
0.845
这些值更高,表明输入查询与问题匹配得更精确。将块与它们回答的问题一起索引,有助于解决对齐问题并提高搜索相关性:我们不是优化与文档的相似性,而是优化与底层问题的相似性。
如何通过 提示压缩 提升 RAG 效果
研究表明,在检索上下文中的噪声会对RAG性能产生不利影响,更精确地说,对由 LLM 生成的答案产生不利影
响。一些方案建议在检索后再应用一个后处理步骤,以压缩无关上下文,突出重要段落,并减少总体上下文长度。
选择性上下文等方法和 LLMLingua 使用小型LLM来计算即时互信息或困惑度,从而估计元素重要性。
RAG 未来发展方向
RAG 的三大未来发展方向:垂直优化、横向扩展以及 RAG 生态系统的构建。
Rag 的垂直优化
尽管 RAG 技术在过去一年里取得了显著进展,但其垂直领域仍有几个重点问题有待深入探究:
-
RAG 中长上下文的处理问题
-
RAG 的鲁棒性研究
-
RAG 与微调(Fine-tuning)的协同作用
-
RAG 的工程应用
在工程实践中,诸如如何在大规模知识库场景中提高检索效率和文档召回率,以及如何保障企业数据安全——例
如防止 LLM 被诱导泄露文档的来源、元数据或其他敏感信息——都是亟待解决的关键问题。
RAG 的水平扩展
在水平领域,RAG 的研究也在迅速扩展。从最初的文本问答领域出发,RAG 的应用逐渐拓展到更多模态数据,
包括图像、代码、结构化知识、音视频等。
RAG 生态系统
• 下游任务与评估RAG通过集成广泛的知识库信息,展现了处理复杂查询和生成丰富回应的潜力。在开放式问题解答、事实验证等任务中,RAG表现出色。其应用不仅提升了信息准确性和相关性,还增强了回应的多样性和深度。特别在医学、法律和教育等专业领域,RAG能够以较低训练成本和优秀性能突显其价值。完善RAG评估体系,发展更精确的评估指标如上下文相关性、内容创新性等,以及提高模型可解释性,都是未来工作重点。
• 技术栈在RAG的技术生态中,相关技术栈的发展起着关键作用。ChatGPT的流行带动了LangChain和LLamaIndex等技术的发展,它们提供了丰富的RAG相关API,成为大模型时代的核心技术。同时,也有新兴技术栈涌现,如Flowise AI6专注于低代码操作,使用户可以简单地操控RAG各类AI应用。如HayStack、Meltno和Cohere Coral这样的新兴技术也在不断进步。随着技术栈的发展与优化,RAG技术也得到了推动。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。