ByteNoteByteNote
40 章走完,你已经能从 0 写 Agent 了
字

字节笔记本

2026年10月24日 · 约 9 分钟读完

40 章走完,你已经能从 0 写 Agent 了

API中转
¥120

Agent 循环

本文是《从 0 写 Agent》系列第 40 章。这个系列基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版),用 Go 从零实现一个生产级 Agent 运行时;本章讲「结语:你现在已经能从 0 写 Agent 了」。

恭喜,你读完了全系列 40 章。

从第 1 章的 30 行循环,到第 39 章的完整 Web 平台,你走完了"从 0 写 Agent"的全旅程。这一章做个总结,Agent 运行时的 7 个核心设计模式、Go 做 Agent 的优劣、以及下一步学什么。


全书回顾:从循环到平台

Part主题你得到了什么
Part 0前言系列地图
Part I最小 Agent循环、Model 接口、Tool、并发、流式
Part II状态记忆Session、FileSession 崩溃安全、SQL、分叉压缩、HITL、RunState 序列化、Guardrails
Part III多 AgentHandoff、历史处理、NestHandoffHistory、Agent-as-Tool、Lifecycle Hooks
Part IV模型可观测Router、Retry、Fallback、装饰器组合、Tracing 四层、BatchProcessor、Exporter
Part V工具生态MCP、Skills、os.Root、Sandbox 抽象、Docker 纵深防御
Part VI完整应用agents-server 四层架构、数据库、WebSocket、HITL 端到端、前端、OAuth

从最简循环到完整平台,这就是"从 0 写 Agent"的全部旅程。


Claude Code

Agent 运行时的 7 个核心设计模式

贯穿全书,反复出现的设计模式:

1. 配置 vs 执行分离

Agent 是静态配置(指令、工具、模型),runner 是动态执行器(持有运行时状态),RunContext 是动态可变状态。配置不可变,执行器管理变化。 这个分离让 Agent 定义可序列化、可配置(存数据库),执行器专注跑循环。

2. 封闭接口 + 私有 marker 方法

Tool.isTool()、RunItem.isRunItem()、StreamEvent.streamEvent(),小写方法让类型集合对本包关闭,强制走构造函数。保证只有包内定义的类型能进入运行时,外部不能造不合规对象。

3. 装饰器模式

Model 接口的 Retry/Fallback/Router 都是装饰器,实现同一接口,包装增强能力,任意组合。这是"能力可组合"的关键,不修改原代码,只包装。

4. 双列表/双视角

generatedItems(模型视角,可被 handoff filter 重写)vs sessionItems(持久化视角,永不重置)。让"模型看到的"和"存储的"分离,各取所需。

5. 错误分层的回喂 vs 中断

  • 输入/输出 guardrail:硬失败(跳闸中断)
  • 工具错误:默认回喂(模型自愈),关键操作中断
  • Sandbox:代码错回喂,基础设施错中断
  • "可恢复的错误回喂,不可恢复的错误中断",这是错误处理的统一原则。

6. resume 复用而非重算

HITL 恢复时,复用 InterruptedResponse(不重新调模型)、复用 turn 计数(不重新计轮次)、复用 usage(不重复计 token)。暂停和恢复是确定性的,不产生副作用。

7. 异步不阻塞业务

  • Tracing 的 BatchProcessor 后台异步导出
  • HTTPExporter 失败静默丢弃
  • "telemetry 永远不能反过来搞挂应用",可观测性是 best-effort,不是 critical path。

这 7 个模式不只适用于 agents-go,它们是工业级 Agent 运行时的通用设计原则。 你写自己的 Agent 框架,也会用到这些。


Go 做 Agent:优势与劣势

优势

  1. 并发模型,goroutine 天然适合多工具并行、流式事件、异步导出。不用 asyncio 满天飞。
  2. 类型安全,编译期检查工具参数、Agent 配置。减少运行时错误。
  3. 单二进制部署,后端 + 前端 + SQLite 全在一个文件。运维极致简单。
  4. 错误处理,显式的 error 返回值,强制处理,比 try/except 严谨。

劣势(诚实说)

  1. JSON Schema 反射不如 Pydantic,struct tag 啰嗦,复杂 schema 难写。
  2. 生态不如 Python,AI/ML 库大多 Python,Go 这边少。
  3. 迭代速度,Go 的类型系统让快速原型比 Python 慢一点(但生产更稳)。
  4. AI 原生能力,TensorFlow/PyTorch 的 Go 绑定远不如 Python。

结论,Go 做"Agent 运行时/平台/后端"是优秀选择(并发、部署、类型),做"模型训练/数据处理"不是(生态不足)。 agents-go 证明了前者。


下一步学什么

读完全系列,你可以往这些方向深入:

方向一:读 Python SDK 源码

agents-go 是 openai-agents-python 的移植。对比读两个版本的源码,能深刻理解"同一个设计,不同语言怎么表达"。 Python 版的 async/generic(TypeScript 风格)vs Go 版的 goroutine/泛型,对照着看收获巨大。

方向二:研究其他 Agent 框架

  • LangGraph(Python),状态图式的 Agent 编排
  • CrewAI(Python),角色扮演式多 Agent
  • agent-native(TypeScript),defineAction 多端复用
  • 对比它们和 agents-go 的设计差异,理解不同取舍

方向三:读《企业级 Agent 平台工程》

前面推荐的 xuxin 那本开源书。agents-go 是"单机 SDK",那本书讲"企业平台",权限、审计、多租户、SLO、成本治理。从 SDK 到企业平台,差距在哪。

方向四:做一个自己的 Agent 项目

最好的学习是动手。用 agents-go(或自己从 0 写)做一个真实项目,客服 Agent、数据分析 Agent、代码助手。真实场景会暴露你看书时想不到的问题。


一句话总结

Agent 不是魔法,是工程。

它的核心就是一个循环,调模型、判断是否调工具、执行工具、回填历史、重复。所有复杂,Session、HITL、Guardrails、Handoff、Tracing、MCP、Sandbox,都是给这个循环加的配件。

理解了循环,你理解了 Agent 的 80%。理解了配件为什么这么设计,你理解了剩下 20%。

读完这 40 章,你应该能:

  • 从 0 写一个能跑的 Agent 内核
  • 理解任何 Agent 框架(LangChain/CrewAI/Claude Code)的内部机制
  • 判断一个 Agent 系统能不能进生产
  • 用 Go 做出比 Python 更易部署的 Agent 服务

这些能力,就是"从 0 写 Agent"给你的。


全系列正文到此结束。附录 A-D 提供源码地图、生产化差距、常见问题和术语表。


本文是《从 0 写 Agent》系列第 40 章,案例代码基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版)。全系列目录见总览。

相关文章

分享: