Agent系列一:AI Agent 认知与技术地图

5 阅读25分钟

1.1 什么是 AI Agent

1.1.1 从 LLM 到 Agent

LLM,即 Large Language Model,大语言模型,本质上是一个基于上下文生成文本或结构化内容的模型。用户给它输入,它根据已有上下文生成输出。

最简单的 LLM 使用方式是:

用户输入问题
  -> 模型生成回答
  -> 用户看到回答

这种模式适合问答、写作、总结、翻译等任务,但它本身并不具备完整的“行动能力”。

Agent 则是在 LLM 外面增加了一套运行机制,使模型不仅能回答问题,还能:

  • 判断任务目标
  • 拆解任务步骤
  • 选择合适工具
  • 调用外部系统
  • 读取工具结果
  • 继续推理
  • 在必要时重试
  • 最终完成任务

可以把 Agent 理解为:

Agent = LLM + 目标 + 状态 + 工具 + 规划 + 执行 + 反馈 + 安全边界

LLM 是 Agent 的核心推理能力,但 Agent 不等于 LLM。


1.1.2 LLM、Chatbot、Workflow、Agent 的区别

类型核心特点是否能调用工具是否有明确流程是否具备自主决策典型场景
LLM根据上下文生成内容问答、写作、总结
Chatbot多轮对话界面可选通常较弱较弱客服、助手、咨询
Workflow预定义流程自动化可以较弱审批流、固定业务流程
Agent根据目标动态规划和执行可以动态变化研究、代码、办公自动化、复杂任务执行

关键区别在于:

  • Chatbot 关注对话体验
  • Workflow 关注固定流程执行
  • Agent 关注目标驱动的动态执行

例如,用户说:

帮我分析这个 PDF,总结重点,并生成一份待办清单。

普通 Chatbot 可能只能根据用户粘贴的文本回答。

Workflow 可以按照固定步骤执行:上传文件 -> 解析文件 -> 总结 -> 生成清单。

Agent 则可以根据实际情况动态判断:

  • 文件是否需要 OCR
  • 内容是否过长需要分块
  • 是否需要先检索相关片段
  • 是否需要调用任务管理工具
  • 是否需要让用户确认生成的任务
  • 如果解析失败是否需要换一种解析方式

这就是 Agent 与简单聊天机器人的区别。


1.1.3 Agent 为什么不是简单聊天机器人

简单聊天机器人通常只有以下能力:

接收消息 -> 调用模型 -> 返回文本

生产级 Agent 至少需要具备:

接收目标
  -> 理解任务
  -> 拆解步骤
  -> 选择工具
  -> 执行工具
  -> 观察结果
  -> 更新状态
  -> 必要时继续执行
  -> 输出最终结果

Agent 更接近一个“可以使用工具完成任务的智能执行系统”,而不只是一个“会说话的模型”。

判断一个系统是否更接近 Agent,可以看它是否具备以下特征:

  • 是否能根据目标决定下一步做什么
  • 是否能使用工具改变外部世界或读取外部数据
  • 是否能维护任务状态
  • 是否能根据工具结果调整后续行为
  • 是否能处理失败和重试
  • 是否有安全边界和权限控制
  • 是否能被追踪、评测和复盘

如果一个系统只是把用户问题转发给模型,再把模型答案返回给用户,它更像 Chatbot,而不是生产级 Agent。


1.1.4 Agent 的典型应用场景

Agent 适合处理有目标、有步骤、需要工具、需要上下文的任务。

常见场景包括:

个人助理
  • 整理日程
  • 总结文件
  • 生成待办事项
  • 检索个人知识库
  • 起草邮件或报告
研究助理
  • 搜集资料
  • 阅读网页或文档
  • 提取观点
  • 比较不同来源
  • 生成研究报告
编程助理
  • 阅读代码库
  • 定位 bug
  • 修改代码
  • 运行测试
  • 总结变更
企业知识库助手
  • 回答内部制度问题
  • 查询产品文档
  • 引用知识来源
  • 按权限隔离数据
  • 记录问答日志
业务自动化 Agent
  • 读取表格
  • 调用业务 API
  • 生成审批单
  • 通知相关人员
  • 记录执行结果
数据分析 Agent
  • 理解分析目标
  • 读取数据文件
  • 执行统计分析
  • 生成图表
  • 输出结论

这些场景的共同特点是:任务往往不是一次模型调用就能完成,而是需要“多步骤执行 + 外部工具 + 状态管理”。


1.1.5 生产级 Agent 的基本要求

演示级 Agent 可以只追求“能跑起来”。

生产级 Agent 必须追求:

  • 可控
  • 可追踪
  • 可恢复
  • 可评测
  • 可审计
  • 可扩展
  • 可部署

一个生产级 Agent 系统至少要回答以下问题:

  1. 用户是谁?他有权限访问哪些数据?
  2. Agent 调用了哪些工具?参数是什么?结果是什么?
  3. 哪些操作是高风险的?是否需要人工审批?
  4. Agent 的每一步是否有日志?能否回放?
  5. 模型调用消耗了多少 token?成本是多少?
  6. 如果工具失败,系统如何处理?
  7. 如果任务中断,是否可以恢复?
  8. 如果 Prompt 或工具改动,如何判断质量是否下降?

1.2 Agent 的核心组成

一个完整 Agent 通常由以下部分组成:

Model + Prompt + Tools + Memory + Planner + Executor + Guardrails + Evaluation

这些部分不是孤立存在的,而是在 Agent Runtime 中协同工作。


5.2.1 Model:模型能力边界

Model 是 Agent 的推理核心。它负责:

  • 理解用户输入
  • 生成计划
  • 判断是否需要工具
  • 生成工具参数
  • 解释工具结果
  • 输出最终回答

但模型不是万能的。模型有明显边界:

  • 不知道用户私有数据,除非通过上下文或检索提供
  • 不会真正执行外部操作,除非系统提供工具
  • 可能产生幻觉
  • 可能误解复杂指令
  • 上下文窗口有限
  • 输出格式可能不稳定

因此,Agent 工程不能只依赖“模型足够聪明”,而要通过工具、状态、校验、安全和评测来约束模型。

模型选型时通常需要考虑:

  • 推理能力
  • 工具调用能力
  • 结构化输出能力
  • 流式输出能力
  • 上下文长度
  • 延迟
  • 成本
  • 稳定性
  • 供应商生态

1.2.2 Prompt:指令与上下文

Prompt 是 Agent 的行为说明书。它决定模型在当前任务中应该如何理解角色、目标、规则和输出格式。

常见 Prompt 类型包括:

System Prompt

用于定义 Agent 的身份、能力边界、安全规则和输出要求。

示例:

你是一个个人智能助理 Agent。你需要帮助用户完成资料整理、任务规划和知识库问答。
当需要外部信息时,你必须优先调用可用工具,而不是编造答案。
涉及文件写入、外部请求、代码执行等高风险操作时,必须等待用户审批。
Developer Prompt

用于描述开发者对 Agent 行为的约束,例如工具调用规则、格式要求、错误处理方式。

Tool Prompt

用于告诉模型某个工具能做什么、什么时候使用、参数如何填写、返回值如何理解。

Few-shot 示例

通过示例告诉模型“什么是好的输出”。

Prompt 工程的核心不是写一段漂亮的提示词,而是把 Agent 行为变得:

  • 稳定
  • 可解析
  • 可测试
  • 可迭代
  • 可约束

1.2.3 Tools:工具调用

Tools 是 Agent 接触外部世界的方式。

没有工具的 Agent 只能“说”。 有工具的 Agent 才能“做”。

常见工具包括:

  • 当前时间工具
  • 计算器工具
  • 搜索工具
  • 文档检索工具
  • 文件解析工具
  • 数据库查询工具
  • 代码执行工具
  • 邮件发送工具
  • 任务管理工具
  • MCP 工具

一个工具通常需要定义:

工具名称
工具描述
参数 Schema
权限等级
执行函数
返回格式
错误格式
是否需要审批

示例工具定义:

{
  "name": "calculator",
  "description": "执行基础数学计算",
  "parameters": {
    "type": "object",
    "properties": {
      "expression": {
        "type": "string",
        "description": "需要计算的数学表达式"
      }
    },
    "required": ["expression"]
  },
  "risk_level": "low"
}

