KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
01. Agent 到底比一次模型调用多了什么? — keel 龙骨
先把场景放回现实。
先把场景放回现实。
用户问:
查询 INC-001,告诉我最可能的故障原因。
一个语言模型可以生成一段回答,也可能建议查询事件系统。但它不会因为“知道工具名称”就自动拥有数据库连接、用户租户身份或执行权限。
四个角色先分清
| 角色 | 它能做什么 | 它不能替代什么 |
|---|---|---|
| Model | 生成文本或结构化建议 | 不能自行授权或执行代码 |
| Tool | 提供一个边界清楚的能力 | 不能决定谁可以调用它 |
| Agent | 围绕目标组织多步行动 | 不等于模型本身 |
| Harness | 解析、校验、执行、记录、停止 | 不应假设模型永远正确 |
一个实用的判断是:
Model output != authorized action
Tool call != tool execution
模型只能通过协议表达“我建议下一步调用 lookup_incident”。Harness 还要检查工具是否存在、参数是否正确、当前用户是否有权访问,最后才允许执行。
Workflow 和 Agent Loop 的差别
如果程序规定“先查事件,再生成报告”,这是 workflow;如果每轮根据模型的决定选择继续查事件、询问用户或结束,这是 Agent loop。两者都可以存在于 Harness 中:代码负责边界,模型只负责被允许范围内的局部选择。
不要用“调用了大模型”作为 Agent 的定义。没有多步目标、外部能力或运行控制的模型调用,仍然只是模型调用。
Harness 是控制层
flowchart LR
U[用户目标] --> H[Harness]
H --> M[模型]
M --> D[Decision]
D --> H
H --> P[策略与状态]
P --> T[工具]
T --> H
H --> U
Harness 的核心问题不是“模型会不会思考”,而是:
- 这次运行属于谁;
- 模型看到了哪些材料;
- 模型提出了什么;
- 哪些动作被允许;
- 结果怎样回到下一轮;
- 什么条件让运行结束。
第一个观察实验
打开项目示例:
python courses/foundation/agent-harness/course/project/examples/01_chat.py
它只调用 Ollama 并打印消息。运行前先预测:它有没有 run_id?有没有工具注册表?模型服务断开时,能区分连接错误和业务错误吗?
运行后你会看到:这个程序能回答问题,但还没有形成 Harness。它没有工具、状态、停止条件和可回放事件。
把一次请求拆成责任边界
用户目标
-> Model Adapter 负责供应商调用
-> Decision Parser 负责理解输出
-> Policy 负责允许与否
-> Executor 负责动作
-> State/Event 负责记录
-> Termination 负责结束
现在不要试图实现全部组件。你只需要记住:模型是运行中的一个参与者,Harness 才是控制运行的人。
故意制造一个失败
把 OLLAMA_MODEL 改成不存在的名称,再运行示例。你得到的是模型适配错误;它与“工具不存在”“用户无权限”是不同的边界。失败分类会在后面决定重试、提示用户还是终止运行。
本章自测
如果模型返回:
{"name":"delete_incident","arguments":{"incident_id":"INC-001"}}
你应该能回答:
- 谁检查工具是否注册?
- 谁检查用户是否有权限?
- 谁真正调用函数?
- 谁记录这次调用?
- 谁决定运行是否停止?
下一章先不加工具,只观察模型调用本身和供应商适配边界。