收藏级教程:ReAct模式详解,让大模型从回答问题到解决问题

一、ReAct 架构:AI 代理的"推理-执行"闭环

ReAct(Re asoning + Act ion)并非简单的技术模块,而是为大语言模型(LLM)赋予自主任务解决能力的核心范式。区别于传统 LLM 直接输出答案的"黑箱模式",ReAct 强制代理在"思考"与"行动"之间形成循环闭环,具体表现为两步交替执行:

  • 推理(Reasoning):基于当前任务目标与已有信息,分析缺口、规划下一步操作方向,相当于代理的"大脑决策"环节;
  • 行动(Action):根据推理结论调用外部工具(如搜索引擎、计算器),获取新数据或执行特定操作,是代理与外部环境交互的"执行环节"。

这种模式打破了 LLM 仅依赖内部预训练知识的局限,让 AI 具备了类似人类"分析问题→动手验证→调整策略"的解决思路。

二、ReAct 架构的核心价值:破解传统 LLM 的三大痛点

传统 LLM 在处理复杂、动态任务时,常因自身局限导致结果偏差,而 ReAct 通过"工具调用+循环决策"提供了针对性解决方案,具体对比如下:

传统 LLM 核心缺陷 ReAct 架构解决方案 实际应用场景举例
预训练知识滞后,无法获取实时信息 调用搜索引擎/实时 API 拉取最新数据 查询"今日北京PM2.5指数""某股票实时股价"
对复杂计算/逻辑推理能力薄弱 集成专业工具(计算器、代码执行器)完成精准运算 计算"某公司近3年净利润复合增长率""解复杂微积分方程"
多步骤任务中易出现逻辑断裂 拆解任务为"推理-行动-观察"链式流程 完成"制定一周减脂餐单"(需查热量数据、营养配比、食材替换方案)


典型场景对比

当用户提问"2024年中国出生人口数量,较2023年下降了多少?"时:

  • 传统 LLM 若未更新2024年数据,可能输出过时信息或编造数据;
  • ReAct 代理则会执行三步流程:1. 调用国家统计局 API 获取2024年出生人口;2. 调取历史数据库查询2023年数据;3. 用计算工具算出下降数值与降幅百分比,最终输出准确结果。

三、ReAct 代理的工作流拆解:从"思考"到"输出答案"的完整循环

ReAct 代理的核心运作逻辑是"思考→行动→观察→再思考"的闭环循环,直到任务目标达成。这一流程高度模拟人类解决问题的习惯------例如我们在规划旅行时,会先思考"需要查目的地天气"(推理),再打开天气APP(行动),看到"未来3天有雨"(观察),进而调整"需携带雨具"(再推理),最终形成完整旅行方案。

以下是ReAct 循环的逐步分解:

  • 思考: 由法学硕士 (LLM) 驱动的代理会分析用户的查询和内部语境,并用自然语言生成推理步骤。这通常不会向最终用户展示,而是代理自言自语的一部分。例如:"问题询问一个国家的人口数量;我应该使用网络搜索来查找最新数据。"
  • 动作: 基于想法,代理决定执行哪个外部工具或操作。它会输出指示操作的指定格式。例如:Action: WebSearch("population of Canada 2023")。代理本质上是通过名称"调用"某个函数(工具),通常会附带一些输入参数。
  • 观察: 代理的环境(我们的代码)执行请求的操作,并将结果(观察)返回给代理。例如,网页搜索工具可能会返回:" Observation: The population of Canada in 2023 is 38 million."。此观察结果会被输入到代理的上下文中。
  • 智能体获取新信息后返回第一步(另一个思考)。它会利用新数据进行推理。在我们的例子中,它可能会想:"现在我有了人口数据;我可以回答这个问题了。"

这个"思考/行动/观察"循环不断重复,允许代理根据需要,串联使用多种工具(例如搜索,然后进行计算,再进行一次搜索等等)。最终,代理决定可以回答用户的问题。此时,它不再输出"行动",而是输出"最终答案"。

正如我们将在从头开始的实施中看到的那样,在整个过程中,代理维持对话及其自己的中间步骤。

每个想法和观察都可以附加到对话上下文中,以便 LLM 记住当中所做的任何操作。

