AI Agents in Action · Second Edition

中文实战笔记

Manning《AI Agents in Action》第二版的逐章中文教程, 覆盖有代码的第 2–11 章。不是翻译——是把书和配套仓库对着核了一遍: 提示词和注释都译成中文、环境换成 uv、代码改成能跑在兼容 OpenAI 的第三方模型上, 并且每一条结论都实测过

顺带挖出了不少书和仓库对不上的地方——包括一个让整章跑不起来的、根本不存在的 npm 包

10章教程
70个代码块
78条实测踩坑
1个不存在的包

先做这个

三个环境变量 + 两行代码

这套配置每一章都要用,而且和书里写的不一样——书假设你用 OpenAI 官方, 我们用的是兼容 OpenAI 格式的第三方模型。下面每一条我都在 openai-agents 0.18.3 上实测过。

# SDK 会自动读走这三个,不用写代码去传
OPENAI_BASE_URL=https://你的服务商地址/v1
OPENAI_API_KEY=sk-你的key
OPENAI_DEFAULT_MODEL=你的模型名
from dotenv import load_dotenv
from agents import set_default_openai_api, set_tracing_disabled

load_dotenv()
set_default_openai_api("chat_completions")  # 不加会去打 /v1/responses,第三方没这个端点
set_tracing_disabled(True)                  # 追踪端点硬编码 api.openai.com,第三方 key 只会 401
三个最容易漏的点

OPENAI_DEFAULT_MODEL 不能不设。不写 model= 不代表没事——SDK 有个内置默认模型(当前是 gpt-5.4-mini), 它会拿这个名字去请求你的服务商,然后你收到一个莫名其妙的错误。

set_default_openai_api("chat_completions") 不是可选的。 SDK 默认走 Responses API。我做了正反两次实验:不加这行请求打到 /v1/responses,加上才是 /v1/chat/completions

③ 从第 7 章起要换一行。set_tracing_disabled(True) 会让 Phoenix 也收不到。接 Phoenix 时要改用 set_trace_processors([])——只清掉发往 OpenAI 的那个。 详见第 7 章

环境用 uv,不用 pip

uv venv --python 3.11source .venv/bin/activateuv pip install -r requirements.txt。 注意目录是 .venv(带点),书里是 venv(不带点), 激活命令别照抄书。完整说明见第 2 章

十章

从这儿挑一章

每张卡片下面那行红字,是我在那一章挖到的最值钱的一个发现

第 2 章 · 核心组件
把一台概率机器
拴成一个能干活的智能体
8 个文件是同一个智能体被改了 8 次,每步只加一件事: 人设 → 参数 → 结构化输出 → 追踪 → 工具。
发现 · 第 4 步是作者故意让你跑崩的,别去修它
第 3 章 · MCP
把工具
搬出你的进程
同一套工具,换个装饰器就住进了另一个进程。 三种连法(stdio / SSE / npx)是并列选项,不是步骤
发现 · 书里的启动命令把客户端当服务端跑,必然连不上
第 4 章 · 多智能体
把方向盘交给模型,
然后装上刹车
真正的主线是控制权一步步从你手里转移给模型—— 写死顺序 → 自己排队 → 移交 → 失控 → 装护栏。
发现 · 中文 name= 会让三个智能体撞成同一个工具名
第 5 章 · 推理与规划
让模型「想一想」
的四种形状
一条链(CoT)、一个圈(ReAct)、一棵树(ToT)、一个回路(Reflexion)。 都在用「更多次调用」买「更少的错误」。
发现 · travel_forward 做的是减法——前进变后退,差 100 年
第 6 章 · 记忆与 RAG
给智能体
外挂两种脑子
向量记忆按「意思像不像」捞碎片,图记忆存实体关系网。 不是谁替代谁,是分工。
发现 · 查询翻成中文会静默失效——不报错,只是答错
第 7 章 · 评估与反馈
你怎么知道
它答对了
判分器的四次升级:== → LLM 当评委 → 还要查出处 → 让人看。 还上了第 2 章欠的追踪那笔账。
发现 · 讲评估的一章,自带的判分器是坏的
第 8 章 · 部署
把智能体
从你的终端里搬出去
能碰到它的人越来越多:终端 → 网页 → API → 容器。 每上一级,要操心的事多一圈。
发现 · README 的 build 命令实测直接报 no such file
第 9 章 · 智能体循环
让智能体
自己决定跑几轮
整章的心脏是三道终止门串在一起,全开才继续。 而第三道最容易被忽略。
发现 · 6 个文件引用的 npm 包根本不存在,整章开箱即挂
第 10 章 · 认知智能体
把「思考」
拆成零件
七个模块围着同一块黑板读写。最有价值的是最后三节: 让它知道自己不知道。
发现 · 775 行的旗舰成品,作者自己从没跑过(有证据)
第 11 章 · 实用建议
回到第一章
的那五层
按第 1 章的五个功能层各给一段建议——书的结构在这里闭合。 当检查清单读,别当代码抄。
发现 · 8 个文件里 2 个直接 TypeError,1 个是第 7 章的复制品

