执行过程变成 可检查、可暂停、可重放 的确定性链路

核心观点:长任务 Agent 的暂停/恢复/续跑,本质是将不可靠的执行过程变成可检查、可暂停、可重放的确定性链路。可靠性与可追溯性,是实现这一功能的两大支柱。

Posted by WuQingBao on June 19, 2026

长任务 Agent 的暂停、恢复与续跑:工程实现全解

核心观点:长任务 Agent 的暂停/恢复/续跑,本质是将不可靠的执行过程变成可检查、可暂停、可重放的确定性链路。可靠性与可追溯性,是实现这一功能的两大支柱。


总览:三大核心机制

核心机制 解决什么问题 关键设计 最终目标
🗺️ 任务状态机 “任务现在在哪一步?” 定义所有可能状态及转移规则 让任务状态可追踪
📌 检查点 “断点在哪里?” 在关键节点保存执行信息 让任务可恢复
📷 上下文快照 “恢复时知道之前发生了什么吗?” 存储完整任务上下文 让任务可重放
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──────────────────────────────────────────────────────────────┐
│                  长任务 Agent 架构全景                          │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│   ┌──────────┐    ┌──────────┐    ┌──────────────────┐       │
│   │ 任务状态机 │ → │  检查点   │ → │   上下文快照       │       │
│   │ (骨架)   │    │ (记忆)  │    │ (完整上下文)     │       │
│   └────┬─────┘    └────┬─────┘    └────────┬─────────┘       │
│        │                │                    │                 │
│        └────────────────┼────────────────────┘                 │
│                         ↓                                      │
│        ┌────────────────────────────────┐                     │
│        │     暂停 / 恢复 / 续跑          │                     │
│        │     (控制层:可靠性保证)        │                     │
│        └───────────────┬────────────────┘                     │
│                        ↓                                       │
│        ┌───────────────────────────────┐                      │
│        │  幂等性 │ 上下文过期 │ 人工接管  │                      │
│        └───────────────────────────────┘                      │
│                                                                │
└──────────────────────────────────────────────────────────────┘

一、任务状态机:定义执行状态

首先需要定义清晰的任务状态机,包括所有可能的状态,每个状态都要有明确的入口条件出口条件

状态转移图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
                    ┌──────────────────────────────────────┐
                    │                                      │
                    ↓                                      │
┌──────────┐  需要用户输入  ┌────────────┐   超时/取消   ┌──────┐
│  运行中   │ ─────────────→ │  等待用户   │ ────────────→ │ 失败  │
│ RUNNING  │                │ WAITING    │               │FAILED│
└─────┬────┘                └─────┬──────┘               └──────┘
      │                           │
      │ 用户主动暂停               │ 用户提供输入
      ↓                           ↓
┌──────────┐                ┌──────────┐
│   暂停    │                │  恢复中   │
│ PAUSED   │ ─────────────→ │RESUMING  │
└─────┬────┘   用户恢复      └─────┬────┘
      │                           │
      │ 上下文过期                 │ 上下文有效
      │                           ↓
      │                     ┌──────────┐
      └───────────────────→ │  运行中   │
             重新规划         │ RUNNING  │
                            └─────┬────┘
                                  │ 任务完成
                                  ↓
                            ┌──────────┐
                            │   完成    │
                            │COMPLETED │
                            └──────────┘

状态详解表

状态 入口条件 出口条件 可转移至
🟢 运行中 RUNNING 任务启动 / 恢复成功 需用户输入 / 被暂停 / 出错 / 完成 WAITING, PAUSED, FAILED, COMPLETED
🟡 等待用户 WAITING Agent 需要用户输入 用户提供输入 / 超时 RESUMING, FAILED
🔵 暂停 PAUSED 用户主动暂停 / 系统暂停 用户恢复 / 上下文过期 RESUMING, FAILED
🟣 恢复中 RESUMING 从 PAUSED 恢复 校验完成 RUNNING(继续)/ RUNNING(重规划)
🔴 失败 FAILED 不可恢复错误 / 超时 用户重试 / 放弃 RUNNING(重试)/ 终态
完成 COMPLETED 所有步骤成功执行 终态

