Skip to content

模型接口:让不确定输出进入确定程序 ​

对应 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 返回真正支持任务的证据。继续阅读检索增强。


本课程逐讲目录 · 两门课程映射与资料边界 · 离线实验与验证边界