检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?

论文地址:https://arxiv.org/pdf/2403.05313

Github地址:https://github.com/CraftJarvis/RAT

想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是,如果这个助手有时难以确保事实准确性,依赖过时的信息或只是编造事实,该怎么办?

检索增强思维 (RAT)是一种创新性的方法,它结合了两种关键技术:检索增强生成 (RAG) 和思维链 (CoT) 提示。大型语言模型 (LLM) 因其模仿人类写作和流畅回答问题的能力而变得流行。但有时,他们的回答需要以现实世界的知识为基础。RAT 通过提供一种革命性的人工智能推理方法来解决这个问题。让我们深入研究并了解 RAT 的代码!

在我们深入讨论之前,让我们先把整个提示分解一下。想象一下,你有这个超酷的人工智能助手,提示语是你用来告诉它你想要什么的目的。你可以让它为你写一个故事,翻译一种语言,或者以一种非常有信息量的方式回答一个问题,这一切都是为了给大模型一个清晰明确的提示。

最酷的部分是:提示工程让你能够激发大模型的全部潜力。你可以用它做各种各样的事情,从写出绝妙的诗歌到解决超级复杂的问题。此外,甚至还有一些高级技术,如一次性、零次、少量、思维链、指导性和迭代性提示,每种技术都适用于简单的任务和复杂的多步骤流程。

现在,我们来谈谈 RAT,这是一种结合了两种强大技术的新方法:检索增强生成 (RAG) 和思维链 (CoT)。让我们探索这两种技术如何将 大模型推理推理提升到新的高度。

检索增强生成 (RAG):知识注入器

想象一下,一个 LLM 正在研究一道数学题。RAG 就像一个乐于助人的导师。它允许 LLM 在推理过程中从外部来源(如公式或定理)获取相关信息。这确保了 LLM 的步骤以事实知识为基础,从而减少了出现奇思妙想解决方案的可能性。

思维链 (CoT):让思考变得可见

思路链提示:帮助大型语言模型展示其工作成果

大型语言模型 (LLM) 擅长生成文本,但它们在解决需要逐步推理的复杂问题(如解决文字问题)时会遇到困难。

CoT提示通过鼓励 LLM 解释他们的想法来解决这个问题。LLM不只是给出最终答案,而是通过将问题分解为更小的步骤来展示其“工作”。这就像在数学课上展示你的计算一样。

有两种方法可以让 LLM 使用 CoT 提示:

  • 零次提示:我们在提示本身中使用特殊的单词或短语,例如“让我们一步一步思考”,以促使 LLM 解释其推理。

  • 少量提示:我们向 LLM 展示一些如何解决类似问题的例子,其中清楚地解释了解决步骤。

然而,CoT 提示也存在一些挑战。

  • LLM 可能会犯错误:如果他们对主题没有足够的了解,他们的推理步骤可能会错误。

  • LLM 可能会陷入错误的想法:有时,他们可能会提出不基于现实的解释。

思路链提示使大型语言模型能够解决复杂的算术、常识和符号推理任务。图中突出显示了思路链推理过程。

少量提示会给出一些示例来帮助语言模型理解它应该做什么,而思维链提示则会从头到尾展示逐步推理。这有助于完成需要符号推理和中间步骤的复杂任务。它最适合较大的模型,而较小的模型可能会产生奇怪的思维链并且不太精确。在某些情况下,您可以使用零次思维链提示而不显示中间步骤。

RAT:知识与思维链的结合

检索增强思维 (RAT) 是一种简单但有效的提示方法,它将思路链 (CoT) 提示与检索增强生成 (RAG) 相结合,以处理长窗口推理和生成问题。

因此,LLM 生成零样本思维链 (CoT),并与 RAG 合并。使用这些想法作为询问,对其进行因果修正并逐步发展出答案。

使用信息检索迭代修改思维链可显著增强大型语言模型在处理长视域生成任务时的推理和生成能力。这种方法还大大减少了幻觉的发生。我们提出的方法称为检索增强思维 (RAT),它涉及使用从相关来源检索到的信息逐一修改每个思维步骤。这包括任务查询,以及生成初始零样本 CoT 后的当前和过去思维步骤。

通过将 RAT 应用于各种基础模型,我们发现它们在各种长视界生成任务上的表现都有显著提升。平均而言,代码生成评分相对提高 13.63%,数学推理评分提高 16.96%,创意写作评分提高 19.2%,具体任务规划评分提高 42.78%。

在这里插入图片描述