二、检查点:保存关键执行信息

在任务执行的关键步骤后,需要保存检查点(Checkpoint)。检查点是任务恢复的”存档点”。

检查点数据结构

1
2
3
4
5
6
7
8
9
10
11
12
┌──────────────────────────────────────────────────────────────┐
│                    📌 检查点(Checkpoint)                     │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  📋 当前计划(Plan)          当前正在执行的整体计划            │
│  📥 输入(Input)             本步骤的输入数据                 │
│  📤 输出(Output)            本步骤的执行结果                 │
│  🔧 工具结果(Tool Results)  调用了哪些工具,返回了什么         │
│  👉 执行指针(Next Step)     下一步应该执行什么                │
│  ⏰ 时间戳(Timestamp)       检查点保存的时间                 │
│                                                                │
└──────────────────────────────────────────────────────────────┘

检查点示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  “checkpoint_id”: “ckpt_20260619_001,
  “task_id”: “task_research_001,
  “status”: “PAUSED”,
  “current_plan”: “生成竞品分析报告”,
  “completed_steps”: [
    {“step”: 1, “name”: “收集竞品数据”, “result”: “saved_to_file://data.json”},
    {“step”: 2, “name”: “数据清洗与分类”, “result”: “saved_to_file://clean.json”}
  ],
  “next_step”: {
    “step”: 3,
    “name”: “生成分析报告”,
    “input”: “file://clean.json”
  },
  “tool_results”: {
    “web_search”: [“result_1, “result_2],
    “file_write”: [“data.json”, “clean.json”]
  },
  “timestamp”: 2026-06-19T10:30:00Z”
}

检查点保存策略对比

策略 描述 优点 缺点 适用场景
📸 全量快照 每步保存完整状态 恢复简单,数据完整 存储开销大 短任务、状态小
📝 增量日志 只保存变化部分 存储高效 恢复需重放日志 长任务、状态大
🎯 混合模式 定期全量 + 步间增量 兼顾效率与恢复速度 实现复杂 生产级长任务
🤖 语义检查点 Agent 自主判断何时保存 灵活,只保存关键节点 依赖 Agent 判断力 智能体任务

三、上下文快照:存储完整上下文

除了聊天记录,还需要存储更广泛的上下文信息,使 Agent 在恢复时能”理解”之前发生了什么。

上下文快照五要素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──────────────────────────────────────────────────────────────┐
│                   📷 上下文快照(Context Snapshot)             │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  🎯 目标(Goal)            任务要达成什么                    │
│     └─ 例:生成一份 2026 年 AI Agent 市场竞品分析报告          │
│                                                                │
│  ⛓️ 约束(Constraints)     有哪些限制条件                    │
│     └─ 例:预算 10 万、只关注中国市场、用中文输出              │
│                                                                │
│  📊 证据(Evidence)        收集到了哪些数据/事实             │
│     └─ 例:10 家竞品数据、3 份行业报告、5 个用户访谈          │
│                                                                │
│  🧠 决策(Decisions)       做过哪些关键决定及原因            │
│     └─ 例:选择 A 策略而非 B,因为用户更看重成本              │
│                                                                │
│  ⏳ 未完成动作(Pending)   还有哪些动作没做完                │
│     └─ 例:等待用户确认报告大纲、第 4 章未写                  │
│                                                                │
└──────────────────────────────────────────────────────────────┘

上下文快照示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  “task_id”: “task_research_001,
  “goal”: “生成 AI Agent 市场竞品分析报告”,
  “constraints”: [“预算10万”, “中国市场”, “中文输出”],
  “evidence_collected”: [
    {“type”: “web_data”, “source”: “竞品A官网”, “saved_at”: 2026-06-18},
    {“type”: “report”, “source”: “艾瑞咨询2026, “saved_at”: 2026-06-18}
  ],
  “decisions_made”: [
    {“decision”: “使用直接抓取而非API”, “reason”: “数据时效性更好”},
    {“decision”: “选择价格优先策略”, “reason”: “用户明确更关注成本”}
  ],
  “pending_actions”: [
    {“action”: “用户确认报告大纲”, “status”: “WAITING”},
    {“action”: “完成第4章撰写”, “status”: “NOT_STARTED”}
  ],
  “execution_pointer”: “step_3_generate_report”
}

四、暂停与恢复:处理任务中断

暂停与恢复是 Agent 系统最关键的两个操作,也是最容易出问题的地方。

暂停流程(4 步)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──────────────────────────────────────────────────────────────┐
│                    ⏸️ 暂停流程                                 │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  Step 1:停止接受新任务                                        │
│  └─ 不再接受新的工具调用请求                                  │
│                                                                │
│  Step 2:处理进行中的动作                                      │
│  └─ 正在执行的动作 → 标记为”可恢复”或”待确认”               │
│  └─ 等待中的动作 → 标记为”未执行”                            │
│                                                                │
│  Step 3:保存状态                                              │
│  └─ 写入检查点(Checkpoint)                                  │
│  └─ 写入上下文快照(Context Snapshot)                        │
│                                                                │
│  Step 4:安全终止                                              │
│  └─ 释放资源,但不销毁状态                                    │
│                                                                │
│  ⚠️ 核心原则:暂停 ≠ 杀死进程                                │
│  ⚠️ 暂停 = 保存进度 + 安全停止                               │
│                                                                │
└──────────────────────────────────────────────────────────────┘

恢复流程(5 步)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──────────────────────────────────────────────────────────────┐
│                    ▶️ 恢复流程                                  │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  Step 1:读取检查点                                            │
│  └─ 加载最新的 Checkpoint 数据                                │
│                                                                │
│  Step 2:恢复上下文                                            │
│  └─ 加载 Context Snapshot,重建任务认知                       │
│                                                                │
│  Step 3:校验外部世界状态  ⚡ 关键步骤                        │
│  └─ 文件是否被修改?                                          │
│  └─ 数据库记录是否变化?                                      │
│  └─ 相关 API 返回是否不同?                                   │
│  └─ 用户输入是否已改变?                                      │
│                                                                │
│  Step 4:决策                                                  │
│  └─ 校验通过 → 继续执行(续跑)                               │
│  └─ 校验失败 → 进入重规划                                     │
│                                                                │
│  Step 5:通知用户                                              │
│  └─ 展示恢复状态 + 差异摘要(如有)                           │
│                                                                │
└──────────────────────────────────────────────────────────────┘

暂停 vs 恢复对比表

维度 暂停(Pause) 恢复(Resume)
核心动作 保存状态 读取状态 + 校验
关键风险 状态丢失 上下文过期
必须做的事 写检查点 + 快照 校验外部世界状态
失败后果 任务进度丢失 执行错误操作
用户感知 “任务已暂停” “任务已恢复/需重新规划”

五、续跑:保证结果一致

续跑(Rerun)是恢复后最关键的一环——如何保证再次执行的结果与第一次一致?

