利用 ReAct 范式提升大模型解决复杂问题的能力
利用 ReAct 范式提升大模型解决复杂问题的能力
核心概念
ReAct 范式的本质
核心概念:ReAct(Reasoning + Acting,推理与行动的交织)是一种大语言模型(Large Language Models, LLMs)的推理-行动协同提示工程范式,它打破了传统 LLM “一次性生成完整答案”或“纯思维链(Chain of Thought, CoT)/纯工具调用(ToolFormer/Gorilla)割裂执行”的局限,通过让 LLM 在生成过程中交替进行「自然语言推理(思考)」和「外部工具/环境交互(行动)」,逐步逼近问题的最优解。
从认知科学的角度看,ReAct 是对人类**“试错学习-感知反馈-调整策略”闭环认知过程**的模拟——当人类面对陌生或复杂的问题(比如查找陌生城市的实时天气并规划行程)时,不会凭空推理所有细节,也不会盲目尝试所有工具,而是会先思考“我需要什么信息?”“用什么工具获取?”,再去调用工具获取新信息,接着基于新信息继续推理下一步,如此循环直到问题解决。
与其他主流 LLM 推理/工具范式的边界与对比
为了更清晰地理解 ReAct 的价值,我们需要将它与三个最核心的竞争/互补范式做对比:纯生成式(Vanilla)、纯思维链(CoT/Zero-Shot CoT)、纯工具调用(ToolFormer/Gorilla)。
概念核心属性维度对比
| 核心属性 | 纯生成式(Vanilla) | 纯思维链(CoT/Zero-Shot CoT) | 纯工具调用(ToolFormer/Gorilla) | ReAct(推理+行动交织) |
|---|---|---|---|---|
| 执行流程 | 一次性从输入 XXX 生成答案 YYY | 从输入 XXX 生成中间推理文本 R1,R2,...,RkR_1, R_2, ..., R_kR1,R2,...,Rk 再生成答案 YYY | 从输入 XXX 或中间状态直接生成工具调用指令 A1,A2,...,AkA_1, A_2, ..., A_kA1,A2,...,Ak ,获取工具返回 O1,O2,...,OkO_1, O_2, ..., O_kO1,O2,...,Ok 后一次性拼接生成 YYY | 交替生成:R1→A1→O1→R2→A2→O2→...→Rk→YR_1 \rightarrow A_1 \rightarrow O_1 \rightarrow R_2 \rightarrow A_2 \rightarrow O_2 \rightarrow ... \rightarrow R_k \rightarrow YR1→A1→O1→R2→A2→O2→...→Rk→Y |
| 信息来源 | 仅依赖 LLM 内部静态知识库(截止训练日期) | 仅依赖 LLM 内部静态知识库 | 依赖 LLM 内部静态知识库 + 外部一次性/多次调用的工具信息 | 依赖 LLM 内部静态知识库 + 外部实时/动态/增量的工具交互反馈 |
| 推理透明度 | 极低(黑盒生成,无法解释推理步骤) | 较高(中间推理文本可解释,但可能与事实/逻辑冲突) | 中等(工具调用指令可追踪,但中间推理可能隐含或缺失) | 极高(推理文本可解释,工具调用可验证,反馈信息可溯源) |
| 事实准确性 | 低(易产生“幻觉 Hallucination”) | 中等(幻觉有所缓解,但仍受限于静态知识) | 较高(依赖外部工具减少幻觉,但工具选择或指令生成可能出错) | 最高(推理与事实反馈交织,可实时修正幻觉与工具选择错误) |
| 复杂问题解决能力 | 弱(无法处理多步骤、需要外部信息的问题) | 中等(可处理纯逻辑多步骤问题,但无法处理外部信息依赖型问题) | 较强(可处理外部信息依赖型问题,但逻辑推理链条可能断裂或盲目) | 极强(可同时处理「纯逻辑多步骤」「外部信息依赖型」「逻辑+外部混合型」三类复杂问题) |
| 计算/资源开销 | 最低(单次 Token 生成) | 中等(多次 Token 生成中间推理) | 较高(多次 Token 生成指令 + 工具 API 调用开销) | 最高(交替多次 Token 生成 + 工具 API 调用 + 反馈信息处理) |
| 适用场景 | 简单问答、文本生成、翻译(无外部信息依赖) | 纯数学题、逻辑推理题、代码补全(无外部信息依赖) | 实时查询、API 调用、知识库检索(外部信息依赖但逻辑简单) | 所有复杂场景:科学研究问题解决、多步骤行程规划、复杂代码调试+优化、知识图谱构建+推理、医疗诊断辅助、法律文书检索+分析 |
概念联系的 ER 实体关系 Mermaid 架构图
为了更直观地展示 ReAct 与其他范式的依赖关系、组成关系,我们可以用 ER 实体关系图来表示:
概念交互关系的 Mermaid 时序图
为了更直观地展示 ReAct 范式内部各实体(LLM、Reasoning Step、Action Step、Observation Step、External Tools)的交互流程,我们可以用时序图来表示:
问题背景
大模型的“能力天花板”:静态知识与一次性生成的局限
尽管以 GPT-4、Llama3、Claude3 为代表的现代大语言模型已经展现出令人惊叹的能力——从简单的文本生成、翻译,到复杂的纯数学题解答、逻辑推理、代码补全,但它们仍然面临着两个无法通过单纯扩大模型规模或优化训练数据完全解决的核心问题:
问题1:静态知识边界与“时效性幻觉”“知识盲区幻觉”
现代大语言模型的知识完全依赖于训练数据,而训练数据有明确的截止日期(比如 GPT-4 的训练数据截止到2023年10月,Llama3 截止到2023年12月)。这意味着:
- 时效性幻觉:LLM 无法获取截止日期之后的任何新信息(比如最新的新闻、实时天气、股票价格、航班信息、软件版本更新等),如果强行提问,它要么会拒绝回答,要么会生成基于旧数据的错误信息(即“时效性幻觉”)。
例子:如果你在2024年7月问 GPT-4 “2024年巴黎奥运会开幕式的具体日期是什么时候?”,它可能会回答“2024年7月26日”(因为这个信息可能在训练数据截止前已经公布),但如果你问它“2024年7月26日北京到巴黎的直飞航班平均时长是多少?”,它绝对不可能给出准确答案——因为航班信息是实时动态的,永远不会出现在静态训练数据中。
- 知识盲区幻觉:即使在训练数据截止日期之前,LLM 也不可能记住所有的知识——比如某个冷门的数学定理证明细节、某个小众编程语言的最新API、某个偏远小镇的历史事件等。如果强行提问这些知识盲区的问题,它要么会拒绝回答,要么会生成看似合理但完全错误的信息(即“知识盲区幻觉”)。
例子:如果你问 GPT-4 “2023年诺贝尔物理学奖得主Anne L’Huillier的博士论文题目是什么?”,它可能会生成一个看似合理的法语题目,但实际上这个题目是错的——因为这个信息可能不在训练数据中,或者训练数据中的信息有误。
问题2:一次性生成与“逻辑断裂”“计算错误”“复杂推理失效”
除了静态知识的局限,现代大语言模型的执行流程也存在严重问题:它们通常采用**“一次性生成完整答案”**的方式(即使加了 CoT,本质上也是“一次性生成完整的推理链条+答案”),这意味着:
- 逻辑断裂:对于非常复杂的多步骤问题(比如需要10步以上的逻辑推理或工具调用),LLM 很难一次性生成完整、连贯的推理链条——中间可能会出现逻辑跳跃、逻辑矛盾甚至完全中断的情况。
例子:如果你问 GPT-4 “从北京出发,先去纽约看自由女神像,再去伦敦看大本钟,最后去东京看东京塔,要求每个城市之间的行程时间不超过12小时,总预算不超过5000美元,需要规划2024年8月1日到8月7日的详细行程(包括航班、酒店、景点门票、餐饮预算)”,如果不加 ReAct,GPT-4 要么会生成一个完全不可行的行程(比如航班时间超过12小时、总预算超过10000美元),要么会生成一个逻辑断裂的行程(比如忘记预订某个城市的酒店、忘记计算某个景点的门票价格)。
- 计算错误:即使是简单的数学计算(比如多位数的加减乘除、平方根、指数运算),LLM 也经常会出错——因为它们本质上是基于概率的文本生成模型,而不是基于逻辑的计算模型。对于复杂的数学计算(比如积分、微分、矩阵运算、Haversine公式计算球面距离),LLM 的出错率更是高得惊人。
例子:如果你问 GPT-4 “计算半径为6371km的球体上,经度为-0.4536°、纬度为51.4700°的伦敦希思罗机场(LHR)到经度为139.7744°、纬度为35.7720°的东京成田国际机场(NRT)的最短球面距离,保留两位小数”,不加任何工具的话,GPT-4 可能会给出一个从9000km到10000km之间的随机数,但实际上正确的结果约为9580.12km。
- 复杂推理失效:对于需要**“试错学习-感知反馈-调整策略”闭环的复杂问题(比如复杂代码的调试+优化、机器学习模型的超参数调优、知识图谱的构建+推理),一次性生成的方式完全失效**——因为这些问题需要根据外部反馈不断调整策略,而一次性生成无法获取任何外部反馈。
例子:如果你给 GPT-4 一段有bug的Python代码(比如计算斐波那契数列的第n项,但递归深度超过了Python的默认限制),让它调试并优化,不加 ReAct 的话,GPT-4 可能会给出一个用循环代替递归的优化方案,但如果循环方案中又有其他bug(比如n=0或n=1时返回错误值),它无法发现并修正——因为它无法运行代码来获取测试反馈。
问题描述
基于上述大模型的“能力天花板”,我们可以将需要提升大模型解决能力的复杂问题正式定义为:
问题定义
给定一个输入问题 XXX,我们希望大语言模型 MMM 能够生成一个准确、可信、可解释的输出答案 YYY,但 XXX 满足以下至少一个条件:
- 外部信息依赖型:XXX 的解决需要获取截止 MMM 训练数据之后的新信息,或者**MMM 训练数据之外的知识盲区信息**,或者实时动态变化的信息(如天气、股票、航班、新闻等)。
- 纯逻辑多步骤型:XXX 的解决需要10步以上的连续、严格的逻辑推理,或者复杂的数学计算(如积分、微分、矩阵运算、概率统计等)。
- 逻辑+外部混合闭环型:XXX 的解决需要同时满足外部信息依赖型和纯逻辑多步骤型的条件,并且需要根据外部反馈不断调整推理策略或行动方案(如复杂代码调试+优化、机器学习模型超参数调优、多步骤行程规划、科学研究问题解决等)。
问题约束
在解决上述复杂问题时,我们还需要满足以下至少一个约束条件:
- 准确性约束:输出答案 YYY 的事实准确性必须达到95%以上,计算准确性必须达到100%(对于纯计算问题)。
- 可解释性约束:必须能够清晰、完整地展示从输入问题 XXX 到输出答案 YYY 的整个推理过程和行动过程,包括中间推理文本、工具调用指令、工具返回反馈、计算过程等。
- 可验证性约束:所有外部信息必须来自权威、可验证的来源(如国际奥委会官网、FlightAware、GeoNames、Python官方文档等),所有工具调用指令必须可复现,所有计算过程必须可验证。
- 效率约束:整个问题解决过程的时间开销必须控制在合理范围内(比如纯逻辑多步骤问题控制在10秒以内,逻辑+外部混合闭环型问题控制在60秒以内),计算/资源开销必须控制在合理范围内(比如Token消耗控制在10000以内,工具API调用次数控制在10次以内)。
问题解决:ReAct 范式的核心原理与操作步骤
核心原理
ReAct 范式的核心原理可以用一句话总结:让大语言模型像人类一样思考和行动——先思考“我需要什么信息?下一步该做什么?”,再去调用工具获取新信息,接着基于新信息继续思考下一步,如此循环直到问题解决。
从技术实现的角度看,ReAct 范式的核心原理可以拆分为三个关键部分:
- 推理-行动-观察(Reasoning-Action-Observation, RAO)三元组:这是 ReAct 范式的最小执行单元,每个 RAO 三元组代表一次完整的“试错学习-感知反馈”循环。
- 历史上下文记忆与复用:ReAct 范式会完整地保存所有历史 RAO 三元组(包括历史推理文本、历史行动指令、历史观察反馈),并在每一步生成新的推理或行动时,将这些历史上下文作为 Prompt 的一部分输入给 LLM,从而保证推理和行动的连贯性和一致性。
- 终止条件判断:ReAct 范式会在每一步生成推理文本后,自动判断是否满足终止条件——如果满足,就生成最终答案;如果不满足,就继续生成下一个 RAO 三元组。常见的终止条件包括:
- LLM 在推理文本中明确输出「Final Answer」或类似的关键词。
- 达到了预设的最大 RAO 三元组步数(比如10步或20步)。
- 连续多次工具调用失败(比如3次或5次)。
- 已经获取了所有需要的外部信息,并且完成了所有需要的逻辑推理或计算。
RAO 三元组的数学模型
我们可以用数学公式来正式定义 RAO 三元组和 ReAct 范式的执行流程:
首先,定义 ReAct 范式的状态空间 SSS:
S={s0,s1,s2,...,sk,...,sn}S = \{s_0, s_1, s_2, ..., s_k, ..., s_n\}S={s0,s1,s2,...,sk,...,sn}
其中:
- s0s_0s0 是初始状态:只包含输入问题 XXX,即 s0={X}s_0 = \{X\}s0={X}。
- sks_ksk(k≥1k \geq 1k≥1)是第k步后的状态:包含输入问题 XXX 和前k个 RAO 三元组,即 sk={X,(R1,A1,O1),(R2,A2,O2),...,(Rk,Ak,Ok)}s_k = \{X, (R_1, A_1, O_1), (R_2, A_2, O_2), ..., (R_k, A_k, O_k)\}sk={X,(R1,A1,O1),(R2,A2,O2),...,(Rk,Ak,Ok)}。
- sns_nsn 是终止状态:满足终止条件的状态,即 sn={X,(R1,A1,O1),...,(Rn,An,On),Y}s_n = \{X, (R_1, A_1, O_1), ..., (R_n, A_n, O_n), Y\}sn={X,(R1,A1,O1),...,(Rn,An,On),Y},其中 YYY 是最终答案。
其次,定义 ReAct 范式的推理函数 fRf_RfR、行动函数 fAf_AfA、观察函数 fOf_OfO、终止判断函数 fTf_TfT:
- 推理函数 fRf_RfR:根据当前状态 sk−1s_{k-1}sk−1,生成第k步的推理文本 RkR_kRk,即 Rk=fR(sk−1)R_k = f_R(s_{k-1})Rk=fR(sk−1)。
- fRf_RfR 的本质是一个基于提示工程的大语言模型调用,Prompt 包含当前状态 sk−1s_{k-1}sk−1 的所有信息。
- 终止判断函数 fTf_TfT:根据第k步的推理文本 RkR_kRk,判断是否满足终止条件,即 fT(Rk)∈{True,False}f_T(R_k) \in \{True, False\}fT(Rk)∈{True,False}。
- 如果 fT(Rk)=Truef_T(R_k) = TruefT(Rk)=True,则直接生成最终答案 Y=fY(sk−1,Rk)Y = f_Y(s_{k-1}, R_k)Y=fY(sk−1,Rk),其中 fYf_YfY 是最终答案生成函数。
- 如果 fT(Rk)=Falsef_T(R_k) = FalsefT(Rk)=False,则继续执行下一步。
- 行动函数 fAf_AfA:根据当前状态 sk−1s_{k-1}sk−1 和第k步的推理文本 RkR_kRk,生成第k步的行动指令 AkA_kAk,即 Ak=fA(sk−1,Rk)A_k = f_A(s_{k-1}, R_k)Ak=fA(sk−1,Rk)。
- fAf_AfA 的本质也是一个基于提示工程的大语言模型调用,Prompt 包含当前状态 sk−1s_{k-1}sk−1 和第k步的推理文本 RkR_kRk 的所有信息,并且可能包含外部工具的输入 Schema。
- 观察函数 fOf_OfO:根据第k步的行动指令 AkA_kAk,调用外部工具获取第k步的观察反馈 OkO_kOk,即 Ok=fO(Ak)O_k = f_O(A_k)Ok=fO(Ak)。
- fOf_OfO 的本质是一个外部工具 API 调用封装,负责处理 API 请求、API 响应、错误处理等。
最后,定义 ReAct 范式的完整执行流程:
KaTeX parse error: Expected 'EOF', got '_' at position 70: … ..., \text{max_̲steps}: \\ …
具体操作步骤
ReAct 范式的具体操作步骤可以分为六个核心步骤:
步骤1:明确问题类型与约束条件
在开始使用 ReAct 范式之前,我们首先需要明确问题的类型(外部信息依赖型、纯逻辑多步骤型、逻辑+外部混合闭环型)和约束条件(准确性、可解释性、可验证性、效率),因为这将直接影响后续的 Prompt 设计、工具选择和终止条件设置。
步骤2:选择并准备外部工具集
如果问题是外部信息依赖型或逻辑+外部混合闭环型,我们需要选择并准备合适的外部工具集。
工具选择原则
选择外部工具时,我们需要遵循以下四个原则:
- 权威性原则:工具必须来自权威、可靠的来源(如 Google Search、Wolfram Alpha、Python REPL、FlightAware、GeoNames、GitHub API、Stable Diffusion API 等),以保证观察反馈的准确性。
- 易用性原则:工具必须提供简单、清晰的 API 接口,或者可以通过简单的代码封装来调用,以降低行动函数 fAf_AfA 和观察函数 fOf_OfO 的实现难度。
- 覆盖面原则:工具集必须能够覆盖问题解决所需的所有外部信息或功能(比如如果问题需要查询实时天气、计算数学公式、执行Python代码,我们需要选择 Google Search、Wolfram Alpha、Python REPL 三个工具)。
- 效率原则:工具的API 响应时间必须控制在合理范围内(比如1秒以内),API 调用成本必须控制在合理范围内(比如每次调用0.001美元以内),以满足效率约束。
常用外部工具集
以下是一些常用的、适合 ReAct 范式的外部工具集:
| 工具类型 | 工具名称 | 工具功能 | 工具来源 | API 访问方式 |
|---|---|---|---|---|
| 通用搜索工具 | Google Search | 搜索互联网上的任何信息 | Google Cloud Platform (GCP) | API Key |
| Bing Search | 搜索互联网上的任何信息 | Microsoft Azure | API Key | |
| DuckDuckGo Search | 搜索互联网上的任何信息(无追踪) | DuckDuckGo | API Key / 免费额度 | |
| 数学计算工具 | Wolfram Alpha | 计算任何数学公式、解决任何数学问题、生成数学可视化 | Wolfram Research | API Key / 免费额度 |
| SymPy (Python 库) | 符号计算、代数运算、微积分运算、矩阵运算 | 开源(GitHub) | Local Execution (Python REPL) | |
| NumPy (Python 库) | 数值计算、线性代数运算、随机数生成 | 开源(GitHub) | Local Execution (Python REPL) | |
| 代码执行工具 | Python REPL | 执行任何 Python 代码 | 开源(Python 官方) | Local Execution / Remote Execution (如 Replit API) |
| JavaScript REPL | 执行任何 JavaScript 代码 | 开源(Node.js 官方) | Local Execution / Remote Execution | |
| Jupyter Notebook API | 执行 Jupyter Notebook 代码块 | Jupyter Project | API Key / 免费额度 | |
| 实时信息查询工具 | FlightAware | 查询实时航班信息、航班历史数据、机场信息 | FlightAware | API Key |
| OpenWeatherMap | 查询实时天气信息、天气预报历史数据 | OpenWeatherMap | API Key / 免费额度 | |
| Alpha Vantage | 查询实时股票价格、股票历史数据、外汇汇率 | Alpha Vantage | API Key / 免费额度 | |
| 知识查询工具 | Wikipedia API | 查询 Wikipedia 上的任何知识 | Wikimedia Foundation | 免费(无 API Key 也可使用,但有速率限制) |
| GeoNames API | 查询地理位置的经纬度、海拔、时区、人口等信息 | GeoNames | 免费(需注册账号) | |
| GitHub API | 查询 GitHub 上的仓库、代码、Issue、Pull Request 等信息 | GitHub | API Key / Personal Access Token (PAT) | |
| 生成式工具 | Stable Diffusion API | 生成任何图像 | Stability AI | API Key |
| DALL-E 3 API | 生成任何图像 | OpenAI | API Key | |
| Whisper API | 转录任何音频、翻译任何音频 | OpenAI | API Key |
工具准备步骤
准备外部工具集时,我们需要完成以下三个步骤:
- 注册账号并获取 API Key:如果工具需要 API Key 访问,我们需要先注册账号,然后在工具的开发者平台上获取 API Key。
- 编写工具输入/输出 Schema:为了让 LLM 能够生成符合要求的行动指令,我们需要为每个工具编写清晰、完整的输入/输出 JSON Schema。
例子:Google Search 工具的输入/输出 JSON Schema
// 输入 Schema { "type": "object", "properties": { "query": { "type": "string", "description": "要搜索的查询字符串,必须简洁明了" }, "num_results": { "type": "integer", "minimum": 1, "maximum": 10, "default": 3, "description": "要返回的搜索结果数量,范围1-10,默认3" }, "language": { "type": "string", "enum": ["zh-CN", "en-US", "ja-JP", "fr-FR", "de-DE"], "default": "zh-CN", "description": "搜索结果的语言,默认简体中文" } }, "required": ["query"] }// 输出 Schema { "type": "object", "properties": { "status": { "type": "string", "enum": ["success", "error"], "description": "搜索请求的状态,成功或失败" }, "error_message": { "type": "string", "description": "如果状态是error,这里是错误信息;否则为空" }, "results": { "type": "array", "items": { "type": "object", "properties": { "title": { "type": "string", "description": "搜索结果的标题" }, "snippet": { "type": "string", "description": "搜索结果的摘要" }, "url": { "type": "string", "description": "搜索结果的链接" }, "source": { "type": "string", "description": "搜索结果的来源网站" } }, "required": ["title", "snippet", "url", "source"] }, "description": "如果状态是success,这里是搜索结果数组;否则为空" } }, "required": ["status"] } - 编写工具调用封装函数:为了简化观察函数 fOf_OfO 的实现,我们需要为每个工具编写简单、清晰的调用封装函数,负责处理 API 请求、API 响应、错误处理、速率限制等。
步骤3:设计 ReAct 提示词(Prompt)
ReAct 提示词的设计是整个 ReAct 范式成功的关键——一个好的 ReAct 提示词可以让 LLM 自动、准确地生成推理文本、行动指令和最终答案,而一个差的 ReAct 提示词则可能导致 LLM 生成混乱的推理、错误的行动指令或无法满足终止条件。
ReAct 提示词的核心组成部分
一个完整的 ReAct 提示词通常包含以下六个核心组成部分:
- 角色设定(System Prompt):告诉 LLM 它现在的身份是什么(比如“你是一位专业的复杂问题解决专家,擅长通过推理与行动的交织来解决任何复杂问题”),以及它需要遵循的基本原则(比如“必须先思考再行动,必须调用合适的工具获取外部信息,必须完整地记录所有推理和行动过程,必须生成准确、可信、可解释的最终答案”)。
- 工具介绍(Tools Description):告诉 LLM 它可以使用哪些外部工具,每个工具的功能是什么,每个工具的输入/输出 JSON Schema 是什么(或者用自然语言清晰地描述输入/输出要求)。
- 执行流程说明(Execution Workflow):用清晰、简洁的语言告诉 LLM ReAct 范式的执行流程是什么,即:
- 第一步(思考):根据当前的问题和历史上下文,生成推理文本,思考“我需要什么信息?下一步该做什么?”。
- 第二步(判断):如果已经获取了所有需要的信息,并且完成了所有需要的推理或计算,就输出「Final Answer」关键词,然后生成最终答案;否则,继续下一步。
- 第三步(行动):根据推理文本,生成符合工具输入 Schema 的行动指令。
- 第四步(观察):等待工具返回观察反馈。
- 重复循环:重复第一步到第四步,直到满足终止条件。
- 格式要求(Format Requirements):用清晰、明确的语言告诉 LLM 推理文本、行动指令、观察反馈、最终答案的格式要求是什么——这一点非常重要,因为只有统一的格式,我们才能用代码自动解析和处理 LLM 的输出。
常用的格式要求示例:
- 推理文本:必须以「Thought:」开头,后面紧跟自然语言推理内容。
- 行动指令:必须以「Action:」开头,后面紧跟工具名称,然后以「Action Input:」开头,后面紧跟符合工具输入 Schema 的 JSON 字符串(注意:JSON 字符串必须用三个反引号包裹,并且必须严格符合 JSON 格式,不能有任何语法错误)。
- 观察反馈:必须以「Observation:」开头,后面紧跟工具返回的结构化/半结构化文本(由观察函数 fOf_OfO 生成)。
- 最终答案:必须以「Final Answer:」开头,后面紧跟清晰、结构化的最终答案内容(可以包含 Markdown 格式的标题、列表、代码块、表格等)。
- Few-Shot 示例(Few-Shot Examples):如果是 Zero-Shot ReAct(即不给 LLM 任何示例),LLM 可能会生成不符合要求的输出——因此,我们通常会给 LLM 提供2-5个 Few-Shot 示例,展示如何正确地执行 ReAct 范式的整个流程(包括思考、判断、行动、观察、生成最终答案)。Few-Shot 示例的质量越高,LLM 的输出质量就越高。
- 当前问题与历史上下文(Current Question & Historical Context):在提示词的最后,我们需要输入当前的问题和所有历史 RAO 三元组(即历史思考、历史行动、历史观察),让 LLM 生成下一步的输出。
Few-Shot ReAct 提示词的完整示例
以下是一个完整的、适合解决“逻辑+外部混合闭环型”问题的 Few-Shot ReAct 提示词示例(以 GPT-4o 为目标模型,以 Google Search、Python REPL、GeoNames 为外部工具集):
你是一位专业的复杂问题解决专家,擅长通过「推理(Thought)-行动(Action)-观察(Observation)」的交织循环来解决任何复杂问题。
### 你的基本原则
1. **先思考,后行动**:永远不要盲目调用工具,必须先明确地思考「我需要什么信息?下一步该做什么?」。
2. **调用合适的工具**:根据当前的需求,选择最合适的外部工具——不要调用不必要的工具,也不要调用功能不匹配的工具。
3. **完整记录过程**:必须严格按照格式要求记录所有的推理、行动和观察过程,确保整个过程可解释、可验证。
4. **生成准确可信的答案**:所有外部信息必须来自权威来源,所有计算必须通过工具执行(不要自己手动计算,除非是非常简单的1+1=2之类的计算),最终答案必须清晰、结构化、准确。
5. **及时终止循环**:一旦获取了所有需要的信息,并且完成了所有需要的推理或计算,必须立即输出「Final Answer」关键词,然后生成最终答案——不要进行不必要的循环。
### 你可以使用的外部工具
以下是你可以使用的三个外部工具,每个工具的功能、输入/输出格式都已明确说明:
---
#### 工具1:Google Search
- **工具功能**:搜索互联网上的任何信息,返回最相关的3-10条结果(包含标题、摘要、链接、来源)。
- **输入格式(JSON)**:
```json
{
"query": "要搜索的查询字符串(必须简洁明了)",
"num_results": 3, // 可选,默认为3,范围1-10
"language": "zh-CN" // 可选,默认为简体中文,可选值:zh-CN, en-US, ja-JP, fr-FR, de-DE
}
- 输出格式(由工具自动返回):
- 如果成功:
Observation: [搜索结果1的标题] - [搜索结果1的摘要](来源:[搜索结果1的来源],链接:[搜索结果1的链接])\n[搜索结果2的标题] - [搜索结果2的摘要](来源:[搜索结果2的来源],链接:[搜索结果2的链接])\n... - 如果失败:
Observation: 搜索失败,错误信息:[具体的错误信息]
- 如果成功:
工具2:Python REPL
- 工具功能:执行任何合法的 Python 代码,返回代码的标准输出(stdout)和标准错误(stderr)。
- 输入格式(JSON):
{ "code": "要执行的 Python 代码(必须是合法的 Python 代码,多行代码可以用换行符分隔)" } - 输出格式(由工具自动返回):
更多推荐
所有评论(0)