场景背景
假设我们要做 Coding Agent 的一个最小能力,找到 Python 项目的入口文件。
最开始模型根据常见经验认为入口是:
app.py
如果这是固定 Workflow:
read app.py
↓
运行 app.py
↓
结束
那么第一步失败,后面就很难继续。
问题矛盾
真实项目结构并不统一。
可能是:
src/main.py
server.py
manage.py
cli.py
run.py
我们不可能把所有可能入口都硬编码。
Main Loop 的价值就在这里。
输入与前置条件
模拟项目:
project/
├── README.md
├── pyproject.toml
└── src/
└── main.py
可用 Tool:
read_file
list_files
最大步数:
10
解决过程
第一轮:
Reason:
常见 Flask 项目可能使用 app.py
Action:
read_file("app.py")
Tool 返回:
Observation:
FILE_NOT_FOUND
关键来了。
这不是任务失败。
Observation 被重新放回 messages。
第二轮模型看到:
app.py 不存在
于是:
Reason:
不能继续假设入口名,应该先看目录结构
Action:
list_files()
得到:
Observation:
["README.md", "pyproject.toml", "src/main.py"]
第三轮:
Reason:
发现 src/main.py,很可能是真实入口
Action:
read_file("src/main.py")
得到内容后,模型结束。
把这三轮连续摆出来,可以清楚看到错误并没有截断任务:FILE_NOT_FOUND 被写回后,下一轮先查看目录,再依据真实文件列表读取 src/main.py。
![图片[1]-案例分析一:从“文件不存在”到找到真实入口——Main Loop 如何让 Agent 自己改路径?-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1422.png)
这条路径的重点是“证据改变动作”。如果第一轮错误没有进入 messages,模型就缺少改道依据,很可能继续重复读取并不存在的 app.py。
输出结果
最终可以输出:
已找到项目入口:
src/main.py
调查过程:
1. 尝试读取 app.py,文件不存在
2. 查看项目文件列表
3. 发现 src/main.py
4. 成功读取并确认入口文件
复盘与迁移
这个案例真正要理解的不是“怎么找 main.py”。
而是,失败结果本身也可以推动任务前进。
只要 Tool Error 被包装成 Observation,再放回下一轮 Context,模型就有机会修正路线。
这也是为什么后面我们不会轻易让 Tool Exception 直接炸掉整个进程。
我们更希望:
错误
↓
结构化 Observation
↓
模型重新决策
这套机制可以迁移到:
- SQL 查询为空;
- API 返回 404;
- Shell 超时;
- 测试失败;
- 文件权限不足;
- 参数不合法。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















请登录后查看评论内容