三大核心保障

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
┌──────────────────────────────────────────────────────────────┐
│                    🔄 续跑三大保障                              │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  1️⃣ 幂等性(Idempotency)                                    │
│  ┌────────────────────────────────────────────────────┐      │
│  │  问题:恢复后重新执行,是否会重复操作?              │      │
│  │  方案:幂等 Key + 执行记录                          │      │
│  │  适用范围:发邮件、写库、付款等有副作用的动作        │      │
│  │                                                    │      │
│  │  公式:同一操作 + 同一幂等Key = 相同结果             │      │
│  │  例:付款操作(idempotency_key: “pay_order_123”)     │      │
│  └────────────────────────────────────────────────────┘      │
│                                                                │
│  2️⃣ 上下文过期检测(Context Expiration)                      │
│  ┌────────────────────────────────────────────────────┐      │
│  │  问题:暂停期间,外部数据是否已变?                  │      │
│  │  方案:恢复时对比检查点时的快照与当前状态            │      │
│  │  处理:过期 → 停止执行 → 重新规划 → 用户确认        │      │
│  └────────────────────────────────────────────────────┘      │
│                                                                │
│  3️⃣ 人工接管(Human-in-the-loop)                             │
│  ┌────────────────────────────────────────────────────┐      │
│  │  问题:任务卡住了,用户能做什么?                    │      │
│  │  方案:暴露进度、证据、下一步建议                    │      │
│  │  原则:任务执行不是黑盒,用户随时可见可干预          │      │
│  └────────────────────────────────────────────────────┘      │
│                                                                │
└──────────────────────────────────────────────────────────────┘

幂等性实现方式

操作类型 幂等策略 示例
数据库写入 UPSERT(存在则更新,不存在则插入) INSERT ... ON CONFLICT UPDATE
发送邮件 幂等 Key 去重 邮件头带 X-Idempotency-Key
支付操作 唯一交易 ID payment_ref: task_001_step_3
文件写入 覆盖写(同内容幂等) 写入同一文件路径
API 调用 重试安全标记 请求头 X-Request-Id

上下文过期处理决策树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
                    恢复任务
                       │
                       ↓
              ┌────────────────┐
              │ 外部数据是否变化?│
              └───────┬────────┘
                      │
              ┌───────┴───────┐
              │               │
             否              是
              │               │
              ↓               ↓
         继续执行      ┌──────────────┐
                      │ 变化是否影响  │
                      │ 后续执行?    │
                      └──────┬───────┘
                             │
                     ┌───────┴───────┐
                     │               │
                    否              是
                     │               │
                     ↓               ↓
                继续执行       ┌────────────┐
                              │ 重新规划    │
                              │ 展示差异    │
                              │ 用户确认?  │
                              └─────┬──────┘
                                    │
                            ┌───────┴───────┐
                            │               │
                           确认            拒绝
                            │               │
                            ↓               ↓
                        按新计划执行      终止任务

六、现实案例:正在发生的工程实践

案例一:AI 编程助手的长任务续跑(Claude Code / Cursor)

背景:用户使用 Claude Code 执行一个大型代码重构任务,涉及 50+ 文件的修改。任务中途用户关闭终端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
📋 任务:将项目中所有 REST API 迁移到 GraphQL

执行进度:
  ✅ Step 1-3:分析代码结构、生成 GraphQL Schema
  ✅ Step 4:重构用户模块(15个文件)
  ⏳ Step 5:重构订单模块(正在执行,修改了 8/20 个文件)
  ⬜ Step 6-8:支付模块、通知模块、集成测试

⏸️ 用户在 Step 5 中途关闭终端

恢复过程:
  1. 读取检查点 → 知道正在修改订单模块的第 8 个文件
  2. 校验外部状态 → 检查已修改的 8 个文件是否被其他操作改动
  3. 检查 Git 状态 → 确认没有其他人的 push 冲突
  4. 使用幂等 Key → 已写入的文件不重复修改
  5. 从第 9 个文件继续 → 无缝续跑

关键技术点

  • 每个文件修改都有唯一操作 ID,保证幂等性
  • Git commit 作为天然检查点
  • 文件 hash 校验外部状态是否变化

案例二:LangGraph 中的对话状态持久化