生产级工具系统不能只关注“能调用”,还必须关注:

  • 参数校验
  • 权限控制
  • 审计日志
  • 错误处理
  • 超时控制
  • 幂等性
  • 人工审批
  • 工具结果脱敏

1.2.4 Memory:记忆系统

Memory 让 Agent 不只是处理当前一句话,而是能够利用上下文和历史信息。

记忆可以分为两类:

短期记忆

通常指当前会话上下文,例如:

  • 最近几轮消息
  • 当前任务目标
  • 已调用工具
  • 工具返回结果
  • 当前执行状态

短期记忆帮助 Agent 在一个任务中保持连贯。

长期记忆

通常指跨会话保存的信息,例如:

  • 用户偏好
  • 用户常用工具
  • 历史任务摘要
  • 常见项目背景
  • 用户明确要求保存的信息

长期记忆帮助 Agent 实现个性化。

但记忆系统必须谨慎设计,因为它涉及隐私和安全:

  • 什么信息可以记?
  • 什么信息不能记?
  • 是否需要用户授权?
  • 用户能否查看、修改、删除记忆?
  • 记忆是否可能被 Prompt Injection 污染?

1.2.5 Planner:任务规划

Planner 负责把用户目标拆解成可执行步骤。

例如用户输入:

帮我阅读这份行业报告,总结核心观点,并生成一个下周行动计划。

Planner 可能生成:

1. 解析用户上传的报告文件
2. 按章节提取关键内容
3. 总结行业趋势和关键观点
4. 将观点转化为行动建议
5. 生成下周任务清单
6. 输出最终总结

Planner 可以是显式的,也可以是隐式的。

隐式规划

模型不输出明确计划,而是在每一步内部决定下一步做什么。

显式规划

模型先输出结构化计划,然后系统按计划执行。

显式规划更适合需要可视化、审批和长任务恢复的场景。

生产级 Agent 中,Planner 需要考虑:

  • 任务是否可完成
  • 是否需要工具
  • 是否涉及高风险操作
  • 是否需要用户补充信息
  • 是否需要拆成多个子任务
  • 是否需要多个 Agent 协作

1.2.6 Executor:任务执行

Executor 负责执行 Planner 产生的步骤,尤其是工具调用。

Executor 需要处理:

  • 调用哪个工具
  • 参数是否合法
  • 用户是否有权限
  • 是否需要审批
  • 工具是否执行成功
  • 失败后是否重试
  • 结果如何回传给模型
  • 中间状态如何保存

可以把 Planner 和 Executor 的关系理解为:

Planner:决定要做什么
Executor:负责真的去做

在简单 Agent 中,Planner 和 Executor 可能都由同一个模型调用完成。

在复杂 Agent 中,它们可能被拆成不同节点,甚至不同 Agent。


1.2.7 Guardrails:安全边界

Guardrails 是 Agent 的安全防线。

Agent 能调用工具、读取数据、执行任务,因此必须有边界。否则它可能:

  • 访问不该访问的数据
  • 执行危险工具
  • 被 Prompt Injection 诱导
  • 泄露系统提示词或密钥
  • 编造不存在的信息
  • 生成不合规内容
  • 无限制消耗 token 或调用外部 API

常见 Guardrails 包括:

输入侧 Guardrails
  • 检查用户输入是否包含恶意指令
  • 检查上传文件是否安全
  • 检查 URL 是否允许访问
  • 检查请求是否超出用户权限
工具侧 Guardrails
  • 工具权限分级
  • 高风险工具审批
  • 参数白名单
  • 超时限制
  • 调用频率限制
  • 沙箱隔离
输出侧 Guardrails
  • 敏感信息过滤
  • 输出格式校验
  • 不确定时拒绝编造
  • 引用来源校验
  • 禁止泄露内部系统信息

一个核心原则是:

所有高风险工具都要权限和审批。

高风险工具包括但不限于:

  • 文件写入
  • 外部网络请求
  • 代码执行
  • 支付操作
  • 邮件发送
  • 删除数据
  • 修改权限

1.2.8 Evaluation:效果评测

Agent 的输出具有不确定性,因此不能只靠人工感觉判断质量。

Evaluation 的目标是让 Agent 可以被持续改进。

