问题
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 讲自愈循环配合:失败日记是自愈的触发器与素材库