背景:LangGraph 是目前最流行的 Agent 框架之一,原生支持 Checkpoint 机制实现暂停/恢复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──────────────────────────────────────────────────────────────┐
│                LangGraph Checkpoint 机制                      │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  Thread 1: 数据分析任务                                       │
│  ├── Checkpoint A: 用户输入 “分析销售数据”                    │
│  ├── Checkpoint B: Agent 调用 read_csv 工具                   │
│  ├── Checkpoint C: Agent 生成图表  ← 此处暂停                │
│  ├── Checkpoint D: (等待恢复...)                              │
│  └── Checkpoint E: Agent 输出分析结论                         │
│                                                                │
│  每个 Checkpoint 包含:                                       │
│  • channel_values: 当前通道状态                               │
│  • versions: 各通道版本号                                     │
│  • metadata: 来源、步骤数、时间戳                             │
│  • parent_config: 父检查点配置(形成链表)                    │
│                                                                │
│  存储后端支持:                                                │
│  • MemorySaver(内存,用于开发测试)                          │
│  • SqliteSaver / PostgresSaver(持久化,用于生产)            │
│                                                                │
└──────────────────────────────────────────────────────────────┘
特性 LangGraph 实现 通用设计
检查点存储 Channel-based 状态快照 可插拔存储后端
恢复策略 从最近 Checkpoint 重放 校验后继续或重规划
人工接管 interrupt_before / interrupt_after 配置 关键步骤前/后自动暂停
上下文管理 State Schema 定义 + 版本控制 类型化 + 版本化

案例三:AI 数据分析 Agent 的上下文过期处理

背景:某电商平台的数据分析 Agent 正在执行每日竞品监控任务,执行期间竞争对手突然降价。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
📋 任务:每日竞品价格监控与分析

⏰ 2026-06-18 22:00  开始执行
  ✅ 步骤1:抓取竞品A价格 → 均价 ¥299
  ✅ 步骤2:抓取竞品B价格 → 均价 ¥319
  ⏸️ 步骤3:暂停(等待人工确认异常数据)

⏰ 2026-06-19 09:00  恢复执行
  📷 重新校验 → 发现竞品A凌晨降价至 ¥199!

┌─────────────────────────────────────────────────┐
│  ⚠️ 上下文过期检测                               │
│                                                  │
│  检查点时:竞品A价格 = ¥299                      │
│  恢复时:竞品A价格 = ¥199(降幅 33%)            │
│                                                  │
│  → 上下文已过期!                                │
│  → 原分析结论(”我方价格有竞争力”)可能失效      │
│  → 自动停止续跑,触发重新规划                    │
│  → 通知用户:发现重大价格变化,建议重新分析      │
└─────────────────────────────────────────────────┘

案例四:不同框架的暂停/恢复方案对比

Agent 框架 暂停机制 恢复机制 幂等性保障 人工接管
LangGraph interrupt_before/after Checkpoint 重放 State 版本控制 内置 human-in-the-loop
OpenAI Assistants requires_action 状态 submit_tool_outputs Run ID 去重 工具确认机制
AutoGen 对话历史持久化 历史重放 + 继续 消息 ID 去重 用户代理模式
CrewAI 任务状态枚举 状态恢复 回调函数控制 流程控制器
自研 Agent 自建状态机 自建 Checkpoint 自建幂等层 自建 UI

七、高级思考问答:全文总结

Q1:为什么长任务 Agent 必须设计检查点?没有检查点会怎样?