评测对象包括:

  • 模型回答质量
  • 工具调用是否正确
  • 参数生成是否正确
  • RAG 检索是否准确
  • 引用来源是否真实
  • 多步骤任务是否完成
  • 是否遵守安全规则
  • 是否出现回归问题

常见评测方式包括:

单元测试

测试工具函数、API、Schema、权限逻辑。

Prompt 回归测试

固定一组输入,观察 Prompt 修改后输出是否变差。

RAG 评测

评估检索召回率、答案忠实度、引用准确性。

Agent 任务成功率评测

评估复杂任务是否真的完成。

LLM-as-judge

用另一个模型作为裁判,对答案进行评分。

人工标注

对关键任务进行人工审核,形成 Golden Dataset。

生产级 Agent 必须把 Evaluation 纳入开发流程,否则每次修改 Prompt、工具或模型都可能引入不可见的质量回退。


1.3 Agent 的基本运行模式

Agent 不是只有一种实现方式。不同任务适合不同运行模式。


1.3.1 ReAct 模式

ReAct 是 Reasoning + Acting 的组合。

它让模型在推理和行动之间循环:

Thought:我需要知道当前时间
Action:调用 get_current_time 工具
Observation:当前时间是 2026-05-26
Thought:我可以根据当前时间回答用户
Final Answer:现在是......

典型流程:

用户输入
  -> 模型思考
  -> 模型选择工具
  -> 系统执行工具
  -> 工具结果返回模型
  -> 模型继续思考
  -> 输出最终答案

ReAct 适合:

  • 工具调用较少的任务
  • 需要边想边查的任务
  • 教学和理解 Agent Loop
  • 快速构建最小 Agent

ReAct 的问题:

  • 中间过程可能不稳定
  • 复杂任务容易循环
  • 对 Prompt 依赖较强
  • 不适合复杂状态管理

1.3.2 Plan-and-Execute 模式

Plan-and-Execute 先制定计划,再执行计划。

用户目标
  -> 生成计划
  -> 执行步骤 1
  -> 执行步骤 2
  -> 执行步骤 3
  -> 汇总结果
  -> 最终回答

示例计划:

{
  "goal": "总结报告并生成行动清单",
  "steps": [
    "解析报告文件",
    "提取核心观点",
    "归纳机会与风险",
    "生成行动清单",
    "输出最终总结"
  ]
}

适合场景:

  • 多步骤任务
  • 长任务
  • 需要前端展示计划
  • 需要人工审批
  • 需要中断和恢复

优点:

  • 更可控
  • 更容易可视化
  • 更容易记录状态
  • 更适合生产系统

缺点:

  • 初始计划可能不准确
  • 执行过程中需要动态调整
  • 计划与执行逻辑更复杂

后续引入 LangGraph 时,会把这种模式工程化为 Graph、Node、Edge 和 State。


1.3.3 Tool Calling 模式

Tool Calling 是现代 LLM API 常见能力。模型可以输出结构化工具调用请求,而不是自然语言描述。

简化流程:

用户:帮我算一下 128 * 56
模型:调用 calculator({ "expression": "128 * 56" })
系统:执行计算器工具
工具:返回 7168
模型:最终回答 128 * 56 = 7168

Tool Calling 的核心价值:

  • 工具参数结构化
  • 更容易校验
  • 更容易执行
  • 更容易记录日志
  • 更适合与后端系统集成

但 Tool Calling 不等于完整 Agent。

Tool Calling 只是 Agent 的一个能力。完整 Agent 还需要状态、记忆、规划、权限、安全、评测等工程能力。


1.3.4 Workflow Agent 模式

Workflow Agent 把 Agent 的执行流程设计为明确的工作流或状态机。

例如:

开始
  -> 理解任务
  -> 检查权限
  -> 生成计划
  -> 执行工具
  -> 是否需要审批?
      -> 是:等待用户审批
      -> 否:继续执行
  -> 是否完成?
      -> 否:继续下一步
      -> 是:输出最终结果

Workflow Agent 适合生产系统,因为它具有:

  • 明确状态
  • 可恢复执行
  • 可插入审批
  • 可追踪节点
  • 可处理失败
  • 可进行回放

LangGraph 就非常适合构建这种状态化 Agent。


1.3.5 Multi-Agent 模式