读完十章之后

两条贯穿全书的线

逐章读的时候看不出来,十章摆在一起才浮出水面。这两条比任何单章的知识点都值钱。

一、这本书反复栽在同一个坑里

四次,同一个病:用字符串操作去理解语言

第 4 章 输入护栏用 if 禁词 in input —— 换个说法就绕过去了
第 5 章 ToT 用 if "promising" in output —— "not promising" 里含 "promising",判反了
第 7 章 判分用 result == "antimatter" —— 拿整句话比一个词,说人话就判错
第 10 章 停滞检测用词交集 —— 同义不同词就检测不出

而解药第 2 章就教了。下面这条线,就是它。

二、output_type 是这本书唯一的主角

同一个东西,在十章里长成了四种身份:

第 2 章 「方便解析」—— 让 result.tasks[2] 能直接取值
第 7 章 让模型的判断能被代码消费」—— 评委必须返回真布尔值,不能返回散文
第 9 章 模型控制程序流的方向盘」—— goal_satisfied 直接决定循环转不转
第 10 章 元认知的前提」—— 你没法给一段自然语言设阈值,但能给 0.4

这本书如果只留一个东西,是它。

没有教程的两章

第 1 章和第 12 章

第 1 章 · 没有代码

全是概念:智能体的五个功能层(人设 / 工具 / 推理 / 记忆 / 评估)、 三种多智能体拓扑(装配线 / 中心辐射 / 团队)。 仓库里没有 chapter_01/,所以没做教程。

但它的五层结构是全书的骨架——第 11 章正是按这五层收口的。 想补这一课,直接看 第 11 章 那个五层堆叠图。

第 12 章 · 书里根本没有这一章

书的正文只到第 11 章(后面是附录 A/B)。但仓库里有个 chapter_12/,里面只有一个 16 行的 02_a2a_agent_consumer.py——01_ 都没有

而且它跑不了。第 7 行是:

card = requests.get("http://localhost:8080/.well-known/ai-agent.json")
endpoint = card["url"]  ← Response 对象不能下标,必然 TypeError

正确写法是 card.json()["url"]。而且它依赖一个 localhost:8080 上根本不存在于本仓库的 A2A 服务——没有任何文件提供它。 requirements.txt 倒是为它装了 google-adk[a2a]litellm

结论:这是个残留存根,不是遗漏的一章。没有教程可做。

关于这套笔记

哪些验证过,哪些没有

验证过的

代码是真跑的,不是看的。我起了一个假的「第三方模型服务」接住请求, 逐个文件跑、核对请求路径、model 字段和鉴权头。所有代码块都过了 ast.parse,翻译只动字符串、不动结构(用 AST 骨架比对确认过)。

几个关键结论是专门做实验证死的:npm 包 404(registry 直查 + scope 枚举 + 实际 npx 拉取,三重)、 Docker build 失败(真跑)、Phoenix 追踪落库(起了真容器,12 个 span)、 中文查询检索劣化(真向量库测距离)、中文 name 撞名(真调 SDK)。

没验证过的 —— 请你帮我看一眼

第 3–11 章的页面渲染我一次都没亲眼看到。写第 2 章时用的浏览器预览面板 从第 3 章起就卡住了,导航报成功但页面不变。所以那九页我只做了静态验证 (语法、HTML 标签配平、复制逻辑与第 2 章实测版逐字比对)。

代码层面我是真跑过的,但排版可能有我看不见的问题。 建议先看第 5 章(四个 SVG 形状图)和 第 9 章(三道终止门)——这两页视觉结构最复杂、最可能翻车。 发现问题告诉我。

代码和仓库不是一一对应的

每一页的代码相比仓库原文都有刻意的改动,页脚都列明了:环境换 uv、 提示词/注释/docstring 译成中文、补上接第三方模型的配置, 以及修掉那些确实是 bug 的地方(第 5 章的减号、第 7 章缺的 f、 第 9 章不存在的包)。

但有几处坏代码我故意保留了原样——因为它坏本身就是要点: 第 5 章 ToT 的子串判断、第 11 章那两个 TypeError。这些地方都单独标注了。

有些东西不能翻,翻了会真的坏掉:智能体 name=(撞名)、 工具函数名(提示词按名字引用)、字典的键、枚举值、第 6 章的检索查询、 第 7 章那五条虚构知识(检索是英文子串匹配)。