RAG优化技巧 | 7大挑战与解决方式 | 提高你的LLM:下篇
在当今快速发展的人工智能领域,大型语言模型(LLM)已经成为无处不在的技术,它们不仅改变了我们与机器交流的方式,还在各行各业中发挥着革命性的影响。
然而,尽管LLM + RAG的能力已经让人惊叹,但我们在使用RAG优化LLM的过程中,还是会遇到许多挑战和困难,包括但不限于检索器返回不准确或不相关的数据,并且基于错误或过时信息生成答案。因此本文旨在提出RAG常见的7大挑战,并附带各自相应的优化方案,期望能够帮助我们改善RAG。
下图展示了RAG系统的两个主要流程:检索和查询;红色方框代表可能会遇到的挑战点,主要有7项:
- \1. Missing Content: 缺失內容
- \2. Missed Top Ranked: 错误排序內容,导致正确答案沒有被成功 Retrieve
- \3. Not in Context: 上限文限制,导致正确答案沒有被采用
- \4. Wrong Format: 格式错误
- \5. Incomplete: 回答不全面
- \6. Not Extracted: 未能检索信息
- \7. Incorrect Specificity: 不合适的详细回答
由于篇幅比较长,上一篇我们谈了前 3 项, 这一篇我们谈谈剩余的 4 种策略:
格式错误
当我们使用prompt
要求LLM
以特定格式(如表格或列表)提取信息,但却被LLM
忽略时,可以尝试以下3种解决策略:
1. 改进prompt
我们可以采用以下策略来改进 prompt
,解决这个问题:
A.明确说明指令
B.简化请求并使用关键字
C.提供示例
D.采用迭代提示,提出后续问题
2. 输出解析器
输出解析器负责获取LLM
的输出,并将其转换为更合适的格式,因此当我们希望使用LLM生成任何形式的结构化数据时,这非常有用。它主要在以下方面帮助确保获得期望的输出:
A. 为任何提示/查询提供格式化指令
B. 对大语言模型的输出进行 解析 。
Langchain
提供了许多不同类型Output Parsers
的流接口,以下是示范代码,具体细节请参阅官方文档[1]。
3. Pydantic parser
Pydantic
是一个多功能框架,它能够将输入的文本字符串转化为结构化的Pydantic
物件。Langchain
有提供此功能,归类在Output Parsers
中,以下是示范code
,可以参考官方文件[2]。
回答不完整
有时候 LLM 的回答并不完全错误,但会遗漏了一些细节。这些细节虽然在上下文中有所体现,但并未被充分呈现出来。例如,如果有人询问“文档A、B和C主要讨论了哪些方面?”对于每个文档分别提问可能会更加适合,这样可以确保获得更详细的答案。
查询转换
提高 RAG
系统效能的一个策略是添加一层查询理解层,也就是在实际进行检索前,先进行一系列的 Query Rewriting
。具体而言,我们可以采用以下四种转换方法:
1.1 路由:在不改变原始查询的基础上,识别并导向相关的工具子集,并将这些工具确定为处理该查询的首选。
1.2 查询重写:在保留选定工具的同时,通过多种方式重构查询语句,以便跨相同的工具集进行应用。
1.3 子问题:将原查询拆解为若干个更小的问题,每个问题都针对特定的工具进程定向,这些工具是根据它们的元数据来选择。
1.4 ReAct
代理选择器:根据原始查询判断最适用的工作,并为在该工作上运行而特别构造了查询。
Llamaindex
已经为这个问题整理出了一系列方便操作的功能,请查看官方文件[3];而Langchain
的大部分功能则散落在Templates
中,例如HyDE的实现和论文内容。以下是使用Langchain
进行HyDE的示例:
from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import LLMChain, HypotheticalDocumentEmbedder
from langchain.prompts import PromptTemplate
base_embeddings = OpenAIEmbeddings()
llm = OpenAI()
# Load with `web_search` prompt
embeddings = HypotheticalDocumentEmbedder.from_llm(llm, base_embeddings, "web_search")
# 现在我们可以将其用作任何嵌入类!
result = embeddings.embed_query("Where is the Taj Mahal?")
Not Extracted(未能检索信息)
当RAG
系统面对众多信息时,往往难以准确提取出所需的答案,关键信息的遗漏降低了回答的质量。研究显示,这种情况通常发生在上下文中存在过多干扰或矛盾信息时。以下是针对这一问题提出的三种解决策略:
1. 数据清洗
数据的质量直接影响到检索的效果,这个痛点再次突显了优质数据的重要性。在责备你的 RAG
系统之前,请确保你已经投入足够的精力去清洗数据。
2. 信息压缩
提示信息压缩技术在长上下文场景下,首次由 LongLLMLingua
研究项目提出,并已在 LlamaIndex
中得到应用,相对 Langchain
的资源则较零散。现在,我们可以将 LongLLMLingua
作为节点后处理器来实施,这一步会在检索后对上下文进行压缩,然后再送入 LLM
处理。
以下是在 LlamaIndex
中使用 LongLLMLingua
的示范,其他细节可以参考官方文件[4]:
3. LongContextReorder
这在第二个挑战,Missed Top Ranked中有提到,为了解决LLM在文件中间会有「迷失」的问题,它通过重新排序检索到的节点来优化处理,特别适用于需要处理大量顶级结果的情形。细节示范可以参考上面的内容。
不正确的具体性(Incorrect Specificity)
有时,LLM 的回答可能不够详细或具体,用户可能需要进行多次追问才能得到清晰的解答。这些答案可能过于笼统,无法有效满足用户的实际需求。
因此,我们需要采取更高级的检索策略来寻找解决方案。
当我们发现回答缺乏期望的详细程度时,通过优化检索策略可以显著提升信息获取的准确性。LlamaIndex 提供了许多高级检索技巧,而Langchain 在这方面资源较少。以下是一些在 LlamaIndex 中能够有效缓解此类问题的高级检索技巧:
- • Auto Merging Retriever[5]
- • Metadata Replacement + Node Sentence Window[6]
- • Recursive Retriever[7]
总结
本文探讨了使用 RAG
技术时可能面临的七大挑战,并针对每个挑战提出了具体的优化方案,以提升系统准确性和用户体验。
- • 缺失内容:解决方案包括数据清理和提示工程,确保输入数据的质量并引导模型更准确地回答问题。
- • 未识别出的最高排名:可通过调整检索参数和优化文件排序来解决,以确保向用户呈现最相关的信息。
- • 背景不足:扩大处理范围和调整检索策略至关重要,以包含更广泛的相关信息。
- • 格式错误:可以通过改进提示、使用输出解析器和
Pydantic
解析器实现,有助于按照用户期望的格式获取信息。 - • 不完整部分:可通过查询转换来解决,确保全面理解问题并作出回应。
- • 未提取部分:数据清洗、消息压缩和
LongContextReorder
是有效的解决策略。 - • 特定性不正确:可以通过更精细化的检索策略如 Auto Merging Retriever、元数据替换等技巧来解决问题,并进一步提高信息查找精度。
通过对 RAG
系统挑战的深入分析和优化,我们不仅可以提升LLM
的准确性和可靠性,还能大幅提高用户对技术的信任度和满意度。
希望这篇能帮助我们改善我们的 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 的正确特征了。