这对于连贯性至关重要。最终结果是,代理能够有效地动态规划其方法,将推理与执行相结合。

这种动态方法比僵化的脚本或单轮响应更具适应性。它能够处理不可预见的子任务,类似于人在出现新信息时进行及时的调整。

四、工具生态:ReAct 代理的"能力延伸器"

工具是 ReAct 架构实现"行动"的核心载体,相当于代理的"双手"。一个高效的工具库需满足三大设计原则,同时覆盖多样化任务场景:

1. 工具设计三大核心原则

  • 原子性:单个工具仅负责单一功能,避免"多功能混杂"导致的调用混乱。例如"计算器工具"仅处理数学运算,"PDF解析工具"仅提取文档内容,不交叉负责其他任务;
  • 强契约性 :明确定义工具的输入格式、输出格式与错误码,确保代理与工具间"通信无歧义"。例如"地图查询工具"要求输入格式为{address: "具体地址", info_type: "latitude/longitude"},输出格式固定为{纬度: 39.9042, 经度: 116.4074}
  • 安全性:对高风险操作(如数据库写入、系统命令执行)添加权限校验、操作日志与异常拦截。例如"数据库工具"仅允许读取操作,禁止删除/修改;"代码执行器"限制运行环境,避免恶意代码攻击。

2. 常用工具示例(Python 伪代码)

python 复制代码
# 工具基类定义
class Tool:
    def __init__(self, name, func, description, input_schema):
        self.name = name  # 工具名称
        self.func = func  # 工具核心函数
        self.description = description  # 工具功能描述(供LLM识别)
        self.input_schema = input_schema  # 输入格式约束

# 1. 搜索引擎工具(对接Google Search API)
def google_search_api(keyword):
    # 调用外部API获取搜索结果
    response = requests.get(f"https://api.google.com/search?q={keyword}")
    return response.json()["results"][:3]  # 返回前3条结果

google_search = Tool(
    name="GoogleSearch",
    func=google_search_api,
    description="获取实时/全网信息,输入:搜索关键词(如"2024世界杯冠军")",
    input_schema={"type": "string", "required": ["keyword"]}
)

# 2. 安全计算工具(替代eval,避免代码注入风险)
def safe_calculator(expression):
    # 使用math库解析数学表达式,限制运算类型
    allowed_ops = {"+", "-", "*", "/", "sqrt", "pow"}
    for op in allowed_ops:
        if op in expression:
            return eval(f"math.{op}" if op in ["sqrt", "pow"] else op.join(expression.split(op)))
    raise ValueError("不支持的运算类型")

calculator = Tool(
    name="SafeCalculator",
    func=safe_calculator,
    description="执行数学计算(加减乘除、开方、幂运算),输入:数学表达式(如"(100-20)*3")",
    input_schema={"type": "string", "required": ["expression"]}
)

# 3. 数据可视化工具(生成折线图)
def generate_line_chart(data):
    # 使用matplotlib生成图表并返回图片URL
    x = data["x"]
    y = data["y"]
    plt.plot(x, y)
    plt.savefig("chart.png")
    return upload_to_img_host("chart.png")  # 上传图片并返回URL

data_plotter = Tool(
    name="LineChartGenerator",
    func=generate_line_chart,
    description="生成折线图,输入:字典格式({x: [x轴数据列表], y: [y轴数据列表]})",
    input_schema={"type": "object", "required": ["x", "y"], "properties": {"x": {"type": "array"}, "y": {"type": "array"}}}
)

# 工具库集合
tool_lib = [google_search, calculator, data_plotter]

五、Prompt 工程:ReAct 代理的"决策指挥官"

ReAct 代理的推理质量,直接取决于 Prompt 的设计------优秀的 Prompt 能引导 LLM 按"推理-行动-观察"流程思考,避免逻辑跑偏。以下是经过实践验证的 Prompt 设计思路与示例:

1. 核心 Prompt 模板(结构化设计)

复制代码
你是一个具备自主决策能力的 ReAct 代理,需严格按照"推理→行动→观察→循环"流程解决用户问题,具体规则如下:

