第 1.3.3 节:用模型适配层统一请求、响应和错误处理
模型适配层统一请求、响应和错误只有拆成可执行步骤,才容易复核、排错和交接。完成本节后,你应该能够按顺序说明模型适配层统一请求、响应和错误的触发、处理、复核、记录和兜底步骤。
实现步骤或决策流程
客服工作台模型底座如何落地
客服工作台里的模型底座可以按“输入、上下文、调用、输出、日志、兜底”六件事落地。
| 环节 | 落地动作 | 为什么重要 |
|---|---|---|
| 输入 | 标准化用户问题、会话编号、用户身份和业务入口 | 后续才能判断权限、上下文和追踪链路。 |
| 上下文 | 只放当前任务需要的会话摘要、知识片段和工具结果摘要 | 控制 Token(文本计量单位)、成本和回答稳定性。 |
| 调用 | 通过模型适配层选择 Mock(模拟)或真实供应商 | 学习、测试和交付环境可以分开。 |
| 输出 | 校验文本、结构化结果或工具意图 | 防止无效输出进入业务动作。 |
| 日志 | 记录 trace_id(追踪编号)、耗时、Token(文本计量单位)、模型名和错误 | 方便成本复盘、故障排查和面试说明。 |
| 兜底 | 超时、限流、格式错误、无依据时进入重试、降级或人工 | 用户不会看到模型编造的业务结果。 |
这套落地方式会贯穿后续章节。第 1.4 章会把输出变成字段契约,第 1.5 章会把模型调用放进第一个 Agent(智能体),第 1.6 章会把工具结果重新送回模型解释。
Responses API(响应接口)、Chat Completions(聊天补全接口)和 Agents SDK(智能体软件开发工具包)
新项目要理解三个层次:
| 层次 | 定位 | 适合场景 |
|---|---|---|
| Chat Completions(聊天补全接口) | 对话消息生成接口 | 兼容旧项目、简单聊天 |
| Responses API(响应接口) | 面向多模态、工具和状态化交互的统一接口 | 新项目的模型调用底座 |
| Agents SDK(智能体软件开发工具包) | 构建 Agent 应用的 SDK(软件开发工具包) | 工具、上下文、Handoff(任务转交)、Tracing(调用链追踪)等 |
本书后续会优先使用新项目更适合的方式讲解,但也会说明旧项目迁移和多模型适配的边界。
模型调用的最小流程
这个流程里,模型只是系统的一部分。真正的工程质量来自应用后端对上下文、工具、错误和日志的控制。
读图重点:模型与工具之间没有直连,所有上下文、执行、校验和展示责任都由应用后端掌握。
Mock(模拟)模式和 Real Provider(真实模型供应商)模式
配套项目先以制作说明呈现,但从设计上必须保留两种运行模式。
Mock(模拟)模式
Mock(模拟)模式不调用真实模型。它可以根据固定规则返回结果。
适合:
- 学习者无 API Key(接口密钥)时运行流程。
- 自动化测试。
- CI(持续集成)检查。
- 演示系统结构。
Real Provider(真实模型供应商)模式
Real Provider(真实模型供应商)模式读取环境变量,调用 OpenAI(模型服务商)、DeepSeek(深度求索模型)、Qwen(通义千问模型)、智谱、Claude(模型产品)、Gemini(模型产品)或本地模型服务。
适合:
- 真实效果验证。
- 客户试点。
- 性能和成本评估。
- 商业部署。
为什么必须同时支持
如果只有 Real Provider(真实模型供应商)模式,学习者可能因为网络、额度、模型更新或 Key(密钥)配置失败而跑不通。如果只有 Mock(模拟)模式,又无法验证真实效果。
所以本书的项目设计统一采用:
| 配置项 | 含义 | 示例口径 |
|---|---|---|
| APP_MODE(应用运行模式) | 决定使用 Mock(模拟)模式还是真实模型模式 | mock 或 real |
| MODEL_PROVIDER(模型供应商) | 指定模型服务来源 | openai、deepseek、qwen 等 |
| MODEL_NAME(模型名称) | 指定具体模型 | 只写名称,不写密钥 |
真实值放在 .env,模板放在 .env.example。
最小模型适配层
商业项目不要把业务代码写死在某一家 SDK(软件开发工具包)上。可以先设计一个很薄的模型适配层。
模型适配契约说明
本节只说明制作方法,不展开代码语法。进入真实项目开发时,要把本节的输入、输出、日志和验收规则落实到项目结构中。
| 环节 | 需要明确的内容 | 验收方式 |
|---|---|---|
| 请求进入 | 用户问题、身份、业务对象和会话编号 | 能复现同一次请求 |
| 智能体处理 | 角色、提示词、工具、资料范围和停止条件 | 典型任务能稳定走完 |
| 工具调用 | 工具名称、权限、输入字段和失败处理 | 高风险工具需人工确认 |
| 结果返回 | 答案、依据、风险、下一步动作和拒答原因 | 前端和业务人员能理解 |
| 运行记录 | 追踪编号、耗时、模型调用、工具结果和人工确认 | 问题能追溯和复盘 |
这个例子不追求完整,只表达一个原则:业务代码依赖自己的接口,具体模型供应商放在适配层里。
项目实现说明可以把文本生成、结构化输出、工具调用和流式响应拆得更细。
推荐技术流:模型调用从可跑到可交付
| 步骤 | 做什么 | 为什么 |
|---|---|---|
| 1 | 定义模型调用场景 | 不同场景的成本、延迟和质量要求不同。 |
| 2 | 设计输入上下文 | 防止把无关历史和过期资料塞进模型。 |
| 3 | 估算 Token(文本计量单位)预算 | 让成本和延迟在可控范围内。 |
| 4 | 设计 Mock(模拟)模式 | 让学习、测试和演示不依赖真实密钥。 |
| 5 | 设计真实供应商配置 | 让系统可以接 OpenAI(模型服务商)、DeepSeek(深度求索模型)或其他供应商。 |
| 6 | 封装模型适配层 | 业务代码不直接依赖某一家 SDK(软件开发工具包)。 |
| 7 | 校验输出和错误 | 不把异常模型结果直接交给业务流程。 |
| 8 | 记录调用日志 | 方便追踪成本、耗时、错误和质量问题。 |
| 9 | 设置降级策略 | 供应商异常时能提示、重试或切换模式。 |
| 10 | 用验收样例验证 | 证明典型客服问题能稳定处理。 |
这条技术流的核心理由是:模型调用不是一次性请求,而是一个外部服务接入工程。
模型请求与响应字段契约
| 字段 | 说明 | 客服工作台示例 | 风险控制 |
|---|---|---|---|
| trace_id(追踪编号) | 串联一次模型调用和业务处理 | 一次售后咨询的唯一编号 | 日志必须保留,便于复盘。 |
| user_message(用户消息) | 用户原始问题 | 我的订单为什么还没发货? | 需要过滤明显恶意输入。 |
| task_type(任务类型) | 本次调用目的 | 意图识别、答案生成、工具结果总结 | 不同任务使用不同 Prompt(提示词)。 |
| context_pack(上下文包) | 进入模型的资料集合 | 售后政策片段、会话摘要、工具结果摘要 | 控制长度和权限。 |
| model_profile(模型配置) | 供应商、模型、模式和温度等选择 | mock、openai、qwen 等 | 不暴露密钥。 |
| output_contract(输出契约) | 期望模型返回的字段 | 意图、风险等级、是否需要工具、回复草稿 | 失败时进入重试或降级。 |
| usage_record(用量记录) | Token(文本计量单位)、耗时、错误 | 输入 1500,输出 300,耗时 2 秒 | 用于成本和性能分析。 |
版本与资料来源
具体 API(应用程序接口)参数和 SDK(软件开发工具包)用法以后续章节及官方文档为准。
主要资料入口:
- OpenAI(模型服务商) API 文档:https://developers.openai.com/api/docs
- API Reference(参考文档):https://developers.openai.com/api/reference/overview/
- Responses API(响应接口):https://developers.openai.com/api/reference/responses/overview/
- Responses API(响应接口)迁移指南:https://developers.openai.com/api/docs/guides/migrate-to-responses
过时风险:模型名称、上下文窗口、价格和 API 参数变化较快。写作和发布前应再次核对官方文档。