小节三:什么时候换一条路径——检查 Fallback 是否仍满足原任务

现在回到最开始的例子:

read_file("config.py")
 ↓
FileNotFoundError

Retry 没意义。

这时更适合,Fallback。

Fallback 可以理解成,当前动作失败以后,切换到另一种完成目标的方式。

切换以后还要确认语义有没有变化。实时接口失败后改读缓存,任务也许还能继续,但答案必须标明缓存时间;精确指标查不到时改用估算值,也不能再把结果描述成精确数据。Fallback 解决的是“还有没有替代路径”,不是把任何能返回数据的 Tool 都当成等价答案。

文件场景的 Fallback

原路径:

read_file("config.py")

失败:

FileNotFoundError

Fallback:

list_files()

得到:

config/config.py

再:

read_file("config/config.py")

这就是最典型的 Fallback。

把这个文件场景完整摊开以后,Fallback 的特点会非常直观:第一步失败带来了一个新事实——config.py 不存在;Agent 随后不是继续猜,而是调用 list_files 或 search_files 去获取真实环境信息,再使用新路径重新读取。

图片[1]-小节三:什么时候换一条路径——检查 Fallback 是否仍满足原任务-大赛人网

所以这里的“聪明”不在于提前知道 config/config.py,而在于利用失败 Observation 主动缩小不确定性。以后入口文件、日志位置、依赖配置找不到时,都可以沿用同样的思路。

Search Fallback

如果:

search_files("DATABASE_URL")

没有结果。

可以:

search_files("db_url")

或者先:

list_files()

看目录。

数据分析场景的 Fallback

如果:

query_by_media

结果为空。

可能:

Fallback 到更高层指标

或者:

换数据源

Fallback 不应该全写死在 Tool 内部

这点非常重要。

例如:

def read_file(path):
    try:
        ...
    except FileNotFoundError:
        自动 list_files
        自动猜路径
        自动重新读

看起来很智能。

但 Tool 职责就变复杂了。

更好的做法通常是:

Tool:
明确告诉 Agent 失败了

Agent:
基于 Goal + Error Observation
决定下一步 Fallback

因为,“找不到文件以后应该怎么办”

其实是任务层决策。

Tool 只负责,“我尝试读这个路径,结果不存在。”

这正是 Harness 分层。

Fallback 和 Retry 的区别

可以用一句话区分:

Retry:
同一个动作,再试一次

Fallback:
换一种动作继续完成目标

例如:

Retry:
query_api(params)
query_api(params)

Fallback:
read_file("config.py") 失败
→ search_files("config")

让 Agent 真正完成自主纠错

下面我们写一个完整可运行示例。

目标,读取 config.py。

真实文件却在:

config/config.py

Agent 第一次猜错。

然后自己恢复。

运行过程应该类似:

Step 1
read_file("config.py")
→ FileNotFoundError

Step 2
list_files()
→ ["config/config.py"]

Step 3
read_file("config/config.py")
→ 成功

Finish

这就是我们真正想要的自主纠错。

为什么这比“自动猜第二个路径”更 Agent?

因为恢复路径来自:

Observation

而不是一开始就写死:

如果 config.py 不存在,
一定去 config/config.py。

模型通过:

list_files

拿到真实环境信息后,再决定。

这才是动态纠错。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容