[Hello Agents Chapter 4] 智能体经典范式构建 Part 2:手写 ReAct 智能体

[Hello Agents Chapter 4] 智能体经典范式构建 Part 2:手写 ReAct 智能体

摘要: 本篇紧接上文,将利用已封装的 LLM 客户端和工具箱,通过精细的 Prompt 工程与正则表达式解析,从零组装一个完整的 ReAct 智能体。我们将深入代码核心,实现“思考-行动-观察”的闭环逻辑,并探讨该范式的优缺点及调试技巧。
关键词: ReAct Agent, Prompt Engineering, Regex Agent 智能体 Parsing, Agent Loop, Debugging
本文是基于Datawhale的hello-agent开源项目做的一些笔记,内容仅供参考,原PDF以及代码可以去github仓库获取https://datawhalechina.github.io/hello-agents


在 Part 1 中,我们完成了开发环境搭建,封装了 客户端,并实现了一个具备智能解析功能的 Google Search 工具及其调度器 。现在,万事俱备,只欠核心逻辑。

我们将通过一个 类来封装核心逻辑。为了便于理解,我们将实现过程拆分为:Prompt 设计、核心循环、输出解析、工具执行与观测整合。

1. 系统提示词设计 (System Prompt)

提示词是 ReAct 机制的基石。我们需要设计一个模板,动态插入可用工具、用户问题及历史交互记录,并强制 LLM 遵循特定的输出格式(Thought/Action)。


这个模板定义了交互规范:

  • 角色定义:明确其具备使用工具的能力。
  • 工具清单 ({tools}):由 动态生成。
  • 格式规约:这是最关键的部分。
  • :强制模型进行“内心独白”。
  • :规定了 的调用格式和 的结束指令。

💡 深度解析 (Deep Dive)
原书使用的这种基于文本格式(Text-based)的 Prompt 在早期 Agent 开发中非常普遍。但在现代工程(如 OpenAI GPT-4 Turbo)中,我们通常会结合 Function Calling (Tool Use) API,将工具定义为 JSON Schema 传入,从而获得更稳定、更结构化的输出,减少正则解析失败的概率。

2. 核心循环的实现 (The Core Loop)

的核心是一个 循环,它不断执行“格式化 Prompt -> 调用 LLM -> 解析 -> 执行 -> 更新历史”的流程。


🛠️ 实战映射 (Implementation)
是一个极其重要的安全阀。在生产环境中,Agent 很容易因为陷入死循环(Loop)而耗尽 Token 额度。LangChain 的 中也有类似的 参数。

3. 输出解析器的实现 (Output Parser)

LLM 返回的是非结构化文本,我们需要用正则表达式提取关键信息。


(注:原书中的正则较简单 ,但在实际多行输出中可能需要 或更复杂的逻辑来防止匹配错误,此处尽量保持原书逻辑并微调以确保可运行)

4. 运行实例与分析

将所有组件组合后,我们可以运行一次真实的查询。

输入问题:“华为最新的手机是哪一款?它的主要卖点是什么?”

运行轨迹记录 (Log)

  1. 第 1 步
  • Thought: 我需要查找华为最新发布的手机型号。这些信息可能在我的知识库之外,需要使用搜索。
  • Action:
  • Observation: (SerpApi 返回结果)
  1. 第 2 步
  • Thought: 根据搜索结果,Pura 70 是最新发布的。Mate 60 也很新。我需要总结它们的卖点。
  • Action:

亲手实现 ReAct 后,我们可以总结其工程特性。

1. 主要特点

  • 高可解释性:通过 链,我们可以清晰看到 Agent 为什么选择这个工具,这对于调试至关重要 。
  • 动态规划:它是“走一步,看一步”。如果第一步搜索结果通过,它可以在第二步立即调整关键词重新搜索,而不是死板地执行预设计划 。
  • 工具协同:LLM 负责运筹帷幄(Plan/Reason),工具负责解决具体问题(Data/Calc) 。

2. 固有局限性 (Limitations)

  • 依赖模型能力:如果 LLM 逻辑推理弱,或者不遵循指令(Instruction Following),很容易在 环节产生幻觉,或者输出无法解析的 格式 。
  • 执行效率:串行循环。每一步都需要一次 LLM 调用 + 网络请求。复杂任务可能导致高延迟和高 Token 消耗 。
  • 提示词脆弱性:Prompt 中的标点符号、换行符差异都可能导致 Agent 行为异常 。
  • 局部最优:由于缺乏全局规划,它可能陷入“原地打转”的死循环(Looping) 。

3. 调试技巧 (Debugging)

当你构建的 Agent 不工作时,请按以下清单检查 :

  1. 检查完整 Prompt:打印出最终发给 LLM 的字符串,检查历史记录 () 拼接是否正确。
  2. 分析原始输出 (Raw Output):解析失败时,查看 LLM 到底输出了什么。往往是因为 LLM 加了“Note:”或者没换行。
  3. 验证工具输入:确保 Agent 生成的 符合函数要求(例如 JSON 格式是否正确)。
  4. Few-shot Prompting:如果模型总是格式错误,在 Prompt 中加入 1-2 个成功的 示例。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/243554.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月15日 下午9:41
下一篇 2026年3月15日 下午9:42


相关推荐

关注全栈程序员社区公众号