理解Agent:状态、上下文、记忆与Prompt的底层逻辑
一、大模型是无状态的,但Agent必须有状态 这是理解Agent的第一道门槛。 大模型(LLM)本质上是无状态的。 你问它一个问题,它回答你。然后你问第二个问题,它不会自动记得第一个问题是什么——除非你把它一起发过去。每次调用都是独立的、干净的、没有历史负担的。 这就像一个记忆力为零的天才:每次对话...
一、大模型是无状态的,但Agent必须有状态
这是理解Agent的第一道门槛。
大模型(LLM)本质上是无状态的。 你问它一个问题,它回答你。然后你问第二个问题,它不会自动记得第一个问题是什么——除非你把它一起发过去。每次调用都是独立的、干净的、没有历史负担的。
这就像一个记忆力为零的天才:每次对话都是第一次见,你刚说完的话,转身他就忘了。
但Agent必须有状态。
什么是Agent?Agent是能自主感知环境、做出决策、执行动作的系统。一个订票Agent需要记住用户要飞哪里、哪天、预算多少;一个代码助手Agent需要记住项目结构、之前的修改、用户的编码习惯。没有状态,Agent就只是一个问答机器,而不是一个能办事的助手。
所以Agent设计的第一个核心问题:如何解决状态?
状态可以存在内存里、数据库里、文件系统里,甚至可以是Agent自己的"心理模型"。关键是,Agent必须有一种机制,把跨轮次的信息保存下来,并在需要的时候调用。
二、上下文管理:Agent的"短期记忆"
既然大模型本身无状态,那ChatGPT为什么能记住你前面说的话?
答案:上下文(Context)。
每次你发送新消息时,系统并不是只把这条消息发给模型,而是把整个对话历史一起打包发过去。模型看到的其实是一个拼接好的长文本:
用户:你好
助手:你好!有什么可以帮你的?
用户:我想订一张去上海的机票
助手:好的,请问您想哪天出发?
用户:明天
模型基于这个完整的上下文来生成回复。这就是上下文管理——把历史对话作为输入的一部分,让模型"看起来"有记忆。
但上下文有个硬约束:上下文窗口大小(Context Window)。
不同模型的上下文窗口不同:早期的GPT-3只有4K token,GPT-4扩展到128K,Claude 3甚至达到200K。但无论如何,它都是有限的。
这意味着什么?
- 对话太长,早期的内容会被截断或压缩
- Agent处理复杂任务时,很容易"撑爆"上下文窗口
- 不是所有历史都值得保留,需要筛选、摘要、取舍
上下文管理的核心挑战:在有限的窗口内,放入最有价值的信息。
三、记忆:超越上下文的"长期存档"
现在问题来了:如果上下文已经能让模型"记得"之前的事,为什么还要单独谈"记忆"?
因为上下文管理和记忆是两个不同层次的东西。
| 维度 | 上下文管理 | 记忆 |
|---|---|---|
| 时间范围 | 短期(当前会话) | 长期(跨会话、跨任务) |
| 存储位置 | 随请求发送给模型 | 外部存储(数据库、向量库等) |
| 内容性质 | 原始对话记录 | 加工后的知识、事实、偏好 |
| 容量限制 | 受上下文窗口约束 | 理论上无限 |
| 主动/被动 | 被动打包发送 | 主动检索、筛选后注入 |
打个比方:
上下文就像你桌面上摊开的文件——你正在看的、马上要用到的。记忆就像你文件柜里的档案——不常打开,但需要时能找出来。
一个成熟的Agent系统通常有两级记忆:
- 短期记忆(工作记忆):就是上下文,处理当前任务流
- 长期记忆:存储用户画像、历史偏好、知识库、过往任务结果,需要时检索注入上下文
关键区别:上下文是"全量发送",记忆是"按需调用"。
记忆系统会主动判断:现在这个问题,需要调用用户的哪些历史信息?哪些知识库内容?然后把这些内容检索出来,和当前请求一起拼进上下文。
四、归根结底:一切都是Prompt工程
绕了一大圈,我们回到最底层的事实:
无论状态、上下文还是记忆,最终都要变成Prompt的一部分,送给大模型。
大模型只认一件事:你给我的文本输入是什么。它不直接访问你的数据库,不直接读取你的文件,不直接感知外部世界。它看到的,就是你构造好的那段Prompt。
所以Agent设计的本质,是围绕如何构建或拼接出一个合适的Prompt:
最终Prompt = 系统指令 + 任务描述 + 相关记忆(检索而来)
+ 当前上下文(对话历史) + 用户最新输入
每一部分都是精心设计的:
- 系统指令:定义Agent的角色、能力边界、输出格式
- 任务描述:当前要做什么
- 相关记忆:从长期记忆中检索出的有用信息
- 上下文:近期对话或操作记录
- 用户输入:最新的指令或问题
Agent框架(如LangChain、AutoGPT等)的核心价值,就是帮你自动化这个拼接过程。 它们处理状态存储、记忆检索、上下文裁剪、工具调用,最终生成一个最优的Prompt发给模型。
五、一张图理清关系
┌─────────────────────────────────────────┐
│ Agent 系统架构 │
├─────────────────────────────────────────┤
│ │
│ 用户输入 ──→ 记忆检索(长期记忆) │
│ ↓ ↓ │
│ 上下文管理 ←── 相关记忆片段 │
│ ↓ │
│ Prompt 拼接:系统指令 + 任务 + 记忆 │
│ + 上下文 + 用户输入 │
│ ↓ │
│ 发送给大模型(LLM) │
│ ↓ │
│ 模型输出 ──→ 执行动作/回复用户 │
│ ↓ │
│ 更新状态/记忆/上下文 │
│ │
└─────────────────────────────────────────┘
六、总结
理解Agent,抓住四条主线:
- 状态:Agent必须有状态,大模型本身没有。状态靠外部系统维护。
- 上下文:让模型"临时记得"当前会话的内容,但受窗口大小限制。
- 记忆:超越上下文的长期信息存储,按需检索注入,不等于上下文。
- Prompt:所有状态、上下文、记忆最终都要拼成Prompt给模型——这是Agent设计的底层逻辑。
下次再听到有人说"我的Agent有记忆",你可以追问一句:是上下文记忆,还是长期记忆?是存在向量库里的,还是每次全量发送的?
概念清楚了,才能做出靠谱的Agent。
本文旨在厘清Agent设计的核心概念,帮助开发者和产品经理建立正确的认知框架。