问题

Agent 调工具失败了,报错被塞进上下文,模型看了一眼继续用同样的错误参数重试——失败没有被"消化",同一个坑能踩五次。

核心模式

失败日记:失败不是噪声,是负样本经验。把每次失败结构化记录下来,重试前强制回看。

@dataclass
class FailureNote:
    action: str        # 尝试做什么
    error: str         # 错误摘要(非原文堆栈)
    cause: str         # 归因:参数错/前提不满足/环境问题/工具缺陷
    lesson: str        # 下次怎么避免

def on_tool_failure(call, error):
    note = analyze_failure(call, error)   # 小模型归因
    journal.append(note)
    # 同类失败 ≥2 次 → 熔断该策略,注入规避指令
    if count_similar(note) >= 2:
        context.inject(f"注意:{note.lesson},禁止再次 {note.action}")

归因是关键一步:参数错误该改参数,前提不满足该补前置步骤,工具缺陷该换工具——不同归因对应完全不同的恢复策略。

实战要点

  • 错误信息要做摘要再入日记,原始堆栈几百行只会污染上下文
  • 熔断阈值要按工具配置:网络抖动类错误可宽松重试,参数校验类错误一次就该停下来反思
  • 失败日记跨会话沉淀(写入第 05 讲的语义记忆),"这个 API 的分页参数是 cursor 不是 page" 这类经验值得永久保存
  • 与第 20 讲自愈循环配合:失败日记是自愈的触发器与素材库