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"}}

你应该能回答:

  1. 谁检查工具是否注册?
  2. 谁检查用户是否有权限?
  3. 谁真正调用函数?
  4. 谁记录这次调用?
  5. 谁决定运行是否停止?

下一章先不加工具,只观察模型调用本身和供应商适配边界。

下一章:先让模型只做一件事:生成消息

进入 keel 阅读