写在前面:本文面向有 LLM 使用基础、希望把 Agent 真正落地的后端 / 全栈工程师。文章不是某个框架的使用手册,而是一张覆盖设计哲学、执行模型、记忆体系、框架选型、多智能体协作、可观测性的完整工程认知地图。
核心主张:Agent 落地的本质,是把"模型的涌现能力"装进"可控的工程结构"里。
一、为什么 Agent 落地这么难?
1.1 模型能力 ≠ 系统能力
很多工程师踩的第一个坑,是把 LLM 的"涌现能力"等同于"系统能力":
模型聪明 → 写好 Prompt → 上线 → 等着收钱 💸
现实是:
模型聪明 → 不代表它在复杂任务里能稳定执行
写好 Prompt → 不代表输出结构可验收
上线 → 不代表你知道它哪里跑偏了
从工程视角看,LLM 本质上是一个带有巨大不确定性的黑盒函数。它在单次推理上可以表现出惊人的能力,但工程系统要的是确定性、可测试性、可演进性——而这些,不是 Prompt 能直接带来的。
1.2 三种典型的失败模式
graph TD
A[Agent 系统] --> B[失败模式 1: 漂移]
A --> C[失败模式 2: 失控]
A --> D[失败模式 3: 不可测]
B --> B1["输入一变,输出就飘<br/>复杂上下文中行为不一致"]
C --> C1["工具调用出错后继续硬跑<br/>不知道什么时候该停、该重试、该降级"]
D --> D1["不知道哪步出了问题<br/>没有 Trace,没有验收标准,全靠肉眼"]
这三个失败模式,本质上都不是"模型不够聪明"的问题,而是系统设计层没做好。
1.3 本文要回答什么
| 工程师的疑问 | 本文对应章节 |
|---|---|
| 系统应该怎么分层设计? | 第二章:四层架构 |
| Agent 的推理执行流程是什么? | 第三章:执行模型 |
| 上下文和状态怎么管理? | 第四章:Memory 体系 |
| 2025/2026 年选什么框架? | 第五章:框架选型 |
| 任务太复杂,一个 Agent 不够怎么办? | 第六章:Multi-Agent |
| 上线后怎么知道它没有跑偏? | 第七章:可观测性 |
二、系统设计层:四层架构
Agent 系统的设计可以拆成四层,每一层职责清晰,对应关系不同:
Persona 负责风格,CoT 负责推理,Skill 负责流程,MCP 负责连接。
2.1 整体架构图
flowchart TD
U["👤 用户 / 任务输入"] --> P
subgraph Core["🧰 Agent Runtime / Orchestrator"]
P["🎭 Persona 层<br/>风格 · 边界 · 语气"]
C["🧠 CoT 层<br/>推理 · 分析 · 拆解"]
S["🛠️ Skill 层<br/>方法论 · 流程 · 检查点 · 异常处理"]
P --> C --> S
end
S --> M["🔗 MCP 层<br/>工具协议 · 资源 · 系统连接"]
M --> T[("🗄️ 数据库 / 文件系统<br/>浏览器 / GitHub / 内部 API")]
M --> R["📦 结果输出 / 交付物"]
2.2 第一层:Persona —— 边界与风格
Persona 决定 Agent "像谁说话",是最容易做、也最容易被高估的一层。
它能做到:
- 统一输出风格(专业、简洁、中立)
- 设定领域边界(只回答 X 相关问题)
- 控制语气与受众(面向开发者 vs 面向运营)
它做不到:
- 复杂任务的分解与编排
- 工具调用策略与回退机制
- 可测试、可版本化的稳定交付
⚠️ 常见误区:把 system prompt 写得越来越像"岗位 JD",以为描述得越详细 Agent 就越专业。 这叫职场画饼——饼很大,交付很小。身份是气质,Skill 才是肌肉。
2.3 第二层:CoT —— 推理显式化(选择性启用)
CoT(Chain of Thought)把推理过程显式化,核心价值是让模型"想清楚再说"。
有效场景(数据支撑):
Wei et al. (2022) 的原始 CoT 论文(arXiv:2201.11903)在数学/符号推理任务上展示了显著提升;2024 年的大规模元分析(To CoT or not to CoT? ,arXiv:2409.12183)进一步指出:CoT 的收益主要集中在数学与符号推理类别,平均提升约 12%~14%,对其他类别的平均提升接近零,某些场景甚至有性能下降(参见 Mind Your Step,arXiv:2410.21333)。
工程建议:按任务类型选择性启用 CoT,而非全局开启。
flowchart LR
T["任务类型判断"] --> A{"是否涉及数学/逻辑/符号推理?"}
A -- 是 --> B["✅ 启用 CoT 显式推理链"]
A -- 否 --> C{"是否涉及多步决策/规划?"}
C -- 是 --> D["⚠️ 选择性启用 结合 ReAct 模式"]
C -- 否 --> E["❌ 直接生成 避免 Token 浪费"]
2.4 第三层:Skill —— 流程固化(核心)
Skill 是整个架构中最重要的一层。 它不是"更长的 Prompt",而是把领域专家的工作方式显式封装为可复用的能力模块:
Skill = 目标定义 + 执行步骤 + 校验检查点 + 工具调用策略 + 异常处理 + 输出规范
对比示例:同样是"写技术 PRD"
| 方式 | 描述 | 结果 |
|---|---|---|
| 只有 Persona | "你是资深产品经理,帮我写 PRD" | 风格像,结构不稳,可测性为零 |
| 有 Skill | 1) 收集背景与目标 → 2) 定义用户与场景 → 3) 拆核心链路 → 4) 列功能清单 → 5) 风险与验收标准 → 6) 输出结构化 PRD | 可测、可版本化、可复用 |
为什么 Skill 比 Persona 更稳定?
- 软约束 vs 硬结构:Persona 依赖语言约束,模型可能"装听";Skill 把行为变成结构,可以被测试、回归、版本化。
- 可测试性:Persona 的"像不像"很主观;Skill 的"对不对"有明确验收标准(字段是否齐全、是否调用工具、是否通过校验)。
- 抗注入能力:Skill 可以在流程入口做输入校验与净化,而纯 Persona 对外部恶意输入几乎没有防护(Prompt Injection 的重灾区)。
2.5 第四层:MCP —— 工具与外部系统连接
Anthropic 于 2024 年 11 月开源的 Model Context Protocol(MCP) 提供了一个开放标准,让 AI 助手可以用统一方式连接数据与工具生态。
可以把 MCP 理解为 AI 世界的 "USB-C" :
flowchart LR
subgraph Client["客户端 Agent / IDE / 应用"]
A1["Agent"]
A2["Claude Desktop"]
A3["VS Code 插件"]
end
subgraph Protocol["MCP 协议层"]
P["统一接口规范 Tools · Resources · Prompts"]
end
subgraph Server["服务端 工具 / 数据源"]
S1["📁 文件系统"]
S2["🗄️ 数据库"]
S3["🌐 Web 浏览器"]
S4["🐙 GitHub"]
S5["🔧 内部 API"]
end
A1 --> P
A2 --> P
A3 --> P
P --> S1
P --> S2
P --> S3
P --> S4
P --> S5
MCP 覆盖三类能力暴露方式:
| 类型 | 说明 | 示例 |
|---|---|---|
| Tools | 可调用的函数/操作 | 执行 SQL、写文件、发 HTTP 请求 |
| Resources | 可读取的数据源 | 文件内容、数据库记录、配置文件 |
| Prompts | 预定义的提示模板 | 标准化任务入口 |
2.6 四层与传统软件架构的映射
| Agent 层 | 工程职责 | 传统软件类比 | 关键工程点 |
|---|---|---|---|
| Persona 🎭 | 风格·边界·语气 | 配置层 / 权限角色 | 易做,勿高估 |
| CoT 🧠 | 推理显式化 | 运行时策略选择 | 按任务类型选择性启用 |
| Skill 🛠️ | 流程·方法论·失败恢复 | 业务模块 / 工作流引擎 | 可复用·可测试·可治理的核心 |
| MCP 🔗 | 工具接入·标准化连接 | RPC / SDK / 集成层 | 解决工具生态的标准化问题 |
| Agent(整体) | 调度·编排·控制 | Orchestrator / Runtime | 让系统能跑·可控·可扩展 |
三、执行模型:Agent 到底怎么"跑"?
系统架构解决了"怎么设计",执行模型解决的是"怎么运行"。这是现有 Agent 文章最常跳过的部分,也是工程落地中分歧最大的地方。
3.1 三种主流执行模式
模式一:ReAct(最主流)
由 Yao et al. (2022) 提出(arXiv:2210.03629,发表于 ICLR 2023),是目前 LangGraph、LangChain 等主流框架的默认 Agent 范式。
核心思想:让推理(Reason)和行动(Act)交替进行,每次 Act 之后通过 Observation 更新推理上下文。
sequenceDiagram
participant U as 用户
participant A as Agent
participant T as 工具/环境
U->>A: 输入任务
loop ReAct 循环
A->>A: 🧠 Thought(内部推理,分析当前状态)
A->>T: ⚡ Action(调用工具 / 执行操作)
T->>A: 👁️ Observation(观察工具返回结果)
A->>A: 判断:任务完成?继续?调整策略?
end
A->>U: 最终输出
适用场景:需要动态工具调用、任务路径不确定的场景(信息检索、代码调试、数据分析)。
工程注意:要设置最大循环次数防止死循环;Observation 质量直接决定下一步 Thought 质量,工具返回值设计很重要。
模式二:Plan-and-Execute(适合长流程)
先做整体规划,再逐步执行。与 ReAct 的核心区别是:规划阶段和执行阶段分离。
flowchart TD
Input["📥 任务输入"] --> Planner
subgraph Planning["规划阶段 Planner LLM"]
Planner["🗺️ 生成执行计划 Step1 → Step2 → Step3"]
end
subgraph Execution["执行阶段 Executor"]
E1["执行 Step 1"] --> E2["执行 Step 2"] --> E3["执行 Step N"]
E1 -- 失败 --> Re1["重试 / 调整"]
E2 -- 失败 --> Re2["重新规划"]
end
Planner --> E1
E3 --> Output["📦 汇总结果输出"]
适用场景:长流程任务(超过 5 步)、步骤之间有明确依赖关系、需要全局视角的任务(项目规划、报告生成)。
优势:执行路径清晰,方便人工审查和中断。
劣势:初始规划如果出错,后续执行会跑偏;动态适应性不如 ReAct。
模式三:Reflection / Self-Critique(适合高质量输出)
执行后让 Agent 对自身输出进行批判性评估,再修正重生成。
flowchart LR
Input["📥 任务"] --> Gen["🛠️ 初始生成"]
Gen --> Reflect["🔍 自我反思 Critic LLM 评估质量"]
Reflect --> Check{"达到质量标准?"}
Check -- "否,附反馈" --> Gen
Check -- 是 --> Output["✅ 最终输出"]
适用场景:代码生成(通过编译/测试来做 Observation)、文档撰写、需要高准确率的结构化输出。
工程技巧:Reflection 可以是同一个模型、也可以是独立的 Critic 模型;可以结合单元测试作为客观 Observation,减少主观评估偏差。
3.2 三种模式对比
| 维度 | ReAct | Plan-and-Execute | Reflection |
|---|---|---|---|
| 适用任务 | 动态工具调用、路径不确定 | 长流程、多步依赖 | 高质量输出、迭代优化 |
| 核心优势 | 动态适应性强 | 执行路径清晰可审查 | 输出质量高 |
| 核心劣势 | 可能死循环,成本累积 | 初始规划错误代价大 | 多轮生成 Token 成本高 |
| 典型框架支持 | LangGraph、LangChain | LangGraph(自定义图) | LangGraph、AutoGen |
| 工程复杂度 | 中 | 中高 | 中 |
工程建议:三种模式不是互斥的,可以组合使用。例如:外层 Plan-and-Execute 做规划,每个 Step 内部用 ReAct 执行,关键输出节点加 Reflection 校验。
四、Memory 体系:Agent 的"记忆"怎么设计?
上下文窗口不等于记忆。当 Agent 需要跨对话保持状态、学习用户偏好、复用历史执行经验时,就需要一套完整的 Memory 体系。
4.1 四种记忆类型
graph TB
M[Agent Memory 体系] --> M1
M --> M2
M --> M3
M --> M4
M1["🧠 In-context Memory<br/>(工作记忆)<br/>当前对话窗口内的信息<br/>范围:单次会话<br/>存储:LLM Context Window"]
M2["💾 External Memory<br/>(外部长期记忆)<br/>向量库 / KV Store / Graph DB<br/>范围:跨会话持久化<br/>存储:Qdrant / Redis / Neo4j"]
M3["🏷️ Entity Memory<br/>(实体记忆)<br/>用户/对象的结构化状态追踪<br/>范围:特定实体的属性与关系<br/>存储:结构化 DB / 图数据库"]
M4["📖 Episodic Memory<br/>(情节记忆)<br/>历史执行轨迹与经验总结<br/>范围:可回溯的过往任务经验<br/>存储:向量库 + 时序索引"]
4.2 各类记忆详解与选型
In-context Memory(工作记忆)
最基础的记忆形式——当前 Context Window 中的信息。
- 优势:无需额外组件,模型直接访问,延迟最低
- 劣势:有限(通常 32k~200k tokens),会话结束即消失,成本随长度线性增长
- 工程要点:做好 Context 压缩(滑动窗口、摘要压缩);避免把所有历史硬塞进去
External Memory(外部长期记忆)
通过向量检索将相关信息按需注入 Context,是 RAG 的本质。
flowchart LR
Q[用户提问 / 当前任务] --> Embed[文本嵌入]
Embed --> VDB[(向量数据库<br/>Qdrant / Pinecone<br/>Weaviate / Chroma)]
VDB --> Retrieve[检索 Top-K 相关片段]
Retrieve --> Inject[注入 Context]
Inject --> LLM[LLM 推理]
- 优势:理论上无限存储,跨会话持久化
- 劣势:检索质量影响上限;嵌入模型选择很关键
- 工程要点:Chunk 策略(大小、重叠)、Rerank 策略、检索结果过滤
Entity Memory(实体记忆)
对特定实体(用户、项目、产品)维护结构化的属性状态。
// 示例:用户实体记忆
{
"user_id": "will_001",
"preferences": {
"language": "Python",
"framework": "LangGraph",
"llm": "DeepSeek"
},
"current_project": "ReAct Agent with MCP",
"history_topics": ["LangChain", "Qdrant", "FastAPI"]
}
- 适用场景:个性化助手、CRM 型 Agent、需要追踪用户/项目状态的场景
- 存储方案:PostgreSQL(简单属性)、Neo4j(复杂关系图)
Episodic Memory(情节记忆)
记录 Agent 的历史执行轨迹,支持"从过去的经验中学习"。
- 典型用途:失败任务的经验总结、成功路径的复用、长期 Agent 的自我改进
- 存储方案:向量库(按语义检索相关历史)+ 时序索引(按时间回溯)
4.3 选型指南
| 场景 | 推荐记忆类型 | 推荐存储 |
|---|---|---|
| 简单问答 / 单轮任务 | In-context | 无需额外存储 |
| 知识库检索 / 文档问答 | External Memory | Qdrant / Chroma |
| 个性化用户助手 | Entity + External | PostgreSQL + 向量库 |
| 长期运行的自主 Agent | 四种全用 | LangGraph + Mem0 + 向量库 |
| 多 Agent 共享知识 | External(共享) | 集中式向量库 + 权限控制 |
五、技术框架选型:2025/2026 年用什么写 Agent?
5.1 选型的核心维度
在选框架之前,先想清楚四个问题:
- 任务复杂度:简单链路 vs 复杂多步骤有状态工作流?
- 多 Agent 需求:单 Agent 够用?还是需要角色协作?
- 生产成熟度:原型验证 vs 生产部署?
- 团队技术栈:是否已有 LangChain 生态投入?偏 Python 还是 TypeScript?
5.2 主流框架横向对比
| 框架 | 核心定位 | 优势 | 劣势 | 最适合场景 |
|---|---|---|---|---|
| LangGraph | 有状态图编排,当前生产主流 | 精细状态管理、检查点、Human-in-the-loop、LangSmith 可观测 | 学习曲线陡,图概念需适应 | 复杂多步骤 Agent、需要容错和状态持久化的生产系统 |
| LangChain LCEL | 链式组合,轻量 Pipeline | 生态丰富、集成多 | 简单任务过度设计 | 中等复杂度 Pipeline,已有 LangChain 投入的团队 |
| CrewAI | 角色化多 Agent | 上手最快(20 行代码可跑)、角色抽象直观 | 缺乏细粒度状态控制,Checkpoint 弱 | 原型验证、业务流程自动化、内容生产 Pipeline |
| AutoGen(AG2) | 对话式多 Agent,微软系 | 灵活对话模式、异步架构、.NET 支持 | Token 成本高(多轮对话),复杂度高 | 研究场景、Group Chat 协作、需要人工介入的对话流 |
| Agno | 轻量高性能 Agent SDK | 简洁 API + 可选托管平台,开发体验好 | 社区生态小 | 生产部署优先、开发体验敏感的团队 |
5.3 框架选择决策树
flowchart TD
Start["我要构建什么?"] --> Q1{"需要精细的状态管理和容错?"}
Q1 -- 是 --> LG["✅ LangGraph 生产首选"]
Q1 -- 否 --> Q2{"需要快速验证多 Agent 协作?"}
Q2 -- 是 --> CA["✅ CrewAI 原型首选"]
Q2 -- 否 --> Q3{"主要是对话驱动的协作场景?"}
Q3 -- 是 --> AG["✅ AutoGen 研究和对话场景"]
Q3 -- 否 --> Q4{"追求轻量和良好开发体验?"}
Q4 -- 是 --> AN["✅ Agno"]
Q4 -- 否 --> LCEL["✅ LangChain LCEL 中等复杂度 Pipeline"]
5.4 一个实用建议:不要绑死一个框架
生产实践中常见的模式是: 用 CrewAI 做原型验证 → 验证后用 LangGraph 重写核心流程 → LangSmith 做生产监控
框架之间并非竞争关系,而是互补工具。LangGraph 负责整体编排和状态管理,CrewAI / AutoGen 的子 Agent 可以作为 LangGraph 节点嵌入。
六、Multi-Agent 架构:单 Agent 搞不定时怎么办?
6.1 为什么需要多 Agent?
单 Agent 的能力天花板:
- 上下文窗口有限:长任务、大文档处理会超出限制
- 角色冲突:同一个 Agent 既要"搜索"又要"批评",容易自我矛盾
- 并行效率低:串行执行无法利用任务间的并行潜力
- 专业化不足:一个通用 Agent 在专业领域的深度不如专化 Agent
6.2 三种主流协作模式
模式一:Orchestrator → Subagent(主控分发)
flowchart TD
O["🎯 Orchestrator<br/>(主控 Agent)<br/>负责任务规划与分发"] --> S1
O --> S2
O --> S3
O --> S4
S1["🔍 Research Agent<br/>信息检索与摘要"]
S2["💻 Code Agent<br/>代码生成与调试"]
S3["📝 Writer Agent<br/>内容撰写与润色"]
S4["✅ Reviewer Agent<br/>质量检查与反馈"]
S1 --> O
S2 --> O
S3 --> O
S4 --> O
O --> Result["📦 最终结果"]
特点:职责清晰,Orchestrator 掌握全局状态,易于调试和干预。
适用场景:有明确分工的流程(内容生产、代码 Review、报告生成)。
模式二:Hierarchical(层级树状)
flowchart TD
Root["🏢 Root Agent<br/>顶层目标管理"] --> M1 & M2
M1["📊 Manager Agent A<br/>数据分析子任务"] --> W1 & W2
M2["📝 Manager Agent B<br/>报告撰写子任务"] --> W3 & W4
W1["Worker: 数据清洗"]
W2["Worker: 统计分析"]
W3["Worker: 章节撰写"]
W4["Worker: 图表生成"]
特点:适合复杂大型任务的层层分解;每层专注自己的粒度。
适用场景:大型项目管理、复杂研究任务、企业级工作流自动化。
模式三:Peer-to-Peer(水平协作)
flowchart LR
A1["🤖 Agent A<br/>(提议者)"] <-->|互相质疑| A2["🤖 Agent B<br/>(批评者)"]
A2 <-->|迭代优化| A3["🤖 Agent C<br/>(裁判)"]
A1 <-->|信息共享| A3
A3 --> Result["✅ 共识结果"]
特点:通过多角度辩论提升输出质量;适合需要"第二意见"的场景。
适用场景:决策支持、代码 Review 辩论、内容质量评估。
6.3 Skill 在多 Agent 中的角色变化
在单 Agent 架构里,Skill 是 Agent 的能力模块;在多 Agent 架构里,Skill 演变为子 Agent 的职责边界定义:
单 Agent:Skill = 方法论 + 流程 + 工具策略
多 Agent:Skill = 子 Agent 的角色定义 + 输入输出规范 + 协作协议
6.4 多 Agent 的工程陷阱
⚠️ Agent 越多,不确定性越高,治理成本成倍增长。
常见陷阱:
| 陷阱 | 描述 | 应对 |
|---|---|---|
| 通信爆炸 | Agent 间消息传递失控,上下文无限膨胀 | 严格定义 Agent 间的输入输出接口 |
| 责任模糊 | 不知道哪个 Agent 导致了最终错误 | 每个 Agent 输出带 Trace ID,支持归因 |
| 成本失控 | 多 Agent 并行调用 LLM,Token 成本暴增 | 用轻量模型处理路由和简单任务,重模型处理核心推理 |
| 过度设计 | 简单任务强行拆成多 Agent | 先用单 Agent 跑通,再按需拆分 |
6.5 什么时候该用多 Agent?(决策标准)
flowchart TD
Q1{单 Agent 能否在<br/>Context 限制内完成?} -- 是 --> Single["✅ 用单 Agent<br/>别过度设计"]
Q1 -- 否 --> Q2{任务是否有<br/>明确的角色分工?}
Q2 -- 是 --> Q3{需要并行执行<br/>提升效率?}
Q3 -- 是 --> Multi["✅ 多 Agent<br/>(并行 Subagent)"]
Q3 -- 否 --> Q4{输出质量是否<br/>需要多角度验证?}
Q4 -- 是 --> Peer["✅ Peer-to-Peer<br/>辩论模式"]
Q4 -- 否 --> Orchestrator["✅ Orchestrator<br/>串行分发模式"]
Q2 -- 否 --> Refactor["⚠️ 先重构 Skill<br/>再考虑多 Agent"]
七、可观测性与评估:上线后怎么知道它在正常跑?
这是大多数 Agent 文章跳过的部分,也是工程师被线上问题打脸最多的地方。
7.1 为什么 Agent 的可观测性比普通服务难?
graph LR
A["普通 API 服务"] --> B["输入 → 确定性处理 → 输出<br/>✅ 易于 logging 和监控"]
C["Agent 系统"] --> D["输入 → 动态推理<br/>→ 工具调用(可能多次)<br/>→ 中间状态变化<br/>→ 不确定性输出<br/>❌ 每步都可能出问题"]
普通服务的 Log 记录"发生了什么";Agent 系统需要记录"为什么这样决策"——这需要 Trace 级别的追踪。
7.2 四个关键可观测性维度
1. Trace(执行链路追踪)
记录 Agent 每一步的推理、工具调用、中间结果。
推荐工具:
- LangSmith:LangChain/LangGraph 生态原生,最无缝
- Arize Phoenix:开源,模型无关
- Langfuse:开源,自托管友好
一个好的 Trace 应该包含:
[Task Start]
├── Thought: "需要先查询用户的历史订单..."
├── Action: query_db(user_id=123, table=orders)
│ └── Observation: [{order_id: 456, status: pending}]
├── Thought: "订单状态是 pending,需要检查库存..."
├── Action: check_inventory(product_id=789)
│ └── Observation: {stock: 0, eta: "2025-05-01"}
└── Final Answer: "您的订单 456 正在等待补货,预计 5 月 1 日到货"
[Task End] duration=3.2s, tokens=1240, tools_called=2
2. Eval(评估体系)
| 评估维度 | 评估方法 | 工具 |
|---|---|---|
| 任务完成率 | 验收标准通过比例 | 自定义测试集 |
| 工具调用准确性 | 是否调用了正确工具、参数是否正确 | 单元测试 |
| 输出格式合规 | 结构化输出字段完整性 | Schema 校验 |
| 幻觉率 | 输出与事实的一致性 | LLM-as-Judge |
| 延迟 & 成本 | P50/P95 响应时间、Token 消耗 | Prometheus + Grafana |
关键认知:Agent 的 Eval 不能只靠人工判断,要尽量设计可自动化的客观验收标准(例如:代码生成任务的测试通过率、SQL 查询的结果一致性)。
3. Guardrails(护栏)
flowchart LR
Input["📥 用户输入"] --> IG["🛡️ 输入护栏<br/>长度限制<br/>内容过滤<br/>Prompt Injection 检测"]
IG --> Agent["🤖 Agent 执行"]
Agent --> OG["🛡️ 输出护栏<br/>格式校验<br/>敏感信息脱敏<br/>幻觉检测<br/>安全过滤"]
OG --> Output["📤 最终输出"]
Prompt Injection 防护要点:
- 不可信外部内容(网页、文档、用户输入)必须在 Skill 入口做净化,不能直接拼入 System Prompt
- 关键操作(写数据库、发邮件、执行代码)加确认步骤或权限校验
- 使用最小权限原则:工具只开放必要权限
4. 版本管理
Agent 系统的变更比普通代码更难追踪,因为"同一份代码 + 不同 Prompt = 不同行为"。
建议的版本化策略:
agent_config/
├── prompts/
│ ├── system_v1.2.txt
│ └── system_v1.3.txt ← 当前版本
├── skills/
│ ├── code_review_v2.json
│ └── prd_writer_v1.json
└── tools/
└── mcp_config.json
- Prompt / Skill / 工具配置都要进版本控制
- 每次变更要有回归测试
- 灰度发布:先在小流量上验证新版本
7.3 最小可行监控方案(资源有限的团队)
graph LR
A["第一步<br/>接入 LangSmith<br/>(免费额度够用)<br/>拿到 Trace 可见性"] --> B["第二步<br/>写 10 个核心测试用例<br/>覆盖高频场景<br/>建立 Eval 基线"] --> C["第三步<br/>加输入/输出校验<br/>至少做格式校验<br/>和长度限制"] --> D["第四步<br/>监控 Token 成本<br/>设置告警阈值<br/>防止费用失控"]
八、避坑总结 + 落地路径
8.1 五个高频陷阱
| # | 陷阱 | 症状 | 解法 |
|---|---|---|---|
| 1 | Persona 当核心能力 | "我写了个很专业的 System Prompt,但输出不稳定" | Persona 只是外衣,Skill 才是骨架,先定流程 |
| 2 | CoT 滥用 | Token 成本暴涨,延迟上升,收益不明显 | 按任务类型选择性启用,数学/逻辑任务才值得 |
| 3 | 工具一多,Prompt 先爆炸 | 接入 20 个工具后 Agent 开始乱选工具 | MCP 标准化 + 工具分组 + 动态工具加载 |
| 4 | 跳过输入/输出校验 | 外部内容注入导致输出被劫持,或结构化输出残缺 | Skill 入口做净化,出口做 Schema 校验 |
| 5 | 跳过 Eval,全靠肉眼 | 改了一个 Prompt,不知道有没有影响其他功能 | 先建 10 个核心测试用例,再迭代 |
8.2 什么时候不该用 Agent?
简单任务用 Agent 是过度设计,Pipeline 更合适。
| 场景 | 建议 |
|---|---|
| 固定输入 → 固定处理逻辑 → 固定输出 | 用 Pipeline(LCEL Chain / 简单函数链) |
| 规则明确、不需要推理 | 用传统代码 + LLM 做局部增强 |
| 对延迟极度敏感(<100ms) | Agent 的 ReAct 循环成本太高 |
| 测试集很小,风险极低 | 先跑通业务,再考虑 Agent 化 |
8.3 从零到生产的落地路径(7 步)
flowchart LR
S1["Step 1<br/>🎭 定 Persona<br/>统一风格与边界"] --> S2
S2["Step 2<br/>🛠️ 设计核心 Skill<br/>把高频任务流程化"] --> S3
S3["Step 3<br/>🔗 接入 MCP / 工具<br/>让 Skill 能调用真实系统"] --> S4
S4["Step 4<br/>🧠 选执行模式<br/>ReAct / Plan / Reflect"] --> S5
S5["Step 5<br/>💾 设计 Memory<br/>按场景选记忆类型"] --> S6
S6["Step 6<br/>📊 接入可观测性<br/>Trace + Eval + 护栏"] --> S7
S7["Step 7<br/>🏭 生产化<br/>版本管理 + 灰度 + 监控告警"]
经验法则:
- 先做 Step 1-3,验证核心业务逻辑
- Step 4-5 在复杂度上升时引入
- Step 6-7 在上线前必须完成,不能省略
九、总结:Agent 工程的本质
用一张图把全文的知识体系收拢:
最后一句话送给所有在 Agent 落地路上踩坑的工程师:
Persona 让它像一个人,CoT 让它像一个会思考的人;Skill 让它像一个会交付的专家,MCP 让它真的能在现实世界里把事办成;Memory 让它不会忘记,Eval 让你不会瞎猫碰死鼠。
Agent 落地的本质,是把"模型的涌现能力"装进"可控的工程结构"里。 ✅