01 · 先看清系统,再认识 Agent¶
员工问内部政策助手:“我下周去外地参加培训,住宿能报销吗?”屏幕很快出现“可以,工单也已创建”,可员工没说具体日期,工单系统里也找不到记录。要排查这次失败,光盯着聊天框还不够:需要查清谁作了判断,谁真正调用了系统,以及哪一步留下了证据。
本章沿着这个政策助手画一张系统地图,学会区分生成建议、执行动作、保存数据与确认完成。阅读前会用 Python 的函数、字典和异常,知道 JSON 与 HTTP 的大意即可;不熟悉时可以先看本章后面的补充说明。后面会逐步加入制度检索、条件澄清和咨询工单;先把各自的责任放对位置。
从五个实体拆开应用¶
模型接收当前输入,生成文字或结构化的动作意图。运行时负责组织输入、调用模型、检查动作、执行工具和控制循环,可以由应用实现,也可以部分由平台托管。工具提供有边界的能力,例如按关键词查制度或创建工单。
状态保存目标、已知条件、证据与执行进度,供后续步骤使用。环境则是系统实际交互的对象,例如文档库、工单库和用户。状态里写了“准备创建”,环境里的工单数量可能仍然是零。
本课程先看应用侧函数工具:模型提出“调用查询函数”,执行器再调用函数、取得结果,文档信息才进入系统。托管工具也可能在 API 响应返回前由供应商平台执行,具体执行者需要按接口辨认。当前工具执行位置示例
可以把这段交互想成办事窗口:模型填写办理建议,运行时核对材料并送到对应窗口,工具办理,回执说明结果。这个类比只帮助区分建议、执行和结果;应用中的几个职责可以由同一进程承担,也不必每次都有人参与。即使模型写了“工单已创建”,仍要在工单系统找到对应对象。MCP 将工具发现、调用与返回结果作为明确交互,业务是否完成则需要应用判断。工具交互参考
下表按职责梳理数据流,实际系统可能把多个职责放在同一进程里。
| 实体 | 收到什么 | 产生什么 | 出错时观察什么 |
|---|---|---|---|
| 模型 | 目标、约束、证据 | 文本或动作意图 | 缺参、误读、选错工具 |
| 运行时 | 动作意图、可信身份 | 拒绝、工具调用、状态转移 | 参数拒绝、权限拒绝、超时 |
| 工具 | 已检查的业务参数 | 结果或明确错误 | 空结果、远端失败、结果未知 |
| 状态 | 用户输入、执行观察 | 下一轮所需信息 | 过期、冲突、丢失关联 |
| 环境 | 查询或变更请求 | 可核对的真实终态 | 数据变化、版本与权限变化 |
一次完整请求如何流动¶
先推演一个不依赖真实模型的例子。员工甲有权阅读“培训差旅政策”,但助手还不知道培训日期。第一步,运行时保存问题与员工身份,把“政策问答、只读”设为动作范围。身份来自登录会话,不能采用模型自行填写的管理员 ID。
第二步,策略发现日期缺失,输出一个澄清问题。此时检索所有历史政策只会增加待筛选材料,直接回答“可以”又缺少依据。员工补充日期后,状态才从“缺条件”变为“可检索”。
第三步,检索工具返回政策片段,同时带回文档 ID、版本、生效日期和权限检查结果。第四步,系统逐项检查材料是否覆盖住宿、培训类型和出行日期;证据充分才组织答案,引用具体条款。证据不够则继续澄清或说明缺口。
第五步,任务终止并记录结果。这里的“完成”是带有效依据回答了问题;若用户另说“帮我建咨询工单”,那是新动作,需要单独检查权限及必要确认。把问答的完成条件与工单的完成条件分开,能够防止系统凭一句漂亮回复掩盖没有发生的写入。
后续章节会介绍身份服务、文档权限与模型适配器。
Workflow 与 Agent 的边界在哪里¶
如果应用始终按“提取字段→检索→生成”执行,主要路径由程序预先规定,可以称为工作流。如果模型根据中间观察动态决定继续检索、补充问题或调用其他工具,可以称为 Agent。这个区分来自一种常见架构约定;业界“Agent”用法并不唯一。Anthropic 的定义讨论
所以,不必先凑齐规划器、长期记忆和多个角色,再给系统命名。政策问答可能只需要固定流程;复杂、信息逐渐揭示的任务才可能需要动态选择。多一步选择就多一个需要验证的失败位置,应从任务需求解释它的价值。框架是否出现,不能决定你的程序是否可靠。
Python、JSON 和 HTTP 不熟,怎样补上来¶
Python 函数把工具能力封装为清楚的输入输出;字典保存结构化字段;异常表达未能正常返回;JSON 是跨边界传送数据的一种格式;HTTP 是常见的远程请求方式。JSON 文本与 Python 对象有区别:true 属于 JSON,Python 布尔值写作 True。解析成功只说明能读出结构,不证明订单属于当前用户。Python JSON 官方说明
下面的代码将 JSON 文本转换为 Python 字典:
import json
payload = '{"query": "培训住宿政策", "top_k": 2}'
arguments = json.loads(payload)
assert arguments["query"] == "培训住宿政策"
assert arguments["top_k"] == 2
print(type(arguments).__name__, arguments["top_k"])
# dict 2
远程工具还必须面对超时。“没收到响应”与“服务没有执行”不是同一回事,写操作尤其如此;有副作用的工具不能无条件重发。AWS 对超时与副作用的说明 这也是为什么先学普通函数与异常处理,通常比先背框架名称更有帮助。
动手验收¶
为这个政策助手画五个方框,用箭头标出用户问题、动作意图、工具参数、证据和最终答案。再制造三个故障:用户没给日期,检索返回旧政策,工单创建响应丢失。每个故障写清由谁发现、状态保存什么、下一步如何结束。合格标准是:模型与执行器分开,身份有可信来源,每条失败路径有可观察终态;不能只写“让模型再想想”。
自检¶
- 模型给出合法工具参数,能否证明工具已执行?
- 一个没有长期记忆的动态工具循环,是否一定不能叫 Agent?
- 创建工单超时后,可以直接宣布没有创建吗?
参考答案
- 不能。还需看到运行时的实际调用与环境结果;参数合法也不代表业务授权通过。
- 不能这样判断。先声明采用的定义,再看谁控制下一步;长期记忆不是统一必要条件。
- 不可以。可能已提交但响应丢失,应保留操作标识查询对账,说明当前结果未知。
关联复习:Q001–Q008。课程目录 · 下一章:02 大模型最小原理
配套面试练习¶
先合上正文讲一分钟,再用追问和案例检查理解。每题都可以跳回对应学习内容。