AI Agent
AI Agent(人工智能代理)是一个能够感知环境、自主决策并采取行动以完成目标的软件系统。
与普通程序不同,AI Agent 的核心特征是自主性:它不只是被动地响应单次输入,而是能够:
- 制定多步骤计划
- 调用外部工具(搜索、代码执行、API 调用等)
- 根据执行结果动态调整策略
- 持续循环直到目标完成
AI Agent 的定义
从学术角度,Agent 的经典定义来自 Russell & Norvig(《人工智能:一种现代方法》):
Agent 是任何能够通过传感器感知环境、并通过执行器对环境采取行动的事物。
在 LLM 时代,AI Agent 的定义更具体:
AI Agent 是以大语言模型为核心推理引擎,能够自主规划任务、调用工具、与外部系统交互,并通过反馈循环完成复杂目标的自治系统。
Agent 的四个核心要素
| 要素 | 说明 |
|---|---|
| 感知(Perception) | 接收输入:多模态用户指令、工具返回结果、系统状态、历史记忆 |
| 规划(Planning) | 将目标分解为可执行的子任务序列 |
| 行动(Action) | 调用工具、执行代码、调用 API、操作文件等 |
| 记忆(Memory) | 短期记忆(上下文窗口)+ 长期记忆(向量数据库等) |
感知的来源
感知不只是用户输入那一句话,Agent 每次推理前收到的完整上下文都属于"感知":
| 来源 | 说明 |
|---|---|
| 多模态输入 | 用户的文本指令(最常见)、图片、音频、视频等 |
| 工具返回结果 | 搜索结果、API 响应、代码执行输出、数据库查询结果 |
| 系统状态 | 文件内容、环境变量、当前任务进度 |
| 历史记忆 | 短期记忆(上下文窗口中的对话历史)+ 长期记忆(从向量数据库检索) |
这四类来源最终都会被拼装进 LLM 的上下文窗口,LLM 基于这个完整上下文做出下一步决策。因此,感知本质上是构建 LLM 输入上下文的过程。
上下文窗口:感知的硬性约束
能放入上下文的信息量取决于模型的上下文窗口大小(以 token 计):
| 模型 | 上下文窗口 |
|---|---|
| GPT-4o | 128K tokens |
| Claude 3.5 Sonnet | 200K tokens |
| Gemini 1.5 Pro | 1M tokens |
超出窗口的内容会被截断,因此 Agent 需要主动管理上下文。常见策略如下(各框架实现不一,没有统一标准):
| 策略 | 做法 | 代表实现 |
|---|---|---|
| 直接截断 | 丢掉最早的对话轮次,只保留最近 N 轮 | 各类简单 Agent |
| 压缩摘要 | 定期用 LLM 把历史对话总结成摘要替换原始记录 | LangChain 默认记忆 |
| 滑动窗口 + 固定锚点 | 永远保留 System Prompt + 初始目标,中间内容滑动淘汰 | Claude Code、Cursor |
| 重要性评分过滤 | 给每条记录打分,优先保留高分内容(如报错信息) | OpenAI Assistants API |
| 分层存储 | 近期内容留在上下文,较早内容写入 RAG,需要时检索回来 | MemGPT / Letta |
为什么各家实现不一样:这是精度与成本的权衡——压缩越精细,LLM 调用越多,成本越高。不同场景对"记住什么"的要求也完全不同:编程 Agent 需要记住文件结构和报错,客服 Agent 需要记住用户偏好,任务执行 Agent 需要记住已完成步骤。
- 工具结果截断:搜索返回内容太长时,只取摘要或关键片段
上下文窗口大小是设计复杂 Agent 时必须考虑的核心约束之一。
记忆系统:短期记忆与长期记忆
Agent 的记忆分两层:
| 记忆类型 | 实现方式 | 特点 |
|---|---|---|
| 短期记忆 | 上下文窗口 | 当前对话可见,会话结束后消失 |
| 长期记忆 | RAG、键值存储、数据库等 | 跨会话持久化,按需取用 |
RAG 是长期记忆最主要的实现手段,核心思路是:把 Agent 需要"记住"的信息存到外部知识库,推理前按需检索相关片段放入上下文,让 Agent 表现得像"记得住"一样。
RAG 解决的核心问题:
- 私有信息:公司文档、个人笔记等根本不在训练数据里,没有 RAG 用户只能每次手动粘贴
- 最新信息:训练数据有截止日期,通过 RAG 知识库可以随时更新——不需要重新训练模型
- 容量限制:上下文窗口装不下所有背景信息,RAG 的知识库可以无限大,按需取用
RAG 不一定用向量数据库:向量数据库是最常见的实现,但本质上只要能"检索相关内容"都算 RAG:
| 检索方式 | 原理 | 适用场景 |
|---|---|---|
| 向量数据库 | 语义相似度检索 | 大规模、语义模糊的查询 |
| 全文搜索(BM25) | 关键词匹配 | 精确词匹配、日志检索 |
| 直接读文件(Markdown/txt) | 把文件全文塞进上下文 | 文件少且短 |
| 混合检索 | 向量 + 关键词结合 | 生产级系统 |
长期记忆的完整全景:
Agent 的记忆系统
├── 短期记忆(上下文窗口)← 当前对话历史、工具结果
└── 长期记忆
├── RAG(向量数据库等)← 文档、知识库
├── 键值存储 ← 用户偏好、配置
└── 结构化数据库 ← 任务状态、历史记录
规划:把目标拆解成可执行的步骤
规划是 LLM 收到目标后,将其分解为一系列有序子任务的过程。
示例:目标是"调研竞品,写分析报告并发邮件给老板",LLM 会规划出:
1. 搜索竞品 A 的信息
2. 搜索竞品 B 的信息
3. 对比分析差异
4. 生成报告文本
5. 发送邮件
规划的几个关键点:
- 分解:把复杂目标拆成 LLM/工具能处理的小步骤
- 排序:有依赖关系的步骤不能颠倒
- 动态调整:执行中途遇到意外,LLM 会重新规划
- 隐式发生:规划往往融合在每次 LLM 推理里,不是单独的一步
规划能力的来源:规划是 LLM 训练出来的潜在能力(训练数据中大量包含"分析问题 → 拆解步骤 → 逐步解决"的示例),Agent 的 System Prompt 是激活和规范化这个能力的开关——光靠训练能力不加引导,行为不稳定;有了引导,分解更系统、更可预期。
规划 vs 决策:规划着眼全局(“要走哪几步”),决策着眼当下(“这一步调哪个工具、传什么参数”)。类比到人:规划是列待办清单,决策是现在做哪件事、怎么做。
自主决策:Agent 的核心运行循环
Agent 的运行过程本质上是一个不断累积上下文、反复调用 LLM 做决策的循环:
初始上下文 = 系统指令 + 用户期望目标
↓
发给 LLM 推理
↓
LLM 决策:调用工具 X,参数 Y
↓
Agent 执行工具,获得结果
↓
追加工具结果到上下文(累积,不替换)
↓
再发给 LLM 推理
↓
(循环,直到 LLM 判断目标已达成)
关键细节:每次迭代中,LLM 看到的不是"最新一条工具结果",而是完整的累积上下文——初始目标 + 历次工具调用 + 历次工具结果全部追加在一起。LLM 凭借这份完整的执行轨迹,才能判断当前进展、决定下一步。
LLM 每轮的输出只有三种可能:
| LLM 输出 | 含义 |
|---|---|
| 工具调用指令 | 需要更多信息或执行操作,继续循环 |
| 直接文本回复 | 目标已达成,终止循环 |
| 追问用户 | 信息不足,等待用户补充后继续 |
自主性的来源:如果每一步的决策都是人提前写死的 if-else 规则,循环再多次也只是普通程序。正是因为 LLM 具备推理能力,每轮都能根据累积的上下文动态判断下一步该做什么、遇到问题该怎么调整,循环才有了"自主性"。
自主性 = LLM 的动态推理 + 无需人介入的多步骤循环
AI Agent 与 LLM 的关系
LLM 是 Agent 的"大脑"
LLM(大语言模型)和 AI Agent 是组件与系统的关系:
- LLM 是一个语言模型,本质上是"输入文本 → 输出文本"的函数,擅长理解、推理和生成文本
- AI Agent 是一个完整系统,以 LLM 作为核心推理引擎,并在外部集成工具、记忆、规划等模块
LLM 不只在规划阶段起作用,而是作为推理引擎贯穿整个"思考-决策"过程:
| 阶段 | LLM 的作用 |
|---|---|
| 规划 | 将目标拆解为子任务,决定执行顺序 |
| 决策 | 判断下一步该调用哪个工具、传什么参数 |
| 观察理解 | 解读工具返回的结果,判断是否达到目标 |
| 生成输出 | 将执行结果整理成自然语言回复用户 |
| 实际执行 | ❌ 调用 API、写文件等由工具负责,不是 LLM |
类比来说:LLM 像人的大脑,工具像人的手。大脑在每一步都在工作(理解、规划、判断),手只在需要具体操作时才动。
用户目标
↓
AI Agent
├── LLM(推理 / 规划 / 决策)
├── 工具(搜索、代码执行、数据库查询...)
├── 记忆(上下文 + 长期存储)
└── 执行器(实际调用外部系统)
↓
完成目标
关键区别
| 维度 | LLM | AI Agent |
|---|---|---|
| 本质 | 语言模型(函数) | 自治系统 |
| 交互方式 | 单次问答 | 多步骤循环 |
| 工具使用 | 不能主动调用工具 | 能调用外部工具 |
| 自主性 | 被动响应 | 主动规划和执行 |
| 记忆 | 仅限上下文窗口 | 可有持久化记忆 |
| 目标完成 | 单次回答 | 持续执行直到完成 |
LLM 的局限性与 Agent 的补充
LLM 本身有明显局限:
- 知识截止日期:训练数据有截止日期,无法获取最新信息
- 无法执行操作:只能输出文字,不能真正操作系统或调用 API
- 上下文长度限制:复杂任务超出单次上下文能力
- 无状态:每次对话独立,没有跨会话记忆
AI Agent 通过外部模块弥补这些局限:
- 工具调用(Tool Use):赋予 LLM 搜索网络、执行代码、读写文件的能力
- RAG(检索增强生成):从外部知识库检索最新或私有信息
- 持久化记忆:跨会话记住用户偏好和历史状态
- 多步骤规划:将复杂任务拆解,逐步完成
Agent 的典型运行循环(ReAct 模式)
思考(Thought)→ 行动(Action)→ 观察(Observation)→ 思考...
目标:查询北京今天的天气并发送邮件
Thought: 我需要先查询天气,再发送邮件
Action: search_weather(city="北京")
Observation: 北京今天晴,25°C
Thought: 获得了天气信息,现在发送邮件
Action: send_email(to="user@example.com", content="北京今天晴,25°C")
Observation: 邮件发送成功
Thought: 任务完成
Agent 的直观类比:人也是 Agent
Russell & Norvig 的定义适用于任何行为主体——包括人。每个人、每个同事都可以抽象成一个 Agent:
| Agent 要素 | 对应到人 |
|---|---|
| 感知 | 眼睛、耳朵等感官接收外部信息 |
| 规划 | 接到任务后列出执行步骤 |
| 决策 | 大脑根据目标和当前状态判断下一步 |
| 行动 | 说话、写作、操作工具等 |
| 记忆 | 短期记忆(工作记忆)+ 长期记忆(经验、知识) |
这个视角也解释了Multi-Agent 系统的意义:就像团队里每个人负责不同专长、相互协作,多个 AI Agent 各自专注一个子任务、互相传递结果,比单个 Agent 单打独斗更高效。
常见 AI Agent 框架
- LangChain / LangGraph — Python,功能全面,生态丰富
- CrewAI — 多 Agent 协作框架
- AutoGen — 微软出品,支持多 Agent 对话
- OpenAI Assistants API — 官方托管的 Agent 能力