A:没有检查点,就像写论文不保存——一次意外就回到原点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──────────────────────────────────────────────────────────────┐
│                                                                │
│  没有检查点:                                                  │
│  ┌────────────────────────────────────────┐                  │
│  │  开始 ──────────────────── 中断 ──→ 💥 全部丢失          │
│  │  (2小时的工作白费)                    必须从头开始        │
│  └────────────────────────────────────────┘                  │
│                                                                │
│  有检查点:                                                    │
│  ┌────────────────────────────────────────┐                  │
│  │  开始 ──📌──📌──📌── 中断 ──→ 📌 从最近检查点恢复        │
│  │        cp1  cp2  cp3          cp3      最多丢失1步进度    │
│  └────────────────────────────────────────┘                  │
│                                                                │
│  更深层的价值:                                                │
│  • 可观测性:用户随时知道任务在哪一步                         │
│  • 可追溯性:出问题时可以回溯到任意检查点                     │
│  • 可调试性:开发者可以”时光倒流”排查问题                    │
│                                                                │
└──────────────────────────────────────────────────────────────┘
维度 没有检查点 有检查点
中断恢复 从头开始 从最近检查点恢复
进度可见 黑盒 白盒
错误排查 无法定位 可回溯到问题步骤
用户体验 不可接受的等待 可暂停可恢复
系统可靠性 单点故障 容错恢复

Q2:检查点应该保存多频繁?如何平衡性能与可靠性?

A:这是一个工程权衡问题,没有标准答案——但有最佳策略。

策略 检查点频率 可靠性 性能开销 适用场景
每步保存 100% 🟢 最高 🔴 高 关键任务(金融、医疗)
关键节点保存 60-80% 🟡 中等 🟢 低 一般分析任务
语义保存(Agent 自主判断) 动态 🟢 较高 🟡 中等 智能体任务
混合策略(定期全量 + 增量) 灵活 🟢 高 🟢 较低 生产级系统

最佳实践

  1. 副作用操作前必存——发邮件、写库、付款之前必须保存检查点
  2. Agent 自主标记——让 LLM 判断”这一步很重要,我应该保存”
  3. 增量保存——只存变化部分,而非完整状态
  4. 异步写入——检查点保存不阻塞主任务执行

Q3:如何保证”续跑”的结果与第一次一致?幂等性的终极挑战是什么?

A:幂等性的本质问题是——你无法区分”第一次执行”和”第一次成功恢复后的重试”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌──────────────────────────────────────────────────────────────┐
│                    幂等性的三个层次                             │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  Level 1:操作幂等                                             │
│  └─ 同一操作执行多次,结果相同                                │
│  └─ 例:设置温度为 25°C(设置 10 次还是 25°C)               │
│                                                                │
│  Level 2:任务幂等                                             │
│  └─ 同一任务重新跑一遍,最终产出相同                          │
│  └─ 例:生成报告(内容基于相同输入数据)                      │
│                                                                │
│  Level 3:系统幂等  ← 终极挑战                                │
│  └─ 即使外部世界变化,任务也能正确完成                        │
│  └─ 例:付款任务中途汇率变了,系统能感知并处理               │
│                                                                │
│  终极挑战:                                                    │
│  ┌──────────────────────────────────────────────┐            │
│  │  • 副作用操作的幂等性(付款、发消息)          │            │
│  │  • 时序依赖(操作 A 的结果影响操作 B)         │            │
│  │  • 外部系统不一致(部分成功、部分失败)        │            │
│  │  • 并发问题(两个恢复请求同时到达)            │            │
│  └──────────────────────────────────────────────┘            │
│                                                                │
└──────────────────────────────────────────────────────────────┘
难点 问题 解决方案
副作用操作 发邮件后恢复,是否重发? 幂等 Key + 执行记录
时序依赖 Step B 依赖 Step A 的结果,但 Step A 结果可能变了 依赖图 + 级联失效检测
外部不一致 写了数据库但缓存没更新 分布式事务 / Saga 模式
并发恢复 两个进程同时恢复同一任务 分布式锁 / 单实例保证

Q4:什么时候应该让 Agent 自动续跑?什么时候必须等人工确认?