检索增强思维 (RAT) 的管道。给定一个任务提示(在图中表示为 I),RAT 从 LLM 在零样本(“让我们一步一步思考”)中产生的初始分步思维(𝑇1、𝑇2、· · ·、𝑇𝑛)开始。由于幻觉,某些思维步骤(例如图中的 𝑇1)可能存在缺陷。RAT 使用来自外部知识库(表示为 Library)的 RAG 迭代地修改每个思维步骤。

该图概述了检索增强思维 (RAT) 流程,这是一种促使大型语言模型 (LLM) 提高其在长窗口任务中的推理能力的方法。以下是关键模块的原理:

步骤 0:初稿

  • 向 LLM 提出任务提示。

  • 该示例展示了有关在 Minecraft 中获取钻石的提示。

步骤 1-步骤 n:迭代细化

  • LLM 根据对提示的理解生成初始响应(Zero CoT)。由于缺乏具体信息,这可能会存在缺陷。

  • RAT 结合了 CoT 提示,其中 LLM 通过解释每个步骤的理由 (Ti) 来反复修改其响应。

关键组件

  • 任务提示:这是起点,为 LLM 提供要解决的问题。

  • LLM:这代表大型语言模型本身。

  • 初始 CoT(Ti-1、Ti):这些是 LLM 在迭代过程中的初始和修订的思维链。

  • 知识库:这象征着 LLM 可以通过检索增强生成 (RAG) 访问的外部知识库。

  • 增强修订:这指的是 LLM 如何根据检索到的信息和先前的解释来完善其思维链 (Ti)。

RAT 流程

  1. 初始响应:LLM 根据提示 (T0) 生成初始响应。

  2. 解释:LLM 解释了初步回应 (T1-1) 背后的原因。

  3. 检索:RAT 根据解释从外部知识库(Library)检索相关信息。

  4. 修订:LLM 通过整合检索到的信息来修订其思维链 (T1)。

  5. 重复:重复步骤 2-4,直到 LLM 得到满意的解决方案 (Tn)。

下图强调了 RAT 如何通过结合外部知识检索和逐步解释来解决 LLM 在复杂推理任务中的局限性。

图 | 上:不同 LLM 推理方法在创意生成任务上的示例。红色文本表示 LLM 生成的文本中的错误或错觉,而绿色文本表示正确生成。没有 RAG 的方法通常会产生带有幻觉的不正确信息,经典 RAG 与结构松散的检索内容高度相关,而 RAT 生成的文本在准确性和完整性方面表现最佳。下:不同 LLM 推理方法在复杂的具身规划、数学推理、代码生成和创意生成任务上的定量性能比较。我们的 RAT 在所有任务上的表现都优于所有基线。

RAT核心代码

https://github.com/CraftJarvis/RAT/blob/main/app/gradio_app.py RAT实现如下:

def rat(question):       print(f"{datetime.now()} [INFO] Generating draft...")       draft = get_draft(question)       print(f"{datetime.now()} [INFO] Return draft.")       # print(f"##################### DRAFT #######################")       # print(draft)       # print(f"#####################  END  #######################")          print(f"{datetime.now()} [INFO] Processing draft ...")       # draft_paragraphs = split_draft(draft)       draft_paragraphs = split_draft_openai(question, draft)       print(f"{datetime.now()} [INFO] Draft is splitted into {len(draft_paragraphs)} sections.")       answer = ""       for i, p in enumerate(draft_paragraphs):           # print(str(i)*80)           print(f"{datetime.now()} [INFO] Revising {i+1}/{len(draft_paragraphs)} sections ...")           answer = answer + '\n\n' + p           # print(f"[{i}/{len(draft_paragraphs)}] Original Answer:\n{answer.replace(newline_char, ' ')}")              # query = get_query(question, answer)           print(f"{datetime.now()} [INFO] Generating query ...")           res = run_with_timeout(get_query_wrapper, 30, question, answer)           if not res:               print(f"{datetime.now()} [INFO] Generating query timeout, skipping...")               continue           else:               query = res           print(f">>> {i}/{len(draft_paragraphs)} Query: {query.replace(newline_char, ' ')}")              print(f"{datetime.now()} [INFO] Crawling network pages ...")           # content = get_content(query)           res = run_with_timeout(get_content_wrapper, 30, query)           if not res:               print(f"{datetime.now()} [INFO] Parsing network pages timeout, skipping ...")               continue           else:               content = res              LIMIT = 2           for j, c in enumerate(content):               if  j >= LIMIT: # limit rge number of network pages                   break               print(f"{datetime.now()} [INFO] Revising answers with retrieved network pages...[{j}/{min(len(content),LIMIT)}]")               # answer = get_revise_answer(question, answer, c)               res = run_with_timeout(get_revise_answer_wrapper, 30, question, answer, c)               if not res:                   print(f"{datetime.now()} [INFO] Revising answers timeout, skipping ...")                   continue               else:                   diff_html = generate_diff_html(answer, res)                   display(HTML(diff_html))                   answer = res               print(f"{datetime.now()} [INFO] Answer revised [{j}/{min(len(content),3)}]")           # print(f"[{i}/{len(draft_paragraphs)}] REVISED ANSWER:\n {answer.replace(newline_char, ' ')}")           # print()       res = run_with_timeout(get_reflect_answer_wrapper, 30, question, answer)       if not res:           print(f"{datetime.now()} [INFO] Reflecting answers timeout, skipping next steps...")       else:           answer = res       return draft, answer   
  1. 生成初始草稿
  • 使用 GPT-3.5-turbo 生成一个初始的草稿答案(draft)。

  • 草稿答案是基于用户输入的问题生成的,可能包含一些错误或不完整的信息。

  1. 分割草稿
  • 将草稿答案分割成多个段落(draft_paragraphs),每个段落包含一个完整的思路。

  • 分割的目的是为了逐段修正和优化答案。

  1. 逐段修正答案
  • 对每个段落,生成一个检索查询(query),用于从网络中检索相关信息。

  • 根据检索到的内容,修正当前段落的答案。

  • 重复这一过程,直到所有段落都修正完毕。

  1. 结构化输出
  • 最后,为修正后的答案添加标题和副标题,使其更具结构性。
  1. 返回结果
  • 返回初始草稿和修正后的最终答案。