Multi-Agent 是多个 Agent 协作完成一个复杂任务。

常见角色包括:

  • Supervisor Agent:负责分配任务和汇总结果
  • Researcher Agent:负责资料检索
  • Planner Agent:负责计划制定
  • Coder Agent:负责代码实现
  • Reviewer Agent:负责检查质量
  • Writer Agent:负责生成最终文档

典型结构:

用户任务
  -> Supervisor Agent
      -> Researcher Agent
      -> Planner Agent
      -> Writer Agent
      -> Reviewer Agent
  -> 汇总结果
  -> 最终回答

Multi-Agent 适合:

  • 复杂研究任务
  • 长文档生成
  • 软件开发协作
  • 多角色审查
  • 需要专业分工的任务

但 Multi-Agent 很容易复杂化:

  • 成本上升
  • 调用链变长
  • 上下文管理困难
  • Agent 之间可能冲突
  • 调试难度增加

1.4 主流 Agent 框架对比

1.4.1 LangGraph

LangGraph 适合构建状态化、可恢复、可中断的 Agent 工作流。

核心概念:

  • Graph
  • Node
  • Edge
  • State
  • Checkpoint
  • Interrupt
  • Streaming

适合场景:

  • 多步骤 Agent
  • 需要状态管理
  • 需要人工审批
  • 需要中断恢复
  • 需要复杂流程控制
  • 长任务执行

优势:

  • 状态明确
  • 流程可控
  • 适合生产级编排
  • 支持 Human-in-the-loop
  • 支持 Durable Execution

需要注意:

  • 抽象较多
  • 需要设计状态结构
  • 对初学者有一定门槛

1.4.2 OpenAI Agents SDK

OpenAI Agents SDK 是官方 Agent 开发工具,提供 Agent、Tools、Handoffs、Guardrails、Tracing 等能力。

适合场景:

  • 快速构建基于 OpenAI 生态的 Agent
  • 使用官方工具调用和追踪能力
  • 构建多 Agent Handoff 流程
  • 使用内置 Guardrails 能力

优势:

  • 官方生态集成
  • Agent 抽象清晰
  • Tool 和 Handoff 支持完善
  • Tracing 能力友好

需要注意:

  • 与具体模型生态绑定较强
  • 复杂状态流可能仍需要额外工程设计

1.4.3 Claude Agent SDK

Claude Agent SDK 适合构建基于 Claude 能力的 Agent 应用,尤其适合工具使用、上下文处理、代码任务和复杂推理类场景。

适合场景:

  • 使用 Claude 构建定制 Agent
  • 工具调用
  • MCP 集成
  • 复杂工程任务
  • 构建可扩展 Agent Runtime

优势:

  • 与 Claude 能力结合紧密
  • 支持 Agent 相关工程抽象
  • 适合与 MCP 生态结合

需要注意:

  • 需要理解 SDK 的运行模型
  • 需要结合实际项目设计状态、权限和日志

1.4.4 Vercel AI SDK

Vercel AI SDK 更偏向前端和全栈 AI 应用开发,尤其适合构建流式聊天体验、Tool Call UI 和前端 Agent 交互。

适合场景:

  • Next.js AI 应用
  • 流式输出
  • Chat UI
  • Tool Call 前端展示
  • 全栈 TypeScript 项目

优势:

  • 前端体验好
  • Streaming 支持强
  • 与 Next.js 结合自然
  • 适合快速构建 AI Chat 产品

需要注意:

  • 复杂后端权限、审计、任务系统仍需要单独设计
  • 生产级 Agent Runtime 不应完全放在前端侧

1.4.5 CrewAI

CrewAI 偏向多 Agent 角色协作。它通过 Agent、Task、Crew 等概念组织多个角色完成任务。

适合场景:

  • 多角色协作 Demo
  • 研究报告生成
  • 内容生产工作流
  • 简化多 Agent 编排

优势:

  • 多 Agent 概念直观
  • 上手较快
  • 适合演示角色分工

需要注意:

  • 生产级状态管理、权限、安全和评测仍需要补齐
  • 多 Agent 容易带来成本和调试复杂度

1.4.6 AutoGen

AutoGen 偏向多个 Agent 之间的对话式协作。

