前言:把一条模型请求变成可以解释的系统行为
一个应用第一次调用模型时,代码往往只有几十行:准备消息、发送请求、读出回答。接入第二个模型,开始有人要求“失败时自动切换”;接入第二个团队,又需要区分密钥、限额与账单。再加上长时间流式输出、用户取消和工具调用,原先的一次函数调用便有了协议、资源和责任边界。
这本书从这些边界出发。我们要回答的不是模型知道多少知识,而是:请求为什么被路由到这里,系统已经对外承诺了什么,失败后哪些动作还能做,付出了多少资源,以及维护者能拿出什么证据。
本书适合了解 HTTP、JSON 和基本编程的后端开发者。做过 API 网关、Java 服务或 Agent 的读者可以直接连接自己的经验;Python 只用于降低实验的启动成本,不要求读者把自己的生产服务改成 Python。涉及锁、并发和网络时,正文会先解释约束,再进入实现。
一条贯穿全书的请求
设想一家团队提供内部知识助手。租户 north 与 south 使用同一个入口,应用提交一段提示、期望的能力和输出上限。网关选择有对应能力的模型服务,把增量结果送回客户端,并在最后处理用量。我们给这条业务请求一个稳定标识,再给每次上游尝试单独编号。这样,“用户问了一次”与“上游被调用了几次”就能分别统计。
随书项目使用真实 HTTP 连接、SSE 事件和本地模型服务替身。替身能够拒绝请求、延迟、输出部分结果后断开,因此不需要购买模型额度,就能观察普通成功演示难以暴露的失败窗口。替身的计量单位是按实验合同定义的 UTF-8 字节 credit;它不是任何供应商的 tokenizer,也不能据此估算真实费用。
怎样阅读
第 1—4 章建立请求生命周期、协议、能力和路由模型;第 5—9 章讨论流、取消、尝试、租户与结算;第 10—12 章把安全、观测和验证放进同一套约束。第 13—15 章带着你运行实验并阅读证据,第 16—17 章讨论如何从教学实现走向自己的工程方案。
可以先运行第 13 章的演示,再回到前面的概念。代码附录从项目源码生成,便于离线阅读。正文中的伪代码负责表达规则;以实际仓库中的命令和测试作为运行入口。每章的练习都有明确检查目标,附录提供解题方向,避免只做术语记忆。
关于实现所能证明的事情
本地实验能够证明特定输入和故障注入下的程序行为,例如“下游已经收到事件后不再发起第二次尝试”。它不能证明真实供应商在断开连接后停止计算,也不能证明一个单进程锁在多节点部署中仍然有效。生产章节会明确需要替换的存储、身份、传输与运维机制。
本书的案例为可复现教学场景,不宣称来自某家公司的生产事故。正文所引协议与产品资料见来源附录;供应商接口和实现会变化,接入真实服务时应固定版本,重新验证能力与费用合同。希望读完以后,你不仅能让请求成功,还能解释它为什么成功、失败后留下什么,以及下一步应该由谁处理。