A:这本质上是一个”自主权边界”问题——Agent 的权力应该有多大?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──────────────────────────────────────────────────────────────┐
│                自主权决策矩阵                                  │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│           低风险                         高风险                │
│        ┌─────────────────┬─────────────────┐                │
│ 可逆   │  ✅ 自动续跑     │  🟡 自动+记录    │                │
│        │  (读文件、查询) │  (写文件、更新) │                │
│        ├─────────────────┼─────────────────┤                │
│ 不可逆 │  🟡 自动+通知    │  🔴 必须人工确认  │                │
│        │  (内部计算)     │  (付款、删除、  │                │
│        │                  │   发送、发布)    │                │
│        └─────────────────┴─────────────────┘                │
│                                                                │
│  额外规则:                                                    │
│  • 上下文过期 → 无论如何都必须人工确认                         │
│  • 任务已执行超过 N 步 → 阶段性人工确认                       │
│  • 成本超过阈值 → 暂停等待预算确认                             │
│                                                                │
└──────────────────────────────────────────────────────────────┘
操作类别 示例 策略 理由
只读操作 读文件、查询数据库 自动续跑 无副作用,零风险
可逆写入 创建文件、更新记录 自动 + 日志 可回滚
不可逆操作 发邮件、付款、删除 必须人工确认 无法撤回
上下文过期 数据已变、需求已变 重新规划 + 确认 盲目续跑可能产生错误结果

Q5:人工接管的”最佳界面”应该长什么样?

A:用户不需要看到 Agent 的每一行日志——他们需要看到”决策点”和”证据”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌──────────────────────────────────────────────────────────────┐
│            🖥️ Agent 任务控制台(理想设计)                     │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  📊 任务健康度:🟢 正常 / 🟡 需关注 / 🔴 需干预              │
│                                                                │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 75%                        │
│  ✅ Step 1-6 完成  ⏳ Step 7 执行中  ⬜ Step 8-10 待执行      │
│                                                                │
│  ──── 当前步骤 ────                                            │
│  📝 “正在生成第 3 章分析报告”                                  │
│  📊 已完成:数据收集 → 清洗 → 统计 → ⏳ 撰写报告              │
│                                                                │
│  ──── 需要你的决定 ────  ⚠️                                   │
│  ❓ “竞品A刚降价33%,是否调整分析策略?”                       │
│     [查看证据]  [继续原计划]  [重新规划]  [暂停任务]          │
│                                                                │
│  ──── 已完成决策记录 ────                                      │
│  ✅ 决策1:选择直接抓取(你确认于 10:15)                      │
│  ✅ 决策2:纳入竞品C(你确认于 10:20)                         │
│                                                                │
│  ──── 预计剩余 ────                                            │
│  ⏰ 约 15 分钟 | 💰 已消耗预算 40%                           │
│                                                                │
└──────────────────────────────────────────────────────────────┘

设计原则

原则 描述 反模式
分层展示 概要 → 详情 → 原始日志 一次性展示所有信息
决策优先 突出需要用户决定的事项 淹没在技术细节中
证据驱动 每个建议附带证据和推理 只给结论不给理由
进度可视化 完成度 + 里程碑 + 预估 只显示”运行中”
可干预性 随时暂停/修改/终止 启动后无法干预

Q6:长任务 Agent 的”终极架构”是什么?

