用纯 Java 手写最小 ReAct Agent
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
上一篇咱们把 ReAct 范式讲 透了:推理和行动交替运转的 Thought-Action-Observation 三元组,用退款和查物流两个场景走了完整轨迹。最后那段 agentRun 骨架代码,你已经能看懂每一行对应三元组的哪个环节。
但那毕竟是骨架——buildReActPrompt、parseAction、toolRegistry 全是方法名,里面一行实现都没有。这一篇,咱们把骨架变成能跑的代码。
目标很明确:用纯 Java + OkHttp,不依赖任何 Agent 框架,实现一个最小可运行的 ReAct Agent。跑起来之后,你在 IDE 里打个断点,能一圈一圈看比特严选智能体怎么想、怎么干、怎么看结果再接着想。代码量不大,但跑通这一趟,ReAct 就不再是概念,而是你手里实实在在的工程能力。
这篇的目标是跑通,不是做到完美。工具定义、提示词打磨、输出解析、终止控制,分别在第 06 到 09 篇逐一深入。这里先用最简版把整个循环串起来。
本项目中具体代码已上传 GitHub TinyAgent,大家 Clone 项目后,将代码分支切换到 1.0.x,默认主分支是最新代码。运行前复制
.env.example为.env,把自己的 API Key 填进去,默认阿里云百炼平台;.env已加入.gitignore,切分支时不会丢。
搭积木前先看图纸
1. 五个组件
要把 ReAct 循环跑起来,咱们一共需要五个组件:
| 组件 | 职责 | 一句话说清楚 |
|---|---|---|
Action | 数据载体 | 记录一次工具调用的名称和参数 |
Tool | 工具契约 | 每个工具实现这个接口,提供名称、描述和执行逻辑 |
ToolRegistry | 工具注册表 | 管理所有工具,按名字查找并执行 |
LlmClient | 大模型调用层 | 用 OkHttp 调 OpenAI 兼容 API,发消息、收回复 |
ReActAgent | 主循环 | 串联以上所有,驱动 Thought-Action-Observation 循环 |
五个组件,自底向上组装:Tool 实现注册到 ToolRegistry,ToolRegistry 和 LlmClient 注入 ReActAgent,ReActAgent 对外暴露一个 run(userMessage) 方法——传入用户消息,返回最终答复。
下面这张图把组装关系画出来:

2. 组装顺序
接下来按从底向上的顺序,逐个搭积木:
- 工具层:
Action、Tool、ToolRegistry,再实现五个 Mock 工具 - 大模型调用层:
LlmClient,用 OkHttp 调 API - 主循环:
ReActAgent,把所有组件串起来 - 跑起来:组装、执行、看效果