适合场景:

  • Agent 之间相互讨论
  • 研究型任务
  • 编程协作实验
  • 多智能体系统探索

优势:

  • 多 Agent 对话机制强
  • 适合实验复杂协作模式

需要注意:

  • 对话链路可能较长
  • 成本控制和稳定性需要额外设计
  • 生产落地需要配套工程治理

1.4.7 LlamaIndex Agents

LlamaIndex 在数据连接、索引、RAG 和知识库方面能力较强,也提供 Agent 能力。

适合场景:

  • 知识库问答
  • 文档检索
  • 数据连接
  • RAG Agent

优势:

  • RAG 生态丰富
  • 数据连接器多
  • 适合知识密集型 Agent

需要注意:

  • 如果项目重点是复杂流程编排,可能需要结合其他工具
  • 权限、审计、审批仍需要业务系统实现

1.5 MCP 与工具生态

1.5.1 MCP 是什么

MCP,全称 Model Context Protocol,是一种用于连接模型应用与外部工具、数据源和上下文的协议。

它可以理解为 Agent 世界里的“工具接入标准”。

在没有 MCP 之前,每个 Agent 应用都可能用自己的方式接入工具:

Agent A -> 自定义搜索 API
Agent B -> 自定义数据库工具
Agent C -> 自定义文件系统工具

这会导致:

  • 工具无法复用
  • 接入方式不统一
  • 权限模型不一致
  • 工具发现困难
  • 维护成本高

MCP 试图用标准协议统一这个过程。


1.5.2 MCP Server 与 MCP Client

MCP 的基本结构:

Agent / AI App 作为 MCP Client
  -> 连接 MCP Server
  -> 发现工具、资源和提示词
  -> 调用工具或读取资源
MCP Client

MCP Client 通常嵌入在 Agent 应用中,负责:

  • 连接 MCP Server
  • 获取工具列表
  • 读取工具 Schema
  • 发起工具调用
  • 接收工具结果
  • 将结果返回给 Agent
MCP Server

MCP Server 提供能力,负责暴露:

  • Tools
  • Resources
  • Prompts

例如,一个文件系统 MCP Server 可以提供:

  • 读取文件工具
  • 搜索文件工具
  • 文件资源列表

一个数据库 MCP Server 可以提供:

  • 查询表结构
  • 执行只读 SQL
  • 获取数据资源

1.5.3 Tools、Resources、Prompts

MCP 中常见三类能力:

Tools

Tools 是可执行动作。

例如:

  • search_files
  • read_document
  • query_database
  • create_task
  • send_email

Tools 通常有输入参数和返回结果。

Resources

Resources 是可读取资源。

例如:

  • 文件内容
  • 数据库表结构
  • 项目配置
  • 文档集合

Resources 更偏“上下文读取”,不一定执行动作。

Prompts

Prompts 是可复用提示模板。

例如:

  • 代码审查 Prompt
  • 报告总结 Prompt
  • SQL 分析 Prompt

Prompts 可以帮助不同 Agent 应用复用同一套任务指令。


1.5.4 MCP 为什么适合 Agent 工具接入

MCP 对 Agent 有几个重要价值:

工具标准化

工具定义、参数、返回值可以通过标准协议暴露。

工具可发现

Agent 可以动态发现可用工具,而不是把所有工具写死在代码里。

工具可复用

同一个 MCP Server 可以被多个 Agent 应用使用。

生态可扩展

开发者可以为数据库、文件系统、浏览器、业务系统分别开发 MCP Server。

权限可治理

企业可以围绕 MCP Server 做统一权限控制、审计和策略管理。


1.5.5 MCP 与普通 HTTP API 的区别

MCP 和 HTTP API 并不是替代关系。

HTTP API 是通用接口协议。 MCP 是面向模型上下文和工具调用的协议。

对比项普通 HTTP APIMCP
目标系统之间通用通信AI 应用接入工具和上下文
工具发现通常需要手写文档或 SDK协议内支持工具发现
SchemaOpenAPI 等方式描述面向模型工具调用描述
资源模型自定义Tools / Resources / Prompts
Agent 集成需要手动适配更适合 Agent 动态接入
使用方式开发者调用 APIAgent/模型应用发现并调用工具

简单理解:

HTTP API 是底层通用能力,MCP 是面向 Agent 的工具接入层。