A:将所有机制统一为一个模型——Agent 就是一个”可暂停的计算”,本质上是人类工作流的数字化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
┌──────────────────────────────────────────────────────────────┐
│                长任务 Agent 终极架构                            │
├──────────────────────────────────────────────────────────────┤
│                                                                │
│  ┌──────────────────────────────────────────────────────┐    │
│  │  Layer 5: 人机交互层(Human-Agent Interface)         │    │
│  │  └─ 进度可视化 · 决策请求 · 人工接管                  │    │
│  ├──────────────────────────────────────────────────────┤    │
│  │  Layer 4: 安全与治理层(Safety & Governance)         │    │
│  │  └─ 幂等性 · 权限控制 · 成本控制 · 审计日志          │    │
│  ├──────────────────────────────────────────────────────┤    │
│  │  Layer 3: 恢复策略层(Recovery Strategy)             │    │
│  │  └─ 上下文过期检测 · 重规划引擎 · 级联回滚           │    │
│  ├──────────────────────────────────────────────────────┤    │
│  │  Layer 2: 状态管理层(State Management)              │    │
│  │  └─ 检查点 · 上下文快照 · 版本控制                  │    │
│  ├──────────────────────────────────────────────────────┤    │
│  │  Layer 1: 执行引擎层(Execution Engine)              │    │
│  │  └─ 任务状态机 · 工具调用 · 结果收集                │    │
│  └──────────────────────────────────────────────────────┘    │
│                                                                │
│  核心洞察:                                                    │
│  ┌────────────────────────────────────────────────────┐      │
│  │                                                    │      │
│  │  状态机 = 骨架(定义可能的状态)                    │      │
│  │  检查点 = 记忆(记住执行到哪里)                    │      │
│  │  快照 = 理解(记住为什么这么做)                    │      │
│  │  恢复 = 智慧(判断能否继续)                        │      │
│  │  幂等 = 纪律(防止重复犯错)                        │      │
│  │  人工 = 兜底(最后一道防线)                        │      │
│  │                                                    │      │
│  │  → 六者合一 = 可靠的可恢复 Agent 系统              │      │
│  │                                                    │      │
│  └────────────────────────────────────────────────────┘      │
│                                                                │
└──────────────────────────────────────────────────────────────┘

全文逻辑总图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
┌─────────────────────────────────────────────────────────────────────┐
│                  长任务 Agent 暂停/恢复/续跑 全景                      │
├─────────────────────────────────────────────────────────────────────┤
│                                                                       │
│  问题是什么?                                                         │
│  └─ 长任务中断 → 状态丢失 / 重复执行 / 黑盒等待                     │
│                                                                       │
│  如何定义状态?                                                       │
│  └─ 任务状态机 → 6种状态 + 明确转移规则                              │
│                                                                       │
│  如何保存进度?                                                       │
│  ├─ 检查点 → 执行指针 + 工具结果 + 计划                              │
│  └─ 上下文快照 → 目标 + 约束 + 证据 + 决策 + 未完成动作              │
│                                                                       │
│  如何处理中断?                                                       │
│  ├─ 暂停 → 停止新调用 + 标记进行中 + 保存状态                        │
│  └─ 恢复 → 读取检查点 + 校验外部状态 + 决策(继续 or 重规划)        │
│                                                                       │
│  如何保证一致?                                                       │
│  ├─ 幂等性 → 幂等 Key + 执行记录(防止重复)                        │
│  ├─ 上下文过期 → 快照对比(防止过期执行)                            │
│  └─ 人工接管 → 进度可见 + 决策可干预(防止黑盒)                     │
│                                                                       │
│  工程启示?                                                           │
│  └─ 可靠性 = 状态机 + 检查点 + 快照                                  │
│  └─ 安全性 = 幂等 + 过期检测 + 人工兜底                              │
│  └─ 可追溯 = 完整执行日志 + 决策记录                                 │
│                                                                       │
└─────────────────────────────────────────────────────────────────────┘
核心概念 一句话总结 关键设计 失败后果
任务状态机 定义任务”在哪里” 6 种状态 + 转移规则 状态混乱,无法追踪
检查点 保存”做了什么” 计划 + 输入 + 输出 + 指针 中断后无法恢复
上下文快照 保存”为什么这么做” 目标 + 约束 + 证据 + 决策 恢复后不理解上下文
暂停 优雅地”停下来” 停止调用 + 标记 + 保存 状态丢失/不一致
恢复 安全地”继续走” 读取 + 校验 + 决策 基于过期信息执行
幂等性 防止”重复做” 幂等 Key + 执行记录 重复付款/发邮件
上下文过期 发现”世界变了” 快照对比 + 重新规划 错误决策
人工接管 让人”看得见” 进度 + 证据 + 建议 黑盒运行,失去信任