示例流程假设用户输入的问题是:“介绍爱因斯坦的生平和成就。”

  1. 生成初始草稿
  • GPT-3.5-turbo 生成一个初始答案,可能包含一些不准确的信息。
  1. 分割草稿
  • 段落1:爱因斯坦的早期生活。

  • 段落2:爱因斯坦的科学成就。

  • 段落3:爱因斯坦的晚年生活。

  • 将初始答案分割成多个段落,例如:

  1. 逐段修正
  • 查询1:“爱因斯坦的早期生活”。

  • 查询2:“爱因斯坦的科学成就”。

  • 查询3:“爱因斯坦的晚年生活”。

  • 对每个段落生成检索查询,例如:

  • 根据检索结果修正每个段落的内容。

  1. 结构化输出
  • 标题:爱因斯坦的生平和成就

  • 副标题1:早期生活

  • 副标题2:科学成就

  • 副标题3:晚年生活

  • 为修正后的答案添加标题和副标题,例如:

  1. 返回结果
  • 返回初始草稿和修正后的最终答案。

其中用到的一些提示语如下:

`prompt1 = """   尝试用逐步的思考来回答这个问题\指令,并使答案更具结构化。   使用 `\n\n` 来将答案分成几个段落。   直接响应指令。除非被要求,否则不要在答案中添加额外的解释或介绍。   """      prompt2 = """   我想验证给定问题的内容准确性,特别是最后几句话。   请用相应的问题总结内容。   这个总结将被用作必应搜索引擎的查询。   查询应该简短,但需要足够具体,以确保必应能够找到相关知识或页面。   您还可以使用搜索语法,使查询足够简短和清晰,以便搜索引擎能够找到相关的语言数据。   尽量使查询与内容中的最后几句话尽可能相关。   **重要**   直接输出查询。除非被要求,否则不要在答案中添加额外的解释或介绍。   """      prompt3 = """   我想根据在维基百科页面上学到的相关文本来修订答案。   你需要检查答案是否正确。   如果你在答案中发现了错误,请修订答案使其更好。   如果你发现有些必要的细节被忽略了,请根据相关文本添加这些细节,以使答案更加可信。   如果你发现答案是正确的且不需要添加更多细节,请直接输出原始答案。   **重要**   尽量保持修订后答案的结构(多个段落及其子标题),使其更具结构性以便理解。   用 `\n\n` 字符分隔段落。   直接输出修订后的答案。除非被要求,否则在修订后的答案中不要添加额外的解释或声明。   """   `

RAT 的优势

  • 提高准确性:通过允许 LLM 访问外部知识并改进其推理,RAT 有助于减少错误并生成更准确的解决方案。

  • 增强的可解释性:带有解释的迭代过程可以深入了解 LLM 的思维过程,从而更容易识别和解决任何问题。

  • 更强的长窗口推理能力:RAT 对于需要多步骤的复杂任务特别有益,因为推理透明度至关重要。

如何学习大模型 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 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值