1. 推理阶段:分析当前任务目标与已获取的历史信息(见"历史记录"),明确"当前缺少什么信息""需要调用哪个工具";
2. 行动阶段:若需调用工具,必须按格式输出:ACTION: 工具名称(参数)(参数需符合工具输入要求,参考工具库描述);
3. 观察阶段:工具返回结果后,需记录为"OBSERVATION: 结果内容",并更新到历史记录;
4. 终止条件:当信息足够回答用户问题时,直接输出:FINAL_ANSWER: 完整答案(无需再调用工具)。

当前任务:{user_query}
工具库描述:{tool_descriptions}(如:GoogleSearch:获取实时信息,输入关键词;SafeCalculator:执行数学计算,输入表达式)
历史记录:{memory}(如:ACTION: GoogleSearch("2024奥斯卡最佳影片") → OBSERVATION: 《奥本海默》)

请输出下一步操作(推理+行动/最终答案):

2. 实际 Prompt 生成示例(用户查询"《奥本海默》的导演是谁?该片获得了多少项奥斯卡奖?")

复制代码
当前任务:《奥本海默》的导演是谁?该片获得了多少项奥斯卡奖?
工具库描述:GoogleSearch:获取实时/影视信息,输入关键词;SafeCalculator:执行数学计算,输入表达式
历史记录:无

请输出下一步操作(推理+行动/最终答案):
推理:当前无《奥本海默》的导演与奥斯卡获奖数量信息,需先调用GoogleSearch获取基础信息。
ACTION: GoogleSearch("奥本海默 导演 奥斯卡获奖数量")

# 工具返回观察结果后,更新历史记录,再次生成Prompt:
当前任务:《奥本海默》的导演是谁?该片获得了多少项奥斯卡奖?
工具库描述:GoogleSearch:获取实时/影视信息,输入关键词;SafeCalculator:执行数学计算,输入表达式
历史记录:ACTION: GoogleSearch("奥本海默 导演 奥斯卡获奖数量") → OBSERVATION: 《奥本海默》导演为克里斯托弗·诺兰,该片在2024年奥斯卡奖中获得7项大奖(含最佳影片、最佳导演)

请输出下一步操作(推理+行动/最终答案):
推理:历史记录已包含导演姓名与奥斯卡获奖数量,信息完整,无需继续调用工具。
FINAL_ANSWER: 《奥本海默》的导演是克里斯托弗·诺兰,该片在2024年奥斯卡颁奖典礼上共获得7项大奖,包括分量最重的最佳影片奖与最佳导演奖。

六、ReAct 原生实现的优化方向:从"能用"到"好用"

完成基础原生实现后,需针对性能、稳定性与用户体验进行优化,核心可关注五大方向:

1. 短路机制:减少冗余循环

当工具返回的结果直接包含最终答案时,跳过后续推理步骤,直接输出结果,提升效率。例如用户查询"2023年全球GDP总量",若GoogleSearch返回"2023年全球GDP总量约105万亿美元",则代理无需进一步推理,直接输出答案。
实现代码示例

python 复制代码
def check_shortcut(tool_result, user_query):
    # 关键词匹配:判断工具结果是否直接回答问题
    query_keywords = ["多少", "是谁", "是什么", "何时"]
    if any(keyword in user_query for keyword in query_keywords) and ":" in tool_result:
        return True  # 触发短路
    return False

# 在循环中调用
tool_result = tool.func(parameters)
if check_shortcut(tool_result, user_query):
    return f"FINAL_ANSWER: {tool_result}"  # 提前终止

2. 错误回退:提升工具调用稳定性

当某一工具调用失败(如API超时、返回错误码)时,自动切换到替代工具或重试机制。例如"GoogleSearch超时"时,回退到"BingSearch";"API返回403错误"时,等待5秒后重试1次。
实现代码示例

python 复制代码
def call_tool_with_fallback(tool, backup_tool, parameters, max_retry=1):
    retry_count = 0
    while retry_count <= max_retry:
        try:
            return tool.func(parameters)
        except Exception as e:
            retry_count += 1
            if retry_count > max_retry:
                # 重试失败,切换到备份工具
                print(f"{tool.name}调用失败,切换到{backup_tool.name}")
                return backup_tool.func(parameters)
            time.sleep(5)  # 重试间隔

