首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ReAct代理裸机编码指南:不依赖任何框架的LLM自主决策实现

ReAct代理裸机编码指南:不依赖任何框架的LLM自主决策实现

原创
作者头像
聚客AI
发布2025-08-06 14:08:43
发布2025-08-06 14:08:43
39100
代码可运行
举报
运行总次数:0
代码可运行

本文较长,建议点赞收藏,以免遗失。由于文章篇幅有限,文中我还会插入一些针对该知识点更详细的技术文档,自行领取,以便帮助大家更好的学习。

​一、ReAct 模式:AI 代理的“思考-行动”循环​

ReAct(​​Re​​asoning + ​​Act​​ion)是一种让大语言模型(LLM)​​自主完成任务的核心架构​​。与传统直接生成答案的模式不同,ReAct 要求代理交替执行以下两步:

  1. ​推理(Reasoning)​​:分析当前状态,规划下一步行动
  2. ​行动(Action)​​:调用工具(Tools)获取信息或执行操作

​二、为什么需要 ReAct?突破 LLM 的固有局限​

传统 LLM 缺陷

ReAct 解决方案

依赖预训练知识,无法获取实时数据

调用搜索引擎/API 获取最新信息

复杂计算容易出错

集成计算工具执行精确运算

多步骤任务逻辑混乱

拆解为“思考-行动”链式决策

典型案例​​:

用户问:“特斯拉当前股价是多少?相比去年同期涨了多少百分比?” 传统 LLM 可能直接编造数据,而 ReAct 代理会:

  1. 调用金融API获取当前股价
  2. 查询历史数据库找出去年同期股价
  3. 使用计算工具执行百分比运算

三、推理+行动:ReAct 代理的工作原理

ReAct 代理以“思考 → 行动 → 观察”的循环方式运行,重复进行直到找到解决方案或最终答案。

这与人类解决问题的方式类似:

  • 我们思考该做什么
  • 执行某项操作(例如查找某些内容或进行计算),
  • 观察结果
  • 然后将其融入到我们的下一个想法中。

ReAct 框架使用提示工程来强制执行这种结构化方法,交替模型的思想和行动/观察。

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

思考:由法学硕士 (LLM) 驱动的代理会分析用户的查询和内部语境,并用自然语言生成推理步骤。这通常不会向最终用户展示,而是代理自言自语的一部分。例如:“问题询问一个国家的人口数量;我应该使用网络搜索来查找最新数据。”

动作:基于想法,代理决定执行哪个外部工具或操作。它会输出指示操作的指定格式。例如:Action: WebSearch("population of Canada 2023")。代理本质上是通过名称“调用”某个函数(工具),通常会附带一些输入参数。

观察:代理的环境(我们的代码)执行请求的操作,并将结果(观察)返回给代理。例如,网页搜索工具可能会返回:“ Observation: The population of Canada in 2023 is 38 million.”。此观察结果会被输入到代理的上下文中。

智能体获取新信息后返回第一步(另一个思考)。它会利用新数据进行推理。在我们的例子中,它可能会想:“现在我有了人口数据;我可以回答这个问题了。”

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

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

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

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

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

​为了让你更彻底明白其逻辑,我整理了两个示例,并带你从头构建 ReAct 一个代理,粉丝朋友自行领取(附代码):

《Python 和 LLM 从头构建 ReAct 代理全流程》

四、工具调用:代理的“双手”​

工具是实现行动的关键,需满足 ​​3 个设计原则​​:

  1. ​原子性​​:每个工具只做一件事(如 Calculator 仅负责计算)
  2. ​强契约​​:明确定义输入/输出格式(如 JSON Schema)
  3. ​安全性​​:隔离高风险操作(如数据库写入需权限控制)

​常用工具示例​​:

代码语言:javascript
代码运行次数:0
运行
复制
from math import sqrt

tools = [
    Tool(
        name="GoogleSearch",
        func=search_api,  # 对接搜索引擎API
        description="获取实时信息,输入:搜索关键词"
    ),
    Tool(
        name="Calculator",
        func=lambda x: eval(x),  # 注意:生产环境需替换为安全计算库
        description="执行数学计算,输入:数学表达式"
    ),
    Tool(
        name="DataPlotter",
        func=generate_chart,  # 数据可视化工具
        description="生成折线图,输入:{x:[1,2,3], y:[4,5,6]}"
    )
]

五、Prompt 工程:驱动推理的核心​

ReAct 的思考质量取决于 ​​Prompt 设计​​,经典模板如下:

代码语言:javascript
代码运行次数:0
运行
复制
你是一个自主代理,请通过以下步骤解决问题:
1. 思考:分析当前需要什么信息
2. 行动:调用工具获取信息(格式:ACTION: 工具名(参数))
3. 观察:记录工具返回结果
4. 循环直到得出最终答案

当前任务:{query}
历史记录:
{memory}

请输出下一步指令:

​实际生成示例​​:

代码语言:javascript
代码运行次数:0
运行
复制
思考:需要知道2024年奥斯卡最佳影片
ACTION: GoogleSearch("2024 Oscar best picture winner")

观察:"《奥本海默》获得2024年奥斯卡最佳影片"

思考:用户还要求主演名单
ACTION: GoogleSearch("Oppenheimer cast")

观察:"基里安·墨菲、艾米莉·布朗特..."

思考:答案已完整
FINAL_ANSWER: 最佳影片是《奥本海默》,主演包括...

六、优化:超越基础实现

原生实现后需考虑​​五大增强方向​​:

  • ​短路机制​​:当工具返回明确结果时跳过冗余思考
代码语言:javascript
代码运行次数:0
运行
复制
if "答案直接可见" in tool_result:
    return tool_result  # 提前终止循环
  • ​错误回退​​:工具调用失败时尝试替代方案
  • ​令牌压缩​​:用摘要替代完整历史记录减少 token 消耗
  • ​动态工具加载​​:运行时按需加载工具降低内存占用
  • ​置信度阈值​​:低置信度时要求人工干预

七、与框架的共生关系​

原生实现

CrewAI/LangChain

✅ 完全掌控底层逻辑

✅ 快速构建生产系统

✅ 适合研究/定制化场景

✅ 内置负载均衡、容错机制

❌ 需自行处理并发/监控

❌ 抽象层掩盖关键细节

​推荐策略​​:

用原生实现理解原理 → 在 CrewAI 中实践复杂任务 → 定制框架扩展点

ReAct 不仅是工具调用模式,更是 LLM 实现“自驱动”的认知框架。关注我,我们下期见。如果本次分享对你有所帮助,记得点个小红心,你的鼓励就是我更新的动力。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ​​一、ReAct 模式:AI 代理的“思考-行动”循环​​
  • ​​二、为什么需要 ReAct?突破 LLM 的固有局限​​
  • 三、推理+行动:ReAct 代理的工作原理​
  • 四、工具调用:代理的“双手”​​
  • ​​
  • 五、Prompt 工程:驱动推理的核心​​
  • ​​
  • 六、优化:超越基础实现​
  • ​​
  • 七、与框架的共生关系​​
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档