第 04 篇 · 从零搭单 Agent:看清 ReAct 裸骨架
原文链接:https://mp.weixin.qq.com/s/FLOwlRBpX0YKw6vH3xMO1w
本文首发于微信公众号「月牙寂」,此处为同步转载。
人类作者:月牙寂(龚浩华)
Agent 作者:月绡凝(小凝)
定位:Agent 实战系列板块二·通用第 04 篇——从零搭单 Agent:不依赖框架,用 Python + 一个 API Key 手写工具调用 + ReAct 循环,看清「裸骨架」再理解框架价值。
免责声明:本文为学习与技术分享用途,代码示意基于官方 SDK 用法。
第 04 篇 · 从零搭单 Agent:看清 ReAct 裸骨架
导读
Eino(01-03 篇)把 Agent 封装得很好,但先手写一次,你才知道框架替你干了什么。本篇不依赖任何框架,用 Python + Anthropic SDK 搭一个能自主调用搜索工具的单 Agent——代码只有几十行,却完整包含 ReAct 循环的三拍子(推理→行动→观察)。
一、Agent vs 普通 LLM 调用
|
|
|
|
|
|
|
|
|
|
|
自己决定调哪个 |
|
|
|
|
|
|
|
|
•一句话:Agent = 能自己调工具的 AI。核心循环就是 ReAct(agent-范式 01 篇)。
二、最小实战:带搜索工具的 ReAct Agent
import anthropic, json
client = anthropic.Anthropic() # 需设 ANTHROPIC_API_KEY
# 1. 定义工具:让模型知道「有搜索能力可用」
tools = [{
"name": "web_search",
"description": "搜索网页并返回相关结果摘要",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"],
},
}]
def web_search(query):
# 真实接入搜索 API(如 Tavily/Serper);此处为示意
return f"关于「{query}」的模拟搜索结果……"
# 2. ReAct 循环:推理 → 工具调用 → 观察 → 再推理
def run_agent(user_query):
messages = [{"role": "user", "content": user_query}]
for step in range(5): # 最大步数护栏
resp = client.messages.create(
model="claude-sonnet-4-5", max_tokens=2048,
messages=messages, tools=tools,
)
# 检查模型是否请求调用工具
tool_call = next((b for b in resp.content if b.type == "tool_use"), None)
if tool_call is None:
return resp.content[-1].text # 无工具调用 → 输出最终答案
# 3. 执行工具,把结果回喂给模型(Observation)
result = web_search(tool_call.input["query"])
messages.append({"role": "assistant", "content": resp.content})
messages.append({"role": "user", "content": [
{"type": "tool_result", "tool_use_id": tool_call.id, "content": result},
])
return "达到最大步数,任务未完成。"
print(run_agent("帮我查一下 Agent 最新的开源框架"))
•五步解析(对照 agent-范式 01 篇):工具定义:JSON Schema 告诉模型「有什么能力、参数是什么」;推理:模型决定「该查一下」并输出 tool_use;行动:你执行工具(这里是 web_search);观察:把 tool_result 回喂;循环:模型看到结果再推理,直到不调工具直接回答。
💡 学习要点:裸骨架 = 一个 while 循环 + 工具回喂Agent 的本质不是魔法:「模型输出 tool_use → 你执行 → 结果回喂 → 模型再想」。框架(Eino/LangGraph)干的是把这个循环工程化(状态、重试、流式、追踪)。
三、实战避坑(官方/社区共识)
1Token 消耗爆炸:单 Agent 一次任务 token ≈ 普通聊天的 4 倍(每次循环都重发全部消息)——所以要有 max_steps 护栏和上下文管理;
2上下文污染:中间结果全塞进 messages,长任务会爆窗口——需要摘要/压缩(agent-系列 03 篇上下文工程);
3工具描述即一切:description 写不好,模型就不会用或乱用——工具是「说明书」,不是「开关」;
4流式 tool_use 拼接:流式输出时 tool_use 参数可能分片,要攒齐再执行(与 Eino 踩坑同源)。
四、从裸骨架到框架(为什么要用 Eino/LangGraph)
|
|
|
|
|
react.NewAgent(...)
|
|
|
|
|
|
|
|
|
|
|
|
|
五、本篇要点(复习卡片)
1Agent 定义:能自己调工具的 AI;核心 = ReAct 循环。
2五步骨架:定义工具 → 模型出 tool_use → 执行 → 结果回喂 → 循环。
3工具描述 = 说明书:description 决定模型用不用、用得对不对。
4两大坑:token 4 倍成本(要护栏)、上下文污染(要压缩)。
5框架价值:把循环工程化——流式、状态、追踪、多 Agent。
六、下一篇预告
第 05 篇(板块二·通用):多 Agent 团队实战——单 Agent 会了,怎么组队:Claude Agent Teams 从零搭「竞品调研系统」(搜索 Agent + 分析 Agent + 汇总 Agent 分工协作),附选型判断(什么时候该多 Agent、token 15 倍代价怎么算)。
参考资料
•[官方] Anthropic Claude API / Tool Use:https://docs.anthropic.com/
•[参考] Claude Agent Teams 实战手册(从零搭多 Agent,社区)
整理:2026-10-02 月绡凝 · 依据官方 SDK 用法。
- 点赞
- 收藏
- 关注作者
评论(0)