LLM 应用三层架构与决策树
LLM 应用三层架构与决策树
学习目标
读完本章后,你将能够:
- 理解 LLM 应用的三层架构:单次调用、工作流、Agent
- 使用决策树为任务选择最合适的层级
- 区分 Managed Agents(服务端托管)与自建 Agent
- 理解 Agent 四准则检查(Complexity / Value / Viability / Cost of error)
- 避免常见的架构误用(过度使用 Agent)
核心概念
三层架构
所有 LLM 应用都可以归类到以下三层之一:
| 层级 | 控制者 | 典型场景 | 复杂度 |
|---|---|---|---|
| 单次调用 | 开发者 | 分类、摘要、提取、问答 | 低 |
| 工作流 | 开发者代码循环 | 多步流水线、自定义工具、审批门 | 中 |
| Agent | 模型自主决定 | 开放式研究、代码生成、复杂推理 | 高 |
统一端点
三层架构都通过同一个端点实现:POST /v1/messages。差异在于是否使用工具定义、工具执行循环和输出约束。
用户定义工具:你定义工具(通过装饰器、Zod 模式或原始 JSON),SDK 的工具处理器自动处理 API 调用、执行函数、循环直到完成。
服务端工具:Anthropic 托管的工具,代码执行完全在服务端完成。
结构化输出:通过 output_config.format 约束响应格式,通过 strict: true 约束工具参数验证。
决策树详解
第 0 步:部署提供商检查
Are you deploying through Amazon Bedrock, Google Vertex AI, or Microsoft Foundry?
- Yes → 只能使用 Claude API + Tool Use。Managed Agents 不可用于第三方部署。
- No → 继续。
这是最常见的误判点——开发者在第三方部署上寻找 Managed Agents 功能,但它仅限 Anthropic 第一方。
第 1 步:单次调用
适用场景:
- 分类、总结、信息提取、问答
- 一个请求,一个响应
- 无需多轮交互或工具调用
示例: "从这篇文档中提取所有人名", "将这段文本分类为正面/负面/中性"
第 2 步:是否需要服务端托管的有状态 Agent?
判断标准:
- 需要 Anthropic 运行 Agent 循环并托管每次会话的容器?
- 需要持久化、版本化的 Agent 配置?
- 需要长时间运行的多轮 Agent,带有文件挂载?
如果答案是 Yes → Managed Agents
- 服务端管理会话,SSE 事件流
- 每个会话独立容器(bash、文件操作、代码执行)
- Skills + MCP 集成支持
第 3 步:工作流 vs 自建 Agent
工作流(Claude API + Tool Use):
- 你用代码控制循环
- 多步流水线,每一步由代码决定是否调用 LLM
- 适合:有明确步骤、需要审批门、自定义日志记录
自建 Agent:
- 模型自主决定轨迹
- 最大灵活性
- 适合:开放式任务,模型需要自主探索
Agent 四准则检查
在选择 Agent 层级之前,检查以下四个条件:
| 准则 | 问题 | 示例 |
|---|---|---|
| Complexity | 任务是否多步且难以提前完全指定? | “把设计文档变成 PR” vs “从 PDF 提取标题” |
| Value | 结果的价值是否值得更高的成本和延迟? | 高价值研究 vs 简单格式化 |
| Viability | Claude 在此类任务上是否有能力? | 代码生成、研究分析 ✅ 精确数学计算 ❌ |
| Cost of error | 错误能否被发现和恢复? | 有测试覆盖、代码审查、回滚机制 |
任何一项为 No → 留在更简单的层级(单次调用或工作流)。
Managed Agents 架构
Managed Agents 是 Anthropic 提供的服务端托管 Agent 方案:
关键原则:
- Agent 配置只创建一次,通过 ID 引用
- 每次会话创建 Session,引用 Agent ID
model/system/tools定义在 Agent 上,不在 Session 上
常见陷阱与对策
过度使用 Agent
问题:为简单任务使用 Agent 层,导致成本增加 10-100 倍、延迟增加 5-50 倍。
对策:严格使用四准则检查。任何一项为 No 就不使用 Agent。
第三方部署误判
问题:在 Bedrock / Vertex AI 上尝试使用 Managed Agents。
对策:第三方部署一律使用 Claude API + Tool Use。
Agent ID 重复创建
问题:在请求路径中每次都调用 agents.create,导致创建大量重复 Agent。
对策:Agent 是持久化对象。创建一次,存储 ID,每次会话引用该 ID。
忽略 Compaction
问题:长时间运行的 Agent 对话超过 1M 上下文窗口,导致截断。
对策:启用服务端压缩(compaction),自动在接近阈值时总结早期上下文。
参考来源
- Claude API 文档:https://docs.claude.com/en/api/skills-guide
- Anthropic Skills 仓库:
skills/claude-api/SKILL.md - Anthropic Engineering Blog:https://anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills