切换深色模式
模型接口:让不确定输出进入确定程序
对应 CS329Z · 2026-09-28 · LLMs for Builders。日期为校方课表日期,可能调整。核对官方课表。
资料状态
核对日期:2026-09-19。对应课程尚未开课;本文是基于公开课纲与文中原始资料的原创预习技术解读,不是课堂实录、讲义翻译或官方作业答案。本文于 2026-09-20 深度修订。示例为原创教学设计;离线实验与真实模型实验的边界分别说明,不以推演冒充模型实测。
上一讲把模型定位为动作与结论的提议者。现在出现一个接口问题:模型输出“再查一下数据库恢复”,程序究竟应该搜索、读取文件,还是向用户追问?自然语言可以表达意图,却不足以支撑稳定的状态迁移。
本讲沿研究助手的一次模型调用,建立从响应字节到业务动作的完整边界。目标不是追求永远合法的 JSON,而是让任何异常都落到正确的恢复路径。
先设计决策空间,再写提示词
研究阶段只需要三种决策:调用只读工具、提交候选答案、请求缺失的用户信息。下面是原创类型示意:
typescript
type Decision =
| { kind: 'tool'; name: 'search' | 'read'; args: unknown }
| { kind: 'answer'; claims: Claim[]; unresolved: string[] }
| { kind: 'clarify'; question: string }分支越少,宿主越容易检查完整性。工具参数的 unknown 刻意保留在适配器边界,直到专属校验器确认字段、类型和范围。不能通过类型断言把外部 JSON 直接“变成可信对象”。
候选答案也不直接交给用户。它先经过主张与证据检查,验收失败时返回结构化缺口。模型接口与交付接口是两个不同边界。
四层校验解决四类问题
首先检查传输与生成是否完整:超时、连接中断、长度截断都可能导致不完整响应。随后解析结构,检查允许的分支和字段。再检查语义,例如引用 ID 是否存在、查询是否非空。最后检查权限与任务版本。
| 输入 | 失败层 | 正确处理 |
|---|---|---|
| 半截 JSON | 传输或生成完整性 | 不执行,记录截断或解析失败 |
name=delete_all | 动作集合 | 拒绝未知工具 |
引用 D999,本轮从未读取 | 业务语义 | 返回缺失证据 |
| 合法搜索,但任务已取消 | 运行状态 | 拒绝过期动作 |
结构化输出能降低一部分格式错误,但它不能证明 D999 真实存在,也不能证明模型理解了“重启”的语义。不同层的错误不要都包装成“模型输出无效”,否则无法选择恢复方式。
响应格式合法,仍可能需要拒绝执行
假设模型返回一个合法 read 请求,文档 ID 确实存在,但属于另一项目。若工具只检查 ID 存在就读取,模型接口就绕过了数据边界。身份和项目范围必须从可信会话注入,不能由模型参数覆盖。
再考虑多工具响应:如果一个模型响应同时请求两次搜索,应明确是否允许并发,以及如何把结果关联回请求。每个调用需要稳定 ID;结果顺序不能被当作唯一关联依据。一个失败、一个成功时保留各自状态,不能把整轮简化成空数组。
为下一轮组装上下文,而不是转储全部历史
上下文工程资料将上下文视为需要持续管理的有限资源。对本项目,每轮优先提供任务约束、未解决问题、必要证据和上一步失败原因。
例如“数据库模式支持恢复,但要求处理端按任务 ID 去重”不能压缩为“支持恢复”。压缩应保留能改变动作或结论的条件,删除的是重复日志和冗余说明。
可为上下文建立预算表,但不要先规定每类固定比例。先问哪些信息不可丢:权限、当前目标、最新更正通常优先;大段工具输出可以保存引用,在需要时回读。若被截断的资料恰好包含反例,模型会在完整结构上作出错误语义判断。
参数校验之后仍需一次状态校验
考虑模型响应生成了两秒,其间用户取消了任务。生成前检查过权限,不代表执行时仍然有效。动作应携带它依据的任务版本,执行器在真正调用工具前再核对当前状态。
text
decision.task_version = 4
当前任务版本 = 5,状态 = cancelled
结果:stale_task;不执行工具,也不请求模型“换个写法再试”对于会改变外部状态的动作,校验与提交之间还可能存在竞争。服务端应在受保护的状态转换中确认授权版本,而不是客户端检查一次后无条件发送。客户端的版本字段是检测手段,不会自动提供跨服务事务。
这也说明校验器要返回机器可区分的原因。invalid_json 可以修复响应格式;stale_task 必须重新读取任务;forbidden 则不能通过参数改写绕过。若三者都返回“再试一次”,模型会在已取消任务里持续执行无效循环。
重试必须以错误类别为依据
解析错误可以给出具体修复反馈后有限重试;缺少用户需求应该澄清;工具无权限不应通过改写参数绕过;持续不可用的数据源应转为部分交付。
总成本要按任务计算。假设 A 每次调用成本为 1,平均需要三次;B 每次成本为 2,一次完成。在相同质量条件下,A 的任务成本为 3,B 为 2。这里是算例,不是模型价格,实际还要计入工具、等待和人工复核。
一次可重复的接口验收
先用固定模拟响应覆盖正常动作、未知工具、截断响应、过期任务和非法引用,确认执行日志中只有允许的动作。然后再接模型,统计各错误类别出现频率。
这样可以区分两种问题:程序没有正确处理已知异常,或模型经常选择错误但合法的动作。前者修适配器,后者才需要调整上下文或模型策略。混着调会让每次变化难以归因。
现在动作已经能安全进入系统,下一步是让 search 返回真正支持任务的证据。继续阅读检索增强。