
专栏AI Agent 开发05上一章我们已经把 Agent Loop 跑通了组上下文 → 调模型 → Tool Call → Runtime 执行 → Observation → 下一轮。真正开始做项目后你会发现“循环能跑”只是第一步。这一篇不让你背框架而是用真实问题把 Agent 工程里还会出现的几类能力一块块补出来。一、上一章的三件套已经能跑为什么还不够最小 Agent 其实很简单一个模型、几个工具再加一段控制循环。while not done: context build_context(state) action model(context, tools) result runtime.execute(action) state.update(result)如果任务只是“查一次天气再回答”它已经够用了。但需求稍微变一下问题马上出现用户聊了十轮以后上下文怎么控制下次再来要不要记住偏好付款前谁审批任务跑一半进程重启怎么办改了 Prompt 以后怎么知道效果变好还是变差图 1 真实 Agent 的技术栈是需求一层层把新能力“逼”出来的二、先别背“十一层技术栈”把 Runtime 放在中间看原稿把 Agent 技术栈拆成很多层这能做总图但对第一次接触的人容易产生两个误会一是以为它们存在严格的上下层依赖二是以为做 Agent 必须把所有东西一次装齐。更容易理解的方式是Runtime / Agent Loop 是中间的执行器周围有几类能力给它提供信息、动作和工程保障。图 2 Agent 技术栈更像围绕 Runtime 协作的能力地图而不是一栋严格的六层楼1. Model负责理解、生成和做决策Model 仍然是核心能力来源。Runtime 会把当前任务和工具信息交给模型模型再决定是直接回答还是提出 Tool Call。工程上通常会把模型调用封装成 Provider / Model Adapter而不是让业务代码到处直接写某一家 SDK。原因很简单以后换模型、做路由、增加超时或统计 Usage 时改一个入口比改几十个业务文件容易。2. Context State先解决“这一轮要让模型看到什么”上一章已经出现了 Context Builder。它关心的是本轮输入用户要求、前面必要的 Tool Result、系统约束、可用工具以及可能检索到的材料。State 则更宽一点它表示当前 Run 的任务状态已经做了哪些步骤、哪些工具调用完成了、是否等待审批、还剩多少预算等。Context 和 State 不要混成一个词。State 是程序持有的任务状态Context 是从 State 和外部信息中挑选出来、这一轮真正发送给模型的内容。3. Memory只有需要“跨时间记住”时才出现Memory 不是 Agent 的必选组件。很多一次性任务根本不需要长期记忆。只有当产品真的需要“用户下次再来仍然记得某些信息”才需要把偏好、历史事实或任务经验持久化。它可能放在普通数据库、专门的 Memory Store或者通过检索把相关信息重新找回来。Redis、向量数据库都只是可能的实现不应该把“短期 MemoryRedis、长期 MemoryVector DB”当成定义。4. Tools把“模型会说”变成“系统能做”Tool 可以是本地 Python 函数、公司内部 API、搜索服务、数据库操作也可以是代码执行、浏览器或电脑操作。重要的不是 Tool 越多越好而是 Runtime 必须知道工具叫什么、参数怎么校验、谁有权限调用、失败怎么处理、结果怎样回填。5. Workflow / Orchestration哪些步骤固定哪些允许动态不是所有任务都应该全部交给模型自由决定。真实产品更常见的是外层流程比较确定局部节点允许 Agent 动态处理。例如“提交报销”可以固定为解析票据 → 校验 → Agent 处理异常 → 人工审批 → 入账。这里 Agent 只是整个 Workflow 的一部分。当流程需要暂停、恢复、人工介入或多 Agent 协作时才会开始需要更强的 Orchestration / durable execution 能力。6. MCP / Tool Integration工具越来越多以后怎么接得整齐Function Calling 是模型表达工具调用的一种机制MCP 则解决 Agent/应用怎样以标准方式连接外部工具、资源等能力。两者不是同一个层级的“二选一协议”。你完全可以先用普通函数 Tool。等外部系统越来越多、希望复用和标准化工具接入时再学习 MCP。三、横着贯穿整个系统的还有 4 类工程能力1. Security / Guardrails / HITL模型提出动作不代表动作就应该执行。工具执行前后可以做校验删除、付款、发邮件等高风险动作还可以要求人工审批。安全不是最后上线前补一个“Prompt 防注入”就结束它还包括身份、权限、租户隔离、Secret、Tool 边界和数据访问控制。2. Evaluation回答“这个 Agent 到底有没有变好”Prompt、模型、工具描述改一次最终轨迹就可能变化。没有固定任务集你只能凭感觉判断“好像更聪明了”。Eval 的基本思路是保留一组代表性任务反复跑回归结果是否正确、工具是否选对、任务是否完成、步数和成本是否合理。3. Tracing / Observability回答“它到底在哪一步错了”一个 Agent Run 可能包含很多模型轮次和工具调用。线上报错时只看最终一句“失败了”几乎没法排查。Tracing 会把 Run、模型轮次、Tool Call、Handoff、Guardrail 等事件串成一条轨迹。这样才能知道第几轮用了哪个工具、参数是什么、耗时多少、失败发生在哪里。4. Storage / Deployment让状态和服务真的活下来Agent 需要保存会话、任务状态、审批状态、文件或评测数据时还是要回到普通软件工程数据库、对象存储、缓存、队列。部署也一样没有哪套“Agent 专用服务器”。容器、网关、Secret、日志、监控、扩缩容都是把 Runtime 稳定运行起来的基础设施。四、什么时候该加哪一块不要按照地图从左到右安装图 3 地图的真正用法遇到一个问题再找到对应能力这张图比“完整依赖清单”更重要因为真实项目的技术栈应该按问题成长。你遇到的问题优先检查/增加什么常见误区多走几步后模型开始跑偏Context / State第一反应就去做长期 Memory下次会话需要记住用户偏好Memory认为 Memory 必须是向量库任务需要暂停、审批、恢复Workflow / Persistence / HITL继续用一个 while 循环硬顶工具来自很多系统Tool Registry / MCP把 MCP 当成 Agent 必装依赖改模型后不知道有没有退化Evaluation只看几个 Demo线上失败不知道原因Tracing / Observability只记录最终错误日志五、框架到底放在这张地图的什么位置到这里再看 OpenAI Agents SDK、LangGraph、LangChain 等框架会容易很多。它们不是“完整技术栈本身”而是帮你封装其中一部分能力。• Agent SDK 类框架通常帮你管理模型轮次、Tool、Handoff、Guardrail、Session、Tracing 等。• LangGraph 这类 Runtime / Orchestration 工具更关注持久化状态、durable execution、Human-in-the-loop、长任务恢复等。• 数据库、对象存储、业务权限、真实评测数据、部署方式仍然要根据你的产品自己设计。所以选框架时先问“它帮我解决地图上的哪几个问题”而不是先问“哪个框架最强”。六、一个适合学习阶段的项目骨架应该先长什么样这一篇不建议像原稿那样第一版就建 memory、MCP、eval、observability 十几个目录。更适合学习的方式是先留出清楚边界agent_project/ ├── app/ │ ├── runtime/ # Agent Loop / 状态推进 │ ├── models/ # Model Provider 封装 │ ├── tools/ # Tool 定义与 Registry │ └── context/ # Context Builder ├── tests/ ├── .env.example └── pyproject.toml等需求出现再新增# 需要跨会话记忆 app/memory/ # 需要 Graph / 审批 / 可恢复流程 app/workflows/ # 工具接入开始标准化 app/integrations/mcp/ # 开始做回归评测 evals/ # 需要自己补充 Trace / Metrics app/observability/这种结构的好处是每个目录都是因为真实需求出现才建立不会第一天就得到一个“看起来生产级、实际上全是空文件夹”的项目。七、几个原稿里需要特别纠正的认识• Agent 技术栈不是固定“十一板块一个都不能少”。不同产品需要的能力不同地图是导航不是验收清单。• Memory 不是 Agent 必需品也不等于 Redis pgvector。• MCP 很重要但不是所有 Tool 都必须经过 MCP本地函数和普通 API Tool 仍然很常见。• 框架之间也不是严格覆盖同一层。SDK、Runtime、Workflow Engine、Observability 平台关注点会重叠。• 安全、Eval、Tracing 应该尽早建立最小版本但不代表第一天就搭完整企业平台。八、这一篇只需要记住一句话Agent 技术栈不是“有哪些热门组件”而是为了让一个模型驱动的循环能长期、受控、可验证地完成任务你分别需要哪些信息、动作、状态和工程保障。九、下一篇下一篇 06《Message、Role、Instruction 到底是什么》会回到最靠近模型的一层从一条最普通的 messages 请求开始看 system/developer/user/assistant 分别承担什么角色以及“对话历史”和 Runtime State 为什么不是一回事。