Extract Agent 进化:跨会话记忆与状态延续
上一篇我们展示了 Extract Agent 如何 3 句话提取一份简历。但真实场景不是"用完即走"——昨天提取了 7 份简历,今天要继续处理剩下的 20 份。Agent 记得住吗?
本文从一个真实的批量简历提取任务出发,拆解引擎如何实现跨会话状态延续。
回顾:批量简历提取的真实场景
接到一批 27 份简历 PDF,需要统一提取为结构化 JSON。
用 Extract Agent 处理:
第一天: 上传前 7 份,设计好 Schema,创建 Session(id=246),批量提取完成,归档。
第二天: 打开新会话,想继续:
用户:用昨天的 session 继续提取剩下的 20 份简历
Agent:请问 session_id 是多少?
用户:……
Agent 失忆了。 session_id=246、batch_id=374、已处理的 7 份文件名——全部丢失。
这不是 bug,是架构缺陷。AI Agent 的会话是无状态的——每次新对话都是一张白纸。
对于单次任务这没问题,但文档提取天然是跨会话的:
- Schema 设计一次、复用多次
- 批量任务分批处理
- 提取结果需要回溯对比
引擎需要记忆。
先看效果:有记忆的 Extract Agent
加入记忆能力后,同样的场景变成了这样:
用户:继续提取剩下的简历
Agent:检测到上次操作记录——
上次操作:batch_extract — session_id=246 批量提取 7 份简历
时间:2026-02-25 17:30:00
已处理文件:杨彩.pdf、姚遥.pdf、李明.pdf …
关键 ID:session_id=246, batch_id=374
已自动复用 session_id=246,请上传剩余的简历文件。
用户不需要记任何 ID,不需要翻聊天记录。 Agent 自己知道上次做了什么、做到哪里、用的什么 Session。
记忆机制:怎么做到的?
设计约束
给引擎加记忆,方案从简单到复杂有很多选择:数据库、云端同步、向量存储。但实际约束很明确:
- 零配置 — 用户不需要装数据库、配服务,开箱即用
- 隐私优先 — 操作记录留在本地,不上传任何服务
- 轻量可靠 — 不引入额外依赖,JSON 文件即可
最终方案
在用户目录 ~/.claude/memory/ 下维护一个 JSON 文件,引擎每次关键操作后自动写入,新会话启动时自动读取。
记忆结构
一次简历批量提取后,引擎自动写入的记忆文件:
{
"skill_name": "doc-extract-engine",
"schema_version": "1.0",
"updated_at": "2026-02-25T11:29:09+08:00",
"last_operation": {
"action": "batch_extract",
"summary": "session_id=246 批量提取 7 份简历",
"timestamp": "2026-02-25T11:29:09+08:00",
"files": ["杨彩.pdf", "姚遥.pdf", "李明.pdf"]
},
"key_ids": {
"last_session_id": 246,
"last_batch_id": 374
},
"history": [...]
}
结构刻意保持扁平:
last_operation记最近一次操作key_ids存关键 IDhistory保留最近 20 条操作轨迹
没有复杂的索引、没有关系型结构——够用就好。
记忆的读写时机
引擎在两个关键节点自动操作记忆:
会话开始时:读取
Agent 被唤起后,第一件事是读取记忆文件,生成一段文本摘要注入上下文。相当于给 Agent 一张"上次工作备忘录":
## doc-extract-engine 记忆摘要
**更新时间:** 2026-02-25T11:29:09+08:00
**上次操作:** batch_extract — session_id=246 批量提取 7 份简历
**时间:** 2026-02-25T11:29:09+08:00
**文件:** 杨彩.pdf, 姚遥.pdf, 李明.pdf
**关键 ID:** last_session_id = 246, last_batch_id = 374
Agent 读到这段摘要后,就能主动告知用户上次状态,或直接复用 session_id 继续工作。
关键操作后:写入
不是每个 API 调用都写记忆——只在状态发生实质变化时记录:
| 操作 | 记录内容 |
|---|---|
| 创建 Session | session_id、Schema 信息 |
| 批量提取 | batch_id、文件列表、提取数量 |
| 对话修正 | 修正内容摘要 |
| 归档 | 归档状态确认 |
写入是自动的,不需要用户触发,也不需要 Agent 额外决策。
记忆带来的能力升级
记忆不只是"记住上次的 ID",它让引擎具备了几个之前不可能的能力。
1. Session 自动复用
这是最直接的收益。之前每次新会话都要用户提供 session_id,现在引擎自动从记忆中读取,直接复用。
对于批量任务——100 份简历分 5 天处理——用户的体验从"每天找 ID"变成"每天说一句继续"。
2. 操作轨迹可追溯
记忆文件保留最近 20 条操作历史。用户可以回溯:
- 上周提取了哪些文档?
- 用的什么 Schema?
- 修正了几轮?
这些信息之前散落在不同会话的聊天记录里,现在集中在一个文件中。
3. 上下文感知的智能决策
Agent 不再是"无状态的工具",而是一个有上下文的协作者。它能基于历史做出更合理的决策:
- 检测到上次提取未归档 → 主动提醒用户是否继续
- 检测到同类文档已有 Session → 建议复用而非新建
- 检测到上次修正了 3 轮 → 提取时主动提高精度要求
实现细节:一个 SkillMemory 类
记忆管理封装为一个 SkillMemory 类,内嵌在引擎的 scripts/ 目录中。核心 API 只有几个:
from memory import SkillMemory
mem = SkillMemory("doc-extract-engine")
# 记录操作
mem.record(
action="batch_extract",
summary="session_id=246 批量提取 7 份简历",
ids={"last_session_id": 246, "last_batch_id": 374},
files=["杨彩.pdf", "姚遥.pdf", "李明.pdf"]
)
# 读取最近一次操作
mem.get_last_operation() # {"action": "batch_extract", "summary": "...", "timestamp": "...", ...}
# 读取关键 ID
mem.get_id("last_session_id") # 246
mem.get_id("last_batch_id") # 374
# 读取最近 5 条历史
mem.get_history(5)
# 生成 AI 可读摘要
print(mem.to_prompt_summary())
文件读写参考了引擎已有的凭证管理模块(credentials.py):JSON 格式、UTF-8 编码、权限 0o600。纯标准库实现,零外部依赖。
与上一篇的架构关系
上一篇介绍了 Extract Agent 的三层架构:
- BusinessAgent(认知层)→ 理解文档语义、生成提取规则
- ExtractDevAgent(执行层)→ 编写/修改提取代码、执行测试
- Supervisor(监督层)→ 评估结果、分析趋势、决策下一步
记忆能力是对这个架构的补充,而非替代。
会话 1 会话 2
┌─────────────────┐ ┌─────────────────┐
│ 认知→执行→监督 │ │ 读取记忆 │
│ ────写入───→ │ │ 创建 Session │
└─────────────────┘ └─────────────────┘
三层架构保证每次提取的质量,记忆保证多次提取之间的连续性。两者正交,互不干扰。
更大的图景:从工具到助手
回头看 Extract Agent 的演进路径:
| 版本 | 能力 | 用户体验 |
|---|---|---|
| v1 | 单次提取 | “帮我提取这份文档” → 返回结果 |
| v1 + 修正 | 多轮对话 | “结果不对” → 自动修正 → 满意归档 |
| v1 + 记忆 | 跨会话延续 | “继续昨天的” → 自动复用上下文 → 继续提取 |
每一步都在缩短用户和结果之间的距离。
单次提取解决的是"能不能做",对话修正解决的是"做得好不好",跨会话记忆解决的是"能不能持续做"。
核心运行流程
以上面的简历提取为例,三层 Agent 的协作过程:
用户:提取简历结构化信息
↓
**BusinessAgent(认知层)**
→ 分析文档类型:招聘平台简历
→ 生成业务规则:需要提取个人信息、教育、工作、项目、技能
→ 输出 Schema 定义
↓
**ExtractDevAgent(执行层)**
→ 基于 Schema 编写提取逻辑
→ 调用提取 API,SSE 流式获取结果
→ 返回首次提取结果
↓
**Supervisor(控制层)**
→ 评估提取质量:覆盖率、准确率、完整度
→ 发现问题:工作描述缺少量化、技能未分类
→ 决策:触发修正轮次
↓
**ExtractDevAgent(执行层,修正轮)**
→ 执行 chat_correct,补充量化数据
→ 重构技能分类
→ 返回修正后结果
↓
**Supervisor(控制层)**
→ 再次评估:质量达标
→ 决策:归档
总结
从架构角度看,Extract Agent 不是简单的"用 AI 读 PDF",而是一个可监督的自动程序优化引擎。
它的核心思想:
- 业务理解结构化 — BusinessAgent 将模糊的提取需求转化为明确的 Schema 定义
- 执行过程可控 — ExtractDevAgent 在工具化沙箱中运行,文件编辑、Shell 执行、计划管理均可审计
- 质量评估独立 — Supervisor 不参与执行,只负责评估和决策,避免"既当运动员又当裁判"
作者: 虾说 发布时间: 2026-02-25
