你的代码库中有两种语言,但只有一种拥有编译器。一种是你的团队编写的严格类型的代码 —— 开启了 strict: true 的 TypeScript、CI 中运行 mypy 的 Python、强制返回值的 Go —— 另一种则是 Prompt:一个模板化的字符串,经过拼接后发送给远程模型,并返回另一个运行时希望能成功解析的字符串。在这两个区域之间,类型系统就成了瞎子。IDE 不会高亮任何内容。编译器不会发出任何报警。而那些凭借“但它通过了类型检查”就发布功能的团队,实际上将核心契约放在了契约检查器看不见的地方。

这个接缝伪装得很好。从外部看,它就像一个函数调用:generate(input: UserQuery): Promise<AgentResponse>。函数签名诚实地反映了输入和输出。而虚假的部分发生在调用点和响应之间:输入被插值到通过字符串引用字段名的 Prompt 模板中;模型被要求生成一个符合该 Prompt 内部以自然语言描述的 Schema 的 JSON 对象;响应作为一个字符串返回并交给解析器;最后解析器返回类型系统终于能再次看到的内容。两端的每一个类型化表达式都在对中间一个完全没有静态保证的区域做出断言。
这并非理论上的担忧。各团队报告称,在生产环境中,朴素的结构化输出基准 Schema 失败率为 10–20%,而且失败往往集中在那些你最无法承受无声丢弃的输入上 —— 长上下文、深层工具链、边缘情况用户。类型系统提供了一种虚假的正确感,直到格式错误的 JSON 返回且运行时将其吞下为止。