很多 MCP Server 内部仍然会调用 HTTP API,只是对 Agent 暴露为统一的 MCP 能力。


1.6 生产级 Agent 的工程要求

一个能演示的 Agent 和一个能上线的 Agent,差距主要在工程体系。


1.6.1 权限控制

Agent 可能访问用户私有数据,因此必须知道:

  • 当前用户是谁
  • 用户能访问哪些会话
  • 用户能访问哪些文件
  • 用户能调用哪些工具
  • 用户是否有执行高风险操作的权限

权限控制不能只写在前端,也不能只依赖模型自觉遵守。

正确做法是:

  • 后端校验用户身份
  • 数据库查询按用户过滤
  • 工具调用前做权限检查
  • 高风险工具触发审批
  • 所有权限失败写入日志

1.6.2 人工审批

Agent 可以自动执行低风险任务,但高风险操作必须引入 Human-in-the-loop。

需要审批的操作包括:

  • 文件写入
  • 文件删除
  • 外部请求
  • 邮件发送
  • 代码执行
  • 支付操作
  • 修改权限
  • 访问敏感数据

审批流程通常是:

Agent 准备调用高风险工具
  -> 系统创建审批请求
  -> 前端展示审批弹窗
  -> 用户批准或拒绝
  -> Agent 根据审批结果继续或终止
  -> 审批记录写入审计日志

人工审批不是简单弹窗,而是生产级 Agent 的安全控制点。


1.6.3 工具审计

所有工具调用都应该被记录。

审计日志至少包含:

  • 用户 ID
  • 会话 ID
  • Agent Run ID
  • 工具名称
  • 工具参数
  • 工具结果摘要
  • 调用状态
  • 错误信息
  • 审批状态
  • 调用时间

工具审计的价值:

  • 问题追踪
  • 安全审查
  • 成本分析
  • 用户纠纷处理
  • 合规要求
  • Agent 行为复盘

1.6.4 日志与追踪

普通日志只能告诉我们“发生了什么”。

Tracing 可以告诉我们“整个调用链是怎样发生的”。

一次 Agent Run 可能包含:

用户消息
  -> 模型调用 1
  -> 工具调用 1
  -> 模型调用 2
  -> 工具调用 2
  -> 审批等待
  -> 工具调用 3
  -> 模型调用 3
  -> 最终回答

如果没有追踪系统,就很难判断:

  • 哪一步失败
  • 哪一步耗费最多 token
  • 哪个工具返回异常
  • 哪个 Prompt 导致错误
  • 哪次修改引入回归

1.6.5 成本统计

Agent 会多次调用模型和工具,成本可能比普通聊天更高。

需要统计:

  • 每次模型调用输入 token
  • 每次模型调用输出 token
  • 每次模型调用成本
  • 每个 Agent Run 总成本
  • 每个用户累计成本
  • 每个工具调用成本
  • 不同模型的成本分布

成本统计的作用:

  • 控制用户配额
  • 发现异常调用
  • 优化模型路由
  • 判断缓存是否有效
  • 支撑商业化计费

1.6.6 失败恢复

Agent 任务可能失败:

  • 模型超时
  • 工具异常
  • 网络错误
  • 用户取消
  • 审批拒绝
  • Worker 崩溃
  • 数据库连接失败

生产系统不能简单地让任务消失。

需要记录任务状态:

pending
running
waiting_approval
completed
failed
cancelled
retrying

还需要支持:

  • 重试
  • 取消
  • 中断后恢复
  • 查看失败原因
  • 从 Checkpoint 继续执行

1.6.7 评测体系

没有评测体系的 Agent 很难稳定迭代。

因为 Agent 输出受以下因素影响:

  • 模型版本
  • Prompt 改动
  • 工具描述改动
  • 检索参数改动
  • 文档内容变化
  • 上下文压缩策略变化

每次改动都可能导致质量回退。

因此需要建立:

  • 标准任务集
  • Golden Dataset
  • 工具测试
  • Prompt 回归测试
  • RAG 评测
  • Agent 任务成功率评测
  • LLM-as-judge
  • 人工抽检

最终目标是:

每次修改 Agent 的 Prompt、工具、RAG 或运行逻辑后,都能通过评测判断质量是否下降。


