未命名文章

作者:CherryYang 发布时间: 2026-10-23 阅读量:3 评论数:0

8.7 子 Agent 结果必须包含证据引用和可恢复轨迹

任务描述需要自包含:已知事实、已排除路径、允许工具、执行约束、预期输出都要明确。结果建议至少包含:

task_id: search-memory-leak-042
status: completed
result:
  suspect: CacheManager::release()
  verification: incomplete
supporting_evidence:
  - evidence_id: E042
    location: src/cache/manager.cpp
rejected_paths:
  - normal_ref_counting_path
open_questions:
  - 并发取消条件下是否释放资源
trace_ref: child-run-042

这个结果的价值在于:主 Agent 不需要加载完整调查历史,就可以依据证据引用继续验证。如果新测试推翻了原结论,则按 trace_ref 找回相关阶段,并对受影响的结论重新检查。

8.8 进程崩溃与外部副作用:恢复不能仅靠上下文

假设主 Agent 在第 87 轮调用 GitHub 创建 PR。PR 创建成功后,进程在写入成功事件之前崩溃。恢复时若简单重放最后一条工具调用,就可能再创建一份 PR。

TRACE 因此应为具有外部副作用的工具维护以下状态:prepared → executing → observed → committed,并为操作绑定 operation_id。恢复时先读取 Checkpoint 和 Event Log,再查询工具侧的实际完成状态;若支持幂等键则据此安全重试;若无法确认是否执行,则暂停核对,不盲目重放。

FIGURE 12 · DURABLE TOOL EXECUTION / CRASH RECOVERY
PREPARED
记录意图
operation_id
EXECUTING
发起工具调用
幂等键(若支持)
OBSERVED
保存返回结果
外部 PR 编号
COMMITTED
提交完成事件
更新任务快照
崩溃发生在 EXECUTING 与 COMMITTED 之间?
核实已执行
补写结果事件,不重复执行。
状态未知
安全查询 / 幂等重试;无法确认则暂停。

推理回溯与执行回滚必须区分:重新进入某个历史决策节点,并不自动撤销已经发生在外部世界的操作。

8.9 每轮运行的完整闭环

把上面的模块合在一起,TRACE 每轮可以按这个顺序运行:

# 简化伪代码:展示状态依赖和提交顺序

def agent_step(task_id, user_input):
    state = task_store.load_snapshot_and_events(task_id)
    required = select_mandatory_state(state, user_input)
    candidates = retrieve_history(state, user_input)
    context = assemble_with_budget(required, candidates, state.recent)

    proposal = llm.decide(context)           # 模型提出行动
    validate_tool_permissions(proposal)

    intent = event_store.prepare(proposal)   # 执行前登记
    result = execute_with_recovery(intent)
    artifact = artifact_store.put_verified(result.raw)
    observation = extract_observation(result, artifact)
    event_store.commit(observation)

    invalidate_affected_decisions(observation)

    if should_compact(task_id):
        candidate = build_snapshot(task_id)
        if validate_snapshot(candidate):
            checkpoint_and_start_new_epoch(candidate)
        else:
            apply_safe_fallback_or_pause(task_id)

这段代码主要用于表达执行顺序。真实系统还需要处理并发、持久化事务边界、模型 API 协议、取消操作、工具超时、权限和版本冲突。

8.10 如何验证 TRACE 真正有效?

设计完整不代表性能更好。TRACE 引入事件日志、依赖图、证据检索和恢复协议,都会增加实际成本。因此需要建立至少五组基线:完整历史、滑动窗口、普通摘要、任务感知摘要、任务感知摘要加外部证据存储,再与完整 TRACE 比较。

建议使用一个可控的 100–200 轮故障诊断任务:早期证据支持排除 H1,后期注入新的 E087,使 H1 的原始排除前提不再充分,要求 Agent 在不重复全部调查的前提下重新判断。测量:

维度指标想回答的问题
任务质量Task Success Rate、证据支持率压缩后还能否正确完成任务?
历史恢复关键证据召回率、失效决策检测率能否及时找到足以挑战旧结论的新证据?
重复成本重复工具调用率、无效回溯次数决策轨迹是否减少了反复走老路?
缓存效率实际 Prefix Cache 命中、Prefill Token 数Epoch 是否真的减少计算?
端到端成本总 Token、TTFT、总延迟、存储检索开销新系统的综合收益是否为正?
恢复可靠性中断恢复成功率、重复副作用次数崩溃后能否安全继续任务?

还需要做消融实验:逐一移除决策依赖图、历史检索、子 Agent 轨迹、Epoch 机制和压缩校验,以确认每个组件分别贡献了什么。不能把原书实验 2-10 的性能数字当作 TRACE 的实验数据。


9. 结语:把上下文设计为可重建的工作视图

回看我们讨论的问题,答案逐渐清晰了。

Agent 的上下文应该优先保留影响当前决策的事实、约束和活跃假设。失败分支、历史证据和原始工具输出可以脱离当前窗口保存,但必须提供稳定、可验证的引用。当新证据挑战历史结论时,系统应当能够重新加载有关信息,并对受到影响的决策进行选择性复核。

KV Cache 则在另一层发挥作用:静态前缀尽量稳定,在一个 Context Epoch 中以追加为主,达到合适条件后允许受控地压缩与重建。这是对缓存效率、信息完整性和任务正确性的工程权衡。

最终形成的是三种状态的分工:

  • Execution State:已执行什么、外部副作用是否完成、如何恢复。
  • Decision State:为什么作出这个判断、依赖什么证据、何时需要重新评估。
  • Inference State:当前 LLM Context 与暂时驻留的 KV Cache。

对于短任务,简单摘要可能已经足够;对于持续百轮、证据复杂且要求可恢复的 Agent,状态管理会逐渐成为比截断 Token 更重要的基础设施。

TRACE 的价值目前是一种可检验的架构假设:让推理上下文可以丢弃和重建,让重要的任务状态和决策证据具备可靠的持久性。要证明它成立,仍需要在真实长任务中测量正确率、重复调查、缓存命中、恢复成功率和综合成本。

参考资料

  1. 李博杰,《深入理解 AI Agent》,第 2 章「上下文工程」,特别是 2.7「上下文压缩策略」。本文关于六类压缩策略及实验 2-10 的数据取自此处。
  2. Packer et al., MemGPT: Towards LLMs as Operating Systems, 2023。用于理解分层上下文与外部记忆。
  3. Liu et al., Lost in the Middle: How Language Models Use Long Contexts。用于理解长上下文中信息位置对使用效果的影响。
  4. vLLM Automatic Prefix Caching。用于了解基于前缀块哈希的 KV Cache 复用约束。
  5. LangGraph Durable Execution。用于理解检查点、执行重放与副作用恢复。

评论