技术分享2026年9月4日

理解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系统通常有两级记忆:

  1. 短期记忆(工作记忆):就是上下文,处理当前任务流
  2. 长期记忆:存储用户画像、历史偏好、知识库、过往任务结果,需要时检索注入上下文

关键区别:上下文是"全量发送",记忆是"按需调用"。

记忆系统会主动判断:现在这个问题,需要调用用户的哪些历史信息?哪些知识库内容?然后把这些内容检索出来,和当前请求一起拼进上下文。


四、归根结底:一切都是Prompt工程

绕了一大圈,我们回到最底层的事实:

无论状态、上下文还是记忆,最终都要变成Prompt的一部分,送给大模型。

大模型只认一件事:你给我的文本输入是什么。它不直接访问你的数据库,不直接读取你的文件,不直接感知外部世界。它看到的,就是你构造好的那段Prompt。

所以Agent设计的本质,是围绕如何构建或拼接出一个合适的Prompt

最终Prompt = 系统指令 + 任务描述 + 相关记忆(检索而来) 
           + 当前上下文(对话历史) + 用户最新输入

每一部分都是精心设计的:

  • 系统指令:定义Agent的角色、能力边界、输出格式
  • 任务描述:当前要做什么
  • 相关记忆:从长期记忆中检索出的有用信息
  • 上下文:近期对话或操作记录
  • 用户输入:最新的指令或问题

Agent框架(如LangChain、AutoGPT等)的核心价值,就是帮你自动化这个拼接过程。 它们处理状态存储、记忆检索、上下文裁剪、工具调用,最终生成一个最优的Prompt发给模型。


五、一张图理清关系

┌─────────────────────────────────────────┐
│              Agent 系统架构               │
├─────────────────────────────────────────┤
│                                         │
│   用户输入 ──→ 记忆检索(长期记忆)        │
│      ↓           ↓                      │
│   上下文管理 ←── 相关记忆片段             │
│      ↓                                  │
│   Prompt 拼接:系统指令 + 任务 + 记忆     │
│            + 上下文 + 用户输入            │
│      ↓                                  │
│   发送给大模型(LLM)                    │
│      ↓                                  │
│   模型输出 ──→ 执行动作/回复用户          │
│      ↓                                  │
│   更新状态/记忆/上下文                   │
│                                         │
└─────────────────────────────────────────┘

六、总结

理解Agent,抓住四条主线:

  1. 状态:Agent必须有状态,大模型本身没有。状态靠外部系统维护。
  2. 上下文:让模型"临时记得"当前会话的内容,但受窗口大小限制。
  3. 记忆:超越上下文的长期信息存储,按需检索注入,不等于上下文。
  4. Prompt:所有状态、上下文、记忆最终都要拼成Prompt给模型——这是Agent设计的底层逻辑。

下次再听到有人说"我的Agent有记忆",你可以追问一句:是上下文记忆,还是长期记忆?是存在向量库里的,还是每次全量发送的?

概念清楚了,才能做出靠谱的Agent。


本文旨在厘清Agent设计的核心概念,帮助开发者和产品经理建立正确的认知框架。