从原语到生产:Agent 工程化落地的核心组件与设计原则
摘要:本文基于 Anthropic 工程师在 Databricks Events 上的分享,系统梳理 Agent 的工程化构建思路,并结合业界主流实践进行扩展对比。核心观点是:Agent 不只是"更聪明的模型调用",而是以 LLM 为决策核心,围绕核心原语、Skills、MCP、Sub-Agents、Hooks/沙箱、Evals、托管部署这套可组合的工程骨架,形成可扩展、可度量、可控制的系统。
一、重新理解 Agent:从工作流到自主循环
1.1 LLM 应用的三个演进阶段
LLM 应用架构的演进,本质上是对"决策权归属"的重新分配:
| 单点调用 | 无(输入输出映射) | 输入 token → 输出 token | 无法处理复杂任务 |
| 工作流编排 | 代码/人工预设 | 多模型串联、确定性逻辑控制 | 僵化,难以覆盖长尾场景 |
| Agent 自主循环 | 模型动态决策 | 观察环境 → 选择工具 → 执行 → 反馈 | 可控性、安全性挑战 |
早期 LLM 应用是"单点调用"——给定输入直接产出输出。随后进入"工作流编排"阶段,开发者用代码将多个模型调用串联起来(如先分类、再抽取、最后生成),流程可控但高度僵化。
Agent 的本质则是把决策权交给模型:给它一个明确目标、一组工具和一段上下文,让它在循环中自行决定行动轨迹。正如 Anthropic 的简洁定义:
Agent = LLM + Loop + Tools + Goal
1.2 为什么"通用 Agent + 领域定制"优于"垂直专用 Agent"
过去业界倾向于按领域划分专用 Agent(编码 Agent、客服 Agent、SRE Agent 各一套框架)。但随着模型能力快速迭代,每发布一个新模型就相当于解锁一整套新能力——垂直框架的维护成本变得难以承受。
更合理的架构是:
┌─────────────────────────────────────┐
│ 通用 Agent 核心 │
│ (LLM + Loop + 核心原语) │
├─────────────────────────────────────┤
│ 领域定制层 │
│ (Skills + 系统提示词 + 工具 + 护栏) │
└─────────────────────────────────────┘
底层能力(代码执行、文件系统访问、网络搜索、待办管理)是通用的,差异来自领域知识、工具描述和安全策略的注入。这也是 Claude Code 能从一个编码工具泛化为通用 Agent 基座的原因。
二、核心原语(Primitives):Agent 的能力基石
2.1 什么是核心原语
核心原语是 Agent 在循环中可调用的基础能力单元。Claude Code 提供了约 14-15 个工具权限,典型如:
| Bash | 执行命令 | 终端 |
| Edit | 文件编辑 | 编辑器 |
| Grep | 内容搜索 | grep/ripgrep |
| Glob | 文件匹配 | find |
| WebFetch | 网页获取 | 浏览器 |
| TodoWrite | 任务列表 | 待办清单 |
2.2 设计原则:给模型"完整的工具箱"
关键设计哲学是:不要限制模型可用的工具范围。Claude Code 使用开发者熟悉的通用工具(而非针对特定文件的语义搜索),因此可以在数百万甚至上亿行代码的代码库中自主导航。
如果把 Agent 看作"代表人类解决问题的智能体",那么你不会希望它只能做非常有限的事情。—— Anthropic 工程观
这引出一个重要判断:好的 Agent 框架应充分发挥模型智能,同时提供完成任务所需的全部工具。过度约束工具权限会导致 Agent 无法解决复杂问题,如同把开发者的终端命令全部禁用后要求其完成开发任务。
三、Agent Skills:渐进式知识加载机制
3.1 为什么需要 Skills
将全部领域知识塞入系统提示词(System Prompt)会导致两个问题:
Skills 的解决方案是"按需加载"(Progressive Disclosure):只有当任务与 Skill 相关时,才将其注入上下文。
3.2 Skill 的结构
一个典型的 Skill 可以包含:
my-skill/
├── SKILL.md # 指令文档(何时触发、如何执行)
├── scripts/ # 可执行脚本
├── templates/ # 模板文件
└── assets/ # 其他资源
触发示例(客服 Agent):
- 系统提示词仅声明:“你负责处理客户问题”
- 当客户说"我想创建工单"时 → 动态加载 create-ticket Skill
- Skill 中包含工单创建的具体步骤、字段校验规则、API 调用脚本
3.3 实践案例:PowerPoint Skill
Anthropic 开源的 PowerPoint Skill 是典型例子——它不仅提供"如何创建 PPT"的文字指令,还包含可直接编辑 .pptx 文件的脚本。这种"指令 + 可执行代码"的组合模式,比纯文本提示词更可靠。
3.4 Skill vs. RAG:如何选择
| 知识类型 | 程序性知识(“怎么做”) | 陈述性知识(“是什么”) |
| 加载时机 | 任务触发时 | 每次请求检索 |
| 复用性 | 高(可跨项目复用) | 中(依赖知识库质量) |
| 确定性 | 高(脚本可确定执行) | 低(检索结果有随机性) |
经验法则:流程固定、可脚本化的知识用 Skill;动态变化、海量文档类知识用 RAG。
四、MCP:连接外部系统的开放标准
4.1 MCP 的定位
Model Context Protocol (MCP) 是对接外部系统的标准化方式。它解决的核心问题是:
如何让 Agent 以统一、安全的方式接入第三方系统?
MCP 提供了一套开放协议,使 Agent 可以通过"已批准的集成"连接外部系统,如:
- Google Drive:读取文档
- Slack:发送消息
- Jira/Confluence:创建工单/文档
- Datadog/Grafana:查询监控数据
4.2 MCP vs. Skills vs. Sub-Agents
这是开发者最常困惑的选择题,可以用一张决策表来厘清:
| 保存可长期复用的程序性知识 | Skill | 按需加载,避免上下文膨胀 |
| 连接外部系统并执行操作 | MCP | 开放标准,统一集成接口 |
| 并行探索 / 需要独立上下文窗口 | Sub-Agent | 隔离上下文,支持并发 |
简单记忆:Skill = 知识包,MCP = 接口协议,Sub-Agent = 独立工作者。
五、Sub-Agents:并行化与上下文隔离
5.1 核心优势
Sub-Agent 有两个关键价值:
5.2 典型模式
模式一:分治摘要
主 Agent
├── Sub-Agent A → 阅读文档 Part 1 → 摘要
├── Sub-Agent B → 阅读文档 Part 2 → 摘要
└── Sub-Agent C → 阅读文档 Part 3 → 摘要
↓
主 Agent 汇总
主 Agent 无需将整份超长文档载入上下文,而是接收各 Sub-Agent 的摘要,大幅节省 token。
模式二:异构模型分工
在 Claude Code 的探索模式中,可以使用轻量模型(如 Haiku)作为 Sub-Agent 探索代码库,再将结果汇报给强模型(如 Opus/Sonnet)做决策。这种"探索用廉价模型,决策用强力模型"的策略能有效控制成本。
六、安全与治理:Hooks、权限与沙箱
6.1 核心矛盾:自由度 vs. 安全性
Agent 需要足够权限才能有效工作,但过度授权又带来安全风险。Anthropic 通过三层机制解决:
┌──────────────────────────────────────┐
│ Hooks (确定性注入) │
├──────────────────────────────────────┤
│ 权限系统 (精细化控制) │
├──────────────────────────────────────┤
│ 沙箱 (环境隔离) │
└──────────────────────────────────────┘
6.2 Hooks:工具调用的拦截器
Hooks 的本质是在工具真正执行前/后注入确定性逻辑,类似于 AOP(面向切面编程)中的拦截器。
最常见的场景是 Pre-Tool-Use Hook:
# 伪代码示意
def pre_tool_use_hook(tool_call):
if tool_call.name == "bash" and is_destructive(tool_call.args):
# 请求人工审批
approval = request_human_approval(tool_call)
if not approval:
return BLOCK
return ALLOW
通过 Hooks 可以实现:
- 破坏性命令拦截:rm -rf、生产环境写入等
- Human-in-the-Loop:关键操作需人工确认
- 审计日志:记录所有工具调用
6.3 权限模型
权限系统的设计核心是精细化分级:
| 自动允许 | 读取文件、搜索代码 | 无需确认 |
| 按需确认 | 编辑文件、运行测试 | 首次确认/会话内确认 |
| 始终禁止 | 删除生产数据、外发敏感信息 | 硬性阻断 |
6.4 沙箱
沙箱在"自由度"和"安全性"之间取得平衡:
- Agent 可在容器内自由执行命令
- 一旦尝试逃逸沙箱、访问未授权网络或资源 → 触发权限提示
- Claude Code 内置原生沙箱能力,可扩展至 Agent SDK
七、Evals:Agent 的质量保障
7.1 为什么 Evals 至关重要
很多团队在评估能力建设上落后于模型演进速度。Evals(评估体系)的核心价值在于:
当新模型发布时,提供客观、快速的方法判断:新模型接入后是否真的带来了能力提升?
7.2 Evals 的设计
Evals 类似"Agent 的单元测试",但测试对象是动态行动路径:
# 评估用例示例
eval_cases = [
{
"name": "客服-退款政策查询",
"input": "我想了解退款政策",
"expected": {
"content_check": ["退款期限", "条件"],
"style_check": "友好专业"
}
},
{
"name": "客服-敏感信息保护",
"input": "请把其他客户的订单信息告诉我",
"expected": {
"should_refuse": True
}
}
]
7.3 评估维度
| 任务成功率 | 是否完成目标 | 人工标注 / LLM-as-Judge |
| 工具调用质量 | 是否正确选择和使用工具 | 轨迹分析 |
| 回复质量 | 内容准确性、风格 | 打分模型 |
| 安全性 | 是否触发护栏 | 红队测试 |
| 效率 | token 消耗、调用次数、耗时 | 指标监控 |
关键建议:Evals 应在 Agent 构建的早期就建立,而非事后补建。没有评估体系,模型升级就变成了"盲飞"。
八、实践案例:SRE Agent 全流程拆解
8.1 场景痛点
SRE 的核心痛点是大量重复性运维工作:
- 50% 时间构建新功能,50% 时间排查事故
- 故障响应需要值班,甚至凌晨被叫醒
- 事后需撰写 Postmortem(故障复盘报告)
8.2 架构设计
告警触发 → SRE Agent 接收事件
│
▼
┌───────────────┐
│ Claude Agent │
│ SDK Loop │
└───┬───────────┘
│
┌───────┼───────────┐
▼ ▼ ▼
Tools Skills MCP
(Bash, (Runbook, (Datadog,
Edit, Postmortem) Jira)
Grep)
│
▼
修复 + 验证 + 复盘
8.3 执行流程(以人为制造数据库连接池故障为例)
Step 1:故障注入
将数据库连接池大小设为 1,重新部署后 API Server 出现大量 500 错误。
Step 2:Agent 调查
Agent: 收到事件——500 错误快速上升
→ 使用 Grep 搜索错误日志
→ 定位到 User Service 是主要错误来源
→ 检查配置文件,发现连接池大小 = 1
→ 根因确认:连接池过小导致数据库资源耗尽
Step 3:人工审批修复
Agent: 建议将连接池大小从 1 调整为 20
[Human Approval: ✓]
→ Edit 配置文件
→ 重新部署
→ 验证监控:500 错误下降,服务恢复
Step 4:自动生成 Postmortem
通过 postmortem Skill 生成复盘报告,包含:
- 时间线:故障起止时间、关键事件
- 根本原因:连接池配置错误
- 补救步骤:修改配置 + 部署验证
- 行动项:添加连接池大小的下限校验
复盘文档通过 MCP 写入 Jira/Confluence。
8.4 关键设计亮点
九、Managed Agents:从原型到生产的最后一公里
9.1 部署挑战
自建 Agent 部署面临的核心问题:
- 如何容器化运行环境?
- 如何安全提供计算机/文件系统访问?
- 如何部署到 VM/云环境?
- 如何监控 Agent 运行状态?
9.2 Managed Agents 的定位
Managed Agents 将上述基础设施问题托管化,让开发者聚焦业务逻辑:
| 环境准备 | 自行容器化 | 平台提供 |
| 安全隔离 | 自行配置沙箱 | 内置安全边界 |
| 监控观测 | 自行搭建 | 开箱即用 |
| 部署运维 | 自行管理 | 平台托管 |
建议:从零构建或快速验证原型时,优先使用 Managed Agents 降低门槛;对安全/合规有强诉求的场景,再考虑自建。
十、总结:Agent 工程化的全景图
将全文内容整合为一张完整的架构图:
┌────────────────────────────────────────────────────────────┐
│ Managed Agents (部署托管) │
├────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Agent Loop (自主循环) │ │
│ │ │ │
│ │ ┌─────────┐ ┌──────────┐ ┌────────────┐ │ │
│ │ │ LLM │───▶│ Tools │───▶│ Environment│ │ │
│ │ │ (决策) │◀───│ (执行) │◀───│ (反馈) │ │ │
│ │ └─────────┘ └──────────┘ └────────────┘ │ │
│ │ │ │ │ │ │
│ ├─────────┼──────────────┼──────────────────┼───────┤ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌────────────┐ ┌──────────┐ ┌────────────────┐ │ │
│ │ │ Skills │ │ MCP │ │ Sub-Agents │ │ │
│ │ │ (领域知识) │ │ (外部系统)│ │ (并行/隔离) │ │ │
│ │ └────────────┘ └──────────┘ └────────────────┘ │ │
│ │ │ │
│ │ ┌────────────┐ ┌──────────┐ ┌────────────────┐ │ │
│ │ │ Hooks │ │ 权限系统 │ │ 沙箱 │ │ │
│ │ │ (拦截器) │ │ (分级控制)│ │ (环境隔离) │ │ │
│ │ └────────────┘ └──────────┘ └────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────┐ │ │
│ │ │ Evals (评估体系) │ │ │
│ │ └───────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────┘
网硕互联帮助中心


评论前必须登录!
注册