Agent03:状态管理

理解 Agent 的状态管理能力,包括短期上下文、长期记忆、任务进度和中间产物,让 Agent 能够处理长时任务和多轮对话。

字数 1558 阅读时长 ≈ 5 分钟 2026-7-15 2026-7-27
Agent03:状态管理

状态管理是 Agent 的核心能力之一,它让 Agent 能够在多轮对话和长时任务中保持信息,避免重复计算和遗忘关键信息。理解状态管理的机制,才能构建能够处理复杂场景的 Agent 系统。

状态管理的基本原理

什么是状态管理

状态管理是指 Agent 在执行任务过程中,对信息进行存储、更新和检索的能力:

状态类型说明示例
短期上下文当前对话的信息用户的当前问题、历史对话
长期记忆跨对话的持久化信息用户偏好、历史任务记录
任务进度当前任务的执行状态已完成步骤、待执行步骤
中间产物任务执行中的临时结果API 返回数据、计算结果

状态管理的必要性

问题说明后果
遗忘上下文不记得之前的对话内容重复提问、回答不一致
重复计算相同问题重复处理效率低下、成本增加
任务中断无法恢复中断的任务用户体验差
信息丢失中间结果未保存需要重新执行

状态管理的挑战

挑战说明应对策略
上下文窗口限制模型上下文窗口有限上下文压缩、摘要
存储成本大量状态需要存储分层存储、过期清理
检索效率需要快速检索相关状态索引、缓存
一致性多轮对话中状态保持一致版本控制、冲突检测

短期上下文管理

上下文的类型

类型说明示例
用户输入用户的问题和指令”帮我订一张机票”
系统提示系统给模型的指令”你是一个旅行助手”
工具调用工具调用的记录调用了航班查询 API
工具结果工具返回的结果航班列表数据
对话历史之前的对话内容多轮对话记录

上下文管理策略