2. 主线项目中的 Agent 系统架构

初版系统架构如下:

flowchart TD
    User[用户] --> Web[Next.js 前端]
    Web --> API[FastAPI 后端 API]
    API --> DB[(PostgreSQL)]
    API --> Redis[(Redis)]
    API --> ObjectStorage[对象存储 / MinIO]
    API --> AgentService[Agent 服务]
    AgentService --> ModelClient[ModelClient]
    ModelClient --> LLM[大模型 API]
    AgentService --> ToolRegistry[工具注册表]
    ToolRegistry --> BuiltinTools[内置工具]
    ToolRegistry --> MCPClient[MCP Client]
    MCPClient --> MCPServers[MCP Servers]
    AgentService --> VectorDB[向量检索 / pgvector]
    AgentService --> AuditLog[审计日志]
    AgentService --> Trace[Tracing / Observability]
    API --> Approval[审批系统]
    Approval --> Web

这个架构中:

  • 前端负责用户交互、聊天界面、工具调用展示、审批弹窗。
  • 后端 API 负责用户、鉴权、会话、消息、文件、权限、审计。
  • Agent 服务负责 Agent Loop、工具选择、工具执行、状态管理。
  • ModelClient 负责统一封装模型调用。
  • Tool Registry 负责工具注册、参数校验、权限等级和调用入口。
  • MCP Client 负责连接外部 MCP Server。
  • PostgreSQL 负责业务数据持久化。
  • Redis 负责缓存、任务队列和运行状态辅助。
  • 向量检索负责 RAG 知识库问答。
  • 审批系统负责高风险工具调用的人类确认。
  • Tracing 系统负责记录完整调用链。

3. 最小 Agent 运行流程

最小 Agent Loop 可以先不引入复杂框架。

基础流程如下:

sequenceDiagram
    participant U as 用户
    participant FE as 前端
    participant API as 后端 API
    participant A as Agent Runtime
    participant M as 大模型
    participant T as 工具系统

    U->>FE: 输入任务
    FE->>API: 发送消息
    API->>A: 创建 Agent Run
    A->>M: 发送上下文和工具定义
    M-->>A: 返回工具调用请求或最终回答
    alt 需要调用工具
        A->>T: 执行工具
        T-->>A: 返回工具结果
        A->>M: 发送工具结果
        M-->>A: 继续推理或最终回答
    else 不需要工具
        M-->>A: 返回最终回答
    end
    A->>API: 保存运行结果
    API-->>FE: 流式返回结果
    FE-->>U: 展示回答和执行过程

更简单的文本版:

用户输入
  -> 后端创建 Agent Run
  -> Agent 将用户输入和工具列表发给模型
  -> 模型判断是否需要工具
  -> 如果需要工具,Agent 执行工具
  -> 工具结果返回模型
  -> 模型继续推理
  -> 输出最终答案
  -> 后端保存消息、工具调用和运行状态
  -> 前端展示回答和工具调用过程

4. 关键点

4.1 Agent 不是“套壳聊天”

如果一个应用只是:

用户输入 -> 调模型 -> 返回文本

它更像 Chatbot。

Agent 的关键是:

目标驱动 + 工具调用 + 状态管理 + 动态决策 + 安全边界

4.2 工具调用是 Agent 的分水岭

没有工具,模型只能生成内容。

有了工具,Agent 才能:

  • 查询实时数据
  • 读取私有文件
  • 调用业务系统
  • 执行计算
  • 创建任务
  • 操作外部资源

但工具越强,风险越高,所以必须有权限、审批和审计。


4.3 生产级 Agent 的难点在工程,而不只在模型

很多 Agent Demo 能跑,但难以上线,原因通常不是模型不够强,而是缺少:

  • 用户系统
  • 数据隔离
  • 工具权限
  • 审计日志
  • 运行追踪
  • 错误恢复
  • 成本控制
  • 自动评测

4.4 先简单,后复杂

不要一开始就做多 Agent、复杂 RAG、完整 MCP、长任务系统。

正确路线是:

最小 Agent Loop
  -> Web Chat
  -> Tool Agent
  -> Knowledge Agent
  -> Workflow Agent
  -> MCP Agent
  -> Production Agent