PaiAgent ReAct Agent节点实现揭秘:单节点内构建自主决策与工具调用的AI智能体
【免费下载链接】PaiAgent🔥轻量级的AI工作流编排系统,类似dify、n8n,全程使用Vibe Coding,AI工具为Qoder+CLI。涉及到的技术栈包括SpringAI、LangGraph4J、SSE、MinIO、DAG自定引擎等。项目地址: https://gitcode.com/javabetter/PaiAgent
PaiAgent 是一个轻量级的 AI 工作流编排系统(类似 dify、n8n),其中最受关注的特性之一就是ReAct Agent 节点:在单个节点内部构建「推理 → 工具调用 → 观察 → 再推理」的自主决策循环,让大模型自己决定调用哪个工具、何时给出最终答案。本文将从源码视角拆解它的实现机制,帮助新手快速理解AI Agent 工具调用与智能体执行轨迹是如何落地的。
什么是 ReAct Agent 节点?
普通的大模型节点是"一问一答"的:输入提示词,返回文本,过程完全确定。而 ReAct(Reasoning + Acting)范式让模型具备了自主决策能力:
- 🧠推理(Reasoning):模型思考当前进展,决定下一步动作
- 🔧行动(Acting):模型选择调用一个工具(联网搜索、检索知识库、读写记忆……)
- 👀观察(Observation):工具执行结果回填给模型,进入下一轮决策
- 🏁终止:模型判断信息足够时,输出最终答案
在 PaiAgent 中,这个循环被封装在react_agent节点内部,由 ReActAgentNodeExecutor.java 驱动。对 LangGraph 引擎来说,它只是一个普通节点——这种"黑盒化"设计让复杂智能体逻辑无需改动工作流图结构即可接入,详见 docs/react-agent-phases.md。
它在项目架构中的位置
PaiAgent 的执行链路是:WorkflowEngine → DAGParser → NodeExecutorFactory → 具体 NodeExecutor。react_agent节点通过现有的 NodeExecutorFactory.java 分发到 ReAct 执行器,复用了所有 LLM 节点的基础能力(模型配置解析、Token 统计等),零侵入地插入了自主决策能力。
核心机制:节点内的 ReAct 循环
整个循环的核心代码在 ReActAgentNodeExecutor.java 中,流程非常清晰:
- 组装系统提示词:把可用工具的名称、描述、输入 Schema 注入系统提示,并约束模型"每次只返回两种 JSON 之一"
- 循环决策(默认最多 5 步,上限 20 步):每轮把「目标 + 当前输入 + 历史轨迹 + 步数」打包发给大模型
- 解析结构化决策:
{"action":"tool_call", "toolName":"工具名", "toolInput":{}}→ 执行工具{"action":"final_answer", "finalAnswer":"最终答案"}→ 结束循环
- 执行工具并回填观察:工具结果(或错误信息)写入轨迹,进入下一轮
每个节点执行完毕后,输出中包含toolTrace(完整决策轨迹)、steps(实际步数)、maxStepsReached(是否触达步数上限)、tokens(Token 消耗)等字段,在前端调试面板中可逐步查看:
工具体系:一个接口,八个即插即用工具
所有工具都实现统一的 AgentTool.java 接口,只需提供四个要素:名称、描述、输入 Schema、执行方法——这正是大模型 Function Calling 的标准形态。AgentToolRegistry.java 利用 Spring 自动装配把所有工具 Bean 收进注册表,新工具无需修改执行器代码即可被 Agent 发现。
内置工具一览(位于 engine/agent/tool/):
| 工具名 | 用途 | 对应源码 |
|---|---|---|
web_search | 通过 MCP 联网搜索实时信息 | WebSearchTool.java |
web_fetch | 抓取网页正文 | WebFetchTool.java |
knowledge_retrieve | 从配置的知识库检索资料 | KnowledgeRetrieveTool.java |
memory_write/memory_retrieve | 写入 / 召回 Agent 长期记忆 | MemoryWriteTool.java |
read_current_input | 读取节点当前输入 | ReadCurrentInputTool.java |
load_skill_detail/load_skill_reference | 加载 Skill 技能详情与参考资料 | SkillLoader 体系 |
两个巧妙的自动化细节:节点配置了知识库时会自动追加knowledge_retrieve工具;选择了web_search会自动补上web_fetch(搜到链接后才能抓正文)。这套"智能工具装配"逻辑见 ReActAgentNodeExecutor.java。
在可视化编辑器中配置与使用
前端节点库中可以直接拖入ReAct Agent节点,它复用 LLM 节点的配置面板(模型、提示词、Skill 关联),并额外提供maxSteps(最大决策步数)与工具选择能力,相关实现见 NodePanel.tsx 与 EditorPage.tsx:
配置三步走:① 拖入 ReAct Agent 节点;② 填写任务提示词(例如"搜索 X 技术最新动态并总结");③ 选择工具与步数上限,保存即可调试。
健壮性设计:为什么它"跑不崩"
大模型的输出天然不可控,这套实现做了多层兜底:
- 🛡️容错解析:自动剥离 Markdown 代码块、归一化动作别名(
tool/call_tool/function_call都识别为工具调用),兼容toolName/tool_name等字段变体(见 parseDecision 方法) - ⚠️优雅降级:模型返回非法 JSON 时直接按最终答案处理,流程不中断
- 🔄工具失败可恢复:工具抛异常不会终止循环,而是把错误作为"可恢复观察"回填,让模型自行换策略重试
- 📊全链路可观测:每步轨迹通过 SSE 实时推送到前端执行日志,Token 消耗逐轮累加统计
下一步:升级为 LangGraph 原生状态机
当前"阶段一"方案里,ReAct 循环藏在节点内部。docs/react-agent-phases.md 中规划了"阶段二":把每一轮决策拆成 LangGraph4J 的独立图节点,用条件边(tool/final/max_steps)路由,让每一轮 Agent 决策都可视化、可断点、可恢复——这是从"黑盒智能体"走向"白盒状态机"的自然演进。
总结
PaiAgent 的 ReAct Agent 节点用一套极简但完整的设计,演示了单节点内构建 AI 智能体的关键要素:结构化 JSON 决策协议、统一工具接口 + 自动装配、多步循环控制、容错解析与全链路轨迹追踪。对于想学习Agent 工作流编排的开发者,这套源码是一个值得精读的轻量级范本。
【免费下载链接】PaiAgent🔥轻量级的AI工作流编排系统,类似dify、n8n,全程使用Vibe Coding,AI工具为Qoder+CLI。涉及到的技术栈包括SpringAI、LangGraph4J、SSE、MinIO、DAG自定引擎等。项目地址: https://gitcode.com/javabetter/PaiAgent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考