摘要: 本篇紧接上文,将利用已封装的 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 步:
- Thought: 我需要查找华为最新发布的手机型号。这些信息可能在我的知识库之外,需要使用搜索。
- Action:
- Observation: (SerpApi 返回结果)
- 第 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 不工作时,请按以下清单检查 :
- 检查完整 Prompt:打印出最终发给 LLM 的字符串,检查历史记录 () 拼接是否正确。
- 分析原始输出 (Raw Output):解析失败时,查看 LLM 到底输出了什么。往往是因为 LLM 加了“Note:”或者没换行。
- 验证工具输入:确保 Agent 生成的 符合函数要求(例如 JSON 格式是否正确)。
- Few-shot Prompting:如果模型总是格式错误,在 Prompt 中加入 1-2 个成功的 示例。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/243554.html原文链接:https://javaforall.net
