第 04 篇 · 从零搭单 Agent:看清 ReAct 裸骨架

举报
yd_287713361 发表于 2026/10/28 23:40:27 2026/10/28
【摘要】 第 04 篇 · 从零搭单 Agent:看清 ReAct 裸骨架

原文链接:https://mp.weixin.qq.com/s/FLOwlRBpX0YKw6vH3xMO1w

本文首发于微信公众号「月牙寂」,此处为同步转载。

人类作者:月牙寂(龚浩华)

Agent 作者:月绡凝(小凝)

定位:Agent 实战系列板块二·通用第 04 篇——从零搭单 Agent:不依赖框架,用 Python + 一个 API Key 手写工具调用 + ReAct 循环,看清「裸骨架」再理解框架价值。

免责声明:本文为学习与技术分享用途,代码示意基于官方 SDK 用法。

01SECTION

第 04 篇 · 从零搭单 Agent:看清 ReAct 裸骨架


02SECTION

导读


Eino(01-03 篇)把 Agent 封装得很好,但先手写一次,你才知道框架替你干了什么。本篇不依赖任何框架,用 Python + Anthropic SDK 搭一个能自主调用搜索工具的单 Agent——代码只有几十行,却完整包含 ReAct 循环的三拍子(推理→行动→观察)。

03SECTION

一、Agent vs 普通 LLM 调用



普通 LLM 调用
Agent
交互
一问一答
多轮自主决策
工具
人写代码串联
自己决定调哪个
任务
单步
多步
决策权
人定每步
AI 定下一步

•一句话:Agent = 能自己调工具的 AI。核心循环就是 ReAct(agent-范式 01 篇)。

04SECTION

二、最小实战:带搜索工具的 ReAct Agent


python

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)干的是把这个循环工程化(状态、重试、流式、追踪)。

05SECTION

三、实战避坑(官方/社区共识)


1Token 消耗爆炸:单 Agent 一次任务 token ≈ 普通聊天的 4 倍(每次循环都重发全部消息)——所以要有 max_steps 护栏和上下文管理;

2上下文污染:中间结果全塞进 messages,长任务会爆窗口——需要摘要/压缩(agent-系列 03 篇上下文工程);

3工具描述即一切:description 写不好,模型就不会用或乱用——工具是「说明书」,不是「开关」;

4流式 tool_use 拼接:流式输出时 tool_use 参数可能分片,要攒齐再执行(与 Eino 踩坑同源)。

06WHY

四、从裸骨架到框架(为什么要用 Eino/LangGraph)


裸骨架(本篇)
框架版(01-03 篇)
手写循环
react.NewAgent(...)
 一行
手写上下文管理
MessageModifier / checkpoint
无流式支持
StreamReader 原生流式
无追踪
Callback / LangSmith 自动埋点
单 Agent 到头
ADK 多 Agent + HITL
07SECTION

五、本篇要点(复习卡片)


1Agent 定义:能自己调工具的 AI;核心 = ReAct 循环。

2五步骨架:定义工具 → 模型出 tool_use → 执行 → 结果回喂 → 循环。

3工具描述 = 说明书:description 决定模型用不用、用得对不对。

4两大坑:token 4 倍成本(要护栏)、上下文污染(要压缩)。

5框架价值:把循环工程化——流式、状态、追踪、多 Agent。

08SECTION

六、下一篇预告


第 05 篇(板块二·通用):多 Agent 团队实战——单 Agent 会了,怎么组队:Claude Agent Teams 从零搭「竞品调研系统」(搜索 Agent + 分析 Agent + 汇总 Agent 分工协作),附选型判断(什么时候该多 Agent、token 15 倍代价怎么算)。

09SECTION

参考资料


•[官方] Anthropic Claude API / Tool Use:https://docs.anthropic.com/

•[参考] Claude Agent Teams 实战手册(从零搭多 Agent,社区)


整理:2026-10-02 月绡凝 · 依据官方 SDK 用法。



【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。