class ContextManager:
    def __init__(self, max_tokens=8192):
        self.max_tokens = max_tokens
        self.context = []
    
    def add_message(self, role, content):
        """添加消息到上下文"""
        self.context.append({"role": role, "content": content})
        self.trim_context()
    
    def trim_context(self):
        """修剪上下文,确保不超过 token 限制"""
        total_tokens = sum(len(msg["content"]) // 4 for msg in self.context)
        
        while total_tokens > self.max_tokens and len(self.context) > 1:
            # 移除最早的非系统消息
            removed = self.context.pop(1)
            total_tokens -= len(removed["content"]) // 4
    
    def get_context(self):
        """获取当前上下文"""
        return self.context
    
    def clear(self):
        """清空上下文"""
        # 保留系统提示
        system_prompt = self.context[0] if self.context else None
        self.context = []
        if system_prompt:
            self.context.append(system_prompt)

上下文压缩技术

技术说明适用场景
摘要压缩生成对话摘要长对话
关键信息提取提取关键信息需要保留特定信息
分层保留保留最近的详细信息,早期的摘要多轮对话
选择性保留根据相关性保留信息需要过滤无关内容

长期记忆

长期记忆的类型

类型说明示例
用户画像用户的基本信息和偏好姓名、偏好的航空公司
历史记录用户的历史对话和任务之前订过的机票
知识图谱领域知识和实体关系城市、机场、航班信息
经验规则从经验中学习的规则用户喜欢靠窗座位

长期记忆的存储

class LongTermMemory:
    def __init__(self, storage_backend):
        self.storage = storage_backend
    
    def save_user_profile(self, user_id, profile):
        """保存用户画像"""
        self.storage.set(f"user:{user_id}:profile", profile)
    
    def get_user_profile(self, user_id):
        """获取用户画像"""
        return self.storage.get(f"user:{user_id}:profile")
    
    def save_task_history(self, user_id, task):
        """保存任务历史"""
        history = self.storage.get(f"user:{user_id}:tasks") or []
        history.append(task)
        self.storage.set(f"user:{user_id}:tasks", history[-50:])  # 只保留最近50个
    
    def get_task_history(self, user_id, limit=10):
        """获取任务历史"""
        history = self.storage.get(f"user:{user_id}:tasks") or []
        return history[-limit:]
    
    def save_knowledge(self, key, knowledge):
        """保存知识"""
        self.storage.set(f"knowledge:{key}", knowledge)
    
    def get_knowledge(self, key):
        """获取知识"""
        return self.storage.get(f"knowledge:{key}")

长期记忆的检索

方法说明适用场景
关键词检索根据关键词查找记忆精确匹配
向量检索根据语义相似度查找模糊匹配
时间检索根据时间查找近期任务
类型检索根据类型查找用户画像、任务历史

任务进度管理

任务状态定义

状态说明示例
pending任务待执行用户提交了任务但还没开始
in_progress任务执行中正在查询航班
paused任务暂停等待用户确认
completed任务完成机票已预订成功
failed任务失败支付失败
cancelled任务取消用户取消了任务

任务进度管理实现

class TaskProgressManager:
    def __init__(self):
        self.tasks = {}
    
    def create_task(self, user_id, goal, steps):
        """创建任务"""
        task_id = f"{user_id}_{datetime.now().timestamp()}"
        task = {
            "task_id": task_id,
            "user_id": user_id,
            "goal": goal,
            "steps": steps,
            "current_step": 1,
            "status": "pending",
            "created_at": datetime.now().isoformat(),
            "updated_at": datetime.now().isoformat(),
            "results": {}
        }
        self.tasks[task_id] = task
        return task_id
    
    def update_task(self, task_id, updates):
        """更新任务状态"""
        if task_id in self.tasks:
            self.tasks[task_id].update(updates)
            self.tasks[task_id]["updated_at"] = datetime.now().isoformat()
            return True
        return False
    
    def complete_step(self, task_id, step_number, result):
        """完成一个步骤"""
        if task_id not in self.tasks:
            return False
        
        task = self.tasks[task_id]
        task["results"][step_number] = result
        task["current_step"] = step_number + 1
        
        if task["current_step"] > len(task["steps"]):
            task["status"] = "completed"
        
        task["updated_at"] = datetime.now().isoformat()
        return True
    
    def get_task(self, task_id):
        """获取任务信息"""
        return self.tasks.get(task_id)
    
    def get_user_tasks(self, user_id, status=None):
        """获取用户的任务列表"""
        user_tasks = [t for t in self.tasks.values() if t["user_id"] == user_id]
        if status:
            user_tasks = [t for t in user_tasks if t["status"] == status]
        return sorted(user_tasks, key=lambda x: x["updated_at"], reverse=True)

任务进度可视化

方式说明示例
进度条显示任务完成比例50%
步骤列表显示每个步骤的状态步骤1 ✓ 步骤2 ○ 步骤3 ○
时间线显示任务执行时间线时间轴
状态卡片显示任务当前状态执行中、已完成

中间产物管理

中间产物的类型

类型说明示例
API 响应外部 API 返回的数据航班列表
计算结果计算产生的结果价格汇总
文档内容生成或处理的文档周报文档
图片数据生成或处理的图片图表图片

中间产物存储策略

class IntermediateProductManager:
    def __init__(self, cache_backend, storage_backend):
        self.cache = cache_backend  # 短期缓存
        self.storage = storage_backend  # 长期存储
    
    def cache_result(self, key, result, ttl=300):
        """缓存中间结果"""
        self.cache.set(key, result, ttl)
    
    def get_cached_result(self, key):
        """获取缓存结果"""
        return self.cache.get(key)
    
    def persist_result(self, task_id, step, result):
        """持久化中间结果"""
        self.storage.set(f"task:{task_id}:step:{step}:result", result)
    
    def get_persisted_result(self, task_id, step):
        """获取持久化结果"""
        return self.storage.get(f"task:{task_id}:step:{step}:result")
    
    def cleanup(self, task_id):
        """清理任务的中间产物"""
        # 清理缓存
        self.cache.delete_pattern(f"task:{task_id}:*")
        # 清理持久化存储(可选)
        # self.storage.delete_pattern(f"task:{task_id}:*")

中间产物复用

策略说明适用场景
缓存复用相同请求直接使用缓存重复查询
结果共享多个任务共享结果公共数据
增量更新只更新变化的部分数据更新
版本控制保留历史版本需要回溯

状态管理的常见问题

问题1:上下文超限

表现:对话历史超过模型上下文窗口限制

解决方案

  • 实现上下文压缩
  • 使用摘要技术
  • 分层保留对话信息

问题2:记忆冲突

表现:不同对话中的信息产生冲突

解决方案

  • 添加版本控制
  • 使用时间戳标记
  • 实现冲突检测和解决

问题3:检索效率低

表现:从长期记忆中检索信息太慢

解决方案

  • 使用索引
  • 添加缓存
  • 优化数据结构

问题4:状态不一致

表现:任务状态与实际执行情况不一致

解决方案

  • 添加状态同步机制
  • 实现状态校验
  • 使用事务保证一致性

状态管理的最佳实践

状态管理架构

┌─────────────────────────────────────────────────────────┐
│                    状态管理层                            │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │
│  │ 短期上下文   │  │  长期记忆    │  │ 任务进度    │     │
│  │ Context     │  │ Long-term   │  │ Task        │     │
│  │ Manager     │  │ Memory      │  │ Progress    │     │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘     │
└─────────┼────────────────┼────────────────┼─────────────┘
          │                │                │
          ▼                ▼                ▼
┌─────────────────────────────────────────────────────────┐
│                    存储层                               │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │
│  │   内存缓存   │  │   Redis     │  │   数据库     │     │
│  │  (短期)      │  │  (中期)     │  │  (长期)     │     │
│  └─────────────┘  └─────────────┘  └─────────────┘     │
└─────────────────────────────────────────────────────────┘

状态管理流程

1. 状态初始化
   - 创建任务状态
   - 加载用户记忆
   - 初始化上下文

2. 状态更新
   - 添加对话内容到上下文
   - 保存用户偏好到长期记忆
   - 更新任务进度
   - 存储中间产物

3. 状态检索
   - 获取当前上下文
   - 查询用户历史记录
   - 读取任务进度
   - 恢复中间产物

4. 状态清理
   - 压缩过期上下文
   - 删除过期缓存
   - 清理完成任务的中间产物

评估指标

指标定义目标值
上下文命中率从上下文中找到所需信息的比例> 90%
记忆检索延迟从长期记忆中检索信息的时间< 100ms
状态一致性状态与实际情况一致的比例> 99%
存储效率有效存储占总存储的比例> 80%

项目判断清单

  • 需要多轮对话 → 实现短期上下文管理
  • 需要记住用户偏好 → 实现长期记忆
  • 需要处理长时任务 → 实现任务进度管理
  • 需要复用计算结果 → 实现中间产物管理
  • 上下文超限 → 实现上下文压缩
  • 检索效率低 → 使用索引和缓存
  • 状态不一致 → 添加状态校验
  • 需要持久化 → 使用数据库存储