3. 令牌压缩:降低 LLM 调用成本

ReAct 循环中,历史记录会不断变长,导致 LLM 输入令牌(Token)数量激增。可通过"摘要压缩"将长历史记录浓缩为关键信息,例如将"3次工具调用记录"浓缩为"已获取《奥本海默》导演与奥斯卡获奖数",减少 Token 消耗。
实现代码示例

python 复制代码
def compress_memory(memory, llm_client):
    # 调用LLM生成历史记录摘要
    prompt = f"请将以下ReAct历史记录浓缩为100字内的关键信息:{memory}"
    summary = llm_client.generate(prompt)
    return f"历史记录摘要:{summary}"

4. 动态工具加载:优化资源占用

代理启动时不加载所有工具,而是根据任务类型"按需加载"。例如处理"数学计算"任务时,仅加载"SafeCalculator";处理"数据可视化"任务时,再加载"LineChartGenerator",降低内存占用。
实现代码示例

python 复制代码
def load_tool_dynamically(tool_name, tool_lib):
    # 根据工具名称从工具库中加载指定工具
    for tool in tool_lib:
        if tool.name == tool_name:
            return tool
    raise ValueError(f"未找到工具:{tool_name}")

# 推理阶段确定需调用的工具后,再加载
reasoning_result = "需调用LineChartGenerator生成折线图"
target_tool = load_tool_dynamically("LineChartGenerator", tool_lib)

5. 置信度校验:降低错误风险

在输出最终答案前,通过 LLM 校验"答案与任务的匹配度"(置信度),若置信度低于阈值(如80%),则提示"信息不足,需补充查询"或请求人工干预。例如用户查询"某公司2024年Q1净利润",若工具返回"2023年Q4净利润1000万",置信度低,需重新调用工具。
实现代码示例

python 复制代码
def check_confidence(answer, user_query, llm_client, threshold=0.8):
    prompt = f"请判断以下答案是否能准确回答问题,用0-1的数字表示置信度:\n问题:{user_query}\n答案:{answer}\n仅输出置信度数值:"
    confidence = float(llm_client.generate(prompt))
    return confidence >= threshold

# 输出最终答案前校验
final_answer = "某公司2023年Q4净利润1000万"
if check_confidence(final_answer, "某公司2024年Q1净利润", llm_client):
    print(final_answer)
else:
    print("信息不足,需补充查询2024年Q1数据")

七、ReAct 原生实现与框架(CrewAI/LangChain)的对比:选择适合的方案

在实际开发中,ReAct 有"原生实现"与"基于框架开发"两种路径,二者各有优劣,需根据场景选择:

对比维度 原生实现 CrewAI/LangChain 框架
底层控制力 ✅ 完全掌控推理逻辑、工具调用流程,支持深度定制(如自定义置信度规则) ❌ 受框架抽象层限制,定制化需修改框架源码或适配API
开发效率 ❌ 需自行实现循环逻辑、错误处理、令牌压缩等功能,开发周期长 ✅ 内置ReAct模板、工具库与优化组件(如LangChain的AgentExecutor),可快速搭建原型
生产环境适配性 ❌ 需自行开发并发控制、监控告警、负载均衡等生产级功能 ✅ 内置高可用机制

八、如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

"最先掌握AI的人,将会比较晚掌握AI的人有竞争优势"。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

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

九、为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

十、大模型入门到实战全套学习大礼包

1、大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!


2、大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

3、AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

4、大模型项目实战&配套源码

学以致用 ,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

5、大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

适用人群
第一阶段(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 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
相关推荐
冬奇Lab1 小时前
Agent 系列(21):Harness 测试工程——45 个测试怎么设计,以及它发现了什么 bug
人工智能·llm·agent
冬奇Lab1 小时前
每日一个开源项目(第133篇):EchoBird - 把 AI 工具的安装和部署做成傻瓜操作
人工智能·开源·资讯
星星在线1 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒2 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x2 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者3 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
用户5191495848454 小时前
Windows 渗透测试载荷加载器 POC 工具集
人工智能·aigc
袋鱼不重4 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
大树884 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
通信小呆呆4 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人