参考论文:https://arxiv.org/pdf/2409.14924v1
我本篇文章会整合到github的repo文章:
https://github.com/xinyuwei-david/david-share/tree/master/LLMs/RAG-Best-Practice
虽然4o和O1很强,但它的知识也不可能是最新的。以往我们介绍LLM使用中的工程化技术,往往把prompt engineering、RAG以及微调三者当成并行的手段,实际上这三种技术可以结合。我阅读的这篇论文思路就很好,把RAG分为四个阶段。
一、显性事实查询(Explicit Fact Queries)
1.1 特点
简单性:直接从提供的数据中检索明确的事实信息,无需复杂的推理或多步处理。
需求:高效、准确地检索相关内容,并生成精确的回答。
1.2 技术与工程建议
a. 基本的RAG方法
数据预处理与分块(Chunking):将长文本或文档进行适当的分块,便于索引和检索。常用的分块策略包括:
固定长度分块:将文本按固定长度切分,但可能会打断句子或段落。
基于段落或语义的分块:根据文本的自然段落或语义边界进行分块,保持内容的完整性。
索引构建:
稀疏索引:使用传统的信息检索方法,如TF-IDF、BM25,基于关键词匹配。
密集索引:使用预训练的语言模型(如BERT)生成文本向量嵌入,进行向量检索。
检索技术:
利用向量相似度计算或关键词匹配,从索引中检索与查询最相关的文本片段。
答案生成:
将检索到的文本片段作为上下文,输入到LLM中,生成最终的回答。
b. 改进检索和生成阶段多模态数据处理:如果数据包含表格、图片等非文本信息,需要将其转换为文本形式,或使用多模态模型进行处理。
检索优化:
递归检索:当一次检索不足以找到答案时,可进行多轮检索,逐步缩小范围。
检索结果重排序:使用模型对检索结果进行评分或重排序,优先使用最相关的内容。
生成优化:
过滤无关信息:在生成阶段前,过滤掉与问题无关的检索内容,避免干扰模型生成。
控制回答格式:通过精心设计的提示,确保模型生成的答案格式正确,内容准确。
1.3 工程实践示例
示例:构建一个问答系统,回答关于公司产品的常见问题
数据准备:
收集所有产品的相关文档、FAQ、使用手册等。
对文档进行清洗、分块和索引。
系统实现:
用户提出问题后,使用密集向量检索,从索引中找到最相关的文本片段。
将检索到的片段作为上下文,输入到LLM,生成回答。
优化策略:
定期更新文档和索引,确保信息的时效性。
监控用户反馈,改进检索策略和提示设计,提高回答质量。
二、隐性事实查询(Implicit Fact Queries)
2.1 特点
复杂性增加:需要对检索到的数据进行一定程度的推理或多步推导。
需求:模型需要将问题分解为多个步骤,分别检索和处理,然后综合得到答案。
2.2 技术与工程建议
a. 多跳(Multi-hop)检索和推理
迭代式RAG:
IRCoT(Iterative Retrieval Chain-of-Thought):利用链式思维,引导模型在每一步检索相关信息,逐步逼近答案。
RAT(Retrieve and Answer with Thought):在回答过程中,引入检索步骤,使模型在需要时检索新的信息。
问题分解:
将复杂问题分解为更简单的子问题,分别检索和回答,然后综合结果。
b. 图结构或树结构的检索和推理构建知识图谱:
从数据中抽取实体和关系,构建知识图谱,帮助模型理解复杂的依赖关系。
图搜索算法:
使用深度优先搜索(DFS)或广度优先搜索(BFS)等算法,在知识图谱中寻找与问题相关的路径或子图。
c. 使用SQL等结构化查询文本到SQL的转换:
将自然语言问题转换为SQL查询,从结构化数据库中获取答案。
工具支持:
使用现有的文本到SQL转换工具,如Chat2DB,实现自然语言到数据库查询的转换。
2.3 工程实践示例
场景:用户询问“过去五年中,公司X的股价在哪些季度超过了公司Y?”
问题分解:
获取公司X和公司Y过去五年的季度股价数据。
比较每个季度的股价。
找出公司X股价超过公司Y的季度。
实现步骤:
Step 1:使用文本到SQL工具,将自然语言转换为SQL查询,检索数据库中相关的数据。
Step 2:利用编程语言(如Python)处理和比较数据。
Step 3:将结果整理成用户可读的格式。
回答生成:将整理好的结果作为上下文,输入到LLM中,生成自然语言的回答
三、可解释的推理查询(Interpretable Rationale Queries)
3.1 特点
需要应用领域特定的规则和指南:模型需要理解并遵循这些规则,通常未在预训练数据中涵盖。
需求:将外部的规则、指南或流程整合到模型中,使其在回答时能够按照指定的逻辑和步骤进行。
3.2 技术与工程建议
a. 提示工程(Prompt Engineering)和提示优化
设计有效的提示:
在提示中明确提供规则或指南,让模型按照指定的步骤进行回答。
自动化提示优化:
使用优化算法(如强化学习)自动搜索和优化提示,提高模型在特定任务上的表现。
OPRO(Optimization with Prompt Rewriting)
通过模型自身生成和评估提示,迭代优化,找到提示组合。
b. 链式思维(Chain-of-Thought, CoT)提示引导模型进行多步骤的推理:
在提示中要求模型展示推理过程,确保其按照指定的逻辑思考。
手动设计或自动生成CoT提示:
根据任务需求,设计合适的CoT提示,或者使用算法自动生成。
c. 遵循外部流程或决策树将规则和流程编码为可执行的格式:
将决策流程转换为状态机、决策树或伪代码,供模型执行。
模型调整:
使模型能够解析和执行这些编码的规则。
3.3 工程实践示例
示例:客服机器人处理退货请求
-
场景:客户要求退货,客服机器人需要根据公司的退货政策,指导客户完成相应流程。
技术实现:
规则整合:将公司的退货政策和流程整理成清晰的步骤或决策树。
提示设计:在提示中包含退货政策的关键点,要求模型按照步骤指导客户。
模型执行:LLM根据提示,按照退货流程与客户交互,提供明确的指引。
优化策略:
提示优化:根据客户反馈,调整提示,使模型更准确地理解和执行退货流程。
多轮对话:支持与客户的多轮对话,处理各种可能的问题和异常情况。
四、隐藏的推理查询(Hidden Rationale Queries)
4.1 特点
最高的复杂性:涉及领域特定的、未明确指出的推理方法,模型需要从数据中发现并应用这些隐含的逻辑。
需求:模型必须具备从大量数据中挖掘模式和推理方法的能力,类似于领域专家的思维过程。
4.2 技术与工程建议
a. 离线学习和经验积累
从数据中学习模式和经验:
通过训练模型,让其从历史数据、案例中归纳出潜在的规则和逻辑。
自监督学习:
-
使用模型生成的推理过程(如Chain-of-Thought),作为辅助,优化模型的推理能力。
b. 上下文学习(In-context Learning, ICL) 提供示例和案例:
在提示中包含相关的示例,让模型参考类似案例进行推理。
检索相关案例:
使用检索模块,从数据库中找到与当前问题类似的案例,提供给模型。
c. 模型微调领域特定的微调:
使用大量的领域数据,对模型进行微调,使其内化领域知识。
强化学习:
使用奖励机制,鼓励模型产生符合期望的推理过程和答案。
4.3 工程实践示例
示例:法律助理AI处理复杂案件
-
场景:用户咨询一项复杂的法律问题,AI需要提供建议,引用相关法律条款和判例。
技术实现:
数据准备:收集大量的法律文档、案例分析、专家意见等。
模型微调:使用法律领域的数据,对LLM进行微调,使其具备法律推理能力。
案例检索:使用RAG,从数据库中检索与当前案件类似的判例和法律条款。
答案生成:将检索到的案例和条款作为上下文,输入到微调后的LLM中,生成专业的法律建议。
优化策略:
持续学习:定期更新模型,加入新的法律案例和法规变化。
专家审核:引入法律专家对模型的输出进行审核,确保准确性和合法性。
五、综合考虑:微调LLM与RAG的结合
虽然微调LLM可以增强模型的推理能力和领域适应性,但并不能完全替代RAG的作用。RAG在处理动态、海量、实时更新的知识方面具有独特的优势。将微调和RAG结合起来,可以发挥各自的优势,使模型既具备强大的推理能力,又能够访问最新和完整的外部知识。
5.1 结合的优势
增强推理能力:通过微调,模型学习到领域特定的推理方法和逻辑。
实时访问知识:RAG允许模型在生成答案时,实时检索最新的外部数据。
灵活性和可扩展性:RAG系统可以方便地更新数据源,无需重新训练模型。
5.2 实际应用建议
针对复杂任务,综合使用微调和RAG:利用微调提升模型的推理和逻辑能力,同时通过RAG获取具体的知识和信息。
评估投入产出比:考虑微调的成本和收益,针对核心的推理能力进行微调,而将知识获取交给RAG处理。
持续更新和维护:建立RAG系统的数据更新机制,确保模型获取的外部数据是最新和准确的。
