System Design Interview / LLM Product Platform
设计一个 ChatGPT
这道题的核心不是“训练一个大模型”,也不是“把用户输入转发给模型 API”。它考的是: 当 ChatGPT 看起来只是一个聊天框时,背后怎样把用户、会话、上下文、模型推理、安全、 配额和运维连成一条稳定的产品链路。面试默认先设计文字聊天 P0:用户登录后创建会话、 发送消息,服务端组装当前上下文,完成安全与配额检查,路由到合适的模型,把生成 token 流式返回,并把消息、状态和观测事件可靠落库。
Projects、Memory、RAG/Search、Apps、Agent、Canvas、Data Analysis/Code、Tasks 和 Pulse 不要一上来混进主链路。它们是扩展面:有的给上下文增加来源,有的调用外部工具, 有的运行异步任务,有的提供编辑或代码沙箱。开场先说清触发条件、权限边界、失败降级, 再按面试官要求选择一两个深入。
P0 主链路
一次普通聊天请求必须闭环:鉴权、会话、上下文、安全、配额、模型推理、流式返回、持久化和观测。
扩展平面
RAG、Memory、Projects、Apps、Agent、Canvas、Code、Tasks/Pulse 都是挂在主链路上的可选能力,不默认进入每次请求。
非目标
不设计从零训练基础模型,不假设知道 OpenAI 私有架构,不展开 Voice/多模态,除非面试官明确要求。
本页回答一个问题:面试里如何把“Design ChatGPT”从泛泛而谈变成可执行、可恢复、可扩展、可审计的系统设计。 读完后,你应该能先锁 P0 聊天主链路,再按 API、Context、GPU、RAG/Tools、Agent、Canvas、Code、安全和运维逐层展开。
默认文字聊天闭环,不把 Agent、Canvas、Code、Pulse 一口气塞进主链路。
conversation、message、generation、tool call、trace 和 billing 都要有明确真源。
讲清 prefill、decode、batching、KV cache、流式回压、取消和降级。
工具、文件、外部 app、代码执行和后台任务都要有权限、审计和回滚。
1. 面试问法地图
先判断面试官到底在问哪一层
“Design ChatGPT”不是一道固定题,而是一组入口相似、深挖方向完全不同的题。 开场 2 分钟先判断面试官要的是消费级聊天产品、API 平台、企业知识库、LLM 推理平台、 实时语音、多模态、Agent、Code Interpreter、Canvas,还是主动任务系统。判断清楚以后, 答案才有主线:先交付 P0 文本聊天闭环,再只深入面试官指定或暗示的能力。
Design ChatGPT
默认是大模型对话产品。不要从训练 GPT 开始,主线放在会话、流式、上下文、推理、工具、安全和高可用。
Design an AI chatbot
更偏通用聊天后端。重点是多轮状态、消息一致性、SSE/WebSocket、模型 API 封装、限流和用户反馈。
Design realtime / Voice ChatGPT
更偏低延迟交互。重点是音频流、打断、会话粘性、端到端延迟、抖动丢包、回退到文本和实时安全。
Design ChatGPT API / Responses
更偏开发者平台。重点是响应生命周期、stream event、工具 schema、幂等、限流、计费、版本兼容和审计。
Design LLM serving / inference platform
如果面试官强调 GPU、token 吞吐、低延迟、模型路由或自建推理,主线不是聊天产品,而是 admission control、token queue、prefill/decode、KV cache、continuous batching、模型灰度和成本隔离。
Design enterprise ChatGPT
更偏企业知识、权限和治理。重点是 RAG、Apps(原 Connectors)、租户隔离、SSO、管理员策略、审计、数据保留、数据驻留和默认不用于训练的企业/API 数据边界。
Design ChatGPT Apps / connected tools
更偏把外部系统接进 ChatGPT。重点是 OAuth/MCP、workspace admin policy、read/write action approvals、最小权限、引用、tool trace 和 prompt injection 防护。
Design ChatGPT Search / RAG
更偏检索增强。重点是网页和文件召回、重排、引用、新鲜度、权限过滤、删除撤权、幻觉控制和质量评测。
Design multimodal ChatGPT
更偏多模态平台。重点是图片、语音、文件、生成产物、媒体存储、异步处理、内容安全和不同模型的路由。
Design workspace and proactive ChatGPT
更偏真实 ChatGPT 工作台。重点是 Projects、Memory、Tasks、Pulse、Apps、通知、权限和后台任务调度;Pulse 要按需要 Memory 的 proactive research 预览能力处理。
Design ChatGPT agent
更偏长任务编排。必须讲浏览器、终端、代码执行、连接器、人类确认、可中断、恢复、任务审计和 prompt injection。
Design Code Interpreter
更偏沙箱执行。必须讲容器、文件生命周期、资源限额、网络限制、产物回传、超时、隔离和恶意代码防护。
Design Canvas
更偏 AI 辅助 artifact 编辑。必须讲文档/代码 artifact、版本、局部选区、补丁、inline comment、预览、回滚和冲突处理,不要默认设计多人协同编辑系统。
| 先问什么 | 候选人要确认 | 为什么重要 |
|---|---|---|
| 面试官要哪条主线 | 产品聊天、API、企业 RAG、LLM serving、Realtime、Agent、Canvas、Code Interpreter 还是 proactive workspace | 决定 45 分钟深挖模块,避免把 GPU serving 题讲成普通 CRUD 聊天题。 |
| 交互实时性 | 文本流式、实时语音、异步任务、后台研究、API batch/worker | 决定 SSE/WebSocket/WebRTC、队列、取消、断线恢复和通知模型。 |
| 知识与动作边界 | 只读问答、用户文件、企业 Apps、Memory、联网搜索、写操作工具 | 决定 ACL、引用、撤权删除、human approval 和 prompt injection 防线。 |
| 成功指标 | TTFT、TPOT、TTA、可用性、groundedness、citation coverage、cost/turn、audit completeness | 初学者要知道系统设计不是“能回答”就够,而是延迟、正确性、安全和成本同时达标。 |
| 非目标 | 是否要训练基础模型、是否要复刻 OpenAI 内部私有架构 | 避免虚构私有实现;除非明确要求,默认设计 serving 和产品后端,不设计 foundation model training。 |
| 产品边界 | 消费级 ChatGPT、企业版 ChatGPT,还是 API 平台 | 消费级重体验和成本;企业版重权限、审计、数据驻留;API 平台重开发者契约和隔离。 |
| 数据与合规边界 | 是否启用文件、Memory/Project memory、Apps、Search、Pulse;数据能否训练/评测 | Pulse 是需要 Memory 的主动研究预览能力;Apps 是 Connectors 后的统一产品入口。这些选择会决定存储、权限、审计、PII、区域合规、prompt injection 防护和后台任务风险。 |
| 模型来源 | 外部模型 API 还是自建 GPU serving | 如果外部 API,重点放在会话、上下文、安全和可靠性;如果自建 serving,必须深入 GPU 调度。 |
| MVP 范围 | 先做 chat + streaming + history + context + safety | Agent、Canvas、Code Interpreter、语音和图片都可以作为扩展,不要一开场把 45 分钟讲散。 |
| 高级能力 | 是否必须覆盖 RAG、Agent、Canvas、Code Interpreter | 面试官如果指定某个子题,就把主架构压缩,时间留给该子系统的状态、权限和故障处理。 |
| 规模和 SLA | DAU、峰值请求、活跃流、TTFT、TPOT、可用性、区域合规 | ChatGPT 类系统的瓶颈通常不是 HTTP QPS,而是 token 吞吐、KV cache、长连接和高成本工具。 |
| 时间 | 输出 | 高分信号 |
|---|---|---|
| 0-5 分钟 | 澄清题型、用户、入口、数据边界、是否自建 serving | 输出一句主线选择:我先设计 P0 文本聊天,再按你指定的方向深挖。 |
| 5-10 分钟 | P0 功能、规模、SLO、成本约束 | 把 DAU/QPS 转成活跃流、token 吞吐、TTFT/TPOT、队列和成本,而不是只报 HTTP QPS。 |
| 10-18 分钟 | 画主架构:client、gateway、chat plane、storage、model/tool plane、observability | 主图要让后续每个追问都有落点:状态在哪、流怎么回、失败怎么恢复、事件怎么观测。 |
| 18-33 分钟 | 按题型深挖:RAG / GPU serving / Realtime / Agent / Code / Canvas / API | 不要平均展开所有高级功能;选择一个模块讲状态机、权限、容量和故障路径。 |
| 33-40 分钟 | 可靠性、安全、权限、降级、成本 | 系统设计高分来自 tradeoff:错了怎么止损、慢了怎么降级、贵了怎么限额、危险动作怎么确认。 |
| 40-45 分钟 | 总结 tradeoff,补遗漏,说明后续扩展 | 用一句话回到题目:P0 已闭环,指定深挖已展开,剩余能力可以沿同一能力注册表扩展。 |
2. 需求和规模
功能需求说完整,非功能需求说出取舍
好答案要先把用户体验和平台约束讲清楚。ChatGPT 的难点来自两个方向同时成立: 用户感觉它是实时聊天,系统内部却是昂贵、状态化、受安全约束的 GPU 工作流。
基础聊天
登录、会话列表、创建消息、编辑消息、停止生成、重新生成、分享、删除、归档、用户反馈。
实时体验
首 token 尽快出现,后续 token 稳定到达。客户端能取消、重连、展示部分结果并恢复生成状态。
智能能力
模型路由、长上下文、记忆、文件问答 / 数据分析、RAG、联网搜索、工具调用、结构化输出、图像和语音。
工作流能力
Projects、Tasks/Pulse、Agent 长任务、Apps(含 Connectors / synced connectors)、虚拟浏览器、终端、代码执行、Canvas artifact 和可下载产物。
平台能力
配额、计费、灰度、AB 实验、SSO/SCIM/RBAC、workspace policy、工具开关、管理员审计、数据驻留、数据删除、retention/ZDR 和默认不训练。
安全能力
输入安全、输出安全、prompt injection 防御、工具权限、敏感动作确认、PII 脱敏和红队评测。
| 优先级 | 覆盖范围 | 面试取舍 |
|---|---|---|
| P0 核心聊天 | 登录、会话、消息、流式生成、停止、重试、上下文、安全、配额和计费 | 这是任何问法都要先保证的骨架;没有它,后面的 Agent 和 Canvas 都没有状态承载。 |
| P1 知识和多模态 | Files/Data Analysis、RAG、网页搜索、记忆、Projects、图片理解、语音输入输出 | 这些能力提升真实产品贴合度,但要把权限、索引、引用和延迟说清楚。 |
| P2 工作流平台 | Agent、Tasks/Pulse、Apps/Connectors、Canvas、Code Executor、GPTs / GPT Store | P2 能展示深度,但面试中要按追问选择一两个钻透,不能把所有扩展平均展开。 |
| 非功能需求 | TTFT/TPOT、stream recovery、event durability、GPU queue wait、async deadline、cost/turn、audit completeness、tenant isolation | 非功能需求不能停在名词,要变成 SLI/SLO、采集事件、错误预算、降级动作和回滚开关。 |
初学者最容易漏的是“功能需求不是列功能名”。面试里每说一个能力,都要顺手补上四件事: 用户看到什么、后端必须保证什么、权限和生命周期边界是什么、过载或依赖失败时怎样降级。
| 功能域 | 用户可见能力 | 后端必须承诺 | 权限 / 生命周期 | 降级边界 |
|---|---|---|---|---|
| P0 Chat | 登录、会话列表、新建消息、编辑、停止、重试、分享、删除、历史搜索和多端同步。 | message/generation 状态机、幂等键、上下文构建、安全检查、配额计费、response event checkpoint 和可恢复 stream。 | conversation、message、generation、share link 都带 tenant_id、owner、visibility、retention_policy 和 delete tombstone。 | 先保住纯文本 chat;历史搜索、分享预览和非关键 metadata 可延迟或只读。 |
| Streaming | 首 token 尽快出现;断线后能继续看到已生成内容;用户可以取消并确认生成是否结束。 | SSE/WebSocket relay、response_id + seq、durable checkpoint、Last-Event-ID/游标恢复、取消时释放 GPU slot 和 KV cache。 | 客户端收到的 delta 必须能被 replay;不能把未持久化 token 当作已完成回答。 | 过载时排队、降模型、缩短 max_tokens;stream relay 异常时降级为轮询最终答案。 |
| Files / Data Analysis / Code | 上传 PDF、表格、图片和代码文件,做数据分析、图表、代码执行和产物下载。 | 文件解析/OCR/索引、对象存储、沙箱容器、资源限额、artifact store、病毒扫描、PII/DLP 扫描和下载签名。 | source_file_id、container_file_id、artifact_id 与 conversation/project ACL 绑定;容器过期后不可隐式恢复。 | 大文件排队解析;不支持类型只做摘要;沙箱过载时暂停运行代码但保留聊天主链路。 |
| RAG / Search / Apps | 搜索网页或企业数据,回答带引用;授权外部应用后可读取或执行受控动作。 | query-time ACL filter、source citation、OAuth scope、sync freshness、write action confirmation 和 prompt injection 防护。 | 外部内容进入 untrusted source block;写操作、跨域导出和敏感读取必须审计。 | 连接器失效时降级为无连接器回答;引用不足时 no-answer 或请求更多权限。 |
| Memory / Projects | 记住偏好;项目内文件、指令和聊天隔离;共享项目不泄露成员个人 memory。 | saved memory 与 chat history 分层、source trace、delete propagation、project-only namespace 和移动/共享后的索引失效。 | Temporary Chat 不读写 account memory;shared project 强制 project-only 语义。 | memory 写入失败时不阻塞 P0 chat;读取不确定时显式忽略或要求用户确认。 |
| Agent / Canvas | 长任务可中断、接管和恢复;Canvas 支持文章/代码 artifact 的局部编辑、预览、版本恢复。 | Agent checkpoint、human approval、tool audit、artifact version、patch/rebase/rollback、preview sandbox 和风险动作确认。 | 模型提出动作,orchestrator 执行动作;artifact 版本不可变,外部副作用必须有审批证据。 | 高风险动作转人工确认;工具故障时保留计划和 checkpoint;Canvas patch 冲突时要求用户选择。 |
| Tasks / Pulse / Deep research | 定时任务离线执行、通知结果;Pulse 做每日主动研究;Deep research 生成带引用报告。 | scheduler、deadline、retry/backoff、dedupe、通知、per-user budget、长任务 checkpoint 和 best-effort research 降级。 | Tasks 是用户显式创建任务,不能静默跳过;Pulse 依赖 Memory 且 connected apps 默认关闭,需 opt-in。 | 过载时降低研究深度、延后低优先级任务、暂停新 Agent/Pulse/Deep research,但发送 late/failure 信号。 |
| Voice / Images | 语音对话可打断;图片可理解、生成和编辑;弱网下能保持明确状态。 | realtime session、ephemeral token、VAD/ASR/TTS、media object store、media safety、转写记录和弱网恢复。 | 音视频训练选择、转写保留、图片安全策略和下载权限独立于普通文本消息。 | 语音链路异常时退回文本;图片生成排队;媒体上传失败不影响已有会话。 |
| Enterprise / Governance | 管理员配置策略、身份同步、审计导出、数据驻留、保留策略和工具开关。 | SSO/SCIM/RBAC、workspace policy、tenant_id everywhere、Compliance API/audit export、retention/ZDR、data residency 和默认不训练。 | 管理员策略高于个人设置;所有存储、索引、缓存、日志和 trace 都必须有租户与保留策略。 | 策略服务不确定时 fail closed;审计导出走异步任务;跨区依赖异常时禁用不合规路径。 |
容量估算前先定义术语:DAU 是每日活跃用户,QPS 是每秒请求数,token 是模型读写的文本单位, TTFT 是首 token 延迟,TPOT 是后续每 token 的间隔。ChatGPT 类系统要把请求数继续换算成 活跃流、token 吞吐、prefill/decode GPU 池、KV cache 压力、事件写入量和后台任务。 白话理解:prefill 是模型一次性读完输入上下文并建立注意力状态,decode 是之后一个 token 一个 token 地生成回答;KV cache 是为了让后续 token 复用前面注意力结果而常驻显存的 K/V 张量, 所以长上下文、并发流和长输出会同时放大显存和调度压力。
先定义人群和计费层级。
每人每天 10 turn 的示例。
平均值乘峰值系数 5。
20s 生成时长下的连接面。
输入压 prefill,输出压 decode。
按实测吞吐和目标水位拆池。
显存由并发序列和上下文长度驱动。
SSE delta、checkpoint、主库和 trace 分面。
按 deadline、budget 和 retry 估。
| 变量 | 含义 | 单位 / 注意 |
|---|---|---|
| λ_raw / λ_accepted / Q_entry | 原始峰值到达、admission control 后实际接入、入口排队或被限流负载。 | turn/s;GPU 和事件写入按 accepted 估,入口队列和限流按 raw - accepted 估。 |
| D_in / D_out | 输入 token/s 与输出 token/s。 | input 主要压 prefill;output 主要压 decode、KV、stream。 |
| r_prefill/group / r_decode/group | 目标模型在目标硬件、目标 batch 策略下的实测吞吐。 | token/s/group;必须来自压测,不要直接套公开数字。 |
| u_target | 目标利用率水位。 | 常留突发余量;水位过高会牺牲 TTFT/TPOT。 |
| k_checkpoint | 每隔多少 output token 写一次可恢复 checkpoint。 | checkpoint 不等于每个 SSE delta 入主库。 |
| W_tool / W_audit/trace | 工具事件、审计事件和 trace 事件写入速率。 | events/s;通常写事件流和分析存储,而不是同步阻塞主链路。 |
| 假设 | 推导 | 面试意义 |
|---|---|---|
| DAU 1000 万 | 每日 1 亿条用户消息 | 这是面试示例假设,不是公开产品承诺;先声明用户层级、地区、模型 mix 和是否包含 Agent/Voice/Tasks。 |
| 峰值请求约 5785/s | 平均 QPS 约 1157/s,再乘峰值系数 5 | QPS 是每秒请求数;它只解释入口压力,不能代表 GPU serving 压力。 |
| 峰值活跃流 | 平均生成 20s 时约 116k;长尾 50s 时约 289k | 活跃流约等于峰值请求/s 乘生成时长;Stream Relay 要按十万级长连接分区扩容。 |
| 单请求 token 假设 | 平均输入 1000 token,平均输出 500 token | 必须同时给 p50/p95/p99;RAG、Projects、Memory、Apps 和 Agent 会显著拉长 input token 和上下文驻留时间。 |
| token 吞吐 | 本示例默认 C_admission >= λ_raw,所以 λ_accepted = 5785/s;D_in = λ_accepted * 1000 = 5.8M token/s;D_out = λ_accepted * 500 = 2.9M token/s | 如果过载限流,GPU 只按 λ_accepted 估,入口排队和 rejected/queued turn 按 λ_raw - λ_accepted 估。 |
| prefill sizing | prefill groups >= input token/s / measured prefill token/s/group / target utilization | prefill 受输入长度、batching、chunked prefill、prompt cache 和模型大小影响;必须用目标硬件的压测 profile,而不是套固定 GPU 数。 |
| decode sizing | decode groups >= output token/s / measured output token/s/group / target utilization | decode 受并发序列数、TPOT/ITL、KV cache 命中和内存带宽影响;交互请求和异步研究最好拆队列。 |
| KV cache 压力 | KV bytes/worker ≈ 2 * layers * kv_heads * head_dim * bytes_per_elem * Σ seq_len_i | Σ seq_len_i 只统计同一 GPU worker 当前 batch;还要乘 tensor/pipeline parallel 拓扑、paged KV 碎片、allocator overhead 和长上下文留存。 |
| 流式带宽 | active_streams * 每流 bytes/s,再加心跳和重连风暴余量 | SSE/WebSocket 连接层要和 GPU 池分开扩容,避免断线重连拖垮入口。 |
| 存储和事件增长 | messages、response_events、audit、trace、files、Kafka events 按天和租户分区 | 回答不是一个最终字符串;但 SSE delta、durable checkpoint、主库 message、Kafka audit/trace 是不同写入面,不能混成一个表。 |
| 事件量闭环 | accepted turns/day 约 1 亿时,约 2 亿 messages/day;50B output token/day;每 20 output token checkpoint 约 2.5B events/day | 若 λ_accepted 低于原始峰值,checkpoint 峰值按 D_out / k_checkpoint 重算;主库只存 message/generation 和关键 checkpoint,细粒度 trace 走事件流。 |
| Tasks 异步负载 | 按 active task 上限、触发频率、deadline、retry/backoff、late/failure notification 和结果回写事件估 | Tasks 是用户显式创建的任务,不能静默跳过;过载时排队、重试、迟到告警、失败通知或让用户暂停/删除。 |
| Pulse / Deep research 异步负载 | Pulse 按 Pro eligible users、每日 research fanout、卡片刷新、入口展示和 per-user budget 估;Deep research 按长任务 checkpoint 估 | Pulse 是 preview/best-effort daily refresh,可按预算延迟、不生成当天卡片或降低研究深度;这里不等同于通知权限。 |
| TTFT / TPOT | 示例 SLO:P95 TTFT 1 到 3 秒;P95 TPOT 20 到 100 ms/token | TTFT/TPOT 必须标成示例目标,并按模型、地区、tier、上下文长度和工具开关校准;面试重点是拆开优化。 |
一条消息如何变成资源账单
鉴权、幂等、配额和 user message durable。
Memory、Projects、RAG、Apps 先过权限再进入上下文。
上下文截断、引用选择和成本预算在这里发生。
按 tier、能力、风险、预算和健康度选择模型。
排队、batching、chunked prefill 和 KV residency。
把持久化事件转成 SSE/WebSocket 增量。
用于重放、计费、评估采样和故障恢复。
Apps、Code、Agent 产生外部调用、沙箱和异步预算。
把 token、GPU、tool、trace 汇总成可审计账单。
- 降模型、缩上下文、减少 RAG 文档。
- 暂停 Agent、Pulse、Deep research 新任务。
- 高风险 Apps/工具动作强制确认或 fail closed。
| 目标 | SLI 怎么量 | 示例 SLO / 边界 | 主要风险 | 设计动作 |
|---|---|---|---|---|
| 首 token 体验 | P95/P99 TTFT,按 model、region、tier、tool_on/off 拆分。 | 示例目标:P95 1-3s;不是 OpenAI 承诺,面试中必须按模型和地区校准。 | prefill 长、GPU queue 高、RAG/Apps 慢、stream relay 拥塞。 | admission control、prompt cache、chunked prefill、减少检索文档、降模型或显示排队状态。 |
| 生成平滑度 | TPOT / ITL、chunk gap、用户侧 stalled seconds。 | 示例目标:P95 20-100 ms/token;长输出和高并发下按模型 mix 重算。 | decode 饱和、KV cache 碎片、客户端背压、连接重试风暴。 | decode 池扩容、paged KV、batch 调度、流控、客户端缓冲和心跳。 |
| good turn 成功率 | 28 天 good_turn / accepted_turn;good_turn = 消息持久、首 token 达标、最终/取消状态可重放。 | 示例目标:99.9%,错误预算烧穿后限制高成本扩展。 | 依赖超时、安全服务不确定、模型池故障、数据库写失败。 | 保 P0 chat,关闭新 Agent/Pulse/Deep research,降级工具,切只读历史。 |
| 流恢复 | 不可恢复断流率、P99 reconnect recovery、duplicate/missing seq。 | 示例目标:不可恢复断流 <0.5%,P99 恢复 <5s。 | relay 无状态、checkpoint 太稀、客户端游标丢失。 | response_id + seq、durable checkpoint、Last-Event-ID、幂等取消和 replay API。 |
| 事件耐久 | user message durable latency、response checkpoint lag、outbox publish lag、RPO。 | 示例目标:主消息 RPO 接近 0;trace/audit 可异步但不能丢关键安全事件。 | 把 SSE delta 当主库写、outbox 与 message 不一致、Kafka backlog。 | 主库 message/generation 事务,response_events 分区写,audit/trace 独立 topic 和补偿重放。 |
| GPU 队列 | prefill queue wait、decode queue wait、GPU utilization、KV eviction rate。 | 示例目标:按池水位设 admission threshold,例如 70% 目标利用率留突发余量。 | 单池混跑长短请求、上下文暴涨、低优先级任务挤占交互请求。 | 交互/异步隔离,prefill/decode 拆池,model/tier queue,暂停后台任务。 |
| 异步任务 | deadline miss、retry exhausted、late/failure notification、checkpoint age。 | Tasks 不可静默跳过;Pulse/Deep research 可 best-effort 但要有 freshness 指标。 | scheduler fanout、高成本研究、外部应用限流。 | per-user budget、priority queue、backoff、late 通知、减少 fanout 或降低研究深度。 |
| 成本和治理 | cost/turn、GPU seconds/turn、sandbox minutes、connector sync cost、ledger drift。 | 示例目标:按 tenant/model/tool/surface 归因,超预算前触发 guardrail。 | 长上下文、RAG fanout、Agent 循环、代码执行和媒体生成放大成本。 | quota、max_tokens、便宜模型、prefix cache、工具预算、预算熔断和用户可见限额。 |
| 安全合规 | tenant isolation violation、ACL unknown rate、audit completeness、delete propagation lag。 | 隔离违规目标必须是 0;策略未知按 fail closed 处理。 | RAG 权限穿透、memory 泄露、共享项目读个人上下文、审计缺字段。 | tenant_id everywhere、query-time ACL、policy decision audit、tombstone 优先、数据驻留路由。 |
| 目标 | 设计基线 | 降级边界 |
|---|---|---|
| 用户可见 SLO | 28 天 Chat good turn 成功率 99.9%;P95 TTFT 1-3s;不可恢复断流率 < 0.5%;P99 reconnect recovery < 5s | good turn = 鉴权通过、用户消息 durable、首 token 达标、最终/取消状态可重放;错误预算烧穿时先降级和限流。 |
| 持久化与恢复 | user message + generation + outbox 同事务;response_events 先持久化再发送;conversation store RPO 接近 0 | 用户看见的 delta 必须能重放;单区故障时 RTO 用分钟级恢复主链路,异步任务可稍后补偿。 |
| 峰值过载降级 | 先排队和限流,再降级模型/减少 RAG 文档/关闭高成本工具;最后暂停 Agent、Pulse、Deep research 新任务 | 降级顺序按用户可见价值排序:保住 P0 chat,再保护付费层级和安全门禁。 |
| 异步任务 SLO | Tasks 看 trigger deadline、retry exhausted、late/failure notification;Pulse 看 preview daily refresh、freshness、保存为 chat 成功率 | Tasks 不能被静默跳过;Pulse/Deep research 可按预算和安全风险延迟、降级或停止新研究。 |
| 成本水位 | 按 tenant、model、tool、GPU pool 归因;超过预算时切便宜模型、降低 max_tokens、延后低优先级异步研究或触发 quota | 成本不是事后账单字段,它会进入 router、admission control、batching 和 canary 决策。 |
3. 真实 ChatGPT 产品面
先贴合真实产品,再抽象成系统模块
真实 ChatGPT 不是一个单纯聊天框。它的页面里有聊天历史、分支新聊天、群聊、搜索、图片、 Apps(含原 Connectors)、Deep research、Voice、文件、Projects、Memory、Tasks、Pulse、Canvas 和 Agent mode。 系统设计时要把它看成一个能力外壳:统一 composer 收集意图,后端通过 capability registry 决定 进入普通聊天、RAG、异步任务、agent runtime、代码执行器或 artifact 编辑流。
Chat shell
新建聊天、历史搜索、编辑消息、重试、分享、归档、删除、重命名、从某条回复分支新聊天和多设备同步。
Group chats
群聊是独立会话空间,通过邀请链接加入;个人 memory/custom instructions 不进入群聊,部分功能在群聊中不可用。
Unified composer
一个输入框后面挂模型选择、工具下拉、文件上传、图片、语音、网页搜索、Canvas 和 Agent mode。
Search
Search 是实时信息入口,涉及 query rewrite、位置相关结果、来源面板、引用、新鲜度和搜索降级。
Projects
项目级指令、文件、项目内聊天、共享项目和 memory_mode = default | project_only;共享后强制 project-only,不能访问成员个人 memory/custom instructions。
Memory
账号级 saved memory 支持查看、禁用、删除和来源解释;project memory 更像由项目 chats/files/instructions 与 default/project_only 策略派生出的上下文。
Files and data
文件上传先进入对象存储、类型检查、解析、索引和 ACL;它不等于一定进入代码执行。
Data Analysis
Data Analysis 是 ChatGPT 内的交互式分析体验,常用 Python/Jupyter 沙箱读文件、做表格处理、画图和生成下载产物。
Code Executor
Code Executor 是后端运行代码的受控能力,要建模容器、文件挂载、资源限额、日志、artifact 和安全扫描。
Voice and images
语音是低延迟音频输入输出链路;图片既可作为输入理解,也可触发生成和编辑工作流。
Deep research
多源检索、长时间阅读、引用回链、报告生成和中间状态持久化,比普通 web search 更像异步任务。
Canvas
Canvas 是文章/代码 artifact 的独立编辑面,核心是版本、局部 patch、预览、恢复和导出。
Agent mode
Agent 是长任务运行时,可用浏览器、终端、连接应用和可中断 checkpoint;危险动作需要确认。
Tasks
Tasks 是用户创建的一次性/周期性自动 prompt,离线执行后通过 push/email 告知结果;需要 active task 上限、pause/delete、通知权限和 unsupported-tool gate。
Pulse
Pulse 是 Pro 用户在 Web/iOS/Android 上的每日主动研究预览体验,依赖 Memory;connected apps 默认关闭,只有用户 opt-in 且允许 proactive activity 后才参与研究信号。
Apps (含原 Connectors)
Apps 是统一入口,包含交互式界面、file search/deep research/sync 数据访问和 write actions;写操作需确认,管理员可控 RBAC、scope、同步和审计。
GPTs / GPT Store
自定义指令、知识文件、actions、Canvas 能力、发布权限、版本、审核和滥用治理组成 GPT Builder 平台。
主承载面:会话历史、Temporary Chat、群聊、文字/文件/图片/语音输入,以及 capability_request 路由。
先做 ACL、租户、保留策略和来源标注,再进入上下文窗口。
检索、引用、新鲜度、长任务 checkpoint、来源展示和失败降级。
工具循环、沙箱、浏览器/终端、确认门、资源限额和审计事件。
artifact 版本、协同编辑、知识文件、actions、发布和回滚治理。
离线调度、主动研究、预算、deadline、retry、通知和保存为 chat。
VAD/ASR/TTS、媒体对象、图片安全、弱网恢复和转写保留。
SSO/SCIM、RBAC、data residency、retention/ZDR、Compliance API 和策略开关。
下面用一张矩阵把产品入口先落到系统对象上:状态是什么、权限边界在哪里、生命周期如何结束、会影响哪些后端平面。 后续章节会深挖架构、RAG、Agent、Canvas 和 Code Executor,但这里先保证产品面不会漏。
| 产品面 | 状态与权限 | 数据生命周期 | 后端影响 |
|---|---|---|---|
| Chat shell | conversation active / archived / deleted;message created / edited / deleted;generation queued / streaming / completed / cancelled / failed | 普通聊天进入历史;用户可改名、分享、删除、从某条回复分支新聊天;删除要传播到消息、response_events、索引、缓存和反馈样本引用。 | Conversation Service 是产品壳的根状态机;所有后续能力都要挂到 conversation_id、message_id、response_id、tenant/user 和 policy_version。 |
| Group chats | group active / invite_link_active / member_joined / member_left / member_removed;auto-response / mention-only | 群聊与个人会话分离;通过邀请链接加入,链接可 reset/delete;群聊支持 1 到 20 人;群成员可看到历史,个人 memory 和 account custom instructions 不进入群聊。 | 需要 group_conversation、membership、invite token、group instructions、per-member visibility、通知、用量归属和群聊禁用功能 gate;部分工具如 Canvas、Data Analysis、Deep Research、Tasks、Apps、Agent 不在群聊中启用。 |
| Unified composer | mode = chat / search / file / voice / image / canvas / agent;model、tool、file、project、task intent 同时存在 | 用户只看到一个输入框,但每个附件、工具、模式和模型选择都会改变后端 plan;未支持组合要提前拦截。 | Composer Resolver 将 UI 意图标准化为 capability_request,进入 capability registry、policy gate、quota、router 和状态机。 |
| Search | search_auto / search_forced / search_disabled;query rewritten / provider_called / citations_rendered / stale_or_failed | Search 面向实时信息,结果可受位置、记忆、历史和查询意图影响;回答要展示来源面板、引用和时间新鲜度;失败时回落到非实时回答或说明无法搜索。 | 需要 search intent detector、query rewrite、provider adapter、location/privacy policy、source panel、freshness watermark、citation trace 和 provider quota。 |
| Deep research | planned / browsing / reading / synthesizing / cited_report_ready / failed / cancelled | Deep research 是用户触发的长研究任务,通常跨多个来源阅读、保留研究计划和中间状态,最终生成带引用报告。 | 需要异步 run、checkpoint、retrieval fanout、citation ledger、source credibility、budget/deadline、resume/cancel 和结果保存为 chat/report。 |
| Files | uploaded / scanning / parsed / indexed / attached / deleted / expired | 上传文件先进入对象存储、MIME/type 检查、病毒/PII 扫描、解析和索引;文件可属于 conversation、Project、GPT knowledge 或 Library。 | 文件是 source,不是执行器;必须记录 source_file_id、owner、ACL、retention、content_hash、parser_version、index_version 和 delete propagation。 |
| Data Analysis | analysis_requested / sandbox_allocated / code_running / chart_ready / artifact_ready / failed | ChatGPT Data Analysis 更像交互式数据工作台,读取上传表格/文档,运行受控 Python/Jupyter,生成图表、摘要和下载产物。 | 需要会话级沙箱、文件挂载、资源限额、stdout/stderr 脱敏、artifact store、图表渲染和用户可下载结果的安全扫描。 |
| Code Executor | container pending / active / idle / expired;job queued / running / succeeded / failed / killed | Code Executor 是可被 ChatGPT/Data Analysis/Canvas/Agent 调用的后端能力;容器和文件有显式生命周期,过期后不能隐式恢复。 | Execution API 要注入 allowed_source_file_ids、network policy、CPU/memory/time limit、package policy、artifact scan 和审计记录。 |
| Voice | session_created / listening / speech_started / reasoning / speaking / interrupted / ended | 语音模式强调低延迟、打断和转写;音频、转写、训练选择和保留策略与普通文本消息不同。 | 需要 realtime session、ephemeral token、VAD/ASR/TTS、WebRTC/WebSocket、jitter buffer、interrupt semantics、media safety 和弱网恢复。 |
| Images | image_uploaded / vision_context_ready / generation_queued / editing / generated / saved / deleted | 图片既可以作为输入理解,也可触发生成和编辑;生成结果需要保存、管理、下载和安全策略。 | 需要 media object store、image safety、prompt/media provenance、generation queue、thumbnail、signed URL、EXIF/PII 处理和删除传播。 |
| Apps (含原 Connectors) | connected / synced / expired / disabled_by_admin;read action / write action pending_confirmed_executed | Apps 统一承载第三方应用、连接器、同步知识源和可交互 UI;写操作需用户确认,企业管理员可控 scope、RBAC 和同步策略。 | 需要 OAuth/scope、connector sync、MCP/app schema registry、query-time ACL、write confirmation、audit export、prompt injection 防护和 stale-source 降级。 |
| GPTs / GPT Store | draft / private / shared / published / reviewed / removed;versioned instructions/actions/knowledge | GPT Builder 将 instructions、knowledge、actions、capabilities、Canvas 等配置打包成可发布实体;发布后要审核、版本化和滥用治理。 | 需要 GPT manifest、knowledge files、action auth、schema versioning、review pipeline、owner policy、store ranking、abuse detection 和兼容回滚。 |
| Agent | planning / tool_call_pending / waiting_confirmation / running / checkpointed / user_takeover / done / failed | Agent 是长任务运行时,可用浏览器、终端、Apps 和文件;高风险动作需要确认,用户可中断、接管和恢复。 | 需要 planner、tool orchestrator、browser/terminal isolation、risk scoring、human approval、checkpoint、trace、budget、kill switch 和 prompt injection guard。 |
| Canvas | artifact open / patch proposed / previewing / saved / restored / exported / conflicted | Canvas 是独立 artifact 编辑面,支持文章/代码局部修改、版本恢复、预览和导出;它不是简单把聊天回复变长。 | 需要 artifact_version、patch/rebase/rollback、preview sandbox、diff store、conflict resolution、export pipeline 和 artifact-level permissions。 |
| Projects | active / shared / deleted;project 内 chats 可 archived / moved / deleted;owner、edit access、chat access 和组织管理员策略 | memory_mode = default | project_only;共享后自动转 project_only 且不可回退;撤权和删除要传播到索引、对象存储、缓存和 memory 引用。 | Context Builder 按 plan/workspace policy 解析 account memory 与 project namespace;共享项目不读取成员个人 memory/custom instructions。 |
| Memory | candidate / saved / disabled / deleted / source-visible;用户开关、workspace 开关、project-only memory | Temporary Chat 不创建或引用 account-level saved memory;project memory 通过项目 chats/files/instructions 和 memory_mode 影响上下文。 | Account memory write 必须有来源、置信度、可解释文本和撤销路径;project context 通过移动/删除源对象、权限和索引失效更新。 |
| Tasks | scheduled / running / succeeded / failed / paused / expired / deleted | 用户创建一次性或周期性 prompt;最多 10 个 active tasks;可 edit/pause/delete;不支持 voice chats、file uploads、GPTs,含文件的 Project task 不能访问 project files。 | Scheduler、dedupe key、checkpoint、retry/backoff、idempotent push/email notification、unsupported-tool gate 和 pause/delete 状态机是核心。 |
| Pulse | eligible / enabled / queued / researching / delivered / saved_as_chat / hidden_from_new_chats / expired | 当前是 preview;Pro 用户可在 Web/iOS/Android 使用;必须开启 saved memories 和 reference chat history;connected apps 默认关闭且需 Allow proactive activity;卡片次日刷新,一天后删除,保存或互动后才进入 conversation history。 | 需要离线 planner、connector opt-in、per-user budget、freshness watermark、citation trace、卡片刷新节奏和 data controls 继承。 |
| 容易混淆的边界 | 正确理解 | 后端设计影响 |
|---|---|---|
| Temporary Chat vs 普通聊天 | Temporary Chat 不进入历史,不创建或引用 saved memory;仍可能为安全目的短期保留。 | 后端要让 conversation retention、memory write、history index 和 eval sampling 都读同一个 retention_policy,不能只在前端隐藏。 |
| Account memory vs Project memory | Account saved memory 是用户级偏好;project context 来自项目 chats/files/instructions 和 project-only 策略;共享项目不读取成员个人 memory。 | Context Builder 必须先解析 principal、project、sharing state 和 memory_mode,再决定可注入上下文。 |
| Tasks vs Pulse vs Deep research | Tasks 是用户显式创建的一次性/周期性 prompt;Pulse 是依赖 Memory 的主动研究预览;Deep research 是用户触发的长研究报告。 | 三者都可能离线运行,但 SLO、通知、预算、保存路径和失败语义不同,不能共用一个无状态 cron worker。 |
| Apps vs 旧 Connectors | Apps 是统一产品入口,包含直接连接、同步知识源、交互 UI 和写动作;旧 Connectors 更像数据接入子集。 | 设计时用 app/connector registry、OAuth scope、sync freshness、write confirmation 和 admin policy 统一抽象。 |
| File upload vs Data Analysis vs Code Executor | File upload 是 source lifecycle;Data Analysis 是用户可见分析体验;Code Executor 是运行代码的底层沙箱能力。 | 文件权限、容器权限和 artifact 权限要分开建模;不是每个文件问答都需要启动 Python,也不是每个 code job 都能访问所有文件。 |
| Agent vs Code Executor / Data Analysis | Agent 是多步工具编排和长任务;Code/Data 是受控计算工具,通常只处理当前任务的文件和代码。 | Agent 需要 planner、checkpoint、浏览器/终端隔离、用户确认和接管;代码沙箱更关注容器资源、文件挂载和 artifact 安全。 |
| Canvas artifact vs 聊天回复 | Canvas artifact 是可版本化、可 patch、可预览、可导出的对象;普通 assistant message 是 conversation 事件的一部分。 | 需要 artifact_version、diff、preview sandbox 和 export pipeline;不要把 Canvas 当成 message 表里的一个长字符串。 |
| Group chats vs 1:1 chats | Group chats 与个人聊天分离,ChatGPT 不看个人 memory/custom instructions;群聊有成员、邀请链接、群设置和不支持功能列表。 | 要建 membership、invite link、group instructions、per-member visibility、usage attribution、teen/safety mode 和 unsupported-tool gate。 |
4. 总架构
白板上先画主链路,再挂侧平面
这一章的主图不是 OpenAI 官方公开架构,而是面试中可辩护的系统设计推断:先把 P0 聊天链路从入口画到流式返回, 再把 Projects、Memory、Search、Apps、Agent、Canvas、Code Executor、Tasks、Pulse 和企业治理挂到侧平面。 这样既能回答传统高并发后端追问,也能自然进入 GPU serving、工具编排和数据治理深挖。
面试官最关心的不是盒子多,而是每个盒子之间的输入输出、状态归属和失败语义。下表把一条普通消息拆成十步: 前三步保证“请求被合法、唯一、可恢复地接收”,中间三步决定“能不能把正确上下文安全地送进正确模型”, 后四步保证“生成、流式返回、账本和观测都能在失败后复盘”。其中 Model Router、Usage Ledger、 Multi-region Failover 等名称是本题的系统设计抽象,用于表达职责边界,不代表官方公开内部组件名。
| 步骤 | 输入 | 输出 | 关键状态 | 失败语义 |
|---|---|---|---|---|
| 1. Client | 用户输入、文件/图片/语音、model/tool/project 选择、client_request_id。 | 带身份上下文、设备信息、幂等键和模式标记的 request envelope。 | 本地 draft、上传进度、stream cursor、取消按钮状态。 | 弱网或刷新后可用 client_request_id 重试;未确认服务端接收前不展示完成。 |
| 2. Edge / Gateway | HTTPS / SSE / WebSocket / WebRTC 入口流量。 | 通过 TLS、WAF、Auth、Rate Limit、plan quota、request size check 的规范化请求。 | request_id、principal、tenant、plan、region、feature flags、rate-limit counters。 | 鉴权失败 401/403;限流 429;不确定的 tenant/policy 直接 fail closed。 |
| 3. Conversation write | 规范化请求和 client_request_id。 | durable user message、generation/response row、outbox event。 | conversation_id、message_id、response_id、generation state、idempotency key。 | 写主库失败就不能调用模型;重复请求返回同一 response_id,避免重复扣费和重复工具动作。 |
| 4. Context Builder | 当前消息、历史窗口、Projects、Memory、RAG/Search/Apps/File metadata。 | 带 provenance、token budget、taint bit 和 citation candidates 的 model input。 | context_snapshot_id、source spans、ACL version、memory/source tombstone version。 | ACL unknown、source stale、delete tombstone 未确认时不注入;可降级为无 source 回答或要求重新授权。 |
| 5. Safety / Policy | 用户请求、上下文、source blocks、tool plan 和 tenant policy。 | allow / sanitize / confirm / refuse / fail_closed 决策。 | policy_version、risk score、safety trace、redaction metadata。 | 策略服务不确定时 fail closed;高风险工具动作转确认而不是自动执行。 |
| 6. Model Router | 能力需求、上下文长度、tier、成本预算、区域、GPU 健康、工具需求。 | model_id、prompt/template version、inference pool、max_tokens、fallback plan。 | router decision、experiment bucket、cost guardrail、model pin。 | 目标池过载时降模型、排队、缩上下文或关闭高成本扩展;旧会话可 pin 旧模型版本。 |
| 7. Inference | model input、generation config、stream callback、cancel token。 | token delta、tool call proposal、usage counters、finish reason。 | queue state、prefill/decode batch、KV cache residency、GPU worker trace。 | GPU 超时/抢占时生成 FAILED/TIMEOUT;取消要释放 slot 和 KV;不得写成成功终态。 |
| 8. Stream Relay | 增量 token/tool events 和 response_id + seq。 | SSE/WebSocket events、heartbeat、reconnect replay。 | last_seq、stream cursor、backpressure、connection shard。 | 客户端断线后按 cursor 重放;relay 故障不应丢已持久化 checkpoint。 |
| 9. Persist / Usage | response_events、final text、tool results、usage counters。 | final message、billing ledger、audit/event topics、eval sampling candidates。 | message final state、usage ledger row、outbox offsets、artifact references。 | final commit 未成功前不能向用户确认完成;账本漂移进入补偿和告警。 |
| 10. Observability | trace spans、logs、metrics、policy decisions、user feedback。 | SLO good/bad event、burn-rate alert、debug replay、release/eval feedback。 | root trace id、span links、model/tool versions、tenant-safe fields。 | 观测缺失不阻塞 P0 chat,但安全审计缺字段要阻断高风险工具和企业导出。 |
真实 ChatGPT 页面上的功能不是另一套系统,而是从主链路分叉出来的能力平面。判断一个设计是否成熟, 可以问五件事:它由什么触发,持有什么状态,权限边界在哪里,是同步阻塞还是异步 checkpoint, 以及依赖失败时用户会看到什么降级结果。
| 扩展平面 | 触发方式 | 状态 | 权限边界 | 同步 / 异步 | 降级 |
|---|---|---|---|---|---|
| Projects / Memory | 用户在项目内聊天、共享项目、开启/关闭 memory、Temporary Chat。 | project_id、memory_mode、memory candidate/saved/deleted、source trace。 | 共享项目不读个人 memory/custom instructions;Temporary Chat 不读写 account memory。 | 同步进入 Context Builder;memory 写入异步候选化。 | memory 读写失败不阻塞 P0;ACL 不确定时不注入项目文件或 memory。 |
| RAG / Search / Apps | 用户显式搜索、系统判定需要实时信息、连接外部应用或同步知识源。 | query rewrite、search provider result、connector sync watermark、source span、citation ledger。 | query-time ACL、OAuth scope、source block taint、write action confirmation。 | 普通 Search 可同步短路;sync connectors 和 Deep research 多为异步/半异步。 | 连接器 stale/403/429 时降级为无连接器回答、no-answer 或请求重新授权。 |
| Voice / Realtime / Multimodal | 语音会话、图片上传、图片生成/编辑、视频/实时输入。 | realtime session、media object、transcript、VAD state、image generation job。 | ephemeral token、media safety、音视频训练选择、对象存储签名 URL 和删除传播。 | 语音是实时双向通道;图片理解同步进入上下文,图片生成常异步排队。 | 语音弱网退回文本;图片生成排队;媒体扫描失败不注入上下文。 |
| Agent / Tools / Code | Agent mode、Data Analysis、Code Executor、Apps write action、浏览器/终端工具。 | agent_run、tool_call、container/job、approval、checkpoint、artifact。 | 模型只提出动作,orchestrator 执行;高风险动作确认;沙箱和工具 scope 最小权限。 | 短工具可同步阻塞当前 turn;Agent 和代码长任务异步 checkpoint。 | 工具失败保留计划和 checkpoint;代码沙箱过载时暂停运行但保留聊天主链路。 |
| Canvas / Artifact | 用户打开 Canvas、编辑文章/代码、生成 patch、预览和导出。 | artifact_id、artifact_version、patch、preview_run、export file。 | artifact-level ACL、patch base version、preview sandbox、download scan。 | 编辑和预览可交互;导出和扫描可异步。 | patch 冲突时 rebase 或询问用户;预览失败不破坏已保存版本。 |
| Tasks / Pulse / Deep research | 用户创建定时任务、Pulse 主动研究、Deep research 长报告。 | schedule、run_id、deadline、research plan、card/report、notification state。 | Tasks 是显式用户任务;Pulse 依赖 Memory 且 connected apps opt-in;研究引用必须可追溯。 | 异步 worker + checkpoint + notification。 | 按预算降低 fanout/深度、延后低优先级任务、发送 late/failure 通知。 |
| Enterprise governance | 企业 workspace、管理员策略、SSO/SCIM/RBAC、审计导出、数据驻留。 | tenant policy、admin role、retention policy、data region、audit export job。 | tenant_id everywhere;管理员策略高于个人设置;Business/API 默认不用于训练公开模型。 | 策略同步进请求路径;审计导出和删除传播异步。 | 策略/区域不确定时 fail closed;跨区依赖不可用时禁用不合规路径。 |
最后把架构按团队边界重新切一遍。优秀的系统设计答案会说明谁拥有 durable state、谁做同步 gate、 谁只做异步投递,以及哪些故障必须 fail closed。这样面试官继续追问数据库、缓存、消息队列、 GPU、Agent 或企业合规时,回答都能回到同一张职责地图。
| 层 | Owner | Durable state | ACL / policy boundary | Sync / async | Degrade / fail-closed |
|---|---|---|---|---|---|
| Gateway / Edge | 平台入口团队 | 短期 rate-limit counters、request log、region route。 | Auth、tenant、plan、abuse/WAF、request size。 | 同步,必须在写 conversation 前完成。 | 限流、排队、降级入口;身份或租户不确定直接拒绝。 |
| Conversation Plane | Chat 状态团队 | conversation、message、response/generation、idempotency、outbox。 | owner、share/group membership、retention、delete tombstone。 | 用户消息和 generation 创建同步;索引和导出异步。 | 主库不可写时拒绝生成;历史搜索可只读或延迟。 |
| Context / Knowledge | Context 与检索团队 | context_snapshot、source spans、vector index、connector watermark、citation ledger。 | ACL、OAuth scope、project sharing、source taint、freshness。 | 主回答同步读取;索引、sync、research 异步。 | source stale/ACL unknown 不注入;降级为无引用回答或 no-answer。 |
| Safety / Policy | 安全治理团队 | policy decision、risk score、redaction、confirmation evidence。 | system/developer/user/tool hierarchy、tenant policy、DLP、high-impact actions。 | 输入/工具/输出关键 gate 同步;红队/eval 异步。 | 安全服务不确定时 fail closed;低风险输出可回退安全模板。 |
| Model / GPU Serving | Inference 平台团队 | router decision、queue event、model version、usage counters、worker trace。 | tier、budget、region、model availability、data residency。 | prefill/decode 同步产生 stream;调度和容量控制实时。 | 降模型、缩上下文、减少输出、排队或暂停低优先级异步任务。 |
| Stream / Persist | 实时传输与存储团队 | response_events、last_seq、final message、usage ledger、artifact refs。 | 用户可见 delta 必须可重放;账本和审计字段不得丢。 | stream 是实时;ledger/audit/trace 通过 outbox 异步扇出。 | 断线按 cursor replay;final commit 失败则不确认完成并触发补偿。 |
| Tool / Agent / Code | 工具运行时团队 | tool_call、agent_run、container/job、approval、checkpoint、artifact。 | OAuth scope、human approval、sandbox policy、network/file allowlist。 | 短工具可同步;Agent/Code/Deep research 多为异步 checkpoint。 | 工具失败返回可解释状态;危险动作无确认不执行;沙箱过载暂停。 |
| Ops / Governance | SRE、发布、安全和企业平台 | SLO event、trace、eval result、feature flag、audit export、incident record。 | tenant isolation、data residency、retention/ZDR、admin RBAC。 | 观测异步为主;policy/config 进入同步请求路径。 | 错误预算烧穿时自动降级/熔断;企业审计缺失时停用高风险功能。 |
5. 请求链路
一条普通消息怎么变成流式回答
真实系统里,消息不是同步函数调用。它有身份、配额、状态、上下文、安全、队列、GPU 调度、 流式传输和落库。面试时按这八步讲,基本不会漏主链路。
因为一次回答可能持续几十秒,用户会刷新或取消,GPU worker 可能重启,工具和代码执行可能比 HTTP 连接活得更久。 如果状态只放在进程内存里,断线后就无法证明用户看过哪些 token;如果重试没有幂等键,就可能重复扣费、 重复提交外部工具动作,或生成两条互相矛盾的回答。所以“请求链路”真正要设计的是一条可恢复的事件流, 而不是一个从 controller 调 model 的函数。
1. 接入
Gateway 做 TLS、鉴权、套餐、配额、灰度标记、请求大小检查。
2. 记录
Conversation Service 写入用户消息和 generation 状态,生成幂等 request id。
3. 组装
Context Builder 拼 system、历史、记忆、RAG 文档、工具结果和当前问题。
4. 审查
输入安全与策略判断先挡掉不该进入 GPU 的请求。
5. 路由
Model Router 根据任务、套餐、上下文、工具、负载和成本选择模型与集群。
6. 推理
Inference Gateway 排队,GPU worker 做 prefill、decode、batching 和 KV cache 管理。
7. 流式
Stream Relay 与 GPU 推理层分离,通过 SSE 或 WebSocket 推送 delta,并按 tenant/response 分区扩容,处理取消、断线和回压。
8. 落库
每个 delta 先过输出安全并持久化 response_event,再 flush;计费、日志、trace、反馈和评估样本走 outbox 异步处理。
这个不变量是本章的核心:客户端已经看到的每个 seq 都必须先成为 durable event;最终 assistant message 只是事件日志重建出来的 canonical view。这样 relay 崩溃、浏览器断线、用户刷新、客户端 ack 丢失、 duplicate seq 或 event gap 都能被同一套日志和状态机解释。
| 问题 | 设计 | 关键语义 |
|---|---|---|
| 状态机 | CREATED -> QUEUED -> PREFILLING -> STREAMING -> COMPLETED | CANCELLING 是过渡态;CANCELLED、FAILED、TIMEOUT 是终态;非法转移要被拒绝并进入审计。 |
| 幂等创建 | tenant_id + conversation_id + client_request_id 唯一 | 重复 POST 不新建回答,直接返回同一个 response_id 和当前状态,避免重复扣费和重复工具动作。 |
| 流式事件 | response_id、seq、event_type、delta、usage_delta、created_at | seq 在 response 内单调递增,客户端用 Last-Event-ID 或 last_seq 断线恢复。 |
| 取消和恢复 | cancel 写 CANCELLING;resume 从最后持久化 seq 继续读 | cancel 与 token 继续到达、GPU stop ack、COMPLETED 可能竞争;终态由状态机 CAS 或事务决定。 |
| 先持久化再发送 | append response_event -> commit durable log -> flush SSE/WebSocket | 客户端可见的 delta 必须来自 response_events 或 durable stream,否则断线恢复会出现看过但服务端没记录的 gap。 |
| 落库边界 | 用户消息、generation、outbox 同事务;response_events 可追加 | 最终 assistant message 从 response_events 重建并标成 canonical,审计和计费用 event_id 幂等去重。 |
普通聊天只是 P0。真实 ChatGPT 的请求还会分叉到文件、图片、语音、Apps、Agent、Code Executor、Canvas 和后台研究。面试里不用把每个功能都画成独立大图,但要说清楚它们在同一条链路上哪里分叉、 哪些对象必须先落库、哪里能异步、失败后如何恢复。
| 产品面 | 触发入口 | 同步 / 异步边界 | 必须先落库 | 恢复点 | 失败 / 取消语义 | 最终产物 |
|---|---|---|---|---|---|---|
| 普通聊天 / Search | composer 发送文本、开启搜索、或模型判断需要实时信息。 | 用户消息同步写入;搜索结果可同步短路,也可在流中先发 searching/source 事件。 | message、response、response_events、search query、source span、citation candidates。 | response_id + last_seq 重放已持久化 delta;source span 按 snapshot_id 固定。 | 搜索超时降级为无实时来源回答或 no-answer;引用不足不能伪造来源。 | canonical assistant message、source panel、usage ledger。 |
| Files / Data Analysis | 上传文件、拖入表格、请求分析、要求生成图表或下载结果。 | upload/scan/parse/index 可异步;分析 turn 只阻塞必要的 file_ready 或 sandbox_ready。 | file_id、scan result、parse job、sandbox job、artifact、response_events。 | file_id/job_id 可恢复;沙箱 stdout/stderr 和产物分片写 checkpoint。 | 扫描失败不进上下文;解析超时提示用户;沙箱失败保留错误和已生成产物。 | 表格摘要、图表、下载文件、notebook/代码执行结果。 |
| 图片理解 / 图片生成 | 上传图片提问、要求生成图片、或对图片做编辑。 | 图片理解先 scan/media safety 再进入 Context Builder;图片生成常进入异步媒体队列。 | media_id、safety verdict、generation job、prompt revision、asset version。 | media_id 和 image_job_id 支持轮询/通知;生成中断不重复扣费。 | 媒体扫描失败不注入;生成队列过载显示排队或降分辨率;被拒绝时写 policy decision。 | 图片 asset、编辑版本、下载链接和审计事件。 |
| Voice / Realtime | 用户打开语音会话、WebRTC/WebSocket 建连、音频帧持续到达。 | 实时会话负责低延迟双向流;文本 transcript 和 response_events 定期 checkpoint。 | realtime session、ephemeral token、audio chunk pointer、transcript、response_events。 | 弱网后按 session_id 和 transcript cursor 恢复;无法恢复时退回文本聊天。 | VAD/ASR 不确定先澄清;网络抖动不应重复执行工具;媒体策略未知 fail closed。 | 转写文本、语音回答状态、聊天中的最终消息。 |
| Apps / 工具调用 | 模型产生 tool_call、用户 @app、或 Apps connector 需要读/写外部系统。 | 模型只提出动作;orchestrator 检查 scope、风险、确认和幂等键后执行。 | tool_call_id、approval_id、provider_operation_id、OAuth scope、tool result。 | tool_call_id 幂等重放;未知 provider 状态进入 reconcile job。 | 高风险写动作无确认不执行;429/5xx 按 backoff;不可逆动作必须避免重复提交。 | tool result、外部操作收据、audit trace、可引用 source。 |
| Agent mode | 用户选择 Agent、提出多步任务、需要浏览/文件/表单/终端等组合动作。 | 短计划可同步展示;长任务进入 agent_run 异步 checkpoint,并在关键动作前请求确认。 | agent_run、step graph、tool_call、checkpoint、approval、watch/takeover state。 | 从最后 checkpoint 恢复;同一 action_id 保证外部动作幂等。 | 预算耗尽、工具失败、策略拒绝或用户接管时,保留计划、证据和未完成状态。 | 任务报告、浏览截图、表格/文件产物、conversation summary。 |
| Code Executor | Data Analysis、代码解释、文件处理、图表生成或用户请求运行代码。 | 代码 job 异步运行;输出流可实时回传,但文件写入和下载必须先过扫描。 | container_id、job_id、resource quota、stdout/stderr chunks、artifact files。 | job lease 超时后可重新调度;stdout/stderr 和 artifact manifest 作为恢复点。 | 超时/内存爆掉杀 job;沙箱过载不影响普通聊天;网络和文件访问按 allowlist。 | 图表、CSV、notebook、日志和下载资产。 |
| Canvas | 用户打开 Canvas、选中文本/代码、要求改写、预览或导出。 | patch 生成可流式;commit 必须校验 base_version 和 selection anchor。 | artifact_id、artifact_version、patch_id、preview_run、export job。 | patch 失败可按 base_version 重放;预览失败不覆盖 current_version。 | base 过期则 rebase 或询问;预览沙箱失败只标记 preview failed。 | 可版本化文档/代码、diff、预览资产、导出文件。 |
| Tasks / Pulse / Deep research | 用户创建定时任务、Pulse 主动研究、Deep research 长报告。 | 请求创建同步返回 run/schedule;研究、抓取、通知和保存为 chat 异步执行。 | schedule、run_id、research plan、checkpoint、citation ledger、notification state。 | worker lease + checkpoint;失败后重试、late notification 或等待用户重启。 | 外部来源限流降低 fanout;过期结果标 stale;引用不可验证不生成最终报告。 | 报告、引用、Pulse card、通知和保存的聊天。 |
最后把链路改写成可靠性契约。每一段都要能回答:什么条件下允许重试,什么条件下绝不自动重试, 哪个事件算 bad event,降级动作是什么,以及哪个指标会告诉 SRE 这条链路正在烧错误预算。
| 阶段 | 不变量 / admission 口径 | Good event | Bad event | 可重试 | 不可重试 | 降级动作 | 观测信号 |
|---|---|---|---|---|---|---|---|
| Gateway / admission | 先做 Auth、tenant、plan quota、request size、GPU 水位和 feature flag,再允许进入主链路。 | 请求被接入、排队或 429,都带 request_id、principal、admission_reason 和可解释 retry_after。 | raw traffic 被无界接受,导致 GPU queue、DB 或工具 provider 被打爆。 | 429 带 retry_after;排队票据可被客户端轮询或恢复。 | 身份、租户、区域、合规策略不确定时不能自动重试放行。 | 限流、显示排队、关闭高成本工具、降模型或缩上下文。 | raw_qps、accepted_qps、429_rate、admission_reason、queue_depth、feature_kill_switch。 |
| Conversation write | user message、response/generation、idempotency ledger、outbox 同步事务提交。 | 同一 client_request_id 只产生一个 response_id;ACK 前业务状态和 outbox 已提交。 | 模型已执行但 user message 未落库,或重试创建了两个 response 并重复扣费。 | 客户端用同一 client_request_id 重试,服务端返回同一个 response_id 和状态。 | 主库不可写时不能调用模型;外部写工具已执行但状态未知时进入人工/补偿。 | 只读历史、稍后重试、保留 draft,不进入 GPU。 | write_latency、idempotency_conflict、transaction_abort、outbox_lag。 |
| Context / policy | 上下文必须带 provenance、ACL version、tombstone version、token budget 和 taint bit。 | model input 中每个外部 source 都有 provenance、ACL 决策和 tombstone 版本。 | 把已删除文件、无权限 connector、个人 memory 注入到共享或群聊上下文。 | connector sync stale 可异步刷新;低风险检索超时可重试一次。 | ACL unknown、policy unknown、delete tombstone 未确认时不注入。 | 去掉来源、关闭 memory/RAG、要求重新授权或 fail closed。 | context_snapshot_id、source_stale_rate、acl_unknown_rate、policy_decision。 |
| Model queue / inference | 按 tenant/tier/model/tool/background 拆队列;prefill/decode 水位控制 TTFT 和 TPOT。 | accepted turn 在目标 SLO 内拿到 slot,或在超预算前被明确排队、降级、取消。 | 长上下文或后台研究挤占交互请求,P95/P99 TTFT 失控。 | 还未产生可见 delta 前,可在同一 response_id 下换池或降模型。 | 已发出可见 delta 后不能悄悄重开一个不同回答冒充连续输出。 | 降模型、减少 max_tokens、缩上下文、暂停 Deep research/Pulse/Agent 新任务。 | queue_wait、prefill_time、decode_tpot、kv_eviction、gpu_util、cancel_ack_lag。 |
| Stream relay | 可见 token 必须先有 durable response_event;relay 只负责传输和重放,不拥有真相。 | flush 给客户端的每个 seq 都能通过 response_id + last_seq 从 durable log 重放。 | 用户看过的 token 服务端没有记录,断线恢复出现 gap 或重复 token。 | 客户端带 Last-Event-ID/last_seq 重连;relay 从 durable log 重放。 | 不能用新 response 替代旧 stream;不能跳过 missing seq 继续标 completed。 | 退回轮询、降低 chunk 频率、显示 reconnecting 或 partial result。 | disconnect_rate、replay_success、duplicate_seq、missing_seq、client_backpressure_seconds。 |
| response_events | response_id + seq 唯一且单调;delta/tool/final/usage 都是 append-only event。 | 事件无 gap、无 duplicate seq;final message 可由完整事件日志重建且与 usage 对齐。 | final message 与事件日志不一致,账单和用户看到的内容对不上。 | 按 event_id/seq 幂等 append;consumer 可从 offset 重放。 | 乱序、缺 gap 或 final commit 未成功时不能向用户确认完成。 | 从已有 events 重建 partial,标记 FAILED/TIMEOUT,触发修复任务。 | event_append_latency、seq_gap、final_rebuild_mismatch、checkpoint_age。 |
| Output safety / final | 输出安全、引用校验和最终 canonical message 在 completed 前完成。 | COMPLETED 前输出策略、引用校验、finish_reason、usage 和 canonical message 全部一致。 | 部分流输出绕过安全,或引用/工具结果未校验就进入最终消息。 | 低风险输出扫描超时可重试;引用校验可异步补充但不能伪造。 | 策略未知、高风险动作证据缺失、source 不可追溯时不完成。 | 截断、改写、拒绝、要求确认,或保留 partial 并解释失败。 | output_policy_decision、citation_missing、redaction_count、completion_state。 |
| Outbox / usage / audit | 计费、审计、索引、评估采样通过 outbox 异步扇出;consumer 按 event_id 幂等。 | usage ledger、audit、trace、index/event consumers 在 lag SLO 内消费且可幂等重放。 | 回答成功但 usage ledger 丢失,或企业审计导出缺关键安全字段。 | consumer 失败可按 offset/backoff 重放;账本漂移走 reconcile。 | tenant、actor、policy decision 缺失时不能生成企业审计成功记录。 | 暂停高风险工具或企业导出,保 P0 chat,后台补偿账本。 | outbox_lag、ledger_drift、audit_sink_lag、consumer_retry_exhausted。 |
6. 数据模型
别只说“用数据库”,要说清楚哪些状态必须可恢复
ChatGPT 的存储不是一个 messages 表。它要记录会话树、生成状态、工具调用、文件、产物、 记忆、向量索引、用量计费和审计证据。数据模型决定断线恢复、重新生成、版本回滚和安全追责能不能做。 本章是基于公开产品/API/隐私资料做的面试设计推断,不代表 OpenAI 内部真实表结构。
先从反例理解:如果只建一张 messages 表,最开始会很快,但一遇到流式输出、重新生成、工具副作用、 文件删除、分享固定版本和计费补偿,就会发现“写一行文本”不是系统的真实状态。
| 场景 | 单表失败点 | 正确建模 | 面试要点 |
|---|---|---|---|
| 断线恢复 | 只存 final message 时,用户已看过的 token 没有 seq 和 durable checkpoint;刷新后无法判断该重放还是重新生成。 | Response / ResponseEvent 用 response_id + seq 追加可见事件,final assistant message 只是 canonical view。 | 流式输出先 durable append 再 flush;relay 无状态,可从事件日志恢复。 |
| 重新生成 / 编辑 | 覆盖旧 message 会丢模型版本、旧答案、分支和分享固定版本,无法解释用户看到的是哪一版。 | Conversation tree + Message + Generation;edit/regenerate 追加新 generation,current 指针决定默认视图。 | 不可变历史 + 可移动 canonical pointer,比 update in place 更容易审计和回滚。 |
| 工具重试 | 把工具输出塞进 assistant text,会丢 approval、scope、provider operation id,重试可能重复外部写动作。 | ToolCall / Approval / ToolResult 独立建模,带 idempotency_key、provider_operation_id 和补偿状态。 | 模型只提议动作,orchestrator 拥有外部副作用状态。 |
| 文件删除 | message 表里只存附件 URL,删除时无法追踪 parse result、vector chunk、sandbox output、缓存和分享副本。 | File、Object、ParsedDocument、VectorChunk、SandboxRun、Artifact 分离,用 tombstone 和 purge_job 串联。 | 删除先阻断读取,再异步传播;ACL unknown 或 tombstone 未确认时不注入上下文。 |
| 分享固定版本 | 分享链接直接指向 live conversation,会随当前分支变化,接收者看到的内容不稳定。 | ShareLink 保存 resource_id、pinned_version、scope、expires_at 和 visibility policy。 | 分享是可审计的快照或受控视图,不是数据库行的裸链接。 |
| 计费补偿 | 只在 message 上存 token_count,模型重试、工具调用、取消和异步任务会让账单无法幂等重放。 | UsageLedger / BillingEvent 按 event_id、response_id、tool_call_id 幂等记账,支持 reconcile。 | 账本是真源,Kafka 只是投递;消费者必须幂等。 |
User / Org / Tenant
身份、套餐、组织、区域、数据保留策略和管理员控制。
Project
项目指令、项目文件、项目内会话、项目记忆、成员权限和更新时间。
Conversation
会话元数据、标题、分支、归档、共享权限和最后更新时间。
Message
role、content、attachments、token_count、status、parent_message_id。
Generation
模型、prompt_tokens、completion_tokens、latency、finish_reason、cost。
Response / ResponseEvent
外部可见的回答、状态机、seq、delta、tool event、usage 和最终重建结果。
ToolCall
工具名、输入、输出、权限、状态、错误、耗时和审计证据。
Artifact
Canvas 文档、代码文件、React/HTML 预览资产、Agent 产物和版本补丁。
File / Data Analysis
上传原件、解析结果、沙箱产物、图表、下载链接、病毒扫描和生命周期。
Memory
用户长期偏好、项目事实、来源、可见性、删除状态和更新时间。
Task / Pulse
定时规则、主动研究触发器、执行状态、通知目标、上次结果和失败重试策略。
VectorStore
文件 chunk、embedding、权限 metadata、版本和过期策略。
AppAuth / Connector
外部 app、OAuth grant、scope、sync cursor、管理员策略、写动作确认和撤权时间。
GroupChat / ShareLink
成员、邀请链接、角色、过期时间、固定版本、可见范围和通知偏好。
Billing / Audit / Trace
usage ledger、event_id、actor、policy decision、trace span、region 和保留策略。
数据系统的第一原则是分清 source of truth 和 derived view。真源负责恢复和审计,派生视图负责查询体验和成本。 派生视图可以延迟、重建、降级;真源不能随便丢,尤其是用户可见 token、权限决策、账本和审计。
| 平面 | 是否真源 | 保存什么 | 派生视图 | 如何重建 | 一致性边界 |
|---|---|---|---|---|---|
| OLTP conversation store | 是 | tenant、conversation、message、response、generation、idempotency、share/group membership、outbox。 | conversation list cache、search index、analytics cubes、assistant message snapshot。 | 从 OLTP + response_events 重建会话视图;缓存 miss 不影响真相。 | 用户消息、response 创建和 outbox 同事务;按 tenant_id + home_region 路由。 |
| Response event log | 用户可见 stream 的真源 | response_id、seq、delta、tool_call、tool_result、usage_delta、final、safety decision。 | 最终 assistant message、断线 replay、usage ledger、eval sample。 | 按 response_id + seq 顺序重放;gap 或 duplicate seq 触发修复。 | append-only,唯一键 response_id + seq;flush 前必须 durable。 |
| Object store | 大对象真源 | 上传文件、图片、音频、Canvas export、代码执行产物、报告附件。 | parsed text、thumbnail、virus scan verdict、download manifest。 | 可从原件重新 parse/index;被 tombstone 的对象禁止读取。 | 对象 key 带 tenant/region/resource/version;元数据在 OLTP,内容在对象存储。 |
| Vector / search index | 否,可重建派生视图 | chunk embedding、BM25/search document、source span、ACL metadata、embedding model version。 | RAG candidate、source panel、semantic search。 | 从 File/ParsedDocument/Connector snapshot 重新切块和 embedding。 | 查询时再校验 ACL 和 tombstone;stale index 不能覆盖权限真相。 |
| Usage ledger | 计费与配额真源 | usage_event_id、response_id、model、tokens、tool seconds、sandbox minutes、quota version。 | invoice、quota dashboard、cost attribution、refund/reconcile report。 | 从 response_events/tool events/outbox 重算并对账。 | event_id 幂等写;账本漂移进入补偿,不依赖 Kafka 作为最终账本。 |
| Audit log | 治理与追责真源 | actor、resource、action、policy decision、admin setting、approval、region、trace id。 | enterprise export、incident timeline、compliance report。 | 关键安全事件不可丢;普通分析事件可降采样。 | append-only;tenant/workspace policy 决定保留与导出权限。 |
| Trace / metrics | 否,诊断视图 | request_id、span、model route、GPU worker、batch id、latency、error、burn-rate signal。 | SLO dashboard、debug replay、release regression report。 | 不能完整重建业务真相,只能辅助定位。 | 采样和脱敏;缺 trace 不应阻塞 P0 chat,但安全审计缺字段要阻断高风险动作。 |
| 关系 | 建模方式 | 一致性意义 |
|---|---|---|
| Conversation tree | conversation_id + parent_message_id + branch_id | 编辑、重新生成和分支回答不是覆盖旧消息,而是在会话树上追加新分支。 |
| ACL / Sharing metadata | subject_id + resource_type + resource_id + role + scope + expires_at + policy_version | 项目、群聊、分享链接、文件、artifact、App 授权都要可审计;权限快照用于重放和追责。 |
| Message 与 Generation | 一条 user message 可以触发多个 generation | 重新生成、模型切换和工具失败重试都要保留多次 generation,最终只把一个版本设为当前 canonical。 |
| Generation 与 Response | Generation 是一次模型尝试;Response 是用户可见回答状态机 | 一次 response 可绑定一个或多个 generation 尝试;重试、fallback 和工具循环不能混成一条 message。 |
| Canonical version / rollback | conversation.current_branch_id、message.current_generation_id、artifact.current_version_id | 历史版本不可变;编辑、重新生成、Canvas 回滚和分享固定版本都只是移动 current 指针并写审计事件。 |
| ResponseEvent | 唯一索引 response_id + seq | delta、tool_call、tool_result、usage、final 都是事件;它支持断线恢复、重放和最终答案重建。 |
| Assistant message canonical view | assistant_message = rebuild(response_events where response_id = x) | 最终展示文本、引用、工具结果和 finish_reason 从事件日志重建;message 表保存当前 canonical 指针和快照。 |
| ToolCall 关系 | tool_call_id 关联 response_id、generation_id、approval_id | 工具执行要有幂等键、权限快照、输入输出摘要和补偿状态,不能只存模型文本。 |
| Outbox 边界 | OLTP 同事务写业务状态和 outbox | 计费、搜索索引、评估、训练候选和审计由消费者异步处理,消费者按 event_id 幂等。 |
| Retention / deletion | deleted_at + retention_until + legal_hold + purge_job_id | 消息、文件、artifact、vector chunk 先写 tombstone 再后台 purge;审计日志按合规策略单独保留。 |
下面把核心表关系展开成矩阵。面试时不需要背字段,但要讲清 source of truth、唯一键、生命周期、 查询路径和恢复路径。这个矩阵能支撑后续 API、存储、RAG、Agent、Canvas 和 Code Executor 的追问。
| 领域 | 真源表 / 对象 | 关键键 | 关系 | 生命周期 | 查询 / 索引 |
|---|---|---|---|---|---|
| Conversation / Message | conversation、message、message_part、attachment_ref。 | tenant_id、conversation_id、message_id、parent_message_id、branch_id、created_at。 | message 属于 conversation tree;attachment_ref 指向 file/media/artifact 版本。 | draft -> committed -> archived/deleted;编辑追加新 message 或移动 branch pointer。 | 按 tenant + conversation + created_at 分区/索引;列表读 summary cache,详情读 OLTP 真源。 |
| Generation / Response | response、generation、response_events。 | client_request_id 唯一,response_id + seq 唯一,generation_id 记录模型尝试。 | response 是用户可见状态机;generation 是模型/工具尝试;assistant message 从 events 重建。 | CREATED -> QUEUED -> STREAMING -> COMPLETED/CANCELLED/FAILED/TIMEOUT。 | 恢复按 response_id + last_seq;重新生成追加 generation 并更新 current_generation_id。 |
| Tool / App / Connector | app_grant、connector_sync_cursor、tool_call、approval、tool_result。 | tool_call_id、approval_id、provider_operation_id、OAuth grant id、scope、policy_version。 | tool_call 关联 response/generation;grant 关联 tenant/user/app;sync cursor 关联 connector source。 | authorized -> synced/stale/revoked;tool pending -> approved/executed/reconciled/failed。 | 写动作按 idempotency key 防重复;读动作结果带 source span 和 ACL snapshot。 |
| Files / Data Analysis / Code | file、scan_result、parsed_document、sandbox_run、sandbox_output、artifact。 | file_id、object_key、parse_job_id、container_id、job_id、artifact_version_id。 | file 产生 parsed chunks 和 sandbox input;sandbox output 可发布成 artifact 或下载资产。 | uploaded -> scanned -> parsed/indexed -> used -> tombstoned/purged;sandbox run 有 lease/timeout。 | 大对象在 object store;metadata 在 OLTP;vector/search index 只存可重建派生块。 |
| Canvas / Artifact | artifact、artifact_version、patch、preview_run、export_job。 | artifact_id、version_id、patch_id、base_version_id、preview_run_id。 | conversation/message 引用 artifact version;patch 只在 base_version 匹配时提交。 | created -> patched -> previewed/exported -> shared/deleted;rollback 移动 current_version。 | 按 artifact_id + version_id 取稳定版本;分享链接可 pin 某一版。 |
| Memory / Project | project、project_member、project_file、memory_item、memory_event。 | project_id、member_id、memory_id、source_message_id、source_trace_id、deleted_at。 | project memory、saved memory、reference chat history 和 Temporary Chat 分开建模。 | candidate -> saved -> disabled/deleted;Temporary Chat 不读写 account memory。 | Context Builder 读取时按 workspace/personal/project/group 边界过滤,source 必须可解释。 |
| Share / Group chat | share_link、group_chat、group_member、group_message_visibility。 | share_id、pinned_version、invite_token_hash、group_id、member_id、role、expires_at。 | group chats 与个人聊天分离;个人 memory/custom instructions 不进入群聊上下文。 | created -> invited/joined -> revoked/expired/deleted;teen/safety mode 可提升群聊策略。 | 按 membership 和 pinned_version 校验读取;邀请 token 只存 hash。 |
| Tasks / Pulse / Deep research | schedule、run、checkpoint、research_plan、report、citation_ledger、notification_state。 | task_id、run_id、checkpoint_seq、deadline、dedupe_key、notification_id。 | run 可保存为 chat/message;report 引用 source/citation;Pulse 依赖 memory 和 opt-in app data。 | scheduled -> leased -> running -> completed/late/failed/cancelled;可 pause/delete。 | worker lease + checkpoint 恢复;通知和保存为 chat 用 dedupe key 防重复。 |
| Billing / Audit / Trace | usage_ledger、audit_log、trace_index、eval_sample_ref。 | usage_event_id、audit_event_id、request_id、response_id、tenant_id、region。 | usage 来自 response/tool/sandbox events;audit 记录 actor/resource/action/policy decision。 | append -> reconciled/exported/retained;eval/training candidate 受数据控制和 policy 过滤。 | 账本按 tenant/model/time 聚合;审计按 tenant/actor/resource/time 查询。 |
高并发系统里,数据模型还要写出一致性契约:哪个唯一键防重复,哪个事务必须同步提交, 哪些索引可异步,跨区域时 RPO 是什么,冷数据如何恢复。否则“用数据库和 Kafka”只是口号。
| 契约 | 唯一键 / 版本 | 事务边界 | 分区 / 索引 | 重放 / 恢复 | 失败处理 |
|---|---|---|---|---|---|
| 幂等创建回答 | tenant_id + conversation_id + client_request_id 唯一。 | message、response、idempotency ledger、outbox 同事务提交。 | 按 tenant_id + home_region + time 分区,避免跨租户热点。 | 重复 POST 返回同一个 response_id 和当前状态。 | 主库不可写时不进入模型;避免重复扣费和重复工具动作。 |
| 可见流可重放 | response_id + seq 唯一,seq 单调。 | append response_event 成功后才 flush 给客户端。 | response_events 按 response_id hash + created_at 分区。 | Last-Event-ID / last_seq 从 durable log 重放。 | gap/duplicate seq 不标 COMPLETED;触发 rebuild/repair。 |
| Outbox 扇出 | outbox_event_id / event_id 幂等。 | 业务状态和 outbox_events 同一个 OLTP 事务。 | 按 topic、tenant、event_time 分区;consumer group 独立扩缩容。 | 消费者按 offset/backoff 重放,幂等写账本/索引/审计。 | consumer 失败不回滚用户响应,但 outbox_lag 烧错误预算。 |
| 权限和删除优先 | resource_id + policy_version + tombstone_version。 | 删除先写 tombstone 和 purge_job,再异步清理派生视图。 | 删除队列按 tenant/region 分片,避免全局扫描。 | purge job 可重入;派生索引从真源和 tombstone 重建。 | tombstone 未确认、ACL unknown、policy unknown 时不注入上下文。 |
| 区域固定与 RPO | tenant_id + home_region + data_residency_policy。 | 强一致写留在 home region;跨区副本标 replication_lag。 | 按 region pin 数据;异步任务必须继承 data region。 | 灾备从 OLTP WAL/object manifest/event log 恢复;RPO 等于最后 durable checkpoint。 | 跨区依赖不满足 residency 时 fail closed 或禁用不合规功能。 |
| 冷热分层 | tenant_id + resource_type + created_at + retention_until。 | 热 OLTP 保当前会话;冷对象/归档保不可变版本和审计。 | 热表按时间滚动,冷数据按 object prefix 和 lifecycle policy。 | 归档可回放到临时恢复库;vector/search 从冷真源再建。 | 冷恢复慢不能影响 P0 chat;展示为历史加载中或只读。 |
再把真实 ChatGPT 功能映射回实体。这样回答不会停留在“有文件表、有工具表”,而能说明每个功能的状态、 生命周期、恢复点和治理边界。
| 功能 | 主要实体 | 生命周期 | 恢复点 | 治理边界 |
|---|---|---|---|---|
| Images | MediaAsset、ImageJob、PromptRevision、SafetyVerdict、AssetVersion。 | upload/scan -> understand;或 generate/edit -> queued -> asset version -> download/share。 | image_job_id 支持轮询和通知;失败保留 policy decision 和已生成版本。 | 媒体安全、对象签名 URL、删除传播到 object/index/cache。 |
| Voice / Realtime | RealtimeSession、EphemeralToken、AudioChunkPointer、Transcript、TurnSegment。 | session open -> audio chunks -> transcript checkpoint -> response_events -> final message。 | 按 session_id + transcript cursor 恢复;不可恢复时退回文本。 | 音频对象按 tenant policy 保留;媒体策略 unknown 时 fail closed。 |
| Agent | AgentRun、PlanStep、ToolCall、Checkpoint、Approval、TakeoverState。 | planned -> step leased -> tool executed -> checkpoint -> completed/paused/taken_over。 | 从 checkpoint_seq 恢复;action_id/provider_operation_id 防重复外部动作。 | 高风险动作确认,工具 scope 最小权限,watch/takeover 进入审计。 |
| Code Executor / Data Analysis | SandboxRun、ContainerLease、Job、StdoutChunk、OutputArtifact、DownloadAsset。 | container allocated -> job running -> outputs checkpointed -> scanned -> artifact published。 | lease 超时重调度;stdout/stderr 和 manifest 可重放给用户。 | 资源配额、文件 allowlist、病毒扫描、产物继承项目/租户 ACL。 |
| Canvas | Artifact、ArtifactVersion、Patch、SelectionAnchor、PreviewRun、ExportJob。 | create -> patch -> preview/export -> share/rollback/delete。 | base_version 不匹配时 rebase 或询问;预览失败不覆盖 current_version。 | artifact-level ACL、preview sandbox、下载扫描和分享 pin version。 |
| Apps / synced connectors | AppGrant、OAuthScope、ConnectorSyncCursor、SourceSnapshot、AppActionReceipt。 | authorize -> sync -> query/use -> revoke/stale/purge。 | sync cursor 可回放;provider 状态 unknown 进入 reconciliation job。 | scope、admin policy、query-time ACL、写动作 approval 和撤权传播。 |
| Tasks / Pulse / Deep research | Schedule、Run、ResearchPlan、CitationLedger、Report、NotificationState。 | scheduled/triggered -> leased -> checkpointed -> report/card -> notified/saved。 | deadline miss 和 worker crash 后按 run_id/checkpoint 重试或 late notification。 | Pulse 依赖 memory 和 app opt-in;引用必须可追溯;预算超限降 fanout。 |
| Group chats | GroupChat、GroupMember、InviteLink、MentionEvent、GroupPolicySnapshot。 | created -> invited/joined -> active -> archived/deleted/expired link。 | 成员/邀请/消息 visibility 独立重放;个人聊天和群聊不互相合并。 | 个人 memory/custom instructions 不进入群聊;成员策略、teen safety 和 audit 分开记录。 |
最后是治理和删除。ChatGPT 类系统的删除不是从 UI 列表移除一行,而是从 OLTP、对象存储、 向量索引、搜索索引、缓存、备份、评估候选和训练候选中逐步传播,同时受 workspace policy、 legal hold、数据驻留和 ZDR/retention 控制约束。
| 策略 | 适用范围 | 传播方式 | 备份 / 冷数据 | 例外 | 审计 |
|---|---|---|---|---|---|
| Tenant / workspace policy | 企业管理员的数据保留、分享、Apps、审计导出、区域和训练控制。 | 写入 tenant_policy_version;请求、context、tool、export 都校验同一版本或更高版本。 | 备份和冷归档继承 tenant_id、region 和 retention_until。 | 管理员 legal hold 或合规要求可阻止 purge。 | 每次 policy 变更、导出、拒绝和 fail closed 都写 audit_log。 |
| Temporary Chat | 临时聊天不出现在历史中,不读写 account memory;保留按产品策略单独处理。 | conversation.memory_mode = temporary;Context Builder 禁用 saved memory/reference history 写入。 | 临时会话对象和日志带 temporary retention tag。 | 安全、合规或滥用监控要求可能影响实际保留边界,设计中必须可配置。 | 记录 mode 决策,但避免把内容放进长期 personalization store。 |
| Business / API data controls / ZDR | Business/API 默认训练边界、API retention、ZDR 与不兼容工具能力。 | request envelope 带 data_control_mode;工具、文件、媒体和 background job 必须继承。 | ZDR/modified retention 下禁用或限制不兼容的持久化路径。 | 某些需要 application state 的工具或后台能力可能不可用。 | 记录被禁用功能和 policy_reason,便于企业解释。 |
| Delete / purge | 用户删除、管理员删除、项目/文件/artifact/vector chunk 删除。 | 先写 tombstone,阻断 read/context;purge job 清理 OLTP、object、vector、search、cache、derived analytics。 | 备份按 retention window 到期后清除或不可恢复;冷存储需可证明状态。 | legal hold、fraud/security investigation 或合同义务可延迟 purge。 | deletion_request、purge_job、skipped_due_to_hold、completed_at 全部可查。 |
| Eval / training candidates | 用户反馈、human label、eval sample、训练候选数据。 | 只从允许的数据控制模式和脱敏管道进入 candidate store。 | candidate 保存 source pointer 和 consent/policy snapshot,而不是无限复制原文。 | Business、API ZDR、opt-out、Temporary Chat 或敏感 policy 命中时不入候选池。 | 记录 sampling_reason、redaction、policy_version、review decision。 |
7. API、存储和事件流
把 ChatGPT 当成可恢复的事件系统,而不是一个 POST /chat
这一章把前面的产品能力落到 API、存储和事件流。公开资料只能证明 Responses API、Streaming、Realtime、 Apps、Agent、Data Analysis、Canvas、Deep research 等产品/API 语义;下面的表结构、队列和存储分层是 system design 面试推断,不代表 OpenAI 内部真实实现。
初学者最容易把系统想成 POST /chat -> 模型 -> 返回字符串。这在 demo 里能跑,但一到真实产品就崩:
用户会刷新页面、取消生成、重试请求、上传文件、让 Agent 执行外部动作、要求企业审计和删除传播。正确抽象是:
API 接受意图,数据库保存可恢复业务状态,运行时执行昂贵推理/工具,事件流把计费、审计、索引、通知和评估异步扇出。
第一张表是白板落点索引。它的重点不是背路径,而是说明每个能力的“同步边界、幂等键、真源、异步任务和降级路径”。 面试官追问到 Agent、Code Executor、Voice、Images、Deep research 时,也能自然挂回同一套 API/storage/event 模型。
| 模块 | 设计形态 | 关键取舍 |
|---|---|---|
| Conversation API | POST /v1/conversations;GET /v1/conversations?cursor=... | 列表用游标分页;conversation 带 tenant_id、project_id、home_region、archived_at 和 shared_policy。 |
| Response API | POST /v1/conversations/{id}/responses | Idempotency-Key = tenant_id + conversation_id + client_request_id;重复请求返回同一个 response_id。 |
| Stream contract | GET /v1/responses/{id}/events?after_seq=123 | SSE event 包含 id: seq、event_type、delta、usage_delta;429 返回 retry_after 和可降级模型。 |
| Cancel / resume | POST /v1/responses/{id}:cancel;GET events after last_seq | cancel 是状态变更,不保证 GPU 立即停止;resume 只重放已持久化事件,不生成新答案。 |
| Files / data analysis API | POST /v1/files;POST /v1/files/{id}:analyze | 文件有 scan、parse、index、sandbox_run、artifact 输出状态;下载链接和产物继承 tenant/project ACL。 |
| Voice / Realtime API | POST /v1/realtime/sessions;WebRTC / WebSocket events | ephemeral token 绑定用户、租户、模型、工具范围和过期时间;transcript checkpoint 与文本 response_events 对齐。 |
| Images API | POST /v1/images/jobs;GET /v1/media/{id} | 图片理解和图片生成都要过 media safety;生成/编辑任务保存 prompt revision、asset version、签名 URL 和删除传播。 |
| Projects / memory API | POST /v1/projects;PATCH /v1/memories/{id} | Project 指令、文件、成员和 project memory 分开存;memory 必须支持来源解释、禁用、删除和审计。 |
| Apps / OAuth API | POST /v1/apps/{id}:authorize;DELETE /v1/app_grants/{id} | OAuth grant 保存 scope、sync cursor、policy_version 和撤权时间;写动作要 approval_id 幂等确认。 |
| Tasks / Pulse API | POST /v1/tasks;GET /v1/pulse/items | 定时规则、触发器、后台 run、通知目标和失败重试要可暂停、可审计、可去重。 |
| Agent API | POST /v1/agent_runs;POST /v1/agent_runs/{id}:approve | Agent run 需要 plan、step、checkpoint、approval、watch/takeover 和 external action receipt,不能只存最终回答。 |
| Code Executor API | POST /v1/sandbox_runs;GET /v1/sandbox_runs/{id}/events | 容器 lease、资源配额、stdout/stderr chunk、artifact manifest 和下载扫描独立于普通模型 response。 |
| Deep research API | POST /v1/research_runs;GET /v1/research_runs/{id}/report | 研究计划、source fetch、citation ledger、checkpoint、预算和通知是长任务状态,适合后台 worker 承载。 |
| Artifacts / Canvas API | POST /v1/artifacts;PATCH /v1/artifacts/{id}/versions | Canvas patch、code preview、download asset 都是 artifact version;回滚只移动 current_version_id。 |
| Share / group API | POST /v1/share_links;POST /v1/group_chats | 分享链接固定版本和过期时间;群聊保存 member role、invite policy、notification preference 和审计事件。 |
| Admin / audit API | GET /v1/audit_logs;GET /v1/compliance/exports | 企业管理员按 tenant、actor、resource、policy decision 和 time range 查询;导出走异步任务和权限校验。 |
| OLTP store | users, projects, conversations, messages, generations, response_events | 主键按 tenant/time 分区;response_events 唯一索引 response_id + seq;业务热缓存失效不能导致丢数据。 |
| Redis business cache | conversation list、rate limit/quota snapshot、stream cursor、presence | OLTP 是真源,Redis miss 可重建;这里的缓存不是 GPU 上的 KV cache,也不能保存不可恢复状态。 |
| Usage / billing ledger | token_usage、tool_usage、invoice_events、quota_counters | 按 response_id + seq 或 event_id 幂等记账;账单和配额可重放修复,Kafka 不是最终账本。 |
| Object and vector store | files, artifacts, chunks, embeddings, ACL metadata | 上传原件进对象存储;chunk 带 tenant、project、source span、doc version、embedding model version 和 ACL。 |
| Outbox / Event stream | billing, audit, search index, eval samples, training candidates | 业务状态与 outbox_events 同一个 OLTP 事务提交;relay 异步发布到 Kafka/Pulsar,消费者按 event_id 幂等,失败不回滚用户响应。 |
| Audit / retention / deletion | audit_log、deletion_requests、tombstones、purge_jobs、retention_until、legal_hold | 审计日志 append-only;删除先 tombstone,再异步清理对象、向量和缓存副本;legal hold 会阻止 purge。 |
| Trace spine | request_id -> conversation_id -> response_id -> run_id | 同一次回答要串起路由决策、RAG 文档、tool call、GPU worker、batch id 和安全结果。 |
然后把 API 写成契约。一个高分回答会显式区分:创建请求是否幂等、流恢复是不是重新生成、取消是不是 GPU stop、 写外部 app 是否需要用户确认、后台任务如何暴露状态、限流错误能否安全重试。
| 产品面 | 示意路由 | 同步 / 异步模式 | 幂等与重试 | 权限 / 租户边界 | 流 / 任务状态 | 失败语义 |
|---|---|---|---|---|---|---|
| 创建会话 / 回答 | POST /v1/responses 或 POST /v1/conversations/{id}/responses | 同步创建 durable response,随后进入 queued/streaming/background。 | Idempotency-Key = tenant + conversation + client_request_id;重复请求只返回同一 response。 | Auth、tenant、project/group/share membership、model entitlement、region policy。 | 返回 response_id、status、stream URL;background=true 时返回 job 状态和轮询/通知入口。 | 主库不可写、policy unknown、quota exhausted 不进 GPU;429/503 带 retry_after 和可降级建议。 |
| 流式读取 / 断线恢复 | GET /v1/responses/{id}/events?after_seq=N;SSE Last-Event-ID | SSE 适合单向文本/工具增量;WebSocket/WebRTC 适合 Voice/Realtime 双向低延迟。 | response_id + seq 唯一;after_seq 和 Last-Event-ID 都是客户端恢复游标,不是新生成请求。 | 读取时重新校验 actor 对 conversation/response 的可见性和 tombstone。 | 事件包含 type、seq、delta、tool_state、usage_delta、heartbeat、final_state。 | gap/duplicate seq 触发 repair;relay 只能重放 durable log,不能凭内存补事件。 |
| 取消 / 继续 / 重新生成 | POST /v1/responses/{id}:cancel;POST /v1/messages/{id}:regenerate | cancel 是业务状态转移;regenerate 是新 generation 分支,不覆盖旧答案。 | cancel_id 幂等;regenerate 用新的 client_request_id,旧 response 保持可审计。 | 只有 owner、project/group 有权限成员或 admin policy 允许的 actor 可操作。 | cancel 写 CANCELLING/CANCELLED;GPU stop ack 只是运行时信号,可能晚到。 | cancel 与 completed 竞争时由状态机 CAS 决定;不能把已完成回答悄悄改成取消。 |
| Files / Data Analysis / Code | POST /v1/files;POST /v1/sandbox_runs;GET /events | upload/scan/parse/index/sandbox_run 多阶段;交互 turn 可等待必要 ready state。 | upload checksum、job_id、container lease、artifact manifest 幂等。 | 文件、项目、容器挂载和下载链接继承 tenant/project ACL 与 retention。 | stdout/stderr、progress、chart、artifact_ready 都是 job event。 | scan fail 不注入上下文;sandbox OOM/timeout 保留错误和已发布 artifact。 |
| Apps / Agent action approval | POST /v1/apps/{id}:authorize;POST /v1/tool_calls/{id}:approve | 读动作可短阻塞;高风险写动作必须用户确认,Agent 长任务按 checkpoint 继续。 | approval_id + provider_operation_id 防重复外部副作用。 | OAuth scope、admin allowlist、tenant policy、resource-level ACL、user confirmation。 | tool_call.proposed / approved / running / receipt / reconcile_required。 | provider unknown 不自动重放写动作;进入 reconciliation 或要求用户确认。 |
| Tasks / Pulse / Deep research | POST /v1/tasks;POST /v1/research_runs;GET /v1/pulse/items | 创建同步返回 schedule/run;执行、抓取、引用校验、通知异步。 | schedule dedupe_key、run_id、notification_id、saved_chat_id 防重复。 | 用户 opt-in、memory/app grant、workspace policy、source license/robots 约束。 | scheduled / leased / checkpointed / late / completed / failed / notified。 | deadline miss 发 late notification;来源不可验证不生成最终报告。 |
真实 ChatGPT 页面上能用到的功能,不应该散落成一堆“特殊 case”。下面这张功能落点表把每个功能压回同一组问题: 入口 API 是什么,必须先落哪类状态,哪些工作后台做,最终 artifact 是什么,审计证据在哪里。
| 功能 | 入口 | 必须持久化 | 后台工作 | 产物 | 审计 / 治理 |
|---|---|---|---|---|---|
| 普通聊天 / Search | Response API + stream events;Search 可作为 tool/source 事件出现。 | message、response、response_event、context_snapshot、source_span。 | 搜索索引、引用校验、标题生成、反馈采样。 | canonical assistant message、source panel、usage ledger。 | request_id、model_id、source provenance、policy decision、billing event。 |
| Voice / Realtime | ephemeral session + WebRTC/WebSocket event channel。 | session、audio chunk pointer、turn segment、transcript checkpoint、response_event。 | 媒体转码、音频对象清理、transcript reconciliation。 | 最终文本消息、语音播放状态、可恢复 transcript。 | ephemeral token scope、media retention、tool execution guard。 |
| Images | media upload / image generation job / image edit job。 | media_asset、safety_verdict、image_job、prompt_revision、asset_version。 | scan、生成排队、缩略图、签名 URL、删除传播。 | 图片版本、下载链接、编辑历史。 | media safety、prompt policy、asset ACL、usage/cost。 |
| Agent | agent_run + step event + approval API。 | plan graph、step、tool_call、checkpoint、approval、takeover_state。 | 浏览、文件处理、外部 app action、长任务恢复。 | 任务报告、截图、文件、最终 conversation summary。 | 每个外部动作的 scope、确认、receipt、policy decision。 |
| Code Executor / Data Analysis | sandbox_run + job event + artifact API。 | container lease、job、stdout/stderr chunk、artifact manifest、download asset。 | 资源回收、病毒扫描、图表渲染、导出。 | CSV、图表、notebook、日志、下载文件。 | resource quota、file mount list、network allowlist、scan result。 |
| Canvas | artifact create / patch / preview / export API。 | artifact、version、patch、selection_anchor、preview_run、export_job。 | preview sandbox、export build、download scan。 | 版本化文档/代码、diff、预览、导出文件。 | base_version、editor actor、share pin、preview isolation。 |
| Apps / Connectors | OAuth grant + sync cursor + tool action API。 | app_grant、scope、connector_sync_cursor、source_snapshot、action_receipt。 | 增量同步、ACL 刷新、撤权传播、reconciliation。 | 外部 source block、操作收据、可引用结果。 | admin policy、scope、provider_operation_id、query-time ACL。 |
| Tasks / Pulse / Deep research | schedule/research run API + notification API。 | schedule、run、checkpoint、research_plan、citation_ledger、notification_state。 | worker lease、source fetch、报告合成、通知、保存到聊天。 | Pulse card、研究报告、引用、保存的 conversation。 | opt-in memory/app data、budget、source provenance、late/failure 状态。 |
| Group chats / Share | group_chat / invite / share_link API。 | group、member、invite token hash、share pinned version、visibility policy。 | 通知、邀请过期、索引、导出。 | 群聊消息视图、固定分享快照。 | membership、role、teen/safety mode、unsupported-tool gate。 |
存储层要先分清真源和派生视图。OLTP、response event log、usage ledger、audit log 是恢复和追责的核心; Redis、vector/search、部分 trace 是性能层或可重建视图。Redis 缓的是业务热状态,不是 GPU 上的 KV cache。
| 平面 | 是否真源 | 键 / 分区 | TTL / 保留 | 重建路径 | 失败模式 |
|---|---|---|---|---|---|
| OLTP truth | users、tenants、projects、conversations、messages、responses、tool_calls、idempotency_ledger、outbox。 | tenant_id + home_region + resource_id;response_events 用 response_id hash + created_at。 | 按 workspace retention、Temporary Chat、ZDR、legal hold 和 cold archive 策略打 tag。 | 从 WAL/backup/object manifest 恢复;派生索引从真源回放。 | 主库不可写时拒绝创建回答;不能先跑模型再补消息。 |
| Response event log | 用户已经看到的 delta、tool event、usage_delta、final_state 的可重放日志。 | response_id + seq 唯一;按 response_id 分片,created_at 滚动分区。 | 热事件保近期恢复;冷事件可压缩成 immutable transcript + audit pointer。 | canonical assistant message、账本、trace 可以从完整事件重建。 | seq gap 或 final mismatch 时不标 completed,触发 repair/reconcile。 |
| Redis business cache | 不是。只放 rate limit、quota snapshot、conversation list、presence、短期 stream cursor。 | tenant/user/model/feature 维度限流;hot key 用 sharding 和 local cache 降压。 | 秒到小时级 TTL;策略变更、删除、quota 更新要主动失效。 | miss 后从 OLTP/ledger/policy service 重建。 | Redis 不可用时保守限流或降级,不能丢业务真源;它不是 GPU KV cache。 |
| Object store / media store | 上传原件、图片/音频、artifact 文件、sandbox output、冷归档 manifest。 | tenant/region/resource_type/date/object_id prefix;metadata 带 ACL 和 retention。 | signed URL 短 TTL;对象按 retention_until、delete tombstone、legal hold lifecycle。 | parse result、thumbnail、embedding 可从对象和 manifest 重建。 | 对象不可读时不注入上下文;下载/分享显示延迟或失败状态。 |
| Vector / search index | 不是。保存 chunk、embedding、ACL metadata、version,用于低延迟检索。 | tenant/project/source_id/chunk_id + embedding_model_version。 | 跟随源文档版本和 tombstone;stale index 不允许绕过 query-time ACL。 | 从 file/object/source_snapshot 重新 parse、chunk、embed、index。 | 索引延迟时降级为无 RAG 或 no-answer;不能返回已删除/无权限 chunk。 |
| Usage ledger | 是。token、tool、sandbox、media、connector cost 的 append-only 账本。 | tenant_id + billing_period + event_id;response_id + seq 幂等。 | 账务保留通常长于产品热数据;按合同和合规归档。 | 从 response_events/tool events 补偿,但最终以 ledger reconciliation 为准。 | ledger drift 告警并补偿;不能因 Kafka 重投而重复扣费。 |
| Audit / compliance log | 是。actor、resource、policy decision、admin action、export/delete/approval 证据。 | tenant_id + time + actor/resource;写入 append-only sink 和冷归档。 | 按企业 retention、legal hold、data residency 分区保存。 | 可从业务事件补字段,但关键安全事件丢失必须阻断高风险功能。 | 企业审计缺关键字段时暂停导出/高风险工具,而不是静默成功。 |
| Trace / metrics | 调试和 SLO 证据,不是用户业务真源。 | request_id -> response_id -> run_id;按 service/model/region/tier 聚合。 | 热 trace 短保留,指标长期聚合;敏感 payload 脱敏或只存 pointer。 | 不能完全重建,但可从 event/audit/ledger 交叉定位事故。 | 观测降级不阻塞 P0 chat,但会限制发布和高风险功能。 |
事件流不是“把所有东西丢 Kafka 就完事”。可靠设计要说明 producer、ordering key、投递语义、consumer 幂等、 lag SLO 和降级动作。多数业务要的是 exactly-once effect,而不是相信某个消息系统替你消灭所有重复。
| 事件类 | 生产者 | 排序键 | 投递语义 | 消费者 | Lag / 故障动作 |
|---|---|---|---|---|---|
| response_events | Stream relay / persist worker | response_id,seq 单调。 | 客户端可见前 durable append;relay at-least-once 发送,客户端按 seq 去重。 | 浏览器恢复、canonical message builder、usage sampler、eval sampler。 | append latency 高时降低 chunk 频率、退回轮询或暂停低优先级生成。 |
| outbox_events | Conversation OLTP transaction | tenant_id + aggregate_id;event_id 幂等。 | 业务状态和 outbox 同事务;relay 到 Kafka/Pulsar at-least-once。 | billing、audit、search index、notification、export、analytics。 | outbox_lag 烧错误预算;先保 P0 chat,暂停索引/通知/研究 fanout。 |
| usage_events | response/tool/sandbox/media finalizer | usage_event_id;response_id + seq 去重。 | ledger exactly-once 效果由幂等键实现,不靠消息队列承诺。 | quota、invoice、cost dashboard、abuse/cost guardrail。 | quota snapshot 过期时保守限流;ledger drift 进入 reconciliation。 |
| audit_events | policy、admin、approval、delete、share、app action | tenant_id + audit_event_id;时间顺序用于查询,不用于授权。 | append-only;关键安全事件同步写或高优先级 outbox。 | 企业审计导出、合规保留、安全调查。 | audit sink lag 超阈值时关闭高风险外部写动作和导出成功标记。 |
| background_job_events | Tasks、Pulse、Deep research、Agent、Code worker | run_id + checkpoint_seq。 | lease + checkpoint + retry;通知和保存聊天用 dedupe key。 | scheduler、notification、conversation saver、user status UI。 | deadline miss 发 late 状态;按预算降低 fanout 或停止低优先级 job。 |
| delete / retention events | user/admin delete、retention sweeper、legal hold service | tenant_id + resource_id + tombstone_version。 | 先写 tombstone 阻断读,再异步 purge object/vector/search/cache。 | context builder、search/vector purge、object lifecycle、audit export。 | tombstone 未传播时 fail closed,不把可疑 source 注入模型。 |
最后把高并发和高可用写成面试可追问的可靠性矩阵:如何背压、哪里需要有序、哪里允许最终一致、 多区域如何满足数据驻留、RPO/RTO 怎么分层、缓存失效和取消竞态如何处理。
| 关注点 | 契约 | 指标 | 降级 | 常见陷阱 |
|---|---|---|---|---|
| Backpressure | Gateway admission 看 GPU queue、DB 写入、outbox lag、sandbox/connector 队列,而不是只看 HTTP QPS。 | accepted_qps、queue_wait、db_write_p99、outbox_lag、sandbox_queue_depth。 | 限流、排队、降模型、缩上下文、关闭 Agent/Deep research/图片生成新任务。 | 只在 Nginx 层限流,会把已接入请求堆死在 GPU 或数据库。 |
| Exactly-once 误区 | 外部效果用幂等键和账本达成 exactly-once effect;队列本身按 at-least-once 设计。 | duplicate_event_rate、idempotency_conflict、ledger_drift、provider_reconcile_count。 | consumer 幂等重放、账本补偿、外部 provider unknown 时暂停自动重试。 | 说“Kafka 保证 exactly-once,所以不会重复扣费”会被继续追问到崩。 |
| Ordering | 用户可见流按 response_id 严格有序;跨 response、billing、audit 只要求可关联和幂等。 | seq_gap、duplicate_seq、final_rebuild_mismatch、consumer_reorder_count。 | missing seq 不 completed;从 durable log 重建 partial,触发 repair。 | 要求所有 topic 全局有序会牺牲扩展性,也不是业务真正需要。 |
| Multi-region / residency | tenant home_region 决定强一致写;跨区副本只读或灾备,异步 job 继承数据区域。 | replication_lag、cross_region_blocked、rpo_checkpoint_age、region_failover_time。 | 区域不满足时 fail closed;历史只读;暂停不合规 connector/Agent/Code。 | 把所有数据多活写全局库,会和数据驻留、删除传播、成本一起冲突。 |
| RPO / RTO | P0 conversation/message/response RPO 接近 0;vector/search/cache 可延迟重建;冷历史可慢恢复。 | durable_commit_latency、checkpoint_age、restore_time、cold_read_latency。 | 保当前聊天写入;历史搜索和导出延迟;冷数据只读或显示恢复中。 | 给所有子系统同一个 99.99% 和 RPO 0,成本不现实,也没有体现优先级。 |
| Cache invalidation | 权限、删除、quota、memory 和 project policy 变更以版本号/tombstone 驱动缓存失效。 | stale_cache_hit、policy_version_mismatch、tombstone_lag、acl_unknown_rate。 | 版本不确定时绕过缓存或 fail closed;不注入 RAG/memory/source。 | 把 Redis 当 truth,会在删除、撤权、企业策略变更时泄漏上下文。 |
| Cancel race | cancel 是业务状态;GPU stop 是 best-effort runtime signal;终态由状态机事务决定。 | cancel_ack_lag、late_delta_after_cancel、cancel_completed_race、slot_release_latency。 | 停止向客户端 flush late delta;释放运行时资源;保留 partial/cancelled 事件。 | 承诺 cancel 后 GPU 立即停止,会忽略已经在 decode/网络缓冲里的 token。 |
| Hot / cold data | 当前会话、recent events 和 rate limit 在热层;旧附件、完整 trace、历史事件归档到冷层。 | hot_table_size、partition_skew、archive_lag、cold_restore_p95。 | 旧历史懒加载;冷恢复慢不影响当前 P0 chat。 | 无限保留热表会让索引、备份和删除成本不可控。 |
这一章答完后,面试官如果继续追问“怎么扩到百万并发流”“断网后怎么恢复”“外部工具会不会重复执行” “删除如何传播到向量索引”“为什么账单不会重复扣费”,都能回到同一套不变量:同步路径只做必要耐久写, 昂贵工作可异步,所有副作用可幂等重放,权限和删除优先于体验。
8. 上下文和记忆
Context Builder 是权限、证据和预算的编译器
上下文不是“把历史全塞进 prompt”。它是本轮请求发给模型的工作集:高优先级指令、当前任务、最近历史、 可用记忆、项目文件、RAG/Search、Apps、工具输出和长任务 checkpoint 都要先经过权限、删除、来源、排序和 token budget。 本章基于公开 ChatGPT 帮助文档和 API 文档做面试设计推断,不代表 OpenAI 内部真实实现。
第一原则很简单:模型只能看到上下文窗口里的东西,但系统不能因为窗口有限就丢掉权限边界,也不能因为有记忆就把历史当数据库。 所以 Context Builder 更像一个编译器:把很多候选来源编译成一个有优先级、有引用、有版本、有预算的 model input。
先用一个总表把常见名词分清。上下文窗口是本轮模型输入;saved memory 是用户级长期偏好; Reference chat history 是按需检索历史;Project memory 和项目文件受项目边界控制;RAG、Apps 和工具输出只是外部证据。
| 策略 | 做什么 | 风险和取舍 |
|---|---|---|
| 指令层级 | root / platform policy > system > developer > user > guideline;外部资料默认 No Authority | assistant/tool/RAG/网页/文件/quoted content 默认没有指令权限,除非高权限显式委托;历史里的用户约束只有在仍相关且未被后续同层指令覆盖时才保留。 |
| 装箱优先级 | 先放当前任务和硬约束,再按价值放 history、memory、RAG / tools evidence | 这是 token packing 规则,不是权限规则;RAG 和工具输出只能作为证据,不能升级成命令。 |
| 最近窗口 | 保留最近多轮原文 | 解决追问和当前任务连贯性,成本最低但覆盖有限。 |
| 摘要 | 旧历史压成结构化 summary | 摘要只能降低历史成本,不能替代事实来源;关键约束要能回溯到原始消息,防止摘要漂移。 |
| 记忆 | 跨会话保存稳定偏好和事实 | 必须可解释、可删除、可禁用,不能把敏感短期信息默认长期化。 |
| ChatGPT 记忆边界 | 把 Saved memory、Reference chat history、Project memory、Temporary Chat 分开建模 | Saved memory 是可管理的长期偏好/事实,是否可用受个人和 workspace 开关控制;可由用户要求或系统提炼,但不适合保存大段原文。 |
| Reference chat history | 按需从历史聊天找相关上下文,不是逐字全量历史 | 关闭 Reference saved memories 会同时关闭 Reference chat history;saved memories 开启时,chat history 仍可单独关闭;Enterprise/Edu 中不可用。 |
| Project memory | default、project-only、shared project 的边界不同 | default project memory 的聊天引用范围按套餐不同:非 Enterprise/Edu(含 Business)可引用项目内外相关上下文,Enterprise/Edu 主要限制在项目内;功能可用性还受开关影响,Enterprise/Edu 需要个人 Reference saved memories 与 workspace Memory,其他订阅通常需要 Reference saved memories 和 Reference chat history;project-only 私有项目只引用同项目聊天/文件和项目指令,且只能新建项目时选择;shared projects 自动变成 project-only,且不访问成员的项目外个人上下文、saved memories 或 global custom instructions,也不可恢复成 default,但仍可使用项目内 instructions、files、chats。 |
| Temporary Chat | 不访问或创建用于个性化的 memory | 不会出现在历史中,也不会用于改进模型;custom instructions 开启时仍会遵守;为安全/合规目的可能保留副本至多 30 天,并在少数高风险场景使用有限安全相关上下文。 |
| 检索 | 按当前问题找相关历史或文件 | 召回要带权限过滤和引用位置,不能只按向量相似度盲塞。 |
| 外部证据 / 工具结果 | RAG chunk、网页、文件、工具输出都按 untrusted evidence 处理 | 进入上下文前做 query-time ACL、delete/revoke filter、source span/citation/provenance 和 sanitizer:ACL 是按用户/项目权限即时过滤,source span 记录文档版本、chunk 和 offset;外部内容要用 untrusted/source block 包装并保留来源,sanitizer 只做脱敏、标记和明显恶意片段处理,真正的权限边界由指令层级和工具 ACL 保证。 |
| 预算 | 先预留输出 token 再塞上下文 | 先保 system、安全规则、当前请求和显式约束,再按 recent history、RAG evidence、tool results 的价值裁剪。 |
接着把所有来源按“作用域、指令权、版本、排除条件、降级”建模。面试时这张表能直接回答: 为什么网页不能给系统下命令,为什么共享项目不读个人记忆,为什么删除中的文件宁可不答也不能注入。
| 来源 | 作用域 | 指令权 / 证据权 | 新鲜度 / 版本 | 排除条件 | 降级 |
|---|---|---|---|---|---|
| System / developer / product policy | 本轮请求的最高优先级约束、租户策略、工具可用性和安全策略。 | 有指令权;不能被用户、网页、文件、RAG 或工具输出覆盖。 | 随 policy_version、prompt bundle version 和 feature flag 发布。 | 策略服务 unknown、版本不一致或租户不匹配时 fail closed。 | 停用高风险工具、缩小能力面、返回安全模板或要求稍后重试。 |
| Current user turn | 当前文本、图片、语音 transcript、附件意图、选择的 model/tool/project。 | 用户意图有任务权,但不能越过更高优先级政策和工具权限。 | 请求接入时冻结到 context_snapshot,避免重试时读取漂移。 | 输入扫描失败、文件未 ready、媒体策略 unknown 时不进入模型。 | 澄清、只处理文本、等待文件扫描或禁用对应 modality。 |
| Recent conversation turns | 最近多轮原文、分支、tool result、response final state。 | 提供任务连续性;旧用户约束只在仍相关且未被同层后续消息覆盖时保留。 | 按 conversation branch 和 message version 固定。 | 已删除、被分享视图隐藏、群聊不可见或跨项目边界的消息不注入。 | 只保最近窗口;旧历史压摘要或要求用户重新提供上下文。 |
| Saved memory / Reference chat history | 稳定偏好、长期事实、相关过往聊天线索、memory sources。 | 低于当前用户指令;只作为 personalization evidence,不是硬指令。 | memory_version、source_event、top-of-mind 排序和用户开关决定。 | Temporary Chat、memory off、删除中、source 不可解释或 workspace 禁用时不使用。 | 关闭 memory 路径,显示未个性化回答,或要求用户显式确认。 |
| Projects / project files / project memory | 项目指令、项目内聊天、文件、成员、shared project 边界和 project-only mode。 | 项目指令只在项目上下文内有效;共享项目不读取成员个人 memory/custom instructions。 | project_policy_version、file_version、membership_version、memory_mode。 | 成员无权限、文件 tombstone、shared project 禁止个人上下文、project-only 限制外部历史。 | 忽略无权限文件、降级为项目内聊天、提示重新授权或重新上传。 |
| RAG / Search / synced connectors / Apps | 网页、搜索结果、连接器文档、Gmail/Drive 等同步来源、app tool result。 | 默认 No Authority;只能当证据,不可作为系统指令执行。 | source_snapshot、sync_cursor、ACL decision、retrieval time、citation span。 | connector stale、OAuth revoked、query-time ACL unknown、robots/license/policy 不允许。 | 无来源回答、no-answer、要求重连 app、降低召回 fanout。 |
| Data Analysis / Code artifacts | 文件解析结果、stdout/stderr、表格摘要、图表、notebook、download artifact。 | 工具结果是证据;代码输出不能修改上层指令和权限。 | sandbox_run_id、artifact_version、scan_result、file_version。 | 扫描失败、artifact 未发布、container expired、文件权限撤销。 | 重跑沙箱、只引用已发布产物、提示文件过期或需要重新上传。 |
| Agent / Tasks / Pulse / Deep research | Agent 计划/checkpoint、Tasks schedule、Pulse/Deep research source、citation ledger、通知和保存为聊天的结果。 | checkpoint 是任务状态,不是新的用户授权;高风险动作仍要 approval。 | run_id、checkpoint_seq、deadline、citation verification、notification_state。 | 任务取消、预算耗尽、source 不可验证、memory/app opt-in 不满足;Agent mode 不能访问 apps with sync 数据;Tasks 不支持文件上传/GPTs,且在带文件的 Project 中创建时不能访问项目文件。 | 发送 late/failure 状态、降低研究深度、要求用户恢复任务。 |
| Group chats / shared views | 群聊消息、成员角色、群设置、邀请链接、分享固定版本。 | 群聊上下文只在群聊空间内有效;个人 memory/custom instructions 不进入群聊。 | membership_version、visibility_version、pinned_share_version。 | 非成员、邀请过期、个人上下文、删除 tombstone;Canvas、Voice、Python/Data Analysis、Deep Research、Tasks and Apps、Agent mode、账号级 memory/custom instructions 不进入群聊。 | 仅展示可见历史,禁用群聊不支持功能,提示需要成员权限或回到个人/项目聊天。 |
后端实现上,Context Builder 不能散落在业务代码里临时拼字符串。它应该是一条可观测流水线: 发现候选、查权限、去重排序、按模型 tokenizer 装箱、写 snapshot,然后在回答后做摘要和 memory candidate。
| 阶段 | 输入 | 决策 | 状态 / 版本 | 失败处理 | 指标 |
|---|---|---|---|---|---|
| 1. Resolve envelope | principal、tenant、conversation/project/group、model、mode、client_request_id。 | 确定 home_region、workspace policy、memory mode、feature flags 和 data controls。 | context_request_id、policy_version、route_reason。 | tenant/policy/region unknown 时不构建上下文;避免跨区或跨租户误读。 | policy_lookup_p99、unknown_policy_rate、region_mismatch。 |
| 2. Candidate source discovery | 当前问题、最近历史、项目、memory、files、connectors、tool state。 | 先生成 source candidate,不立刻注入;每个 candidate 带 source_type 和 owner。 | candidate_set_id、retrieval_query、source pointers。 | connector timeout、vector store 延迟、memory service 降级时只影响对应 source。 | retrieval_p95、candidate_count、connector_stale_rate、memory_lookup_error。 |
| 3. Authorization / freshness filter | candidate_set、ACL、membership、OAuth scope、tombstone、retention policy。 | query-time ACL、delete/revoke/tombstone、source freshness、license/robots 逐项过滤。 | acl_decision_id、tombstone_version、source_snapshot_version。 | ACL unknown 或 tombstone 未确认时 fail closed,不注入可疑 source。 | acl_unknown_rate、filtered_candidate_rate、tombstone_lag。 |
| 4. Rank / dedupe / cite | 授权后的候选源、source spans、embedding/BM25/recency/intent features。 | 按 task relevance、authority、recency、diversity、cost、citation quality 排序。 | ranker_version、selected_source_ids、citation_span_ids。 | 引用不足时选择 no-answer 或无来源回答,不能伪造 citation。 | source_precision_feedback、citation_missing_rate、dedupe_ratio。 |
| 5. Token accounting / packing | model tokenizer、input budget、reserved output、system/user/source blocks。 | 先保硬约束和当前任务,再按价值密度放 recent/history/memory/RAG/tool evidence。 | pack_plan_id、token_estimate、truncation_reason。 | 估算偏差过大导致截断或输出预算不足;触发 safety margin 和重 pack。 | token_estimate_error、pack_latency、dropped_useful_source_rate。 |
| 6. Snapshot / replay | 最终 model input、source versions、policy versions、pack order、taint labels。 | 写 context_snapshot,供断线恢复、审计、调试、eval 和 rerun 对齐。 | context_snapshot_id、source_manifest、prompt_hash、token_count。 | 没有 snapshot 就无法解释模型为什么看到某个文件或 memory。 | snapshot_write_latency、snapshot_missing_rate、replay_success。 |
| 7. Post-turn learning | 用户反馈、assistant response、tool result、memory candidate、eval sample。 | 提取 memory candidate、更新 summaries、写训练/eval 候选,但必须过数据控制。 | memory_candidate_id、summary_version、eval_sample_ref。 | Temporary Chat、Business/API/ZDR、opt-out 或 sensitive policy 命中时不进入长期个性化/训练候选。 | wrong_memory_write、summary_drift、candidate_policy_reject。 |
Token packing 不是“按时间倒序塞满”。要先预留输出,再保硬约束和当前任务,然后按 value/token cost 放来源。 不同类别的来源有不同丢弃规则:高优先级指令不能丢,外部证据可以丢,provider receipt 不能丢,长日志应变成 artifact pointer。
| 类别 | 排序信号 | 预算规则 | 必须保留 | 丢弃 / 压缩 | 风险 |
|---|---|---|---|---|---|
| Hard instructions | 优先级最高,不参与相关性排序。 | 必须完整放入;如果超预算,拒绝或切更大上下文模型。 | system/developer/policy、tenant controls、安全约束、当前用户请求。 | 不能为了 RAG 或历史删除高优先级指令。 | 把外部文档放在高优先级位置,会造成 prompt injection。 |
| Current task evidence | 当前附件、选中文本、Canvas selection、user-highlighted source。 | 优先保留与当前操作直接相关的 span,而不是整文件。 | selection anchor、file version、artifact base_version、tool input。 | 大文件按 section/chunk 裁剪;保留 citation pointer。 | 没有 anchor/version,Canvas patch 或代码修改会落到错误位置。 |
| Recent turns | 时间近、对当前问题有 coreference、包含未完成 tool state。 | 保最近 N 轮原文;更旧内容转 summary 或检索。 | 用户纠正、未完成承诺、活跃 tool call、当前分支。 | 闲聊、重复解释、已被新消息覆盖的约束优先丢。 | 只看最近窗口会漏长期约束;只看摘要会产生摘要漂移。 |
| Saved memory / profile | 用户开关、top-of-mind、来源可信、与当前任务相关。 | 短句优先;大段原文不进 memory,source pointer 可回溯。 | 用户显式要求记住且未删除的稳定偏好。 | Temporary Chat、删除、敏感或低置信 memory 不使用。 | 把一次性隐私信息长期化,或在共享/群聊中泄漏个人上下文。 |
| Project / RAG / connector evidence | BM25/embedding、recency、source authority、ACL confidence、citation quality。 | 按 chunk value / token cost 排序,保多样性并限制同源占比。 | 用户显式指定文件/网页、必要引用、source span。 | stale、无 ACL、重复、低相关或 citation 不可追溯的 chunk。 | 向量相似不等于授权;旧索引可能包含已删除内容。 |
| Tool / Agent / Code state | 活跃 run、未完成 step、错误恢复需要、用户接管点。 | 保 checkpoint summary + 必要 artifact manifest,不塞完整日志。 | approval state、provider receipt、container/job status、error code。 | 长 stdout/stderr、重复 trace、可从 artifact 拉取的二进制内容。 | 丢 provider receipt 会导致重复外部动作;塞完整日志会浪费上下文。 |
再把真实 ChatGPT 功能映射到上下文边界。这样回答 Agent、Canvas、Code Executor、Tasks/Pulse、 Deep research、群聊和 Apps 时,不会只说“都放 prompt”,而是能说清哪些能进、哪些绝不能进、如何恢复和审计。
| 功能 | 允许进入上下文 | 禁止进入上下文 | Snapshot 字段 | 恢复 | 治理 |
|---|---|---|---|---|---|
| Projects / files | 项目指令、项目文件、项目内聊天、项目 memory,按 membership 和 memory_mode 注入。 | shared project 不能读取成员个人 saved memories、global custom instructions 或项目外私有聊天。 | project_id、membership_version、file_version、memory_mode、instruction_version。 | 文件删除或移动后,旧 context snapshot 仍可审计;新请求按 tombstone 过滤。 | 共享/移动项目触发索引和缓存失效;无权限 source fail closed。 |
| Memory / Reference chat history | 相关 past chats、saved memories、custom instructions 和可展示的 memory sources。 | Temporary Chat、用户关闭 memory/history、Enterprise/Edu 不支持的 Reference chat history、删除中 memory。 | memory_id/hash、source_event_id、memory_version、top_of_mind flag。 | memory 服务失败时不阻塞 P0 chat;回答标为未个性化。 | 删除 memory 不改写历史,但要阻断未来使用并记录 tombstone propagation。 |
| Group chats | 群聊消息、群设置、成员可见历史和群内 instructions。 | 个人 memory、个人 custom instructions、非成员可见内容;Canvas、Voice、Python/Data Analysis、Deep Research、Tasks and Apps、Agent mode、账号级 memory/custom instructions。 | group_id、member_version、visibility_version、unsupported_feature_gate。 | 成员变更后旧流按创建时 snapshot 完成,新请求重新鉴权。 | 群聊、分享和个人空间分表/分 namespace;邀请 token 只存 hash。 |
| Apps / synced connectors | 授权 scope 内、query-time ACL 通过、sync cursor 足够新的 source block 或 tool result。 | OAuth revoked、admin 禁用、provider ACL unknown、外部内容中的指令升级。 | app_grant_id、scope_hash、sync_cursor、source_snapshot_id、taint=untrusted。 | stale connector 降级为无连接器回答或要求重新授权。 | 最小披露给 app;写动作仍走 approval;Agent mode 不能直接访问 apps with sync 的数据,要用其允许的 app/source 路径。 |
| Data Analysis / Code Executor | 用户授权文件、解析摘要、sandbox output、artifact manifest、图表和下载产物指针。 | 扫描失败文件、过期容器私有状态、未发布 artifact、无权限项目文件。 | file_id、parse_version、sandbox_run_id、artifact_version、scan_result。 | 容器不可恢复时从文件和 manifest 重建;stdout 长日志走对象存储引用。 | artifact 继承 tenant/project ACL;下载和分享前重新扫描。 |
| Agent | 当前 agent_run 的计划、checkpoint、已确认 tool result、用户 watch/takeover 状态。 | 未确认高风险动作、外部 provider unknown 状态、跨任务 private state、apps with sync 数据的直接访问。 | run_id、checkpoint_seq、approval_id、action_receipt、budget_state。 | 从 checkpoint_seq 恢复;重复动作靠 action_id/provider_operation_id 幂等。 | 模型只能建议动作;orchestrator 负责权限、确认和审计。 |
| Tasks | 用户显式创建的 one-off/recurring schedule、任务说明、通知目标和任务所在 conversation 的必要上下文。 | Voice chats、File Uploads、GPTs;在带文件的 Project 中创建 task 时,task 不能访问项目文件。 | task_id、schedule_version、conversation_id、notification_state、active_task_quota。 | 任务离线执行;完成后通知;deadline miss 或 worker failure 记录 late/failed 状态。 | 最多活跃任务数、计划用量限制、Compliance API 可见性、pause/delete/edit 全部审计。 |
| Pulse / Deep research | Pulse opt-in memory/app context、research plan、source manifest、citation ledger、报告草稿。 | 用户未 opt-in 的 app 数据、过期/不可验证 source、训练禁用数据进入候选、群聊中不支持的 Deep Research。 | run_id、deadline、source_manifest、citation_ledger_version、notification_state。 | deadline miss 变 late notification;研究可从 checkpoint 继续或让用户重启。 | 引用必须可追溯;预算超限降 fanout/深度;保存为 chat 用 dedupe key。 |
| Canvas / artifacts | 当前 artifact version、selection anchor、patch context、preview result 和 export manifest。 | 过期 base_version 上的 blind patch、无权限 artifact、预览沙箱未通过产物。 | artifact_id、base_version、selection_anchor、patch_id、preview_run_id。 | base mismatch 时 rebase 或询问用户;预览失败不覆盖 current_version。 | 分享 pin version;artifact ACL 和 conversation ACL 分开校验。 |
高并发场景下,上下文构建常常比模型调用更像“慢依赖聚合器”:向量检索、连接器同步、memory 读取、文件解析、 权限过滤和 token 估算都可能拖慢首 token。高可用设计必须明确哪些是 P0 依赖,哪些可以降级。
| 关注点 | 契约 | 指标 | 降级 | 常见陷阱 |
|---|---|---|---|---|
| Context build cache | 缓存 key 必须包含 tenant、principal、conversation branch、policy_version、source versions、model/tokenizer。 | cache_hit_rate、stale_hit_rate、pack_latency、token_estimate_error。 | 版本不确定时绕过缓存;只保 current turn + recent turns。 | 只按 prompt text 缓存,会把别人的文件、memory 或权限结果复用过来。 |
| Retrieval latency | RAG/search/connectors 按 deadline 和 source class 并发;慢源不拖死 P0 chat。 | vector_p95/p99、connector_p99、source_timeout_rate、deadline_miss。 | 减少 fanout、关闭慢 connector、无来源回答、显示 source stale。 | 等待所有来源返回会把首 token 延迟变成最慢依赖延迟。 |
| Memory service failure | memory 是增强,不是 P0 chat 依赖;写入候选异步化,读取失败可降级。 | memory_lookup_error、wrong_memory_write、deleted_memory_use、memory_apply_latency。 | 不使用 memory、冻结写入、标记未个性化、重放删除 outbox。 | memory 服务挂了就让整个聊天失败,或更糟的是使用过期缓存。 |
| Delete / revoke propagation | tombstone 优先于检索体验;ACL unknown、tombstone lag、OAuth revoked 都不注入。 | tombstone_lag、acl_unknown_rate、revoked_source_hit、purge_job_age。 | fail closed、重建索引、绕过 stale cache、要求重新授权。 | 只从向量库删,不从摘要、缓存、memory candidate、artifact manifest 删。 |
| Prompt injection / taint | 外部 source block 带 taint=untrusted 和 authority=no;工具 schema 和上层指令在隔离通道。 | injection_pattern_rate、unsafe_tool_call_blocked、source_authority_violation。 | 去掉来源、改成引用摘要、要求确认、禁用写工具。 | 把网页内容拼在 system prompt 附近,模型可能把网页文字当高优先级命令。 |
| Cost / token budget | 按 source value/token cost 装箱,预留输出和工具预算;长上下文不是免费扩容。 | input_tokens、output_truncation_rate、context_cost_per_turn、dropped_source_feedback。 | 压缩摘要、减少 chunk、切 cheaper model、要求用户选择文件范围。 | 无脑塞满最大上下文,会拉高 TTFT、成本和幻觉风险。 |
| Snapshot replay | 每次回答都有 context_snapshot_id,可解释模型看到的 source、版本、权限和 pack order。 | snapshot_missing_rate、replay_success、source_manifest_mismatch。 | 缺 snapshot 的回答不进入训练/eval;事故调试只做 best-effort。 | 只记录最终 prompt hash,不记录 source versions,无法解释删除后为何仍被引用。 |
| Tenant isolation | 所有 source candidate、cache、embedding、summary、memory、trace 都带 tenant/project/group boundary。 | tenant_mismatch_blocked、cross_project_source_attempt、isolation_violation。 | 策略 unknown 或 namespace mismatch 直接 fail closed。 | RAG 按全局 embedding 召回后再过滤,容易产生侧信道和热 key 泄漏。 |
上图是装箱示例,不是固定百分比。reserved output 不会作为输入片段发送给模型,而是从总 context window 里预留给生成阶段,避免回答中途因为输出预算不足被截断。面试中要强调:更大的 context window 只是上限, 不是把所有历史、文件和网页都塞进去的理由;权限、引用和成本仍然先于“多塞一点”。
9. LLM 推理和 GPU 调度
高分点在 token 级调度,不在“加机器”
普通后端按 request 扩容,大模型 serving 还要按 token、显存、KV cache、batch 和模型副本调度。 如果候选人能讲清 prefill/decode、KV cache 和 continuous batching,面试官通常会认为你理解真实瓶颈。
公开资料可以证明 PagedAttention、chunked prefill、prefix cache、TTFT/TPOT、Realtime API 和 Agent 等关键语义;Dynamo、DistServe 和 Splitwise 证明 prefill/decode 分池是公开可讨论的 serving 架构。 但 ChatGPT 内部如何落地模型池、队列和故障恢复仍是面试推断。第一原则是:ChatGPT 的“聊天、文件、代码、Canvas、Agent、语音、图像、定时任务” 最终都会把不同形状的上下文、工具结果和用户时延目标,压到同一组稀缺资源:GPU 算力、HBM、KV block、stream relay 和后台工具池。
λ_req 是 accepted requests/s;t_in/t_out 是每请求输入/输出 token;r_prefill/group 和 r_decode/group 分别是每个 GPU group 压测得到的 prefill/decode tokens/s;u_target 是目标利用率折扣;s_i=t_in+t_out 是单请求 KV token; TP 是 tensor parallel 分片数,最终物理 GPU 数要用 group 数乘 TP。
| 变量 | 含义 | 面试解释 |
|---|---|---|
| T_admit / T_queue | 入口校验、限流、排队和等待 GPU slot 的时间 | 来自线上 trace 和压测;队列深度、租户优先级、deadline 和区域故障都会改变它。 |
| T_prefill / T_first decode / TPOT | 读 prompt、产出首 token、后续每 token 间隔 | prefill 受输入长度和 attention kernel 影响;TPOT 主要看 decode batch、KV 访问、采样和 stream relay。 |
| T_stream | 首 token 从 GPU worker 到 Stream Relay、再 flush 给客户端的时间 | 受跨进程队列、SSE/WebSocket buffer、网络 RTT、浏览器读取速度和断线重连策略影响。 |
| L / H_kv / D_h / B_e | 模型层数、KV head 数、head dimension、KV 元素字节数 | 来自模型配置和量化方案;GQA/MQA 会让 H_kv 小于 attention heads,KV quant 会降低 B_e。 |
| Σ s_i | 同一个 GPU worker / TP group 内所有 active sequence 的当前长度总和 | 不要用 batch_size * max_len 粗估;真实 continuous batching 是变长序列,KV 随每步 decode 增长。 |
| H_kv / TP / ε_page | GQA/MQA 的 KV head 数、张量并行切分、分页碎片和 allocator overhead | PagedAttention / paged KV cache 降低碎片,但仍要留安全水位给临时 workspace、通信 buffer 和突发长上下文。 |
| λ_req / E[input tokens] | 峰值请求率和输入 token 均值,用于估算 prefill 需求 D_in | D_in = λ_req * E[input tokens];文件、RAG、项目上下文和长聊天会显著拉高 p95/p99。 |
| E[output tokens] / D_out | 输出 token 均值和峰值 decode 需求 | D_out = λ_req * E[output tokens];Agent 循环、代码生成和长答案会让 decode 池比普通聊天更快吃满。 |
| N_decode_groups | 满足峰值输出 token 需求所需的 decode GPU group 数 | 由 D_out、实测 r_decode/group 和目标利用率 u_target 推出;它是容量规划结果,不是用户请求数。 |
| r_decode/group | 在目标模型、硬件、batch、context 分布和 TPOT SLO 下实测的 output token/s | 这是压测结果,不是论文峰值;不同模型、量化、speculation 和并发形态会改变这个数字。 |
| u_target | 目标利用率安全水位,常低于 1 | 给突发、故障迁移、长上下文和 kernel 抖动留余量;高峰压到 100% 会直接放大 TTFT 和取消失败。 |
高质量答案要把产品入口和 serving 入口连起来:不是所有请求都走一个 GPU 队列。前台聊天、Realtime、Agent、Deep research 的交互方式、可重试性和容量指标完全不同,调度层必须先识别 surface,再选择模型池、工具池和降级策略。
| 功能入口 | 输入形状 | 推理路径 | KV 压力 | 运行队列 | 取消 / 重试 | 容量信号 |
|---|---|---|---|---|---|---|
| 普通聊天 | 短 prompt + 最近历史,输出长度中等,用户强感知首 token。 | 同区域模型池直达,Context Builder 产出 snapshot 后进入 per-model queue。 | 主要由多轮历史和输出长度增长;prefix cache 可复用系统提示和稳定会话前缀。 | interactive lane,deadline 短,decode 优先,必要时降级到更快模型。 | 用户停止生成时释放 KV;未出 token 可重试,已流式输出只能显式 regenerate。 | TTFT p95、TPOT p95、active tokens/GPU、cancel release lag。 |
| Search / RAG | 用户问题 + 搜索摘要 + source spans,输入 token 和证据块数量波动大。 | 检索 fanout 先并发执行,deadline 内返回的证据被打包后再进入推理池。 | RAG 证据会放大 prefill;引用越多,KV 和 TTFT 压力越大。 | retrieval lane 和 inference lane 分离;慢搜索不占 GPU slot。 | 取消要同时停搜索、rerank 和推理;重试必须复用或重建 source snapshot。 | retrieval p99、context token p95、source timeout rate、answer citation miss。 |
| 文件 / Data Analysis | 文件摘要、表结构、采样行、代码执行结果和图表 artifact 引用。 | 文件解析和 Python 执行在工具池;模型只看受控摘要、schema 和必要片段。 | 原文件不能直接塞满窗口;采样、分块、摘要和 artifact manifest 决定 prefill。 | tool queue 通常比 GPU 更慢,需把 CPU sandbox 与推理排队拆开计量。 | 取消 run 要回收 sandbox、临时文件和 GPU KV;重试复用已验证 artifact。 | parse latency、sandbox queue、input token amplification、artifact replay success。 |
| Code Executor | 代码片段、测试输出、错误堆栈、workspace diff 和下一步计划。 | 模型生成 patch/command,executor 执行,结果再作为 untrusted tool output 回模型。 | 错误日志和 diff 容易很长;需要截断、聚类和可点击 artifact,而不是全量灌入。 | interactive + tool lane 交错;GPU 等待工具时不应占住 decode slot。 | 命令、容器和推理 run 都要有 attempt_id;部分副作用只能补偿,不能盲目重放。 | tool wait ratio、stdout truncation、retryable error rate、patch token/output ratio。 |
| Canvas | 文档片段、选区、编辑意图、版本号和结构化 diff。 | 模型输出 edit operations;服务端用 optimistic lock 合并到 canvas document。 | 长文档靠 selection + outline + changed spans 控制;prefix cache 复用稳定文档前缀。 | low-latency edit lane,偏短输出,但需要稳定版本 pinning。 | 取消不能留下半个 diff;冲突时重新基于最新 document snapshot 生成。 | edit merge conflict、document token p95、selection miss、undo/replay success。 |
| Agent | 目标、计划、工具结果、浏览器/文件/terminal 状态和 checkpoint。 | orchestrator 多轮调模型和工具;每轮推理都从 checkpoint 重建上下文。 | 每轮状态膨胀快,必须摘要旧步骤,只保留证据、未完成动作和安全约束。 | background-capable lane,长任务可让出前台容量,工具和 GPU 分别限流。 | 用户接管、暂停或取消要写入 run state;已执行外部动作不自动重放。 | steps/run、tool fanout、checkpoint size、handoff latency、background queue age。 |
| Voice / Realtime | 音频帧、转写 token、视觉/文本上下文和低延迟音频输出。 | WebRTC/WebSocket transport + realtime model pool,音频输入输出要流式双向。 | 上下文持续增长,但更受端到端时延和抖动约束;长历史要滚动摘要。 | realtime lane 独立保留容量,不能被长 prefill 或批处理任务挤压。 | barge-in 要中断当前 decode 和音频播放;重连后恢复会话状态和音频 cursor。 | audio round-trip p95、jitter、barge-in latency、session reconnect success。 |
| Images / multimodal | 图片 embedding、OCR/vision features、文本问题和可能的生成参数。 | 视觉 encoder 或图像模型专用池先处理,再与文本模型或生成 pipeline 汇合。 | 视觉 token/patch 和高分辨率输入显著放大 prefill 或 encoder memory。 | multimodal lane 与纯文本池隔离;大图片、批量图片和生成任务单独排队。 | 取消要释放 encoder/GPU memory 和上传临时对象;重试复用已校验 media manifest。 | vision token p95、media preprocess p99、GPU memory watermark、upload abandon rate。 |
| Tasks / Pulse / Deep research | 定时触发、研究计划、外部来源、阶段性摘要和最终报告。 | scheduler/background worker 创建 run;GPU 推理只是多阶段工作流的一段。 | 单轮上下文可能很长,但不要求交互级 TTFT;可用 checkpoint 和摘要分阶段压缩。 | background lane,按租户预算、deadline 和离峰容量调度,不抢前台聊天。 | 任务取消写 tombstone;失败按阶段重试,必须避免重复通知或重复外部动作。 | background queue age、deadline miss、source freshness、checkpoint replay cost。 |
| 路由维度 | 怎么决策 | 系统设计要点 |
|---|---|---|
| 模型选择 | quality tier、latency SLO、context length、tool / multimodal need | 简单聊天走低成本快模型;代码、复杂推理、长上下文、语音/视觉和企业高质量请求走对应专用池。 |
| 区域和租户 | home_region、data residency、tenant tier、enterprise isolation | 路由先满足数据边界,再在同区域模型池内做负载、成本和 SLO 选择;跨区只作为明确的降级/灾备策略。 |
| Region failover | health check 摘除故障 GPU pool,按数据驻留判断能否跨区溢出 | 关键模型保留最小热备容量;未开始的可重试请求可跨区重放,已经开始生成的 stream 要明确中断、重连或重新生成语义。 |
| 灰度和回退 | model_version、prompt_version、router_policy、safety_policy | 每次回答记录路由原因和版本;新模型失败或质量回归时按租户、功能或流量百分比回退。 |
| 成本控制 | token budget、max_output、tool budget、cache hit、batch pressure | 模型越大不等于越好;高峰时可降低默认模型、缩短上下文、关闭昂贵工具或要求用户确认长任务。 |
| 架构 | 形态 | 取舍 |
|---|---|---|
| 单池 serving | prefill 和 decode 在同一模型副本里排队 | 最容易实现,适合低流量或模型少的场景;长 prompt 会拖慢短回复,TTFT/TPOT 容易互相影响。 |
| continuous batching | 每个 iteration 重新装箱,generation 请求优先,新请求填剩余 token budget | 高吞吐核心;要同时受 max_num_seqs、max_num_batched_tokens、free KV blocks 和 deadline 约束。 |
| chunked prefill | 长 prompt 拆成多个 context chunk,和 decode 交错执行 | 降低最坏 TTFT、避免长上下文卡住队列;chunk 太小会增加调度开销,太大又会伤害 decode 平滑度。 |
| PD disaggregation | prefill pool 负责读长上下文,decode pool 负责持续生成 | 适合长 prompt 和长回答混合的高峰流量;代价是 KV 传输、跨池调度和故障恢复复杂度。 |
| 调度点 | 做什么 | 为什么重要 |
|---|---|---|
| Admission control | tenant quota、model quota、input/output token budget、deadline | 排队前先估算成本和风险;队列过深返回 retry_after 或降级模型,不能无限接入再让 GPU 崩。 |
| Weighted fair queue | 按 tenant、plan、conversation、model pool 分层加权 | 防止单个企业、长上下文或 Agent 批量任务饿死普通聊天;同租户内部还要限制并发 run。 |
| Token packing | max_num_batched_tokens、max_num_seqs、free KV blocks、deadline-aware batching | 调度单位是 token 和 KV block,不是 HTTP request;高峰时优先保 decode 平稳,再塞 prefill chunk。 |
| Backpressure | queue depth、HBM watermark、stream relay buffer、client disconnect | Stream Relay 写不出去时要暂停读、降采样 trace 或取消低优先级任务,避免把背压传到 GPU worker。 |
| Cancel / timeout | CANCELLING -> GPU stop ack -> release KV blocks -> final event | 取消不等于 GPU 立即停;状态机要幂等,释放队列槽、KV block、tool lease 和计费 hold。 |
| Worker failure / OOM | worker heartbeat/lease、attempt_id、强制释放 KV blocks、终态幂等落库 | 未发出 token 的请求可在同模型池重试;已开始流式输出的请求不能静默重放,只能发 interrupted/reconnect/regenerate 语义。stop ack 丢失时由 lease 超时回收资源,避免 KV block 泄漏。 |
| Long context | chunked prefill、prefix cache、sliding / sparse attention、context cap | 长上下文同时吃 prefill 时间和 KV;要按 p95/p99 长度做队列隔离,不能让 200k token 请求挤掉所有短聊天。 |
| 估算项 | 示例口径 | 注意事项 |
|---|---|---|
| 显存预算 | 70B BF16 权重约 140GB;TP=4 时每 GPU 约 35GB 权重,再留 workspace / comm / safety headroom | 数字只做面试估算;真实还受量化、MoE、parallelism、runtime kernel 和 allocator 影响。 |
| KV/token 示例 | 若 L=80、H_kv=8、D_h=128、B_e=2、TP=4,则约 80KB/token/GPU,再乘分页碎片系数 | 80GB GPU 扣除权重和工作区后若给 KV 25GB,大约只能容纳 300k 级 active token/GPU;p95 长上下文会快速吃满。 |
| prefill fleet | D_in = peak req/s * E[input tokens],再除以实测 input token/s/group 和目标利用率 | 例如 400 req/s * 8k token = 3.2M input token/s;若每组实测 80k 且目标利用率 0.7,需要约 58 组 prefill capacity。 |
| decode fleet | D_out = peak req/s * E[output tokens],再除以实测 output token/s/group 和目标利用率 | 例如 400 req/s * 500 token = 200k output token/s;若每组实测 6k 且目标利用率 0.7,需要约 48 组 decode capacity。 |
| 配置旋钮 | max_num_batched_tokens、max_num_seqs、chunk size、KV watermark、queue max_wait | 这些值靠压测调;目标不是单点吞吐最高,而是在 TTFT、TPOT、失败率和成本之间稳定。 |
| 优化 | 收益 | 成本和不适用场景 |
|---|---|---|
| PagedAttention / paged KV | 收益:减少 KV 碎片并让变长请求更容易混部 | 成本是 block manager 和调试复杂度;仍要监控 free block、eviction、prefix sharing 和 page overhead。 |
| Speculative decoding | 收益:低 batch 或长 decode 时减少目标模型串行 forward 次数 | draft 命中率低、tokenizer 不一致、batch 已很大或 draft 成本过高时会倒退;要按任务类型开关。 |
| Chunked prefill | 收益:让长 prompt 让出 iteration,降低队列最坏 TTFT | chunk size 会在 TTFT、TPOT 和调度开销间取舍;小请求可能因切块策略变慢。 |
| Prefix cache | 收益:复用完全相同的系统提示、项目指令、文件前缀或长上下文前缀 | cache key 必须含模型、tokenizer、adapter、tenant、ACL、doc version 和 safety policy,防止越权复用。 |
| Quantization | 收益:降低权重或 KV 显存,提升吞吐或可放更大模型 | 不同任务质量损失不同;数学、代码、安全拒答、长上下文和工具参数都要单独评测。 |
| PD disaggregation | 收益:prefill/decode 分别优化 batch、队列和副本数 | KV 传输、跨池故障恢复和 placement 复杂;只有隔离收益大于传输成本时才值得上。 |
| 关注点 | 生产契约 | 核心指标 | 降级策略 | 常见陷阱 |
|---|---|---|---|---|
| Model warmup / cold start | 每个模型版本、并行配置和量化形态都有 warm pool;上线前完成权重加载、kernel 编译、CUDA graph 捕获和小流量探活。 | cold_start_seconds、warm_pool_ready、first_request_error、kernel_compile_latency。 | 新版本未 warm 好不接生产流量;低峰降副本时保留最小热备;冷启动请求返回排队或降级模型。 | Kubernetes pod ready 不等于模型 ready;权重在、HTTP 活着,不代表首个真实长上下文请求不会超时。 |
| Active stream version pinning | 一次回答从首 token 到 final event 固定 model_version、tokenizer、adapter、safety_policy 和 sampling config。 | stream_version_mismatch、midstream_restart、tokenizer_mismatch、final_event_missing。 | 滚动升级只影响新 run;旧 stream 继续在旧 worker 上结束,或显式 interrupted 后由用户重新生成。 | 中途把 stream 切到新模型会破坏 token 序列、计费、可复现性和用户看到的连续语义。 |
| Rolling upgrade / canary | router_policy 按租户、功能、区域和百分比灰度;每个回答记录 route_reason、model_version、prompt_version 和 eval bucket。 | canary_error_delta、quality_regression、tool_call_delta、rollback_time、shadow_eval_gap。 | 按 feature 或 tenant 退回旧模型;只回滚路由策略时不动数据库和会话状态。 | 只看 HTTP 500 会漏掉质量下降、工具调用变多、输出变短和安全拒答异常。 |
| Per-model SLO | 每个模型池单独定义 TTFT、TPOT/ITL、tokens/s/GPU、queue age、KV block pressure 和 OOM 预算。 | ttft_p95/p99、itl_p95、free_kv_blocks、gpu_util、hbm_watermark、oom_rate。 | 先保护 realtime/interactive lane;长上下文、background research 和低等级租户延迟或降模型。 | 把所有模型混成一个 P95,会掩盖大模型、语音模型、视觉模型和 agent lane 的不同瓶颈。 |
| Cost attribution loop | 每个 run 记录 input/output tokens、KV residency、tool wait、GPU seconds、cache hit 和 route decision,用于限额、定价和降级。 | cost_per_answer、gpu_seconds/run、cache_hit_saving、wasted_decode_after_disconnect、tenant_budget_burn。 | 预算接近上限时缩短上下文、降低默认模型、关闭昂贵工具或转后台任务。 | 只按请求数计费或限流,会惩罚短问短答并放过超长上下文、agent 循环和无人读取的流式输出。 |
| Capacity failover | 按 region、model family、data residency 和 tenant isolation 准备故障迁移;未开始请求可重排,已开始 stream 语义化中断。 | pool_unhealthy_seconds、failover_success、cross_region_blocked、retry_after_rate。 | 同区降模型、延迟后台任务、限制 max_output;跨区只在数据策略允许时启用。 | 把 GPU 池当无状态 Web 服务横向漂移,会踩到数据驻留、KV 不可迁移和流式输出不可静默重放。 |
| Overload and backpressure | admission 在 GPU 前拦截:按 token budget、deadline、KV 水位、stream relay buffer 和 tool queue 统一判断能否接入。 | admission_reject、queue_age、kv_watermark、relay_buffer_bytes、client_disconnect_rate。 | 返回 retry_after、缩短输出、切更快模型、转后台或提示用户缩小文件范围。 | HTTP 层无限接收请求,最后在 GPU OOM、Stream Relay 积压或客户端断开后才失败。 |
Prefill
读完整 prompt,计算历史 token 的状态,通常更偏 compute-bound。TTFT 里大头常是排队、prefill 和第一个 decode。
Decode
一个 token 接一个 token 生成,通常更偏 memory-bound。TPOT 受 decode batch、KV cache 访问和 HBM 带宽影响。
KV Cache
缓存历史 token 的 Key/Value,近似占用 2 * layers * kv_heads * head_dim * tokens * batch * bytes_per_elem,另有分页碎片开销。
PagedAttention
把 KV cache 像虚拟内存一样分页,减少碎片并支持不同长度请求混部。
Continuous Batching
每个 decode step 重新组 batch,完成的请求退出,新请求插入,提升 GPU 利用率。
Chunked Prefill
把长 prompt 的 prefill 切成块,穿插 decode,避免长请求霸占 GPU。
Prefix Cache
只能复用完全相同 token 前缀;cache key 要含模型、tokenizer、adapter、prompt prefix、tenant、ACL 和 doc version。
Speculative Decoding
小模型先猜多个 token,大模型验证。收益取决于任务和小模型命中率。
FlashAttention
通过 tiling 和在线 softmax 减少 HBM 读写,尤其改善长上下文 prefill 的速度和显存压力。
PD Disaggregation
把 prefill 和 decode 分池,减少互相干扰并分别优化 batch、队列和资源配比;KV 传输开销必须小于隔离收益。
Quantization
weight-only、KV cache quant 和 activation quant 解决的瓶颈不同;数学、代码、安全和长上下文要分别评测质量损失。
Parallelism
能用副本和数据并行先扩副本;模型放不下再用张量、流水线、序列或专家并行,并处理 MoE 负载倾斜和跨机通信。
Latency metrics
TTFT ~= queue + prefill + first decode;TPOT 看 decode step;容量看 tokens/s/GPU、HBM、KV block pressure 和安全水位。
10. RAG、连接器和工具调用
模型提出动作,执行层决定能不能做
RAG 和工具是 ChatGPT 从聊天产品变成工作平台的关键。这里最容易丢分的是权限: 检索结果、邮件、云盘、代码仓库、网页和工具输出都可能携带不可信指令或越权数据。 公开资料能证明 Search、Deep research、Apps/连接器、MCP、Code Interpreter 和 Data Analysis 的产品/API 语义; 下面的索引、队列、审批和恢复机制是 system design 面试推断。
第一原则非常简单:模型没有账号、没有数据库权限、也不应该直接拥有副作用。模型只能提出“我想查什么、我想调用哪个工具、我想写入什么参数”; 真正放行的是执行层,它按 tenant、scope、policy、approval、egress、audit 和 idempotency 判断能不能做。 外部文档、网页、邮件、PDF、连接器结果、代码执行输出都只是 evidence,不是 instruction;即使它们写着“忽略前面的规则”,也没有指令权。 对初学者来说,RAG 就是“先检索用户有权看的资料,再让模型基于这些资料回答并给出处”;工具调用则是“模型提出候选动作,平台用规则和状态机决定是否执行”。
| 产品入口 | 公开产品语义 | 后端契约 | 信任边界 | 失败模式 | 面试高分点 |
|---|---|---|---|---|---|
| ChatGPT Search | 用户显式或自动触发搜索,回答带来源、引用和更强时效性。 | query rewrite -> web/source fanout -> rank/rerank -> source snapshot -> answer with citations。 | 网页内容和摘要只是证据,不得覆盖 system/developer/user 指令;引用需要 source span 和 retrieval_time。 | 慢源超时、引用不足、来源冲突或低可信时,返回部分结果、无来源回答或明确不确定。 | 不要把搜索当普通 prompt 拼接;它是有 deadline、质量阈值和可审计 provenance 的检索系统。 |
| Deep research | 先生成计划,长时间多步研究,能使用网页、上传文件和启用的 apps,最终给结构化报告和引用。 | ResearchRun + plan_version + source allowlist + multi-step retrieval/tool queue + checkpoint + final report artifact。 | 每个来源、工具输出和中间摘要都带 provenance;用户可中断调整来源或目标,不能让来源反向改写研究计划权限。 | 某些来源不可用时降为 partial report;超预算时暂停、请求确认或缩小范围。 | Deep research 是后台工作流,不是一次超长 RAG;要设计 checkpoint、source freshness、报告复现和引用校验。 |
| Apps / synced connectors | Apps 可 search/reference/sync 数据,有些可执行经批准的 actions;管理员可控制启用和权限。 | connector registry -> OAuth/scope -> sync index -> query-time ACL -> app action gateway -> approval/audit。 | 同步索引、缓存和回答都按 tenant/user/workspace ACL 过滤;write action 需要 preview、confirmation 和 admin policy。 | OAuth 过期、scope 收窄、connector outage 或 sync lag 时 fail closed,避免注入过期或越权内容。 | sync 提前建索引能降延迟,但权限、撤权和删除仍必须 query-time 生效。 |
| File uploads / Data Analysis | 用户上传文件后可分析表格、PDF、文本,生成表格、图表或代码支撑的分析。 | upload -> malware/type/size check -> parse/OCR -> file index/artifact -> code interpreter container -> result sanitizer。 | 文件内容是 untrusted data;Python 结果、CSV/PNG artifact 和 stdout 进入上下文前要脱敏、截断和引用到 file/version。 | 解析失败、文件太大、容器超时或 quota 到顶时,提示缩小范围、抽样或转后台。 | 不要把文件直接塞模型;先把文件变成可索引、可采样、可审计、可删除的 artifact。 |
| Agent tool execution | Agent 可组合浏览器、连接器、终端或 API;高影响动作需要确认,用户可暂停/接管/取消。 | AgentRun -> tool intent -> policy gate -> approval -> executor pool -> checkpoint -> sanitized observation。 | 模型只提出 intent;凭证、cookie、secret、网络出口和写权限只在执行层短时注入。 | 工具超时、用户取消、登录失效或外部动作不可逆时,进入 paused/cancelled/compensating,而不是静默重试。 | Agent 的工具调用和 RAG 同源:外部世界不可信,副作用只能由状态机和策略层放行。 |
| API MCP / custom tools | Responses API 可接 remote MCP/connectors;工具调用可自动或要求开发者 approval。 | tool registry -> list_tools cache -> schema validation -> approval request -> mcp_call -> result sanitizer。 | 远端 MCP server 会接收模型上下文和参数,必须被信任;server 自称 read-only 不等于平台策略放行。 | tool schema drift、server 5xx、approval timeout、rate limit 和 malicious output 都要回到可解释 tool result。 | tool schema 描述的是“长什么样”,不是“能不能做”;能不能做由 tenant/scope/policy/approval/audit 决定。 |
| Canvas / Code Executor 边界 | Canvas 支持选区编辑和版本恢复;代码/终端执行把结果回传给模型继续迭代。 | document snapshot / diff / selection -> model edit/tool run -> patch preview -> optimistic merge -> version/audit。 | 代码输出、报错日志、网页片段和 diff 都可能夹带指令;只作为证据或 patch 候选,不直接拥有权限。 | 版本冲突、sandbox 失败、日志过长或 patch 不可应用时,保留 artifact 并要求用户选择或重试。 | Canvas/Code Executor 是 RAG+tool 的局部化场景:上下文要小,版本要准,副作用要可撤销。 |
排序先把关键词、向量相似度、新鲜度和风险合成候选分;回答前再按 claim-to-source 支撑度检查, 低于阈值就不应强答。这里的 source span 仍是不可信证据,不能覆盖系统、开发者或用户指令。 BM25 可以理解为“关键词命中和稀有词更重要”,向量相似度可以理解为“语义相近也能召回”;高质量 RAG 通常把两者混合,再用 reranker 和权限过滤收窄证据。
| 模块 | 链路 | 面试必须补充 |
|---|---|---|
| RAG ingestion | webhook/poll cursor -> parse/OCR -> chunk -> embed -> shadow index -> validate -> alias swap | 每个 chunk 带 doc_version、content_hash、chunker_version、embedding_model_version、index_version;新索引用 shadow build + 回放 golden set + alias swap,失败可回滚。 |
| Index lifecycle | incremental sync、staleness SLA、dual index、rebuild、rollback、delete/ACL tombstone | 删除和撤权先写 tombstone 并让 query-time filter 立即生效,再异步清原文、chunk、embedding、BM25/vector、cache、引用、评测和训练候选。 |
| Retrieval | rewrite -> ACL filter -> hybrid/vector -> rerank -> pack -> cite | 未授权 chunk 不能进入 rerank、prompt、日志或 trace;要有 no-answer threshold、freshness 和引用回链。 |
| Tool gateway | select -> schema -> policy -> sandbox -> dry-run/confirm -> execute -> sanitize | 模型只提出意图;持久化 tool_call 状态、幂等键、审批快照、超时、重试、补偿、预算和审计。 |
| MCP / Connectors | trusted registry、server_label、allowed_tools、require_approval、admin controls | 远端 MCP 会接收数据并可能写外部系统;不要信任 server 自报 read-only。出站参数预览、敏感字段脱敏、参数约束和高风险写动作确认必须在边界上做。 |
| Tool executor sandbox | isolated executor -> egress proxy -> secret broker -> result sanitizer | CPU、内存、时间、网络、临时文件和租户隔离都由执行层控制;凭证只在执行层按 scope 注入,模型上下文不直接持有生产 token。 |
| Context packing | dedupe -> MMR/diversity -> source span -> token budget | 不要只按相似度塞满上下文;要保留多样证据、结构化表格/代码片段和可引用 source span。 |
| Citation / provenance | source_id/url/file_id、doc_version、chunk_id、offset、retrieval_time、content_hash、index_version、ACL_version | 引用是可审计证据,不只是链接;claim-to-source 校验失败时降级为 no-answer、要求更多权限或明确标注不确定。 |
| RAG quality loop | golden set -> retrieval metrics -> groundedness -> answer correctness -> hard negatives | 同时评估 faithfulness、引用支撑、no-answer precision/recall、权限泄漏回归、新鲜度和线上反馈挖掘。 |
| Delete / revoke | delete tombstone / ACL tombstone -> query-time filter -> async purge | 删除和撤权不同:撤权可保留索引但必须按 ACL/version tombstone 过滤,删除要从缓存和训练候选中清出。 |
| Prompt injection | 外部文档、网页、邮件、PDF、工具输出都只能是 evidence,不能升级成 instruction | 所有 source block 带 untrusted/authority=no;工具结果进入 sanitizer 后才能回模型;检测到数据外发、越权指令或隐藏 prompt 时要阻断、降级或要求确认。 |
| 状态 | 语义 | 恢复和审计 |
|---|---|---|
| CREATED / VALIDATING | 模型提出 tool call,执行层做 schema、tenant、scope、policy 校验 | tool_call_id、idempotency_key、response_id、approval_required 要先落库,便于恢复和审计。 |
| AWAITING_APPROVAL / DENIED | 高影响动作展示 dry-run、目标对象、参数 diff 和风险说明 | 审批快照保存出站参数、数据接收方、管理员限制和用户选择;拒绝后把 DENIED 作为工具结果反馈给模型,而不是静默继续。 |
| RUNNING / RETRYING | 执行时带 timeout、retry budget、concurrency limit 和 cancellation token | 只对幂等或带幂等键的动作自动重试;非幂等动作要回到用户确认。执行层通过 sandbox、egress proxy 和 secret broker 运行。 |
| SUCCEEDED / FAILED / TIMED_OUT / CANCELLED | 终态写结果摘要、错误类型、外部 request id 和用量 | 工具输出进入 sanitizer,去除不可信指令和敏感字段后才回到模型上下文。 |
| COMPENSATING | 需要撤销、退款、删除草稿、恢复配置时进入补偿状态 | 补偿不是模型自由发挥,而是预定义 workflow,结果同样进入审计和用户可见状态。 |
| 关注点 | 生产契约 | 核心指标 | 降级策略 | 常见陷阱 |
|---|---|---|---|---|
| Fanout deadline | 每个 source class 有 deadline、并发上限和 token/source budget;慢源不拖死前台回答。 | source_p95/p99、deadline_miss、partial_answer_rate、fanout_width、citation_coverage。 | 返回 partial results、减少 source fanout、先答已验证来源、提示用户扩大时间或权限。 | 等待所有 connector/search/source 返回,会把首 token 延迟变成最慢外部依赖延迟。 |
| Queue / backpressure | 按 tenant、source、connector、tool type 和 foreground/background lane 建队列;admission 同时看 deadline、budget、inflight、worker lease 和 DLQ age。 | queue_age、inflight_calls、lease_timeout、dlq_age、load_shed_rate、foreground_protection。 | 返回 retry_after、缩小 fanout、转后台、丢弃低优先级 sync、暂停批量 deep research,优先保护前台聊天和已确认写动作。 | 只在外部 provider 报错后才背压,会让内部 worker、连接池、sandbox 和 Stream Relay 先被打爆。 |
| Connector sync outage | 同步链路按 webhook/poll cursor 写 checkpoint;索引 stale 要可见,query-time 仍必须查权限和 tombstone。 | sync_lag、cursor_age、webhook_drop、index_staleness、alias_swap_failure。 | 展示 source stale、切实时 fetch、关闭该 connector、回滚 alias 到上一版索引。 | 把离线索引当 truth,导致 connector 停更后继续引用已删除或已撤权内容。 |
| Credential revoke / ACL change | OAuth revoke、scope 收窄、成员移除、文件删除先写 tombstone,query-time filter 立即 fail closed。 | revoke_propagation_lag、acl_unknown_rate、tombstone_hit、stale_source_blocked。 | 跳过该来源、要求重新授权、重建索引、清缓存和训练候选。 | 只在离线 sync 阶段过滤 ACL,在线检索召回后才发现越权,甚至已进入 rerank/prompt。 |
| External rate limit | 对每个 provider/app/tool 做令牌桶、预算、retry_after 解析和租户隔离,不能把外部限流传染到核心 chat。 | provider_429、retry_after_obeyed、budget_burn、tenant_throttle、fallback_rate。 | 降 fanout、使用缓存摘要、排队后台 sync、提示用户稍后重试或选择其他来源。 | 所有租户共享一个 provider token bucket,单个企业的大批量 deep research 拖垮全站 connector。 |
| Tool timeout / cancel / retry | 每个 tool_call 有 timeout、attempt_id、idempotency_key、cancel token 和 retry budget。 | timeout_rate、cancel_ack_lag、duplicate_write_blocked、retry_success、tool_wait_ratio。 | 可幂等读自动重试;非幂等写回到 approval;取消后停止 flush late result 并释放 sandbox/lease。 | 把 timeout 后的未知外部状态当失败重试,可能重复发邮件、下单、改权限或写数据库。 |
| Exactly-once myth | 内部事件 at-least-once + 幂等消费;外部副作用用 outbox、provider request id、dedupe key、dead-letter 和补偿 workflow。 | outbox_lag、dedupe_hit、dead_letter_age、compensation_success、unknown_external_state。 | 进入 NEEDS_REVIEW/COMPENSATING,向用户展示未知状态,不让模型自由猜测。 | 承诺 exactly once,会在网络断开、provider 5xx、客户端取消时制造重复副作用或丢审计。 |
| Audit / compliance export | 保存 retrieval_snapshot、tool_call、approval_snapshot、external_request_id、policy_version、source manifest 和脱敏 trace。 | audit_missing、snapshot_replay_success、redaction_error、compliance_export_lag。 | 缺审计的高风险动作不执行;导出失败进入重试/告警,不影响低风险检索。 | 只记录最终回答,不记录模型看过哪些 source、发出哪些参数、用户确认了什么。 |
| Prompt injection | 所有外部 source/tool output 都按 untrusted data;高权限指令与证据分通道,写动作过 policy/approval。 | injection_detected、unsafe_action_blocked、data_exfil_attempt、source_authority_violation。 | 移除来源、只引用安全摘要、禁写工具、要求用户确认或拒绝。 | 把网页/邮件文字拼到 system prompt 附近,模型可能把攻击者文本当成高优先级命令。 |
11. Agent 系统设计
Agent 的本质是有权限边界的长任务运行时
ChatGPT agent 的公开产品形态已经不是单轮工具调用。它能在自己的虚拟计算机里组合视觉浏览器、 文本浏览器、Code Interpreter/终端、直接 API 和 Apps/连接器;但 sync app 数据有单独限制,不能被简单视作 Agent 可直接读取的全局索引。系统设计要回答:怎么计划、怎么执行、怎么让用户接管、怎么确认高风险动作、怎么限流、 怎么恢复和审计。
公开资料能证明虚拟计算机、浏览器、代码执行、Apps、用户接管、Watch Mode、高影响动作确认、并发限制、数据驻留和保留策略这些产品语义; 本章下面的队列、状态机、lease、checkpoint、outbox、补偿和多执行池隔离,是面试中基于这些语义推导出的后端设计。 面试官真正想听的是:Agent 不是“让模型自己上网办事”,而是“模型提出下一步,运行时用可恢复状态机和权限策略决定是否、何时、在哪里执行”。
Agent 不是按“模型想不想做”来放行,而是按数据敏感度、外部影响、不可逆性和外发目的地给动作分级。 风险越高,就从自动执行升级到确认、Watch Mode、用户接管或直接拒绝。
| 模块 | 职责 | 面试必须补充 |
|---|---|---|
| Agent Gateway | 创建 AgentRun、校验用户/租户/计划、写入目标、预算和可见约束 | 入口只接受用户目标,不直接授予生产权限;run_id、conversation_id、tenant_id、model_version 和 policy_version 先落库。 |
| Planner / Reasoner | 把目标拆成 plan_version 和下一步 tool intent | 计划可被用户改写或暂停;模型只能提出 intent,不能绕过 Tool Router 自行访问 Apps/连接器、浏览器 cookie 或终端凭证。 |
| Tool Router | 在 visual browser、text browser、terminal、direct API、Apps/连接器间选择执行面 | 同一目标可在工具之间切换,例如文本浏览器找资料、视觉浏览器登录、终端处理文件、API 写日历。 |
| Policy / Permission | 动作分类、数据敏感度、外部接收方、管理员策略、确认和 Watch Mode | 高影响或不可逆动作必须展示 dry-run、目标对象、参数 diff 和数据接收方;敏感站点要求用户在场。 |
| Task Queue | 按 tenant/plan/model/tool pool 排队,发放 worker lease 和 cancellation token | 限制 per-user concurrent runs;worker heartbeat 失效后从最近 checkpoint 恢复,幂等步骤可重试,非幂等步骤回到确认。 |
| Executor Pools | browser VM、text browser、terminal sandbox、API action、app/connector fetch/write | 每个执行池有独立网络出口、资源预算、凭证注入和 result sanitizer;终端尤其要限制 CPU、内存、磁盘、时间和 egress。 |
| Durable State / Audit | AgentRun、AgentStep、ToolCall、artifacts、screenshots、approvals、trace replay | 每步结束 checkpoint;用户能看到部分结果、暂停/继续/取消,审计日志脱敏但可复盘关键决策。 |
| 状态 | 语义 | 恢复和权限边界 |
|---|---|---|
| CREATED / PLANNING | 目标、预算、策略版本、初始计划落库 | 计划不是承诺执行;进入执行前仍要经过 tool schema、权限和风险分类。 |
| AWAITING_AUTH | 需要登录、OAuth、app/连接器授权或 browser takeover | 密码、验证码和会话恢复信息不写入模型上下文;用户接管时模型只看到允许回传的页面状态。 |
| AWAITING_APPROVAL | 等待用户确认高影响动作 | 确认页展示 dry-run、目标对象、参数 diff、数据接收方、是否可撤销和费用影响;拒绝会作为工具结果反馈给模型。 |
| EXECUTING_TOOL | 带 worker lease、timeout、retry budget、idempotency key 和 cancel token 执行 | 用户取消要传播到浏览器/终端/API 执行层;不可中断的外部动作要写 pending 状态并轮询终态。 |
| CHECKPOINTING / PAUSED / RESUMING | 每个 tool step 后保存状态,用户离开或 Watch Mode 需要监督时暂停 | 恢复时从 durable state 重建浏览器会话、文件、计划和上一步结果;不能重放已经成功的非幂等动作。 |
| SUCCEEDED / FAILED / CANCELLED / COMPENSATING | 写终态、部分结果、错误原因、通知和补偿 workflow | 失败可进入 DLQ 供离线排查;补偿只执行预定义流程,例如删除草稿、撤销预订或恢复配置。 |
| 对象 | 状态 | 必须持久化 | 重试/取消语义 | 补偿语义 |
|---|---|---|---|---|
| AgentRun | CREATED / PLANNING / RUNNING / PAUSED / SUCCEEDED / FAILED / CANCELLED | run_id、tenant_id、user_id、goal、plan_version、policy_version、budget、home_region、data_residency。 | run 级 cancel 是幂等 tombstone;恢复时重新装载计划、预算、工具输出和最后 checkpoint。 | 只输出 final report、partial results 和 pending external actions;不假装未确认或未知动作已经成功撤销。 |
| AgentStep | READY / LEASED / EXECUTING / CHECKPOINTED / RETRYING / DLQ | step_id、run_id、dependency、worker_lease、heartbeat_at、attempt_id、input_snapshot_hash。 | 只有纯读或幂等 step 自动重试;worker lease 过期后从 checkpoint 接手,不能重放已成功的非幂等动作。 | DLQ 保存输入快照、工具参数、错误类型和最近 trace,供人工或离线 replay 定位。 |
| ToolCall | CREATED / VALIDATING / RUNNING / TIMED_OUT / UNKNOWN / SUCCEEDED / FAILED | tool_call_id、schema_version、idempotency_key、provider_operation_id、deadline、args_hash、egress_scope。 | cancel 要传到浏览器、终端或 API provider;外部状态 UNKNOWN 时先查询 provider_operation_id,不盲目重发。 | 非幂等副作用用 provider status 决定补偿路径,例如撤销草稿、取消预订、删除临时文件。 |
| Approval / DryRun | REQUIRED / PRESENTED / APPROVED / DENIED / EXPIRED | approval_snapshot、diff、recipient、data_destination、risk_level、policy_reason、user_decision。 | 重试不能绕过已要求的确认;参数、收件人、数据来源或风险级别变化后必须重新展示 dry-run。 | DENIED/EXPIRED 作为工具结果反馈给模型,模型只能改计划或请求更窄授权。 |
| ToolResult | OBSERVED / SANITIZED / ATTACHED / SUPPRESSED | result_uri、redaction_event、source_manifest、stdout/stderr、artifact_ids、taint_flag。 | 工具输出永远是 untrusted data;被 suppress 的结果不进入模型上下文,只保留审计和用户可见错误。 | 若结果含敏感数据或注入指令,返回安全摘要、引用或阻断原因,而不是把原文继续喂给模型。 |
| Compensation | NEEDED / RUNNING / SUCCEEDED / FAILED / MANUAL_REVIEW | compensation_plan_id、external_request_id、provider_status、manual_review_reason、audit_link。 | 补偿 workflow 也是状态机,带幂等键、限次重试和人工升级;不能由模型自由编排撤销动作。 | 用户看到原动作、补偿动作、剩余未知状态和下一步处理人,避免黑盒失败。 |
| 动作 | 默认策略 | 确认/接管细节 |
|---|---|---|
| 读公开网页 / 搜索 | 默认可自动执行,但网页内容按不可信输入处理 | 需要记录来源、时间和截图/文本摘要;页面里的指令不能覆盖系统、用户目标或工具策略。 |
| 读私有 Apps / 连接器数据 | 需要用户授权、管理员启用和 query-time scope/ACL;sync app 数据不能默认当作 Agent 直接工具索引 | 邮件、云盘、代码仓库和日历数据不能被外发到无关站点;实时 app、sync app 和 Deep research 来源要分别记录 scope、引用和数据外传检查。 |
| 填表 / 保存草稿 | 可执行到草稿或待提交状态,提交前确认 | 确认内容包括页面、目标对象、字段 diff、收件人/商家/组织和是否会触发外部通知。 |
| 发邮件 / 发消息 / 改日历 | 高影响写动作,要求用户确认;敏感站点可能要求 Watch Mode | 确认前展示收件人、主题、正文摘要、附件和数据来源;用户离开时暂停,不能后台发送。 |
| 购买 / 预订 / 改权限 / 删除 | 不可逆或高成本动作,通常 require approval + Watch Mode,有些任务直接拒绝 | 支付、转账、权限扩散、大规模删除和法律/医疗等高风险动作必须更保守;拒绝也要解释可替代的低风险步骤。 |
| 登录 / 密码 / 验证码 | browser takeover,用户输入敏感值,模型不读取原文 | 接管期间只保留恢复运行所需的最小会话状态;用户交还控制后再恢复页面状态采集。已有浏览数据、cookies 和非接管截图按数据控制策略保留或清理。 |
| 执行面 | 隔离和凭证 | 结果处理 |
|---|---|---|
| Visual browser | 远程浏览器/虚拟计算机,受站点 allow/deny、Watch Mode 和 cookie/session 策略约束 | 非接管步骤的截图、DOM 文本和下载文件进入 sanitizer;takeover 期间暂停这些信号进入模型和 trace。页面注入指令按 hostile content 处理。 |
| Text browser | 轻量抓取和阅读,不共享视觉浏览器的全部交互状态 | 适合搜索、摘要和引用;仍要做 robots/访问策略、PII 脱敏、来源记录和 prompt injection 检测。 |
| Terminal | 容器/VM 沙箱,限制 CPU、内存、磁盘、时间、进程数、网络出口和临时文件 | 凭证通过 secret broker 临时挂载,命令输出和生成文件经扫描后回到模型;默认不能访问用户本机文件系统。 |
| Direct API | 结构化 schema、OAuth/API key、idempotency key、rate limit 和审计 | 写动作按风险矩阵确认;失败时用外部 request id 查询终态,避免重复下单、重复发信或重复改配置。 |
| Apps / Connectors | 按登录用户、管理员策略、实时 app/sync app 能力和 query-time scope 读取或写入第三方系统 | 结果标记来源、scope、retrieval_time、ACL version 和 sync caveat;Agent 不能把所有 sync app 预索引数据当成直接可读,跨租户、跨用户、跨 workspace cache 禁止复用。 |
| 主题 | 设计 | 观测和评估 |
|---|---|---|
| 长任务调度 | tenant/plan 队列、per-user concurrent run limit、priority、lease、heartbeat、DLQ | 30 分钟任务不能绑死单个进程;每步 checkpoint,worker 挂了从 durable state 恢复,用户收到部分结果和完成通知。 |
| 取消和恢复 | cancel token 传播到 browser/terminal/API;PAUSED run 可 resume 或 expire | 已开始的外部写动作不能假装取消成功,要展示 pending/unknown 并轮询或人工处理。 |
| Admission / Budget / Region | 按 plan、tenant、region、data residency、tool pool、monthly limit、concurrent task limit 和成本预算做 admission | 指标包括 queue_age、budget_burn、rate_limit_hit、region_pool_pressure、tool_cost/run;降级为缩小计划、切低成本模型、暂停后台 step、要求用户确认或转人工。 |
| Agent eval | task success、tool choice accuracy、confirmation recall、critical confirmation recall | 评估要覆盖漏确认、误确认、错误工具、错误恢复、Watch Mode 中断和用户接管后的状态一致性。 |
| Security eval | prompt-injection pass rate、data exfiltration attack success、destructive action block rate | 攻击样本来自网页、邮件、文档、工具输出和终端日志;每个版本都跑回归,失败样本进入红队和策略更新。 |
| Trace replay | step trace、screenshot、tool args/result、approval snapshot、policy decision、redaction event | 审计日志既要能复盘,又不能泄漏密码、token、验证码、私有文件全文或无关连接器数据。 |
Visual browser
能点击、滚动、输入,适合人类页面。设计上要有浏览器会话、截图、DOM/视觉状态和接管模式。
Text browser
适合大规模文本检索和阅读。比视觉浏览器便宜,便于摘要和引用。
Terminal
运行命令、处理文件、生成表格或幻灯片。必须限制网络、CPU、内存、磁盘和执行时间。
Direct API
直接 API 适合结构化动作,例如日程、表单或仓库操作;执行前要过 schema、scope、策略和确认。
Apps / Connectors
实时 app、sync app、Deep research 可用来源要分开建模。Agent 不能把所有 sync app 数据当成可直接读取的索引。
Browser takeover
需要登录或输入敏感信息时让用户接管浏览器;接管期间暂停截图、DOM 和键盘输入进入模型上下文或可回放 trace。
Human control
用户可暂停、接管、补充说明、停止任务;高影响动作必须显式确认,敏感站点额外启用 Watch Mode,用户离开则暂停。
Task durability
长任务要有计划、步骤、事件日志、checkpoint、重试、部分结果和完成通知。
12. Canvas 系统设计
Canvas 是 artifact 协同编辑,不是把长答案放到右侧
Canvas 要支持写作和代码项目:用户能直接改,模型能做局部编辑,页面能展示 inline comments、 版本历史、代码预览和错误修复。它的核心数据不是 message,而是可演进的 artifact。 当前公开帮助页还给出两个产品边界:Canvas 可在 Web、Windows 和 macOS 使用,移动端仍是 coming soon; Canvas 不适用于 pro-series models。React/HTML 预览在 sandbox 中运行,Python 执行目前只支持 Python; Enterprise 可控制代码执行和网络访问,且默认关闭 Canvas 代码访问网络。
先用一个端到端例子理解:用户选中一段代码,ChatGPT 给出 inline suggestion;服务端把 suggestion 存成基于 `base_version_id` 的 patch,而不是直接覆盖全文;Patch worker 重新定位 range、检查冲突、提交新版本; 预览沙箱只拿新版本运行,导出和分享也绑定明确的 version。这样用户能撤销、查看 Show changes、恢复旧版本, 后端也能在断线、重试、模型改错和并发编辑时解释“谁基于哪一版改了什么”。
Block tree, current_version_id, tenant ACL, preview policy
Selection context -> edit intent -> structured diff
permission gate, conflict check, anchor drift repair, policy/audit
append immutable version, store patch, move current pointer
Sandbox preview, signed export, share link pinned to version
Launch plan draft
We will introduce the feature gradually, starting with internal users and expanding after quality gates pass.
The rest of the document remains untouched while preview and export bind to the saved version.
这里的 p 是一次模型或用户生成的 patch,p_base 是它基于的版本。只有 base version 仍然是当前版本、 且 range anchor 还能可靠定位时才直接提交;否则进入 re-anchor / rebase,置信度低就让用户确认。
| 模块 | 职责 | 面试必须补充 |
|---|---|---|
| Client editor | 右侧 artifact editor、selection、inline comment、show changes、preview console | 本地编辑要低延迟;服务端仍是版本真源,断线后按 last_seen_version 补事件。 |
| Canvas service | Artifact API、版本提交、patch 校验、ACL、事件广播 | 所有用户编辑、模型 patch、shortcut 和恢复版本都走同一条 versioned write path。 |
| Model edit planner | 决定 open canvas、targeted edit、rewrite、inline critique、shortcut action | 官方 Canvas 重点训练了何时打开、何时局部编辑、何时重写和如何给内联建议;系统要把这些决策记录成 eval 样本。 |
| Patch worker | 把模型输出转换为结构化 patch,做 re-anchor、merge、commit 或冲突提示 | 模型生成的是建议,Patch worker 负责把它变成可重放、可审计、可回滚的数据变更。 |
| Artifact / Version store | 保存当前 artifact、不可变版本、diff、content hash、评论、分享和审计事件 | 回滚不删除历史,只追加 restore event 并移动 current_version_id,便于 Show changes 和审计。 |
| Sandbox / preview service | React/HTML sandbox、Python execution、console/error、Fix bug 闭环 | 预览和执行不是编辑主路径;sandbox down 时降级为只读代码/文档编辑和版本历史。 |
| Share / export service | 分享 canvas asset,导出 PDF/Markdown/Word 或按语言导出代码文件 | 分享可指向 live artifact 或固定 version;企业策略控制 scope、expiry、revocation 和下载能力。 |
| 对象 | 核心字段 | 设计边界 |
|---|---|---|
| Artifact | artifact_id、type、owner_id、tenant_id、project_id、current_version_id、head_branch_id、acl_policy、created_from_message_id | type 区分 document、code、React/HTML asset;Chat message 只引用 artifact,不承载全文版本历史。主查询路径是 tenant_id/project_id/artifact_id -> current_version。 |
| ArtifactVersion | version_id、artifact_id、branch_id、parent_version_ids、merge_base_version_id、content_hash、snapshot_uri、diff_uri、author、source、created_at | 版本不可变,可形成 DAG;source 标明 user edit、model patch、shortcut、restore、import,方便审计、Show changes 和回滚。 |
| Patch | patch_id、base_version_id、target_branch_id、range_anchor、operation、status、idempotency_key、model_version、trace_id | operation 可以是 replace/insert/delete/comment/apply_suggestion;status 覆盖 proposed、applied、rebased、conflict、rejected。 |
| RangeAnchor | start_offset、end_offset、selection_hash、prefix_window、suffix_window、block_id、ast_node_id | offset 快但会漂移;hash、上下文窗口、Markdown block id 或 AST node id 用来在用户继续编辑后重新定位。 |
| InlineComment | comment_id、anchor、suggestion_patch_id、state、author、thread_id、resolved_at | Apply 按 suggestion_patch 走同一套 base_version 校验和 rebase;关闭评论不等于删除历史。 |
| SandboxRun | run_id、artifact_version_id、runtime、network_policy、resource_limits、stdout、stderr、error_span | Python console、React/HTML preview 和 Fix bug 都用结构化错误回传,不把任意日志无边界塞回模型。 |
| Block / Chunk | block_id、parent_id、ordinal、text_range、chunk_uri、token_count、embedding_version、ast_path、last_indexed_version_id | 长文档不能每次全量读写;按 Markdown block、代码 AST node 或 rope chunk 做局部索引、局部渲染和局部重新 embedding。 |
| ShareLink | share_id、artifact_id、version_id/live、scope、expires_at、revoked_at、viewer_policy | 撤权要同时停用链接、预览缓存和导出下载;企业管理员可禁止外部分享或网络预览。 |
| 关注点 | 设计 | 查询路径 | 恢复 | 指标 | 常见陷阱 |
|---|---|---|---|---|---|
| 长文档编辑结构 | 客户端用 piece table/rope 或 block tree 承载大文档;服务端保存 block/chunk manifest,局部 patch 只重写受影响 chunk。 | artifact_id + version_id -> manifest -> changed block_ids;编辑器按 viewport 和选区懒加载附近 blocks。 | manifest hash 不一致时回退到最近完整 snapshot;后台重建 chunk index、search index 和 embedding index。 | doc_open_p95、patch_bytes/doc_bytes、chunk_rebuild_lag、viewport_render_ms。 | 每次模型局部修改都全量保存 100k 行文档,会把版本库、diff、预览和移动端全部拖垮。 |
| 快照和 diff compaction | N 个版本或累计 diff 超阈值后生成 compressed snapshot;旧 diff 保留审计摘要和 cold storage 指针。 | current_version 读最近 snapshot + tail diffs;Show changes 读两个版本的 snapshot/diff plan。 | compaction 失败不影响写入,只增加读放大;成功后用 checksum 验证可重放。 | diff_chain_length、snapshot_build_lag、version_replay_ms、storage_bytes/artifact。 | 只存 diff 不存周期快照,灾后或打开旧版本时需要重放几千次 patch。 |
| Range / comment 索引 | 每个 inline comment 和 suggestion 同时保存 offset、block_id、prefix/suffix、selection_hash、AST path 与 semantic label。 | artifact_id + version_id -> active anchors by block_id;打开某段时只加载该段评论和 suggestions。 | anchor confidence 低时标成 needs_reanchor,不自动 apply;展示给用户重新定位或关闭建议。 | anchor_relocate_success、anchor_miss、comment_load_ms、stale_comment_rate。 | 只存 start/end offset,用户在前面插入一段后所有评论都漂移到错误文字上。 |
| 热文档缓存 | current manifest、最近版本、评论摘要和预览状态进 per-tenant cache;写入后通过 version seq 失效。 | tenant_id/project_id/artifact_id + current_version_seq;缓存值永远带 acl_policy_version 和 content_hash。 | 缓存缺失直接读主存储;缓存版本落后时客户端按 server seq 补事件。 | cache_hit、stale_cache_blocked、event_catchup_ms、read_after_write_miss。 | 跨 tenant 复用 artifact cache 或不带 ACL version,会把私有 Canvas 泄漏给错误用户。 |
| 搜索和模型上下文 | 为文档 outline、headings、changed blocks、code symbols 和 recent edits 建派生索引;模型只拿相关片段和 manifest。 | goal/selection -> block retrieval -> context pack;大文档回答不把全文塞入上下文。 | 索引滞后时用当前 version manifest 做局部扫描;提示 freshness 降级,避免基于旧版本强答。 | context_pack_tokens、index_freshness_lag、selection_miss、symbol_lookup_latency。 | 把整篇文档复制进 prompt,会同时浪费 token、增加延迟,还容易让模型改错范围。 |
| 问题 | 设计 | 失败处理 |
|---|---|---|
| Targeted edit | 用户选区或 block comment -> range_anchor -> model patch -> preview diff -> apply | 没有选区时才考虑 rewrite;选区存在时模型只应改目标范围,并解释相邻上下文是否受影响。 |
| Anchor drift | offset mismatch -> content hash check -> prefix/suffix match -> block/AST re-anchor | confidence 低于阈值 τ 时不要硬套 patch;提示用户重新选择范围或展示冲突 UI。 |
| Optimistic concurrency | 所有写入携带 base_version_id 和 idempotency_key | base 等于 current 且 anchor valid 直接提交;否则 rebase/merge。重复提交同一幂等键返回同一结果。 |
| Merge strategy | 文档用文本 diff + block anchors;代码优先 AST-aware patch,再回退三方 merge | 服务端可串行提交,也可用 OT/CRDT 做多人实时协作;面试里先说明当前 ChatGPT 单用户/轻协作场景可用串行版本化写入。 |
| Branch / merge-base | 用户本地编辑、模型建议和快捷动作都基于同一个 base_version_id;分叉时记录 branch_id 和 merge_base_version_id | 模型 patch 落后于用户编辑时,先三方 merge;merge-base 不清楚时不能强行覆盖当前文档。 |
| Show changes / rollback | Show changes 比较两个 ArtifactVersion;restore 追加新版本或 restore event | 回滚不覆盖历史;当前版本指针改变后,后续 patch 必须基于新的 current_version_id。 |
| 层次 | 负责人 | 状态 | 冲突处理 | 回滚语义 | 错误答案 |
|---|---|---|---|---|---|
| Local undo / redo | 浏览器编辑器 | 只管理用户尚未提交或最近本地操作栈,指向 last_seen_version_seq。 | 收到服务端新版本后,本地 undo 栈按 transaction mapping 重写;无法映射则清空并提示。 | 撤销只生成新的本地 transaction,不直接删除服务端版本。 | 把本地 undo 当成服务端回滚,会让另一个窗口或模型 patch 看到不存在的历史。 |
| Canvas previous version | 产品 UI | 顶部版本箭头浏览 ArtifactVersion DAG 上的历史节点,可复制、对比或恢复。 | 浏览旧版本期间 current head 可能继续变化;旧版本视图默认只读,恢复需要新建 restore patch。 | restore 追加 Version vN+1,parent 指向当前 head,restored_from 指向旧版本。 | 直接把 current_version_id 指回旧版本会丢掉之后的历史和审计解释。 |
| Model patch | Model edit planner + Patch worker | 模型输出基于 base_version_id、selection/range_anchor 和 instruction_snapshot。 | base 落后时先 re-anchor,再用 merge-base 做三方 diff;低置信度进入 conflict UI。 | 模型改错时 revert 也是新 patch;保留原模型版本、prompt、selection 和 diff。 | 让模型重新生成全文覆盖用户并发编辑,是 Canvas 面试里最常见的灾难答案。 |
| 多人/多窗口并发 | Canvas service | 每个 writer 按 artifact_id 分区串行提交,或在强协作模式使用 OT/CRDT op log。 | 串行模式用 optimistic lock;实时协作模式把 op 转换/合并后再形成 canonical version。 | 服务端只回滚指针或追加补偿版本,不删除已经广播的 event seq。 | 既说支持多人实时协作,又只用 last-write-wins,会覆盖用户内容且无法解释。 |
| Server rollback / disaster restore | 存储和审计系统 | snapshot、diff、op log、audit log、share/export manifest 分开备份,按 artifact version seq 重建。 | 灾后恢复时先冻结写入,重建 current heads,再补发 event catch-up 给客户端。 | 按 tenant/project 维度做 point-in-time restore;分享固定版本优先保持可解释。 | 只备份当前文档文本,不备份版本、评论、分享、审计和预览产物,恢复后产品语义会碎掉。 |
| 能力 | 运行边界 | 安全和修复闭环 |
|---|---|---|
| React/HTML preview | sandboxed iframe、独立 origin、CSP、postMessage allowlist、resource budget | Web content 可能向第三方通信;未知第三方通信要让用户确认,企业可默认关闭网络访问。 |
| Python execution | 浏览器/受控执行环境、stdout/stderr/exception structured event、Fix bug shortcut | 当前 Canvas Python 执行会在底部 console 展示输出;错误建议和 Fix bug 生成 patch,仍走版本/冲突流程。 |
| Dependency policy | 包解析、lock/cache、allowlist/denylist、size/time budget | React/HTML 支持 npm/常见库时也要控制安装时间、包体积、供应链风险和跨用户缓存隔离。 |
| XSS / data exfiltration | DOM sandbox、network egress confirmation、secret isolation、preview storage reset | 不要把聊天里的私密信息自动注入 web preview;预览脚本、外链图片和 fetch 都按不可信代码处理。 |
| Error feedback | compile_error、runtime_error、test_failure、console_output、source_map span | 模型修 bug 需要结构化错误、当前 version、失败命令和最小日志;大日志先摘要和脱敏。 |
| 主题 | 设计 | 权限边界 |
|---|---|---|
| ACL | owner/editor/viewer、tenant/project 继承、GPT capability、admin policy | Canvas 可在 GPT Builder 启用;企业策略控制代码执行、网络访问、分享和导出。 |
| Import | paste -> blank canvas、upload file、open chat content in canvas、create from prompt/toolbox | 导入要记录 source、content_hash、MIME/type、解析结果和安全扫描状态。 |
| Export | document -> PDF/Markdown/Word;code -> 按语言导出文件扩展名 | 导出基于指定 version,避免导出过程中 current 变化;下载 URL 带短期授权和审计。 |
| Share | share live artifact 或 fixed version,scope、expiry、revocation、viewer policy | 撤销分享要清 CDN/preview cache;viewer 不能通过分享链越权看到私有聊天或连接器资料。 |
| 主题 | 事件/指标 | 设计意义 |
|---|---|---|
| Event contract | artifact.patch_delta、inline_comment_added、version_committed、preview_started、preview_error | 事件有 seq、version_id、patch_id、trace_id;客户端断线后按 seq 补齐,避免 patch 丢失。 |
| Metrics | patch_accept_rate、anchor_miss、merge_conflict、preview_latency、sandbox_crash、fix_bug_success | 还要看 canvas trigger precision/recall、targeted edit 成功率、comment apply rate 和 Show changes 使用率。 |
| Eval | trigger boundary、targeted-vs-rewrite、inline comment accuracy、code review usefulness | OpenAI 公开说明中 Canvas 训练/评估关注触发、局部编辑和评论质量;系统应把线上样本回流到这些评估集。 |
| Degradation | sandbox down -> disable run/preview;model patch down -> keep manual editing;event lag -> read-only banner | 最小可用能力是编辑、保存版本和导出;预览、Fix bug、自动建议都可以独立熔断。 |
| 关注点 | 生产契约 | 核心指标 | 降级策略 | 常见陷阱 |
|---|---|---|---|---|
| Version write path | artifact write 以 artifact_id 分区串行提交;base_version_id + idempotency_key 保证重试不会重复生成版本。 | version_commit_p95、duplicate_idempotency_hit、optimistic_conflict_rate、write_error_rate。 | 主写路径不可用时进入只读模式,仍允许查看历史、复制和下载最近稳定版本。 | 把版本写入、预览运行和导出放在一个事务里,任何慢依赖都会阻塞保存。 |
| Event broadcast and catch-up | version_committed 先持久化,再通过 outbox 发布给 WebSocket/SSE;客户端按 artifact_seq 补漏。 | outbox_lag、missing_seq_recovered、client_catchup_ms、event_duplicate_rate。 | 广播层挂了不丢版本;页面显示同步延迟,刷新后从 seq 拉全量差异。 | 只靠内存 pub/sub 推 patch,服务重启后客户端看不到刚保存的修改。 |
| Preview / export queue isolation | React/HTML preview、Python execute、PDF/Word export 走独立队列和 worker pool,不占用版本提交线程。 | preview_queue_age、export_queue_age、sandbox_crash_rate、worker_pool_saturation。 | 队列拥塞时禁用 Run/Preview/Export 按钮或显示排队;文档编辑和版本历史继续可用。 | 一次大型 npm install 或 PDF 导出把所有 Canvas 保存请求拖慢。 |
| Region and disaster recovery | 按 tenant home_region 写 artifact/version;对象存储、diff log、audit log 有 RPO/RTO 目标,派生索引可重建。 | rpo_seconds、restore_time、cross_region_blocked、index_rebuild_lag。 | 区域异常时只读访问最近复制版本;数据驻留不允许跨区写就不自动 failover。 | 把 Canvas 当普通静态文件跨区复制,忽略版本顺序、分享链接和企业数据驻留。 |
| Immutable audit | 每个 create/edit/apply/restore/share/export/preview/run 都写 append-only audit event,包含 actor、policy、version、trace。 | audit_missing、audit_export_lag、tamper_check_failed、policy_version_gap。 | 审计不可写时禁止高风险分享、导出和网络预览;普通编辑可进入受限队列。 | 只存最终内容,无法解释谁应用了哪条模型建议、何时分享、导出了哪个版本。 |
| Derived index rebuild | search、outline、embedding、symbol index、preview cache 都是派生物;真源是 immutable versions + snapshots + audit。 | rebuild_success、index_freshness_lag、cache_purge_lag、share_cache_stale。 | 索引落后时关闭模型跨文档检索,改用当前版本局部扫描或要求用户选择范围。 | 把 embedding/search index 当真源,删除或回滚时产生幽灵内容。 |
Artifact model
Canvas 不是一条消息,而是 writing/coding project 的可编辑 artifact:document、code、rendered React/HTML asset。
Selection-aware edits
用户选中一段文字或代码后,模型应做局部 patch;未选中时才考虑全量重写。
Inline feedback
建议、批注、代码 review 都挂在 range 上,range 随版本演进要能重新定位。
Version history
每次模型修改和用户修改都形成版本,可回滚、对比、导出。
Code preview
代码 Canvas 需要语言识别、格式化、沙箱运行/预览、错误捕获和一键修复。
Preview safety
Canvas React/HTML 和代码执行会被沙箱隔离;外部网络由企业管理员配置,Enterprise 默认关闭网络访问。
Conflict handling
用户编辑和模型 patch 并发时,按版本号、range 和 patch base 检测冲突。
13. Code Executor / Data Analysis
代码执行器必须按不可信代码平台设计
Advanced Data Analysis、API Code Interpreter 和 Canvas Python 看起来都是“让模型跑 Python”,系统上则是安全沙箱、 文件系统、资源调度、结果发布和审计回传。公开 ChatGPT Data Analysis 使用 stateful Jupyter/Python 环境,且不能发起外部 web/API 请求;API Code Interpreter 可以显式配置 container、memory tier 和 network_policy;Canvas Python 的输出在底部 console, React/HTML 预览可能发起网络通信,Enterprise 默认关闭 Canvas 代码访问网络。面试中要明确:模型写 Python,执行层强制隔离。
代码执行容量不是按聊天 QPS 或平均运行时间估,而是按 memory tier 拆池: m 可以代表 small、standard、high-memory 等沙箱池。T_service 包含冷启动、文件挂载、运行和结果复制, 但扫描积压与队列等待要单独用 P99(W_queue) SLO 通过压测或离散事件仿真校验。
| 层 | 职责 | 强制边界 |
|---|---|---|
| Chat / Model | 模型生成 code_interpreter_call,表达 intent、Python code、文件引用和错误修复上下文 | 模型不是执行者,也不自由选择文件或容器;Execution API 基于 ACL、quota 和会话状态注入 allowed_source_file_ids、container 和资源限制。 |
| Execution API | create/reuse container、create Python job、idempotency_key、quota、policy、memory_limit、network_policy | 官方 API 支持自动或显式 container;memory tier 影响成本和容量,container_id、network_policy 和 domain_secrets 决策要进入 trace。 |
| Scheduler queue | tenant/model/tool queue、warm pool、cold start、deadline、cancellation token | 排队前估算 runtime、内存、文件大小和依赖成本;高峰时返回 retry_after 或降级为文件问答。 |
| Sandbox worker | microVM/container、read-only base image、workspace mount、cgroup、seccomp、egress policy | 不可信代码边界在这里强制执行,不依赖 prompt;无宿主机挂载、无跨租户缓存,默认 network_policy=disabled。 |
| Artifact store | server/UI-only: artifact_id, download_url;model-visible: sanitized_summary, opaque citation/ref | 生成产物也按不可信内容处理;给模型的 annotations 不包含可下载 URL 或内部持久化 ID,只暴露脱敏摘要和不透明引用。 |
| Safety / Audit | AV scan、PII/redaction、policy decision、resource usage、repair loop、trace replay | 错误和日志回传给模型用于修复前先截断、脱敏和标注来源;审计保留 request_id、container_id、job_id、source_file_id 和 artifact_id。 |
| 阶段 | 链路 | 失败语义 |
|---|---|---|
| Upload | user file -> object storage -> MIME/type check -> AV scan -> source_file_id | 扫描未完成或类型不支持时不挂载;source_file_id 绑定 tenant、conversation、owner ACL 和保留策略。 |
| Tool call | model emits code_interpreter_call with code; orchestrator resolves allowed_source_file_ids and container config | allowed_source_file_ids、container_id/auto 和 memory_limit 属于执行配置,由 Execution API 根据 conversation、tenant、ACL 和 quota 注入;过期容器不能恢复,只能重建并重新上传文件。 |
| Job creation | CREATED with idempotency_key, quota estimate, memory tier, timeout, retry budget | 重复请求返回同一 job;非幂等外部效果在 Data Analysis 中应被禁止,生成文件是容器内效果。 |
| Queue / run | QUEUED -> sandbox allocation -> workspace mount -> RUNNING -> result events | worker 拿 lease 和 heartbeat;cancel token 可停止排队或尽力中断运行中代码。 |
| Result / repair | stdout/stderr、exit_code、charts/images、opaque citation、exception spans 回给模型和 UI | 模型只拿 sanitized summary、citation 和 opaque reference;artifact_id 只给服务端和 UI 授权层使用,不直接进入模型上下文。 |
| Download / cleanup | generated files scanned and copied to artifact store,容器 idle 过期后工作目录丢弃 | 官方容器应视为临时状态;需要保留的结果必须在活跃窗口内复制为 artifact_id 或下载。 |
VALIDATING 和 QUEUED 也可以直接进入 FAILED 或 CANCELLED;终态不是线性先后关系。
| 状态 | 语义 | 恢复和用户体验 |
|---|---|---|
| CREATED / VALIDATING | 校验 tool schema、code、allowed_file_ids、MIME、扫描状态、租户配额和 memory tier | 失败返回 validation error,不创建 sandbox;大文件或高内存任务可要求用户确认成本。 |
| QUEUED | 等待 warm container 或新 sandbox slot | 队列过深返回 retry_after;tenant quota 命中时不让低优先级任务挤占企业/交互式运行。 |
| RUNNING | 执行代码、采集 stdout/stderr、文件写入、图表生成、资源和网络事件 | 超 CPU/内存/磁盘/时间立即终止并写结构化错误;egress 默认拒绝,不能直接外发数据。 |
| COMPLETED | exit_code=0,代码运行结束,stdout/stderr 和容器内生成文件引用进入结果事件 | COMPLETED 只表示运行完成;artifact 扫描、预览和下载是独立发布状态,UI 不能把分析完成误写成所有下载已可用。 |
| FAILED / TIMEOUT / OOM | 写错误类型、最后日志、资源峰值和可修复提示 | 可修复错误进入模型 repair loop;OOM/timeout 可以建议更高 memory tier、采样数据或拆任务。 |
| CANCELLED | 用户取消、会话关闭或调度层触发 kill switch | 取消运行中代码是 best-effort;已经安全复制的 artifact 可以保留,未复制的容器工作目录不承诺可恢复。 |
| 容器状态 | 语义 | 恢复和用户体验 |
|---|---|---|
| ACTIVE | container 可接收 job,workspace、已挂载文件和 Python 内存仍然存在 | 复用前必须校验 tenant、conversation、policy version 和 last_active_at;不能把旧容器跨会话复用。 |
| IDLE | 暂时无运行 job,但可在活跃窗口内继续复用 | 任何读取元数据、上传/删除容器文件或运行代码都会刷新活跃时间;worker 可回收冷资源。 |
| EXPIRED / DELETED | 容器因 idle TTL 或显式删除失效,内存和工作目录丢弃 | 过期容器不能恢复为 active;只能新建容器、重新解析 allowed source files 并重新上传需要的文件。 |
| 对象 | 字段 | UI / 模型消费 |
|---|---|---|
| OpenAI Responses request | tools[].container = container_id 或 { type: "auto", file_ids, memory_limit, network_policy } | 公开请求侧允许显式复用容器或自动创建/复用活跃容器;file_ids、memory_limit、network_policy 是工具配置,不是模型输出。 |
| OpenAI Responses output | code_interpreter_call: id、type、code、container_id、outputs(logs/images)、status | 这是公开 API 可见形状;container_id 表示实际运行容器,outputs 主要是日志和图片,不承诺包含内部 artifact 记录。 |
| Container files API | container_file: id、container_id、path、source、bytes、created_at、content endpoint | 容器文件属于某个 container,source 可来自 user 或 assistant;容器过期后文件数据不可恢复。 |
| Internal execution config | resolved_container、allowed_source_file_ids、memory_limit、resolved_network_policy、allowed_domains、domain_secrets_ref、policy_version | 这些字段由 orchestrator / Execution API 注入;domain_secrets 只绑定 allowlisted domain,经 secret broker 注入,不能进入模型上下文、stdout 或普通 trace。 |
| Network policy | disabled 或 allowlist{ allowed_domains, domain_secrets } | ChatGPT Data Analysis 默认不能外部 web/API 请求;API 侧若开启 allowlist,必须域名级授权、secret 作用域绑定、日志脱敏和审计。 |
| Public status mapping | in_progress/interpreting -> QUEUED/RUNNING;completed -> COMPLETED;incomplete/failed -> FAILED/TIMEOUT/OOM/CANCELLED | 公开 code_interpreter_call.status 是 API 状态;本章 job state 是内部调度状态,二者不是一一对应。 |
| Execution event | job_id、state、queued_at、started_at、finished_at、exit_code、resource_usage | Streaming UI 可显示正在分析、正在生成图表、正在保存文件;断线后按 job_id 查询终态。 |
| Text output | stdout、stderr、exception、traceback、truncated、redaction_count | 长日志截断并摘要;敏感字段脱敏,原始日志只在受控审计路径可查。 |
| Rich output | image/png、chart spec、table preview、dataframe summary、MIME、size、sha256 | UI 渲染预览,模型收到摘要和引用,不把大文件全文塞回上下文。 |
| Internal artifact record | artifact_id、filename、container_file_citation、download_url、expires_at、scan_status | artifact_id 是产品内部持久化 ID,不是公开 OpenAI 字段;下载 URL 短期有效且按 ACL 授权。 |
| 主题 | 设计 | 约束 |
|---|---|---|
| source_file_id | 用户上传或连接器带来的源文件,存于 object store,经过 AV scan、MIME sniff、size limit、tenant ACL | source_file_id 的 owner 是 user/tenant/conversation;删除要传播到 object store、索引、preview cache 和容器挂载记录。 |
| container_file_id | Execution API 把 allowed source files 复制/挂载到某个 active container 后产生的容器内文件引用 | container_file_id 的 owner 是 container;随容器过期或删除而失效,不应作为长期下载或跨会话引用。 |
| artifact_id | 容器生成文件 -> MIME sniff / size limit / AV scan / zip bomb scan -> artifact store -> annotation -> authorized download | artifact_id 的 owner 是 conversation/tenant;预览在隔离 sandbox 中渲染,下载 URL 短期有效并按 ACL 鉴权。 |
| Retention / deletion | Library file、chat attachment、Temporary Chat file、custom GPT knowledge、container_file、generated artifact 分开建模 | 公开 ChatGPT Library 会保存上传和生成文件直到用户删除;删除后立即从账号移除,并安排 30 天内从系统永久删除,Temporary Chat 文件不保存到 Library。ADA/Document Analysis 和 GPT 文件保留仍按计划/设置变化。 |
| Upload limits | 512MB/file、text/document 2M tokens、CSV/表格约 50MB、image 20MB、rolling upload rate、用户/组织 storage cap | 这些是产品层 admission 信号;后端还要按 file type、MIME、token count、scan backlog、workspace quota 决定是否接入。 |
| Dependencies | preinstalled scientific stack、image version、controlled package source、allowlist/denylist | 避免任意 pip install 打开供应链和外网风险;如支持安装,走私有镜像源、签名扫描、网络隔离和可复现 lock。 |
| Workspace quotas | disk_bytes、file_count、artifact_bytes、download_count、scan_latency | 大文件分析和多图表生成很容易吃满磁盘;超额时提示用户删除或抽样,而不是让 worker OOM。 |
| 产物状态 | 发布条件 | 用户体验 |
|---|---|---|
| SCANNING | container_file_id 已产生,artifact pipeline 正在做 MIME sniff、size check、AV 和 zip bomb scan | UI 可以显示“文件处理中”;模型只拿到摘要引用,不能把未扫描文件当成可下载产物。 |
| QUARANTINED / BLOCKED | 扫描失败、MIME 不符、压缩包异常、主动内容或策略命中 | 运行结果仍可解释,但下载、预览和再次挂载被阻断;审计保留原因和样本哈希。 |
| PREVIEW_READY | 缩略图、表格预览或图表预览已在隔离预览 sandbox 中生成 | 预览环境不能执行宏、脚本或外链;大表只展示抽样和 schema,避免把文件全文塞回上下文。 |
| DOWNLOAD_READY | artifact_id 已持久化,短期 download_url 按 tenant/conversation ACL 签发 | 下载和预览可独立失败或过期;重新签发 URL 不需要重新运行代码,但仍要重验 ACL。 |
| URL_EXPIRED / REVOKED | durable artifact 仍可存在,但当前 signed URL 已过期、权限被撤销或会话策略变更 | UI 应重新请求授权链接或提示不可访问;不要把 URL 失效误判成 artifact 丢失。 |
| DELETED / PURGED / RETENTION_EXPIRED | artifact 已按显式删除、租户保留策略或合规清理从持久存储和预览缓存移除 | 这是不可重新签发 URL 的终态;审计索引只保留最小元数据、删除原因和不可逆清理时间。 |
| 攻击面 | 强制控制 | 残余风险 |
|---|---|---|
| 恶意代码 / 宿主逃逸 | microVM/gVisor/Kata/Firecracker、seccomp、read-only base image、no host mount | 残余风险通过短生命周期、镜像补丁、异常 syscall 告警和高风险样本隔离降低。 |
| DoS / 挖矿 | cgroup、CPU/memory/disk/time/process limits、kill switch、tenant quota | 超限终止并计入 abuse score;不要让单个 notebook 长时间占用 worker。 |
| 数据外传 | network_policy disabled by default;allowlist domains only through egress proxy、domain_secrets、DLP、audit、budget guard | domain_secrets 必须由 secret broker 按域名注入,模型不可见,stdout/stderr 脱敏;只有显式 allowlist 且通过代理审计时才允许指定域名访问。 |
| 恶意输入文件 / 数据指令注入 | treat file content as data、disable macros、formula neutralization、safe archive extraction、no unsafe deserialize | PDF/Office/CSV/压缩包和 pickle/joblib 都是不可信输入;归一化路径、拒绝 symlink traversal、导出表格前转义公式。 |
| 文件泄漏 | per-tenant namespace、per-run workspace、artifact ACL、short-lived download URL | source_file_id、container_file_id、artifact_id 和日志都不能跨 conversation/container 复用;审计时按 ID taxonomy 追踪访问。 |
| 供应链包 | prebuilt image、signed image、package allowlist、private mirror、scan and pin | 包安装失败应成为可解释错误;不能让用户代码任意下载并执行网络脚本。 |
| 日志和结果泄密 | stdout/stderr truncation、PII redaction、large output summary、audit access control | 模型只需要足够修复和解释的摘要;完整日志按最小权限保存。 |
| 主题 | 指标/策略 | 设计意义 |
|---|---|---|
| Lane isolation | 按 tenant、plan、model、tool、memory tier、interactive/background 和 Canvas/API/ChatGPT surface 分队列 | Data Analysis、Canvas Python、API Code Interpreter 和 Agent terminal 不能共享一个无优先级队列;高内存或长运行任务不能饿死普通聊天和短分析。 |
| Capacity | peak_lambda_by_tier、p99_service_time、p99_queue_wait_ms、warm_pool_hit、scan_backlog、slots_per_worker_by_tier | 按 memory tier 分池估 active sandbox,再用压测/仿真校验 P99 queue wait SLO;冷启动和扫描积压要独立看。 |
| Reliability | worker heartbeat、lease、sandbox crash、OOM、timeout、artifact store errors | worker lease 过期后只重放未开始或幂等阶段;RUNNING 且外部状态未知时进入 UNKNOWN/NEEDS_REVIEW,已经生成的 artifact 要幂等复制,避免重复文件或丢文件。 |
| DLQ / retry exhausted | validation_error、sandbox_boot_failed、scan_failed、artifact_publish_failed、unknown_after_cancel | 超过 retry budget 后进入 DLQ,保存 job_id、container_id、attempt_id、input_file_manifest、stdout/stderr 摘要和最后 policy decision,供人工或离线 replay。 |
| Backpressure | tenant_quota_hit、queue depth、memory tier pressure、scan backlog | 高峰时禁用高内存 tier、限制并发、返回 retry_after 或只允许文件问答和解释已有结果。 |
| Observability | oom_count、timeout_count、cancel_latency、artifact_bytes、scan_latency、repair_success_rate | 指标要能按 tenant、model、memory tier、file type、package image 和 sandbox worker 切分。 |
| Cost control | cost_per_run、memory_tier_seconds、artifact_storage_days、egress_bytes、scan_cpu_seconds、retry_waste | 每个 run 把模型 tokens、sandbox minutes、memory tier、artifact storage、network egress 和 retry waste 归因到 tenant/user/tool;超预算时降 memory tier、缩样本、排队或要求确认。 |
| Region / residency / DR | source files、container metadata、artifact store、audit log 按 tenant home_region 写入;派生预览和索引可重建 | RPO/RTO 按 artifact/audit 明确;跨区恢复先保证文件和审计,再重建预览/索引。数据驻留不允许时不能把容器或文件静默迁到其他 region。 |
| Degradation | sandbox unavailable -> disable run;artifact store down -> no downloads;scan backlog -> delay mount;region degraded -> read-only artifacts | 最低可用能力是解释文件/代码和保留聊天;执行失败必须透明,不伪造成成功分析。导出/预览/运行分别熔断,聊天和已保存结果继续可读。 |
14. 后端高并发高可用
聊天服务可以最终一致,用户消息和计费不能丢
高可用设计不要停在“服务多副本”。ChatGPT 这类系统还要处理长连接、生成中断、GPU OOM、 工具超时、RAG 失败、跨区域和成本保护。可靠性策略必须能在部分失败时保持用户可理解。
SLO 是用户能感知到的目标,error budget 是允许失败的额度,burn rate 是额度被消耗的速度。 面试里不要只说“降级”,要说清楚什么指标越线、谁先被限流、哪些能力 fail closed、什么时候切区。
无状态入口
Gateway、Chat API、Streaming relay 水平扩展;鉴权、配额和策略未知时不能默认放行。
有状态生成
Generation 有 CREATED、QUEUED、PREFILLING、STREAMING、COMPLETED、FAILED、CANCELLED、TIMEOUT 状态,断线可按 seq 恢复。
多级限流
按 IP、user、org、model、input token、output token、tool、region 限流,免费和企业用户不同策略。
队列和回压
GPU 忙时按模型池和 token 预算排队;超队列深度返回 429、降模型、缩上下文或禁高成本工具。
多区域
用户有 home_region;强一致写入 home region,搜索、向量和评估异步复制,故障时按 RTO/RPO 切换。
降级策略
开放域 RAG 失败可明示无引用回答;企业知识库、文件问答和联网搜索失败要 fail closed,不能伪造引用。
任务耐久性
Tasks、Deep research 和 Agent 需要 checkpoint、重试、超时、补偿、通知和人工接管。
隔离资源池
免费、Plus、Team、Enterprise、Agent、语音、Canvas 预览和代码执行可分池,避免高成本工作流拖垮普通聊天。
| 可靠性对象 | SLI / SLO | 错误预算动作 |
|---|---|---|
| Ingress / auth / quota | Good event: gateway 2xx/4xx 正确、auth 决策在目标延迟内、quota cache 未超过 staleness TTL | 策略未知时高风险工具和企业数据 fail closed;低风险已登录聊天只能用短 TTL 会话和保守 cached quota,并返回 retry_after。 |
| Conversation durable log | Good event: message、generation、response_events、outbox、idempotency ledger 在 ACK/flush 前持久化 | 写 quorum 或 durable append 不可用时新消息 fail closed 或只读;恢复后按幂等键去重补投,不能先流 token 后补日志。 |
| Interactive chat | Good event: 成功最终回答或明确安全错误,且 TTFT / queue wait / total latency 在目标阈值内 | Burn rate 升高时先限低优先级租户、缩短上下文、降模型或返回 retry_after;不能等全站挂掉才动作。 |
| Streaming relay | Good event: event gap 在阈值内、断线可按 seq 重放、没有 duplicate / missing seq | SSE/WebSocket 断线后按 response_event seq 重放;若 durable log 落后,就暂停 flush 而不是发不可恢复 token。 |
| GPU serving | Good event: queue wait 达标、无 OOM、prefill/decode 成功、tokens/s 不低于池级水位 | 按模型池触发熔断、扩容、跨允许区域借 GPU、禁长上下文和高成本工具;队列水位直接驱动 admission control。 |
| RAG / tools | Good event: retrieval/tool 在 deadline 内完成,副作用无重复,证据请求有足够 citation coverage | 开放域问题可提示检索不可用;企业、文件、权限绑定和联网证据请求要 no-answer 或稍后重试,绝不生成伪引用。 |
| Agent / Canvas / Code | Good event: checkpoint 新鲜、patch 提交成功、preview sandbox 可用、job 成功且 artifact scan lag 达标 | Burn rate 过高时暂停 Agent、Canvas 只读、禁代码运行或延迟下载,保留可恢复 checkpoint 和用户可见状态。 |
| Billing / audit | Good event: outbox lag、ledger mismatch、audit sink lag 和 idempotency conflict 都在阈值内 | 普通聊天可继续排队补投;高影响工具、付费动作和企业审计动作在积压过大时暂停,避免不可追责执行。 |
| Multi-region | Good event: home region 健康、replication lag 达标、failover time 达标、split-brain fence 成功 | 切区由 RTO/RPO 和错误预算共同触发;主区未 fencing 前只能只读或新建临时会话,不能双写。 |
| 对象 | 示例目标 | 面试说明 |
|---|---|---|
| Interactive chat | 示例:TTFT P95 2-5s、queue wait P99 < 30s、stream gap P99 < 2s,按免费/Plus/Enterprise 和模型池拆 SLO | 这是面试用示例目标,不是 OpenAI 官方承诺;真实系统会按 tier、region、模型、工具开关和高峰时段分别定义。 |
| Streaming relay | 示例:SSE reconnect success > 99.9%,duplicate/missing seq 接近 0,relay buffer lag P99 < 1s | 流式体验的好事件不是“HTTP 200”,而是用户能持续看到可恢复的事件;durable seq 是恢复边界。 |
| GPU serving | 示例:accepted token/s 利用率 60-75%,OOM rate < 0.1%,prefill queue P99 按模型池设置 | 利用率太低浪费 GPU,太高会让 TTFT 和 TPOT 崩;容量控制要把 KV cache、batching 和长上下文单独看。 |
| RAG / indexing | 示例:ACL tombstone lag < 5s,fresh file index P95 < 60s,retrieval deadline P95 < 800ms | 索引慢可以少引用,权限慢不能越权;安全相关复制和 tombstone 优先级高于召回率。 |
| Agent / Code / Canvas | 示例:checkpoint age P99 < 15s,sandbox queue P95 < 60s,artifact scan lag P95 < 30s | 长任务的 SLO 要看可恢复性和用户可见状态;不能只统计最终成功率。 |
| Ledger / audit / DR | 示例:outbox lag P99 < 30s,audit sink lag P99 < 2min,replication lag P99 < 10s,failover drill 达标 | 计费和审计允许延迟但不能丢;高影响动作在审计预算耗尽时暂停。 |
| 预算消耗 | 动作 | 边界 |
|---|---|---|
| 2x burn | 进入观察和局部保护:降低新建长上下文比例、收紧低优先级队列、提高采样和 trace 留存 | 目标是早发现,不打扰大多数用户;动作要可自动撤销。 |
| 5x burn | 执行分层限流:免费/批处理/低优先级 Agent 先降级;高成本工具和代码执行加排队上限 | 避免全局 429;按 cell、tenant、model、tool lane 定位爆炸半径。 |
| 10x burn | 触发强动作:关闭非核心功能、冻结可疑 cell 写入、切走入口流量、拉起 incident commander | 此时不再追求功能完整,而是保护 durable log、计费、审计和可恢复状态。 |
| Policy burn | 安全、权限、审计未知时直接 fail closed;只读和低风险普通聊天可以用短 TTL 缓存保守服务 | 可靠性不能以数据泄露、越权检索或不可追责副作用换取表面成功率。 |
| 队列主题 | 做法 | 为什么重要 |
|---|---|---|
| 池隔离 | 按 tenant tier、model、region、chat/agent/code 分池 | 避免一个企业租户或 Agent 长任务占满普通聊天池;跨池借用要有上限和熔断。 |
| 公平调度 | tenant weighted fair queue + per-model token budget | 既限请求数,也限 input/output token 和并发 generation,防止少量长上下文造成 head-of-line blocking。 |
| deadline | 每个请求有 max_wait、用户取消和客户端断线清理 | 超过 deadline 直接 429 或降级;取消后释放队列槽、KV block 和工具执行资源。 |
| retry_after | 由队列水位、服务率、目标模型池和用户优先级估算 | 返回可重试时间和可选降级模型,避免客户端立即重试造成重连风暴。 |
| 容量对象 | 估算方式 | 追问点 |
|---|---|---|
| 入口 admission | 从 raw QPS 扣掉 auth/quota/safety/cache miss 后得到 accepted QPS;令牌桶同时按 request/min 和 token/min 限制 | 面试里要说明 429 是保护系统,不是失败兜底;retry_after 由队列水位和服务率估算,而不是固定秒数。 |
| Streaming relay | 连接数 ≈ accepted QPS × turn 持续时间;容量按长连接、buffer、seq 重放窗口、客户端慢读分别估 | SSE/WebSocket 的瓶颈常是连接和缓冲,不是 CPU;慢客户端要独立限速,避免拖住模型输出。 |
| GPU model pool | 按模型池估算 prefill/decode 时间、batch slots、KV cache block、tokens/s 和目标利用率 | 长上下文主要吃 prefill 和 KV,短回答主要吃 decode;两者混排会造成 head-of-line blocking。 |
| Tool / Code workers | worker slots ≥ tool arrival rate × P95 tool runtime;按浏览、connector、sandbox、artifact scan 分 lane | GPU 等工具时不应长期占 decode slot;工具慢时 checkpoint 并释放核心推理资源。 |
| RAG indexing backlog | backlog age = 待解析/待 embedding 文件量 ÷ indexer throughput;ACL tombstone lane 优先 | 新文件可延迟检索,但删除和权限变更必须快速生效;否则可靠性会变成安全事故。 |
| Cost guardrail | 把 accepted QPS、token/s、GPU seconds、sandbox minutes、egress、storage 写入 forecast 和 budget controller | 高可用不等于无限扩容;成本预算耗尽时也要进入有序降级。 |
| 故障 | 降级动作 | 边界 |
|---|---|---|
| Gateway / Auth / Quota 不可用 | 高风险能力 fail closed;低风险已登录聊天使用短 TTL token、保守 cached quota 和 retry_after | 不能因为配额或策略服务超时就放开工具、企业知识库、代码执行或高成本模型;缓存必须有 staleness 上限。 |
| Conversation store / durable log 故障 | 写 quorum 不足时新消息 fail closed 或会话只读;response_events 落库前不 flush | message、generation、response_events、outbox 和 idempotency ledger 必须在 ACK/可见前持久化,恢复后按幂等键补投。 |
| GPU 满载 | 排队、429 retry_after、降模型、缩上下文、关闭高成本工具 | 按 request/min、input token/min、output token/min、并发 generation 和 queue depth 同时限流。 |
| Safety 不可用 | 高风险能力 fail closed,低风险聊天可进入保守模型或等待 | 不能因为审查服务挂了就允许工具动作、敏感内容或未过滤输出流出。 |
| Billing / Kafka 故障 | 主事务写本地 outbox,后台补投;严重积压时限流付费动作 | 计费不能丢,但不应让瞬时 Kafka 故障直接打断已经提交的用户消息。 |
| RAG 不可用 | 开放域问题明示无引用;企业知识库、文件问答、联网搜索和权限绑定请求 fail closed | 不能用模型记忆冒充检索结果;权限系统、ACL tombstone 或来源校验故障时返回 no-answer 或稍后重试。 |
| 对象存储故障 | 禁止新文件分析;已缓存小文件可读;生成文件延迟下载 | 文件原件、解析结果和下载链接要有独立状态,避免把分析结果误报为完整。 |
| 工具超时 / 半成功 | tool_call -> UNKNOWN/PENDING;记录 idempotency_key、provider operation id、reconciliation job | 用 provider status API、read-after-write 或 outbox reconciliation 确认结果;只有无副作用或幂等动作自动重试,高影响动作需用户确认和审计。 |
| Canvas 故障 | version write quorum down -> 副本/cache 只读;read path down -> artifact 暂不可用;preview down -> 禁预览 | 未提交 patch 保持 pending,不伪装成功;只有读副本可验证时才提供只读,读路径故障则提示稍后重试。 |
| Code Executor 故障 | queue down -> 禁运行;worker crash -> 按 job lease 重试;artifact store / scanner down -> 延迟下载 | job、container 和 artifact 都有独立状态;artifact 复制和发布必须幂等,执行失败不能清掉聊天上下文。 |
| 主题 | 设计 | 避免的问题 |
|---|---|---|
| DLQ 记录什么 | 原始事件、schema version、tenant/org、idempotency_key、attempt_count、last_error、provider_operation_id、trace_id、next_action | DLQ 不是垃圾桶,而是可诊断、可重放、可审计的失败事实;敏感字段仍按日志策略脱敏。 |
| 可自动 replay | 无副作用或天然幂等任务:embedding/index rebuild、artifact scan publish、notification resend、审计 sink 补投 | replay 必须读取幂等 ledger,成功后写 resolved_at 和 replayed_by,避免重复发布文件或重复扣费。 |
| 需人工或用户确认 | 外部支付、发邮件、删除远端数据、提交代码、修改 connector 资源等高影响动作 | 半成功外部动作要先 reconciliation,再决定补偿或让用户确认;不能靠模型猜测结果后重试。 |
| 长任务 checkpoint | Agent、Deep research、Code job、Canvas patch 在 retry exhausted 后进入 PAUSED/NEEDS_REVIEW,而不是 FAILED 丢状态 | 保留最后 checkpoint、工具输出摘要和未提交 patch,让用户可继续、取消或导出中间结果。 |
| 队列健康 | 按 topic/lane/cell 监控 retry age、DLQ inflow、replay success、poison message、oldest unacked | 某个租户或文件造成 poison message 时隔离到 quarantine lane,不拖垮全局消费者。 |
| 主题 | 策略 | 取舍 |
|---|---|---|
| Home region | 用户和企业租户绑定主写区域 | 会话、文件、审计和记忆强一致写主区域,满足数据驻留和删除承诺。 |
| 跨区复制 | 搜索索引、向量索引、评估样本、读副本异步复制 | 复制延迟要进入用户可见边界:跨区恢复后可能先只读,RAG 结果可能短暂不完整。 |
| GPU 跨区 | 容量不足时可跨区推理,但不跨数据驻留红线 | 企业租户要按管理员策略决定是否允许把 prompt 发到其他区域的推理池。 |
| RTO / RPO | 入口分钟级切流;数据按类别定义 RTO/RPO | RTO 是多久恢复服务,RPO 是最多丢多少数据;可见事件和最终消息不能用同一承诺糊弄过去。 |
| 故障域 | 隔离策略 | 为什么重要 |
|---|---|---|
| Cell routing | 按 home_region、tenant tier、model pool、tool lane 路由到固定 cell,cell 内独立 quota、队列、worker 和缓存 | cell 是爆炸半径边界;一个企业租户、一个模型池或一类 Agent 长任务失控时,只烧局部错误预算。 |
| Control plane / data plane | 控制面负责策略、配置、路由和发布;数据面负责聊天、流式、推理、工具执行和持久化 | 控制面故障不应立刻打断已建立的低风险会话;高风险工具和策略未知请求必须 fail closed。 |
| Dependency domain | auth、quota、conversation store、object store、Kafka/outbox、GPU scheduler、vector DB、artifact scanner 分别限流和熔断 | 不能让一个下游慢依赖耗尽入口线程、relay buffer 或 GPU slot;每个依赖有 bulkhead 和 timeout。 |
| Tenant isolation | 大客户独立 cell 或独立队列权重;跨租户缓存、向量索引、文件对象和审计日志全部带 tenant fence | 隔离既是可靠性也是安全边界;排障时可以冻结单租户而不是全站降级。 |
| Release blast radius | 新模型、新 tool policy、新 Canvas/Code runtime 先在 canary cell 放量,SLO 和 eval 同时达标再扩大 | LLM 产品的故障可能是质量/安全回退,不一定是 500;发布单元要和观测单元一致。 |
| 数据类别 | 恢复目标 | 故障语义 |
|---|---|---|
| 用户消息 / generation / outbox | ACK 前同步复制或跨区 quorum 才能承诺 RPO=0 | 用户消息、generation、outbox、可见 response_events 和 idempotency ledger 都要复制;若异步复制,RPO 就是 replication lag。 |
| response_events | 已经对客户端可见的 seq 目标 RPO=0 | 未发送的内存 token 可以丢弃或重试;发送前必须先进入 durable log。 |
| 文件对象 / artifact | 上传确认后目标 RPO=0 或明确返回未完成 | 对象存储跨区复制滞后时,灾备区可先只读元数据并延迟文件分析。 |
| 向量索引 / 搜索索引 | 异步重建,RPO 可为分钟级 | 恢复后可能短暂无引用或少引用,但不能越权;ACL tombstone 必须优先复制。 |
| 审计日志 | 业务 outbox RPO=0,审计 sink 可延迟恢复 | 高风险工具动作在审计积压过大时要降级或暂停,避免不可追责执行。 |
| 跨区写入 | 只在主区 fencing 后开放;否则只读或新建临时会话 | 明确 split-brain 防护,避免同一 conversation 在两个区域同时接受写入。 |
| 步骤 | 动作 | 验收 |
|---|---|---|
| Detect | burn rate、queue depth、replication lag、outbox lag、stream gap、cell health 同时越线,自动开 incident | 检测必须带 scope:region、cell、tenant、model、tool lane,否则只能全局限流。 |
| Freeze / fence | 冻结故障 cell 新写入,停止高影响工具,写入 fencing token,阻止双主和重复副作用 | 未 fencing 前最多只读或新建临时会话;不能让同一 conversation 在两个区域同时接受写入。 |
| Shift traffic | 入口按健康 cell 和 home_region 策略切流;企业数据驻留不允许时返回只读/稍后重试 | 跨区推理只能在租户策略允许且数据边界可解释时启用。 |
| Replay | 按 durable log、response_events seq、outbox、idempotency ledger 回放未完成 generation、工具和审计事件 | 先恢复可见用户状态,再补投计费/审计;replay 永远读幂等 ledger。 |
| Validate | 校验 ledger drift、audit sink lag、artifact availability、RAG ACL freshness、conversation tail consistency | 恢复不是服务能 200 就结束;要确认用户看见的消息、账单和审计能互相对账。 |
| Resume | 逐层恢复写入、Agent、Code Executor、Canvas preview 和高成本模型,观察 burn rate 回落后解除限流 | 恢复顺序应从低风险读写到高影响副作用;避免故障刚恢复就被 backlog 打穿。 |
15. 安全、隐私和权限
Agent 越能做事,安全边界越要硬
安全不是一个 moderation API,而是一条贯穿输入、上下文、RAG、工具、执行、输出、日志和用户控制的治理链。 特别是 Agent:网页和文件里的恶意指令可能诱导它泄露连接器数据或执行真实世界动作。
这里的 principal 是“谁在请求”,resource 是“访问什么”,action 是“做什么”,context 是设备、区域、 项目、连接器 scope、风险等级和管理员策略。安全系统的核心不是让模型自己守规矩,而是每一步都由服务端策略执行器裁决。
| 边界 | 做法 | 为什么重要 |
|---|---|---|
| Input safety | 先判断请求风险 | 高风险请求可以拒绝、改写、要求澄清或禁用工具;低风险请求也要打上 safety context,供后续 RAG、工具和输出审查使用。 |
| Output safety | 流式输出前要有缓冲 | 不能完整输出后才审查,否则违规内容已经到达客户端;流式输出用小缓冲和分段审查,在高风险主题上降低输出速度换安全。 |
| Tool safety | 高影响动作需要确认和可追责执行 | 付款、发邮件、提交表单、删除数据、发代码变更都必须显式确认;Watch Mode 不能替代确认,自动重试也不能绕过确认。 |
| Data safety | 租户隔离、最小权限和 query-time ACL | 所有表、缓存、向量索引、日志和 trace 都带 tenant_id、principal、scope、policy_version 和 resource_version。 |
| Agent safety | 网页、文件、工具和 connector 输出不可信 | 隐藏 prompt injection、钓鱼表单、恶意文件和 connector 数据外传都要作为主风险;不可信内容不能升级成系统或用户指令。 |
| Abuse & quota | 按 tenant、user、device、IP、safety_identifier、surface 和 tool/action 归因限流 | 区分 chat/search/code/agent/voice/image/tool 预算;动作包括降低流速、禁工具、冻结 Agent、block identifier、组织级升级和反绕过检测。 |
| Privacy controls | 训练使用、临时聊天、浏览数据、截图和日志保留 | Business/Enterprise/Edu 默认不用于训练;个人用户可 opt out 或用 Temporary Chat;Agent 浏览数据、截图和连接器授权要可查看、撤销和清理。 |
| 产品面 | 主体 | 资源 | 信任等级 | 策略检查 | 审计 | Fail closed |
|---|---|---|---|---|---|---|
| Chat / conversation | user、org、workspace admin | conversation、message、response_events、memory candidates | 用户输入可信为意图,不可信为事实 | auth、tenant、age/region policy、safety classifier、retention policy | request_id、conversation_id、policy_version、moderation result | 身份或策略未知时拒绝高风险能力;消息未持久化不进入生成。 |
| Projects / files / memory | project member、project owner、memory owner | project files、project memory、personal memory、file chunks | 文件内容和记忆摘要都是数据,不是指令 | project membership、file ACL、memory visibility、delete/revoke filter | source_file_id、memory_id、chunk version、access decision | ACL tombstone、删除或索引状态不明时 no-answer,不生成伪引用。 |
| Custom GPT / GPT actions | GPT builder、workspace admin、end user、OAuth account | GPT instructions、knowledge files、action schema、action domain、outbound payload | builder 指令低于平台安全策略;action response 不可信 | domain allowlist、OAuth scope、schema validation、workspace sharing policy、outbound consent | gpt_id、action_id、domain、auth mode、user confirmation、shared fields | 域名、schema、OAuth scope 或 workspace policy 不匹配时禁止 action;发往第三方的数据最小化且不承诺内部删除周期覆盖第三方保留。 |
| Apps / connectors / RAG | current user + connected app account | connector documents、search results、citations、cached snippets、app-visible context | connector 内容只作为 evidence,不具备指令权 | query-time ACL、scope、document version、DLP、source provenance、third-party privacy boundary | connector_id、scope、doc_id、retrieval_time、ACL version、consent record | 授权过期、撤权、索引异常或 ACL 不可验证时不返回结果;向 app 暴露的 memory/context、设备和区域信息走最小披露。 |
| Agent browser / terminal | user delegated agent session | browser state、screenshots、cookies、terminal actions、enabled apps、external sites | 网页和终端输出默认 hostile | workspace toggle/RBAC、app controls、site blocklist、capability token、step budget、DLP、human confirmation | agent_run_id、step_id、enabled_app、blocklist_version、visible summary、confirmation record | Enterprise/Edu 默认关闭或策略未启用时禁用;sync app index 不直接给 Agent;网站阻断同时作用于虚拟浏览器和 connectors。 |
| Canvas / code workspace | artifact owner、collaborator、model proposer | artifact_version、patch、preview sandbox、export file | 模型 patch 是建议,不是直接写入事实 | version check、range anchor、preview sandbox、share/export ACL、network toggle、third-party confirm | artifact_id、base_version、patch_id、preview result、share_id、network confirmation | base version 冲突、anchor 低置信、预览不可用、权限未知或未知第三方通信未确认时保持 pending。 |
| Code Interpreter / Data Analysis | conversation user、sandbox service account | uploaded files、container、stdout/stderr、artifact、download URL | 用户文件、执行输出和生成产物全都不可信 | sandbox isolation、no outbound web/API request、uploaded or connected source only、artifact scan | container_id、job_id、source_file_id、artifact_id、scan result | 文件授权、沙箱隔离、扫描或下载签名失败时不挂载、不执行或不发布 artifact;外部数据必须上传或来自已连接 source。 |
| Voice / image / realtime media | chat user、device session、workspace admin、media processor | microphone/video stream、transcript、uploaded image、generated image、media object、EXIF/PII | 音视频和图片都是不可信输入;转写和视觉理解也可能错 | device permission、media safety、age/region policy、EXIF/PII stripping、data residency、training opt-in、usage limits | media_id、session_id、consent state、safety verdict、transcript id、asset version | 麦克风/相机权限、media safety、驻留策略或训练同意状态未知时不采集或不用于训练;图片生成/编辑失败不发布 asset。 |
| Tasks / Pulse / notifications | user、scheduler、notification service | scheduled task、research result、notification payload | 后台结果需要重新进入安全和权限检查 | user opt-in、quiet hours、fresh ACL、delivery channel policy | task_id、trigger_time、policy_version、delivery status | 用户撤销、权限变化或风险升级时跳过执行,只发可解释失败状态。 |
| 机制 | 设计 | 面试解释 |
|---|---|---|
| 来源包装 | RAG、网页、文件、connector、tool output 都进入 source block,带 provenance、timestamp、scope 和 taint bit | 模型可以引用这些内容作为证据,但不能把其中的“忽略上文”“导出密钥”等句子当成更高层级指令。 |
| 指令层级 | system/developer > user > tool contract;untrusted source 永远低于用户目标和平台策略 | 外部内容只能影响回答事实,不能扩大权限、改变收件人、要求访问其他 connector 或关闭安全检查。 |
| 秘密和外传 | secret redaction、DLP、egress policy、clipboard/download/email guard、cross-source join 检测 | 从不可信内容派生的导出、邮件、表单提交、下载和权限变更必须重新走 policy_eval 与用户确认。 |
| 缓存污染 | cache key 包含 tenant、principal、scope、policy_version、doc_version、safety label | 禁止跨用户、跨租户、跨 project 复用 connector/RAG 结果;撤权 tombstone 先在 query-time 生效,再异步清理旧索引。 |
| 资源 | 权限策略 | 撤权 / 删除语义 |
|---|---|---|
| RAG / connector | 检索时按当前 user、org、project、OAuth scope、document version 和 ACL version 过滤 | 权限不在索引构建时一次性固化;query-time 再验证,授权过期、撤权或 ACL 服务异常时 no-answer。 |
| Memory | personal memory、project memory、reference chat history 分开;Temporary Chat 不读写个性化 memory | Temporary Chat 可保留有限安全上下文并短期保留副本,但不进入个性化记忆;用户禁用或删除 memory 后,候选、索引和摘要缓存都要停止使用。 |
| Files and artifacts | 上传文件、项目知识文件、GPT knowledge、代码执行产物、Canvas export 用不同 resource type | 下载 URL 是短期签名能力,不给模型;分享、导出和删除要独立检查 owner/collaborator/admin 权限。 |
| Admin policy | workspace admin 控制 Agent toggle/RBAC、apps、connectors、GPT actions、sharing、retention、data residency 和 compliance export | 用户 OAuth 授权不能越过管理员禁用策略;Agent 只用 workspace 启用的 apps,Compliance API 暴露 agent conversation 而非每个虚拟机/app 子请求。 |
| 场景 | 控制 | 边界 |
|---|---|---|
| 状态机 | PROPOSED -> POLICY_EVAL -> DRY_RUN -> CONFIRMATION -> EXECUTING -> AUDITED -> DONE/COMPENSATING | 模型只能提出 tool call;执行器根据 policy 和确认记录决定是否真的调用外部系统。 |
| 低影响动作 | 只读搜索、读取当前用户授权文件、生成草稿、预览 patch 可自动执行 | 仍要记录 scope、source、参数和结果摘要;只读不等于无风险,敏感数据读取也要 DLP。 |
| 高影响动作 | 发邮件、付款、提交表单、共享文件、删除、改权限、发代码变更必须确认 | 确认界面展示收件人、金额、域名、资源名、diff、数据来源和不可逆影响;确认后生成不可抵赖审计事件。 |
| Browser / terminal | 网页 DOM、终端输出和截图限制在 agent run;cookies、saved logins 属于持久 browser profile | 登录态只在 VM 内使用且不能给模型明文;网络和文件系统按能力令牌授权,需要跨站提交、下载、上传或复制敏感内容时重新确认。 |
| Code Executor | Data Analysis / Code Interpreter 无外部 Web/API 请求;Canvas / custom executor 默认关网络或由管理员控制 | 外部数据通过上传或 connected source 进入;Canvas 预览遇到未知第三方通信要用户确认;自建执行器才设计 allowlist、egress proxy、DLP、audit。 |
| 场景 | 控制面动作 | 面试要点 |
|---|---|---|
| Policy service down | 使用短 TTL signed policy cache 服务低风险聊天;高风险工具、企业数据、connector、代码执行和共享 fail closed | 策略未知不能默认放行;cache key 含 policy_version、tenant、region、user age/tier 和 resource scope。 |
| Audit sink down | 低风险事件写本地 outbox 后补投;高影响动作、管理员变更、外部副作用和合规导出暂停 | 可用性不能牺牲可追责性;outbox lag 进入 SLO 和 burn-rate 控制。 |
| False positive | 提供可解释拒绝、用户申诉、人工复核队列、policy replay 和 allowlist change request | 误杀会伤害用户体验;修复要回放同一 request/context/policy_version,避免靠主观感觉改规则。 |
| False negative | incident kill switch、block identifier、撤回 artifact/share、禁用 tool lane、补跑 redaction 和通知受影响租户 | 漏拦的处理对象包括回答、文件、分享链接、Canvas export、connector 外发和第三方动作。 |
| Red-team / evals | 把 prompt injection、exfiltration、jailbreak、tool poisoning、media abuse 和 connector leak 做成发布硬门禁 | 新模型、新工具 schema、新 connector、新安全策略都要 shadow replay 和 adversarial eval,不能只测普通 QA。 |
| Incident loop | 记录 blast radius、policy diff、trace sample、user impact、rollback/kill switch、补偿动作和 postmortem owner | 安全事故闭环最终要回到 release gate、监控规则、红队用例和用户控制,而不是只修一次热补丁。 |
| Deletion / compliance | 删除状态优先于旧索引;训练候选、评测样本、日志、对象存储、向量库、缓存和备份分别有 tombstone 路径 | 合规删除是控制面状态,不是主表 delete;所有读路径先检查 tombstone 和 retention policy。 |
| 数据 | 保留 / 训练 | 删除 / 合规语义 |
|---|---|---|
| Conversation / messages | 按用户或企业 retention policy 保存;Temporary Chat 不用于训练并短期保留后删除 | 删除要传播到搜索、摘要、评估候选和缓存;法律、安全和滥用调查例外需要单独审计。 |
| Business / Enterprise / Edu data | 默认不用于训练;管理员可配置保留、连接器、共享、数据驻留和合规导出 | 设计里把 training candidates 与 serving logs 物理/逻辑隔离,只有授权、脱敏、过滤后的样本能进入训练候选池。 |
| Shared links / Canvas share | 个人版是 public bearer snapshot link;Business/Enterprise 是 workspace-scoped link | Enterprise 共享聊天可继续展示分享后新增消息;unshare 或删除后链接失效,viewer 继续对话会生成私有副本;分享前提示敏感内容并审计 share/unshare。 |
| Files / GPT knowledge / Project files | conversation file、Library file、GPT knowledge、Project file 分 resource type 和 owner lifecycle | 删除 chat 删除对话及已拉入上下文的引用/派生内容;已保存到 Library 的文件需单独删;Temporary Chat 文件不入 Library;Project/GPT 删除要 tombstone 知识文件和索引。 |
| Voice / image / media assets | 文本、图片、语音/视频片段、转写、图片生成输入输出按 plan、workspace、consent 和 residency 分开保留 | 个人用户可选择分享音视频训练;Business/Edu/Enterprise workspace 不允许用户分享语音/视频用于训练。EXIF、PII、缩略图、签名 URL 和生成 asset 都要独立删除传播。 |
| Memory | 用户可查看、禁用、删除;memory candidate、approved memory、embedding 和摘要缓存分层删除 | 删除 memory 不等于改写历史对话;系统要停止未来使用,并保留最小审计证明删除已传播。 |
| Agent browser state | 任务能力令牌和 VM 执行权限随任务结束失效;cookies、saved logins 可跨会话保留并由用户清理 | 普通 Chat/Temporary Chat 见 30 天窗口;Agent chat、浏览历史和截图随对话保留,删除后按 Agent 的 90 天窗口清理;用户接管期间不采集截图。 |
| Logs / traces / compliance | trace 用最小必要字段;合规 API/导出面和内部审计面分层 | 请求、策略决策、工具动作摘要和高风险确认可查;chain-of-thought、密钥、cookie 和原始截图不进入普通分析日志。 |
| Backups and deletion | 在线索引先删除或 tombstone,备份按固定窗口过期;删除状态比旧索引优先 | 面试里说明“删除不是只删主表”:OLTP、对象存储、向量库、搜索索引、缓存、outbox、备份和训练候选都要有删除路径。 |
16. 评估、可观测性和成本
大模型系统上线后,质量必须能被回放和打分
传统服务只看错误率不够。LLM 产品还要看回答质量、引用正确性、工具决策、Agent trace、 安全拦截、GPU 利用率和每 token 成本。没有 trace,就无法解释一次坏回答是检索错、工具错、 prompt 错还是模型错。
面试里最关键的不是背指标名,而是把指标接到动作。一次 TTFT 越线要能沿 trace 钻到 admission、 队列、prefill、decode、stream relay 或客户端背压;一次质量回归要能定位到模型、prompt、 RAG index、工具 schema 或安全策略版本;一次成本越线要能驱动限流、降模型、缩上下文或扩容。 这里的 TTFT_model 是模型服务首 token,TTFC_user 是用户侧首 chunk;BillableUsage 用于计费解释, COGS_turn 用内部摊销单价 c_* 估成本,二者不能混算。
用户体验
TTFT 拆成 admission、queue、prefill、first decode、stream relay、client backpressure;再看断流、取消、重试和反馈。
GPU 运行
GPU/HBM、free KV blocks、KV eviction、prefix cache hit、batch wait、scheduler starvation、deadline miss。
RAG 质量
召回、rerank、groundedness、引用正确率、ACL/version/freshness、connector sync lag、external rate limit。
记忆质量
Saved Memory、Reference Chat History、Project Memory 和 Temporary Chat 要看写入正确率、删除传播和边界泄漏。
工具质量
tool success、timeout、retry、confirmation precision/recall、Agent step rollback、Watch Mode interrupt、任务完成率。
实时语音
WebRTC/session setup、RTT/jitter/loss、VAD、ASR、TTS first audio、barge-in 和 reconnect 直接决定体感。
安全质量
policy decision、误杀/漏拦、prompt injection、数据外传、terminal 网络违规、write action 阻断和 fail-closed。
成本质量
按 model/tier/region/tenant/surface 拆 tokens、GPU seconds、sandbox minutes、sync/index/egress,并对账 usage ledger。
端到端 trace
root/inference/retrieval/tool/agent/code spans 记录版本、token、finish reason、脱敏摘要和 artifact pointer。
后台任务
Tasks/Pulse 观测 schedule skew、checkpoint、retry、过期/取消、通知送达和异步研究结果回写。
| 产品面 | 用户面 SLI | Good / Bad event | Trace / Span 来源 | SLO / 告警 | 排障和容量动作 |
|---|---|---|---|---|---|
| Streaming chat | TTFT_model、TTFC_user、TPOT、chunk gap、completion latency、disconnect、cancel、retry | Good = 2xx 且 TTFC_user <= T1、TPOT <= T2、无断流;Bad = 超阈值、5xx、stream_disconnect、deadline_exceeded。 | root request span + inference span + stream relay span + client ack/backpressure | 用 5m/1h 和 30m/6h 多窗口 burn rate;P99 只做症状面板,不直接当 burn-rate 分母 | 按 trace 定位 admission、队列、prefill/decode、relay 或客户端;必要时限流、降模型、缩上下文、扩推理池。 |
| GPU inference | per-model deadline miss、queue wait、tokens/s/GPU、OOM、KV block pressure | Good = batch 在 deadline 内完成且无 OOM/eviction storm;Bad = queue wait 超阈值、deadline miss、OOM、scheduler starvation。 | router span、scheduler batch span、prefill/decode worker span、KV cache events | 按 model/tier/region/tenant 分池做 burn rate 和容量水位告警;避免全局平均掩盖高优先级队列 | 调整 admission、continuous batching、chunked prefill、prefix cache、跨池借 GPU 或暂停低优先级长上下文。 |
| RAG / connectors | retrieval latency、ACL deny/no-answer、citation correctness、freshness、sync lag、external 429 | Good = ACL 可验证、freshness 在窗口内、引用可追溯;Bad = stale source、ACL unknown、external 429/5xx、错误引用。 | query rewrite、embedding、vector search、rerank、connector fetch、ACL check spans | 按 connector、index version、ACL version、doc freshness 建 SLO;权限未知直接 no-answer | 回滚 index、重建 ACL filter、降级为无连接器回答、暂停 stale source、触发 sync repair。 |
| Memory | extraction precision/recall、source attribution、write/apply latency、delete propagation、boundary violation | Good = 只在允许面引用正确记忆且来源可追溯;Bad = 错误写入、Temporary Chat 读写 memory、删除后仍使用、Project 边界泄漏。 | memory_extract、memory_write、memory_apply、memory_delete spans,带 memory hash、source_event、visibility、project boundary | 按 saved memory、reference chat history、project memory 切片;deleted-memory use 和 boundary violation 是高优先级事件 | 冻结写入、禁用相关 memory source、强制 tombstone 优先生效、重放删除 outbox、回滚 memory policy。 |
| Agent / tools | tool success、step timeout、approval latency、漏确认、rollback、Watch Mode interrupt | Good = policy allow/confirm 后动作完成且审计齐全;Bad = timeout、漏确认、retry exhausted、rollback、用户中断。 | agent run/step span、tool execute span、policy_eval span、confirmation snapshot | 高影响 action 漏确认为 P0;工具 timeout 用 dependency + action type 切片 | 禁用高风险 action、降到草稿模式、要求 takeover、回滚工具 schema 或拉黑异常 domain。 |
| Safety / policy | policy latency、decision error、unsafe allow、false refusal、DLP redaction、prompt injection/exfiltration block | Good = policy bundle 可用且正确裁决;Bad = unsafe allow、policy timeout fail-open、误拒激增、外传检测绕过。 | policy_eval span、classifier span、redaction event、policy_bundle_version、classifier_version | unsafe allow 和 fail-open 单独高优先级告警;按 policy bundle / classifier version 切片 | fail closed、禁工具/连接器、回滚策略包或分类器、提高确认门槛并触发安全回放集。 |
| Voice / Realtime | session setup、WebRTC RTT/jitter/loss、VAD endpoint、ASR partial/final、TTS first audio、barge-in、reconnect | Good = 首音频和打断在阈值内、丢包可恢复且无音频安全超时;Bad = setup fail、ASR/TTS 超时、barge-in miss、reconnect storm。 | realtime session span、webrtc transport span、VAD/ASR/TTS spans、audio safety span、client playback ack | 按 region、relay、device、codec、network type 切片;P99 首音频、jitter/loss 和 reconnect 分开告警 | 切文本模式、关闭 full-duplex、回滚 ASR/TTS、按 region 扩 relay、降采样音频或提示重连。 |
| Image / multimodal | upload latency、media safety latency、EXIF/PII strip、generation queue、render fail、artifact/CDN publish、feedback | Good = 安全扫描、生成/编辑、发布和引用都在阈值内;Bad = policy refusal 激增、渲染失败、asset 发布失败、CDN/egress 异常。 | media upload span、image safety span、image generation/edit span、artifact publish span、feedback/eval span | 按 model、size、style/edit mode、region、safety policy、asset type 切片;render fail 和 unsafe publish 是高优先级 | 回滚图像模型或 safety policy、切低分辨率/异步队列、禁异常编辑模式、暂停 CDN 发布并重扫 artifact。 |
| Canvas / Code Executor | patch apply success、preview startup、sandbox queue、runtime/memory、AV scan、artifact publish | Good = patch/preview/job/artifact 在阈值内完成且扫描通过;Bad = anchor conflict、sandbox timeout、AV fail、publish blocked。 | artifact patch span、preview sandbox span、container job span、file scan/artifact span | 交互式代码执行看 P99 queue wait;预览网络确认和 artifact 扫描失败单独告警 | 降级为静态 diff、限制大文件/高内存任务、扩 sandbox worker、暂停下载发布。 |
| Tasks / Pulse | schedule skew、checkpoint age、retry exhaustion、expired/cancelled、notification delivery、fresh ACL | Good = 触发、研究、重校验、通知均在窗口内;Bad = missed trigger、retry exhausted、expired result、delivery fail。 | scheduler trigger span、research job span、checkpoint span、notification span | 后台任务用时延和积压告警;发送前重新校验 ACL、quiet hours 和 delivery policy | 重排队、补偿通知、丢弃过期结果、暂停某连接器研究或切换低成本模型。 |
| Deletion / compliance | tombstone propagation lag、cache purge lag、index deletion lag、training candidate quarantine | Good = tombstone 先于旧索引生效且传播在 SLO 内;Bad = 查询绕过 tombstone、缓存未清、训练候选未隔离。 | delete request span、outbox span、object/vector/search/cache delete spans | 删除传播超 SLO 或 tombstone 查询绕过是高优先级安全事件 | 先让 query-time tombstone 生效,再异步清索引/备份;冻结训练候选并输出合规审计。 |
| Billing / usage ledger | usage event durability、idempotency conflict、token reconciliation、quota counter drift、invoice/export lag、refund state | Good = response usage、ledger、quota 和 invoice/export 可对账;Bad = 丢 usage event、重复计费、quota 漂移、出账延迟或退款未闭环。 | usage_meter span、ledger append span、quota counter span、billing export span、refund/adjustment span | ledger completeness 和 reconciliation drift 单独告警;按 plan、workspace、model、surface 和 billing cycle 切片 | 冻结出账、保守扣减 quota、从 outbox 重放 usage event、生成 adjustment/refund、修正 invoice export。 |
| 平面 | 记录什么 | 采样 / 隐私边界 |
|---|---|---|
| Metrics | 低基数聚合:SLI、burn rate、queue depth、token/s、GPU utilization、cost per turn、ledger drift、policy decision counts | 标签只放 plan/model/region/surface/status/error_type 等有限集合;不放 prompt、doc_id、user_id、URL 或异常文本。 |
| Traces | 按 request_id 串 root、inference、retrieval、tool、agent、code、voice/image、billing spans | 采样率按风险和错误动态提高;高风险安全、账务、删除和高影响动作强制采样。 |
| Events | 可回放事实:response_events、tool_call/result、policy_decision、approval_snapshot、usage_event、delete_tombstone、artifact_state | 事件是事后解释和补偿的真源;至少一次投递时靠 idempotency_key 和 ledger_seq 去重。 |
| Logs | 脱敏诊断文本:错误摘要、截断 stdout/stderr、provider error class、runbook note、human review decision | 日志不作为低基数 metric 标签,不保存 chain-of-thought、cookie、secret、完整截图、原始音频或未脱敏文件内容。 |
| Artifacts | 受控回放对象:脱敏 prompt bundle、RAG evidence pointer、截图/音频/文件 pointer、Canvas patch、image asset、eval sample | artifact 读取必须重新鉴权;保留期、删除和训练资格独立于普通 trace。 |
| Span | 必须记录的版本和归因字段 | 隐私和高基数边界 |
|---|---|---|
| All critical spans | status、outcome、error.type、retry_attempt、deadline_ms、cancel_reason、dependency、sampled、redaction_policy_version | error.type 低基数化,例如 timeout、policy_denied、dependency_429、oom、user_cancel、retry_exhausted;避免把异常文本当标签。 |
| Root / request | request_id、conversation_id、tenant_id、region、plan/tier、surface、router_version、prompt_version、policy_version、sampling_rate | tenant/user 是分区键不是高基数标签滥用;普通 trace 不写原始 prompt、chain-of-thought、cookie、密钥。 |
| Inference | model/requested_model/served_model、input/output/cached tokens、stream=true、finish_reason、TTFT_model、TTFC_user、TPOT、queue/prefill/decode timing | 只记录 token counts 和脱敏错误类型;内容回放走受控 artifact pointer 与权限检查。 |
| Retrieval / connector | connector_id、index_version、ACL_version、query_hash、top_k、rerank_version、freshness、no-answer reason | doc_id、snippet、embedding 不进普通 metric 标签;只存脱敏摘要、citation pointer 和版本。 |
| Memory | memory_id/hash、source_event_id、memory_version、visibility、project_id、memory_policy_version、temporary_chat=false、delete_tombstone_version | memory 文本不做标签;删除后 trace 只能保留最小审计字段,并证明未来 serving 不再引用。 |
| Tool / agent | agent_run_id、step_id、tool_name、schema_version、risk_level、policy decision、approval_id、tool result summary | 工具参数和结果默认 redacted;截图、DOM、下载文件放对象存储并按权限、保留期和采样策略访问。 |
| Voice / realtime | session_id、ephemeral_key_id、region、relay_id、codec、RTT/jitter/loss、VAD delay、ASR final latency、TTS first audio、barge_in | 普通 trace 不存原始音频;必要时只存短期受控音频 artifact pointer、转写摘要和安全判定版本。 |
| Image / multimodal | media_id、asset_id、model、size、mode(upload/generate/edit)、safety_verdict、EXIF_strip、generation_queue、render_status、cdn_publish、egress_bytes | 原图、生成图和编辑 mask 只放受控对象存储;普通 trace 只记录指针、版本、大小桶、安全结论和失败类型。 |
| Canvas / code | artifact_id、base_version、patch_id、sandbox_id/container_id、runtime、memory、file_scan_result、publish_state | stdout/stderr、traceback 和文件预览先截断脱敏;下载 URL 只做短期签名,不进入模型 trace。 |
| Async task | task_id、schedule_time、trigger_time、checkpoint_seq、retry_count、fresh_acl_version、notification_channel、delivery_status | 后台研究结果发送前重新做权限和 DLP;失败摘要可观测,用户内容仍按会话/企业保留策略处理。 |
| Billing / usage ledger | usage_event_id、idempotency_key、response_id、model、input/output/cached tokens、quota_counter_version、ledger_seq、invoice_batch_id | 账务 trace 记录数值和版本,不写 prompt;workspace/user 只用于授权和对账分区,避免高基数 metric 标签。 |
| 症状 | 首查面板 / Query | 关键 Span | 常见根因 | 降级 / 回滚动作 |
|---|---|---|---|---|
| TTFT 慢 | TTFC_user 分解面板:admission、queue、prefill、first decode、relay、client ack | root request、router、scheduler batch、inference prefill/decode、stream relay | 配额/策略慢、模型池排队、长上下文 prefill、KV pressure、relay backpressure、客户端慢读 | 按模型池限流、降模型、缩上下文、扩 GPU/relay、关闭低优先级工具或返回 retry_after。 |
| 引用错 / 无引用 | citation correctness、ACL unknown、index freshness、connector 429、rerank version | query rewrite、embedding、vector search、rerank、connector fetch、ACL check | 索引过期、ACL tombstone 未优先、connector sync lag、reranker 回滚、模型未使用证据 | no-answer/fail closed、重建索引、回滚 rerank、暂停 stale source、把样本加入 groundedness eval。 |
| 工具半成功 | tool timeout、provider operation id、idempotency conflict、confirmation snapshot、retry exhaustion | agent step、policy_eval、tool execute、outbox/reconciliation | 外部 provider 超时、确认后网络断开、重复重试、副作用状态未知、schema 版本不兼容 | 进入 UNKNOWN/NEEDS_REVIEW、查 provider status、停止自动重试、高影响动作让用户确认补偿。 |
| 成本暴涨 | forecast burn、tokens/cache miss、GPU seconds、sandbox minutes、connector sync、egress | usage_meter、inference、cache、tool/agent、container job、connector sync | 长上下文比例升高、prefix cache miss、Agent 步数失控、大文件/图像生成激增、重试风暴 | 预算熔断、降模型、限制步数/文件/分辨率、启用摘要、暂停异常 connector 或任务队列。 |
| 质量回退 | canary delta、regenerate/complaint、eval score、model/prompt/router/index/policy version diff | root、router、inference、retrieval、tool、policy bundle | 模型别名切换、prompt 包变更、router 规则错误、tool schema 漂移、index manifest 错 | 暂停放量、version pinning、回滚 artifact、shadow replay 失败样本、扩大人工标注。 |
| 安全漏拦 | unsafe allow、prompt injection block rate、DLP miss、high-impact confirmation miss、exfiltration signal | classifier、policy_eval、redaction、tool execute、connector fetch | 策略包回归、分类器阈值错误、tool output 未 taint、connector 数据外传、确认 UI 缺字段 | kill switch、fail closed、禁相关工具/connector、回滚策略、补跑安全回放和通知受影响租户。 |
| 账单对不上 | usage event completeness、ledger_seq gap、quota drift、invoice batch、refund/adjustment state | usage_meter、ledger append、quota counter、billing export、refund/adjustment | stream retry 重复事件、final usage 丢失、outbox lag、幂等键冲突、模型/tokenizer 版本不一致 | 冻结出账、从 outbox 重放、保守 quota、生成 adjustment/refund,并把差异样本加入对账回归集。 |
| 阶段 | 指标 | 怎么定位 | 动作 |
|---|---|---|---|
| Admission / quota | admission latency、quota lookup、tenant budget、rate-limit decision | 慢在入口通常是身份、配额、策略或区域路由服务抖动 | 缓存短 TTL 配额、降级非关键个性化、对低优先级租户返回 retry_after。 |
| Queue / scheduler | per-model queue wait、batch wait、deadline miss、priority inversion、scheduler starvation | P99 TTFT 高但 GPU 利用率不满,多半是队列、公平性或 batch 策略问题 | 按 tier 分队列、调整 batch window、切换模型池、限制超长上下文。 |
| Prefill / KV | prefill time、prompt tokens、free KV blocks、KV eviction、prefix cache hit、HBM bandwidth | 长上下文和 cache miss 会把首 token 拖慢,KV eviction 会引入抖动 | 压缩上下文、启用 prefix cache、PagedAttention 调参、限制低价值历史注入。 |
| Decode / stream | TPOT、decode tokens/s、stream chunk gap、relay buffer、client backpressure | TPOT 慢看 GPU decode;chunk gap 大但 decode 正常看 relay 或客户端消费 | 分离 relay 告警、背压时降采样 trace/取消低优先级流、扩 decode worker。 |
| Dependency / tool | connector latency、tool timeout、sandbox startup、external 429、confirmation wait | 总耗时慢但模型正常,多半是 RAG、工具、代码沙箱或用户确认等待 | 设置 per-tool timeout、返回部分结果、降级只读模式、预热 sandbox、隔离外部依赖。 |
| 检测主题 | 方法 | 自动动作 |
|---|---|---|
| Seasonality baseline | 按小时/星期/地区/plan 建立请求、token、GPU、工具、语音、图像和账务基线 | ChatGPT 流量有强周期;只用固定阈值会把高峰误报或把慢性退化漏掉。 |
| Per-surface robust score | 对 TTFT、citation error、tool timeout、policy refusal、image render fail、ledger drift 用 robust percentile/z-score | 按 surface、model、connector、region 切片,避免全局均值掩盖局部事故。 |
| Canary delta | 新模型/prompt/router/tool schema/index/policy 与 stable bucket 比较质量、延迟、安全和成本 | delta 越线自动暂停放量;人工只处理少量边界样本和业务取舍。 |
| Connector spike | 外部 429/5xx、ACL unknown、sync lag、doc freshness、no-answer rate 出现异常时隔离 connector | 一个 SaaS connector 的异常不能拖垮全局 RAG,也不能用旧内容假装检索成功。 |
| Safety anomaly | unsafe allow、DLP miss、exfiltration signal、high-impact confirmation miss、prompt injection block rate 激增 | 安全异常优先于可用性;必要时 fail closed、禁工具、禁 connector 或切只读。 |
| Ledger anomaly | usage event gap、idempotency conflict、quota drift、invoice/export lag、refund queue age 异常 | 账务异常先冻结出账和保守 quota,再重放 outbox;不要把重复 retry 当新增消费。 |
| 评估层 | 样本来源 | 指标 | 发布门禁 |
|---|---|---|---|
| Offline eval | golden set、hard negatives、真实 trace 抽样、RAG/工具/Agent/安全多语言用例 | answer correctness、groundedness、citation accuracy、tool decision、policy precision/recall | 新模型、prompt、router、index、tool schema 低于基线或置信区间不通过就不能灰度。 |
| Online eval | 用户反馈、regenerate、conversation abandon、人工标注、LLM judge 抽检 | 满意度 proxy、bad answer rate、judge-human agreement、per-surface regression | 线上只做抽样和切片,不把 LLM judge 当唯一真值;关键样本回流离线集。 |
| Safety regression | jailbreak、indirect prompt injection、secret exfiltration、漏确认、policy bypass | attack success rate、false refusal、unsafe allow、high-impact action miss | 安全越线直接 block rollout 或关闭对应能力,不能用平均满意度抵消安全失败。 |
| Canary / A/B | 按 plan、region、model、connector、surface、language 分桶 | latency、cost、quality、safety、tool success、complaint delta | 指标恶化触发自动 rollback;只扩大通过所有硬门槛的桶。 |
| Release artifact | model card、prompt bundle、router config、index manifest、schema diff、policy bundle | version lineage、replayability、approval record、rollback target | 每次发布都能用同一 trace 重放到旧版本,否则事后无法解释质量回归。 |
| 产品面 | 信号 | 典型故障 | 处置 |
|---|---|---|---|
| Apps / Connectors sync | sync lag、delta cursor age、ACL drift、index build error、external 429/5xx、freshness | 连接器看似可用但返回过期或越权内容,比直接失败更危险 | stale source 降级为 no-answer 或提示重新连接;sync worker 和 query-time ACL 分开告警。 |
| Memory | candidate extraction、write/apply、source citation、delete tombstone、project visibility、Temporary Chat bypass | 错记、误用已删除记忆、跨项目引用或 Temporary Chat 仍读写个性化记忆 | 冻结 memory 写入,强制 tombstone,回滚 memory policy,把高风险样本送人工标注和回放集。 |
| Voice / Realtime | session setup、WebRTC RTT/jitter/loss、VAD、ASR/WER、TTS first audio、barge-in、reconnect、audio safety | 首音频慢、打断无效、网络抖动、ASR 听错或音频安全链路超时 | 切文本、关闭 full-duplex、扩 relay、回滚 ASR/TTS 模型、按设备和区域分桶排障。 |
| Image / multimodal | upload queue、media safety、EXIF/PII stripping、generation/edit queue、render fail、asset publish/CDN、egress、feedback | 图像安全误判或漏判、编辑 mask 错位、生成失败、产物发布失败、CDN 链接异常或生成成本飙升 | 回滚图像模型/安全策略,切异步队列或低分辨率,暂停异常 asset 发布,重扫媒体对象并回放用户反馈。 |
| Agent browser | step count、takeover count、site block hit、download/upload、approval wait、screenshot redaction | 长任务跑偏、登录态滥用、网页 prompt injection 或高影响动作漏确认 | 触发 Watch Mode、中断/回滚、收紧 domain policy、复核工具 schema 和确认 UI。 |
| Canvas | patch validation、anchor confidence、merge conflict、preview error、share/import/export | 模型 patch 覆盖用户新改动,或预览代码发生未知第三方通信 | 低置信 reanchor、冲突转人工确认、未知网络通信 pending、share/unshare 审计。 |
| Code Executor | queue wait、startup、runtime、memory、stdout truncation、file scan、artifact download | 沙箱冷启动或 AV 扫描积压导致用户以为模型卡住 | 预热 worker、按 memory tier 分池、限制大文件、扫描未过不发布 artifact。 |
| Tasks / Pulse | schedule skew、missed trigger、checkpoint age、retry、expiry、notification success、fresh ACL | 后台结果过期、权限变化后仍发送、通知失败或研究成本失控 | 发送前重校验 ACL,过期丢弃,通知补偿,按预算切低成本模型或暂停研究。 |
| Billing / usage ledger | usage event completeness、idempotency conflict、token reconciliation、quota drift、invoice/export lag、refund status | 用户看到用量、配额和发票不一致,或 retry 导致重复/漏记 usage event | 冻结出账,从 outbox 重放,保守 quota,生成 adjustment/refund,并把对账差异回填审计。 |
| 成本驱动 | 拆账维度 | 预算保护 | 动作 |
|---|---|---|---|
| Model tokens | model、tier、region、tenant、surface、input/output/cached tokens、context length bucket | per-tenant token budget、超长上下文占比、cache miss 率、forecast burn | 降模型、缩上下文、启用摘要或 prefix cache、对低优先级请求排队/429。 |
| GPU residency | GPU seconds、KV residency、batch occupancy、HBM pressure、idle gap、deadline miss | tokens/s/GPU 低于阈值且队列高;KV eviction 或 OOM 上升 | 调 batch window、拆 prefill/decode 池、跨允许区域借 GPU、暂停长上下文。 |
| Tools / Agent | tool call count、external API cost、browser minutes、approval wait、failed retry | 单任务 step budget、domain budget、tool retry budget、高影响动作确认预算 | 限制步数、切草稿模式、禁高成本工具、提示用户确认成本或人工接管。 |
| Code / artifacts | sandbox minutes、memory tier、file size、scan time、artifact storage、download egress | runtime/memory/file budget、AV scan backlog、signed URL abuse | 按 tier 分池、拒绝超限文件、压缩产物、延迟发布下载或转异步任务。 |
| Connectors / RAG | sync CPU、embedding、vector index、storage、egress、external rate-limit penalty | sync lag、stale source、index rebuild cost、per-connector quota burn | 降低 sync 频率、只重建变更分片、停用异常 connector、用 no-answer 保护权限。 |
| Billing correctness | usage_event_id、response_id、model、tokens、tool units、quota counter、invoice batch、refund/adjustment | ledger completeness、idempotency conflict、token count reconciliation、quota drift、invoice/export lag | 冻结出账、从 outbox 重放、对账修正、保守 quota、生成退款或 adjustment。 |
17. 发布、评测和训练闭环
模型升级必须像后端发布一样可灰度、可回滚、可追责
面试主线不应该变成训练大模型,但要说明线上 ChatGPT 一定有评测和训练反馈闭环。 新模型、新 prompt、新 router、新工具 schema、新 RAG index、安全策略、Voice、Canvas、Code Executor、 Tasks、Connectors 和 Memory 都要经过离线评测、安全评测、shadow traffic、risk-based canary 和回滚策略。 用户反馈和日志能成为评测或训练候选,但必须先经过授权、脱敏、过滤、标注校准和数据隔离。
这章的核心回答是:发布不是“把模型换掉”,而是把所有会改变回答、权限、延迟、成本和安全边界的 artifact 都纳入同一条 release control plane。Ship 是硬门禁,Ramp 是可暂停的灰度函数,TrainCandidate 则只描述“有资格进入候选池”,不代表一定进入训练。
Offline eval
通用问答、代码、数学、长上下文、RAG、工具、Agent、安全拒答、中文和多语言都要有回归集。
Safety eval
越狱、间接 prompt injection、数据外传、高风险工具动作、漏确认、Watch Mode 中断和隐私泄露要单独红队。
Shadow traffic
新模型先吃影子流量,记录差异、延迟、成本和安全结果,不直接影响用户。
Canary rollout
不是背固定百分比,而是按风险分级、稳定分桶、门禁指标和容量预算逐步 ramp。
Rollback
模型、prompt、router、tool schema、RAG index 和安全策略都要版本化并能快速回退。
Training feedback
反馈和日志先过授权、PII 脱敏、质量过滤、去重、标注和 judge 校准,再进入 eval 或训练候选。
| 阶段 | 产物 | 门禁 | 控制面动作 |
|---|---|---|---|
| Candidate assembly | model card、prompt bundle、router config、tool schema、RAG index manifest、policy bundle、feature flags | 每个 artifact 都有 immutable version、owner、risk level、rollback target 和 replay dataset。 | 发布配置用幂等写入和审批流;同一个 release_id 可重试,不能产生两个不同线上版本。 |
| Offline / continuous eval | golden set、production trace sample、hard negatives、expert labels、LLM judge rubrics | 质量不能低于基线容忍区间;LLM judge 要和人工标注校准,不能单独作为真值。 | 每次模型、prompt、router、index、schema、policy 变化都触发 CE;失败样本进入回归集。 |
| Safety hard gate | Model Spec scenarios、jailbreak、prompt injection、data exfiltration、高影响工具动作、危险能力 eval | unsafe allow、policy bypass、危险能力越线、隐私泄漏是硬阻断,不能被平均满意度抵消。 | 安全 owner 可 veto;必要时只发布低风险能力、提高确认门槛或关闭工具/连接器。 |
| Shadow replay | 线上请求的脱敏 replay、synthetic load、trace diff、cost estimate | 新版本不影响用户,但要比较质量、延迟、token、工具选择、安全裁决和成本。 | shadow 流量受预算和 GPU 配额限制;长上下文、voice、agent task 要单独容量池。 |
| Canary / A/B ramp | stable bucket by tenant/user/conversation、region、plan、surface、capability | burn rate、complaint delta、quality regression、safety regression、cost delta 任一越线就暂停。 | 旧会话 pinned 到旧 model/prompt/tool schema;新会话按桶进入新版本,保证用户体验一致。 |
| Rollback / kill switch | model alias、prompt bundle、router rule、tool schema、index、memory policy、safety policy、feature flag | 回滚也要幂等、可审计、可部分执行;按租户、地区、plan、surface 或能力粒度切回。 | 保留旧版本依赖和兼容 adapter;严重事故先 kill switch,再做 root-cause 和补偿。 |
| Post-launch learning | bad trace、用户反馈、人工复核、incident report、label task、training/eval candidate | 进入训练前必须满足 consent、policy、PII、retention、dedupe、quality;进入 eval 也要脱敏和权限隔离。 | 把事故样本、误拒/漏拦、错误引用、工具误用转成回归集,下一次发布先跑这些样本。 |
| 变更对象 | 离线门禁 | 灰度信号 | 回滚对象 | 兼容性风险 |
|---|---|---|---|---|
| Model / serving config | 通用能力、代码/数学、长上下文、多语言、instruction following、latency/cost replay | TTFT_model、TPOT、error rate、quality delta、cost delta、GPU saturation | model alias、serving pool、sampling params、context length policy | 旧会话 pinned;新模型不支持的工具、modalities 或上下文长度要由 router 降级。 |
| Prompt / system / developer bundle | 指令层级、格式、拒答边界、personalization、tool call decision、regression examples | user regenerate、complaint、judge-human disagreement、tool call drift | prompt bundle version、system policy text、developer template | 同一 conversation 内不要中途换行为规范;必要时只对新 turn 或新会话生效。 |
| Router / admission / quota | model selection accuracy、tier fairness、quota/rate-limit correctness、fallback paths | routing mismatch、429/5xx、queue wait、per-tier SLO、budget burn | router rule、model weights、fallback order、rate-limit config | 不能把企业或高风险请求误路由到缺少工具、安全或数据驻留能力的池。 |
| Tool schema / Agent policy | argument compatibility、dry-run、confirmation precision/recall、idempotency、rollback/compensation | tool success、timeout、approval miss、step loop、Watch Mode interrupt、high-impact action block | tool schema、domain allowlist、risk policy、confirmation UI | schema 变更要有 adapter;已运行 agent run 使用启动时的 tool contract。 |
| RAG index / connectors | groundedness、citation accuracy、ACL filter、freshness、external 429 handling、no-answer behavior | ACL unknown、stale source、wrong citation、sync lag、connector error | index manifest、embedding/rerank model、ACL version、connector feature flag | query-time ACL 必须独立于 index 版本;权限未知时 no-answer,不用旧缓存硬答。 |
| Memory policy | write precision/recall、source attribution、delete tombstone、Temporary Chat bypass、project boundary | wrong memory write、deleted-memory use、boundary violation、apply latency | memory extractor、memory policy bundle、apply strategy、write flag | 删除和禁用优先于旧摘要/embedding;Project Memory 和个人 Memory 不能互相污染。 |
| Voice / Realtime | ASR WER、TTS quality、barge-in、audio safety、network impairment、tool-in-voice behavior | session setup、RTT/jitter/loss、TTS first audio、reconnect、barge-in miss | ASR/TTS model、codec、relay route、full-duplex flag、voice tool policy | 弱网或高风险工具时可切文本/半双工;音频安全失败不能 fail open。 |
| Image generation/editing / media pipeline | prompt/image safety、render quality、edit mask alignment、EXIF/PII stripping、asset ACL、download/share policy、abuse eval | generation queue、render fail、policy refusal/unsafe allow、asset publish/CDN error、egress cost、user feedback | image model alias、image safety classifier、prompt rewrite policy、media pipeline、CDN publish flag、asset retention rule | 旧会话引用的 asset 继续可读;违规或错误生成的 asset 要支持 revoke/unshare/tombstone,不能只回滚模型。 |
| Canvas / Code Executor | patch apply、anchor confidence、sandbox startup/runtime、file scan、artifact publish、network policy | merge conflict、preview failure、sandbox timeout、AV fail、artifact download block | artifact patcher、preview runtime、container image、egress policy、publish flag | 用户已编辑 artifact 要 rebase;旧 container/image 需保留到活跃 job 完成。 |
| Tasks / Pulse | schedule semantics、checkpoint/retry、fresh ACL、notification policy、expiry/cancel behavior | missed trigger、retry exhausted、expired result、delivery fail、research cost burn | scheduler config、research prompt、connector set、notification template、feature flag | 发送前重校验权限和 quiet hours;旧任务按创建时 contract 运行或显式迁移。 |
| Safety policy / classifiers | Model Spec eval、policy precision/recall、red-team set、prompt injection、DLP/exfiltration、dangerous capability | unsafe allow、false refusal、policy timeout、classifier drift、appeal/incident spike | policy bundle、classifier version、redaction rules、fail-closed mode | 安全策略可以即时提升门槛;高影响工具、连接器和下载发布要支持紧急禁用。 |
| 控制 | 实现 | 失败模式 | 面试要点 |
|---|---|---|---|
| Dataset registry | 每个样本记录 dataset_id、sample_id、source、consent、retention、policy、split、owner、created_from_trace 和 allowed_use | 样本没有 lineage,训练、评测、人工标注和 red-team 集混在一起,事后无法证明资格。 | 先建数据注册表,再谈训练闭环;数据资格是系统状态,不是文档约定。 |
| Eval-only fence | held-out、red-team、benchmark 和 release gate 样本打 eval_only/train_excluded 标签,训练管线硬过滤 | 模型在训练中见过回归集,offline eval 分数虚高,canary 前就已经被骗。 | 评测集泄漏会让发布门禁失真,是比普通噪声更严重的质量事故。 |
| Near-dedupe | 按 conversation、user、document、image/audio hash、embedding similarity 和 n-gram 做近重复去重 | 同一问题的改写版进入训练,held-out 表面没泄漏但语义已经泄漏。 | LLM 评测要做语义级近重复,而不只是 exact hash。 |
| Judge / rubric isolation | grader prompt、rubric version、judge model、calibration set 与训练样本分库;judge 输出只作为标签候选 | 训练模型学习 judge 口味或 rubric 文本,线上质量变成迎合自动评委。 | LLM-as-judge 需要人工校准和版本隔离,不能把 judge 当真理源。 |
| Access and audit | 训练、评测、标注、红队、incident replay 都走 purpose-bound access,读取和导出进入审计 | 工程师或作业把企业/临时聊天/删除样本误导出到训练候选。 | 合规风险通常发生在离线管线,不只发生在线上 serving。 |
| Leakage audit | 周期性抽样检查 train/eval overlap、source eligibility、delete tombstone、holdout similarity 和 benchmark contamination | 一次正确配置后长期漂移;新数据源、新 connector 或新反馈入口绕过旧过滤。 | 泄漏防护是持续审计,不是一次性脚本。 |
| 来源 | 允许用途 | 过滤和校准 | 去向 |
|---|---|---|---|
| Personal ChatGPT with training enabled | 可进入改进候选,但仍要按隐私设置、地区、保留策略和用户删除语义过滤。 | PII/secret redaction、consent check、dedupe、quality score、toxicity/safety tag、language/domain balance。 | held-out eval、SFT candidate、preference pair、safety data;高风险样本先人工复核。 |
| Personal opt-out normal chat | 普通历史仍可保存和展示,默认 training_candidate=false;用户主动提交 thumbs up/down 或文字反馈是单独授权入口。 | account-level data control、normal history retention、delete propagation、trace redaction、explicit_feedback_consent。 | 无显式反馈时只进历史、服务质量和安全/滥用监控;有显式反馈时,反馈及关联对话可进评测/训练候选。 |
| Temporary Chat | 不进历史、不创建 memory、不训练;仅为安全和滥用监控最多短期保留。 | temporary_chat=true、no memory write、no history index、<=30d safety retention、artifact quarantine。 | 安全/滥用监控和临时合规查询;不能进入训练、长期个性化、memory 或普通历史索引。 |
| Business / Enterprise / Edu / API | 默认不用于训练或改进公共模型;只有显式 opt-in 或客户专属定制流程才可用。 | tenant policy、ZDR/retention、DPA/region、admin controls、customer-owned fine-tune boundary。 | tenant 内审计、合规导出、客户专属评估或定制;默认不混入全局训练候选。 |
| Direct apps / synced connector data | 直接同步或检索到的 app 数据只做上下文、搜索、引用和建议;消费版也只有当数据进入对话且 Improve 开启或用户显式反馈时才可能训练。 | OAuth scope、sync opt-in、RBAC/ACL、freshness、third-party terms、conversation inclusion、training eligibility tag。 | 回答上下文、citation、sync index、合规日志;未进入 conversation/output/feedback 的原始 synced data 不进全局训练。 |
| Pulse Gmail / Calendar direct data | Gmail/Calendar proactive activity 是用户 opt-in;直接读取的原始内容不用于训练,Pulse 交互保存成对话后才按 Data Controls 处理。 | Pulse opt-in、app scope、daily expiry、save-as-chat state、conversation history state、Improve setting、delete propagation。 | 当天 Pulse 卡片、可保存对话和安全/合规日志;直接 app 内容 never train,保存/交互后的对话才可能进改进候选。 |
| Explicit feedback / implicit UX signals | thumbs up/down 和文字反馈是主动提交;regenerate、abandon、停留时长只是隐式质量信号,不能覆盖底层训练资格。 | explicit_feedback_consent、anti-spam、sampling、locale/topic balance、conversation eligibility、human adjudication。 | 显式反馈可进 eval、preference pair 或训练候选;隐式信号主要进 UX dashboard 和抽样队列。 |
| Human labels / expert datasets | 作为 golden set、rubric、judge calibration 和 release gate 的高可信基线。 | 多标注者一致性、盲评、rubric examples、label provenance、holdout split。 | offline eval、safety regression、RFT/RLHF reward data、hard negative set。 |
| LLM judge / graders | 用于规模化打分、pairwise comparison、tool-call grading 和 continuous eval。 | 和人工标签对齐,控制 position bias、verbosity bias、prompt leakage 和 judge model drift。 | 自动门禁、样本排序、低置信人工复核;不能替代安全硬门禁。 |
| Incident traces / red-team samples | 安全、可靠性和产品回归的最高优先级样本。 | 脱敏、最小必要字段、root-cause tag、policy category、replay determinism。 | hard negative eval、safety SFT/RLAIF candidate、postmortem action item、launch checklist。 |
| 安全门禁 | 证据 | 发布决策 | 事故闭环 |
|---|---|---|---|
| Model Spec / behavior policy | 场景化 eval 覆盖 instruction hierarchy、拒答边界、uncertainty、personality、truthfulness、sycophancy。 | 任何核心行为规范回归都 block 或只允许小范围实验。 | 把误拒、漏拦、过度迎合、错误自信样本回流到 policy eval 和 prompt/model 训练。 |
| Dangerous capability | 生物、网络、自动化滥用、欺骗、自主复制等能力评估和 safeguards review。 | 能力越过风险阈值时需要额外防护、访问限制、监控或不部署。 | 上线后用 abuse signals、red-team findings 和外部报告更新风险评估。 |
| Tool / connector misuse | indirect prompt injection、secret exfiltration、跨源数据拼接、高影响动作漏确认、connector ACL bypass。 | 不满足就禁工具/连接器、只读模式、强确认或 fail closed。 | 每个工具事故要补 schema、policy、confirmation UI、eval case 和审计字段。 |
| Privacy / data boundary | Business/API 默认不训练、opt-out 生效、Temporary Chat 不入训练、删除传播、tenant/project isolation。 | 任何数据边界不确定都不能进入训练候选,也不能在回答中引用。 | 触发隔离、删除重放、合规通知和训练候选冻结。 |
| Post-launch safeguards | kill switch、policy rollback、appeal/review queue、incident owner、customer comms、audit export。 | 没有可执行处置链路,不允许扩大 rollout。 | postmortem 产出新的 hard negatives、SLO、runbook 和 release checklist。 |
18. 面试打法
先给主线,再按面试官偏向钻深
面试答案最怕散。你可以固定成四段:范围和假设、主架构、核心瓶颈、追问取舍。 如果面试官偏后端,就钻长连接和高可用;偏 AI infra,就钻 GPU 调度;偏产品平台,就钻 Agent、Canvas 和权限。 这套讲法参考了 ByteByteGo 的系统设计框架、 System Design Handbook 的 OpenAI 面试拆解 以及 OpenAI 对 ChatGPT 能力面、 流式响应、 工具调用 的公开说明,但回答要用工程状态、故障和取舍重新组织。
| 范围 | 讲什么 | 取舍 |
|---|---|---|
| 必讲主线 | P0 聊天 + 流式 + 历史 + 上下文 + 输入/输出安全 | 初学者先把一个普通问题如何变成流式回答讲完整,别一开场展开所有高级功能。 |
| 必讲后端 | response 状态机、seq 恢复、幂等键、response_events、outbox | 这几项能证明你会设计可恢复的状态化系统,而不是只会调模型 API。 |
| 必讲 AI infra | token sizing、prefill/decode、KV cache、batching、GPU 队列 | 不需要背硬件数字,但要把 HTTP QPS 转成 token/s、活跃流和显存压力。 |
| 只选一个扩展 | RAG / Agent / Canvas / Code Executor 任选一个钻透 | 其余 P1/P2 能力点名放到扩展路线,等面试官追问再展开。 |
| 步骤 | 可以怎么说 | 画什么 | 关键实体 | 取舍 |
|---|---|---|---|---|
| 1. 澄清边界 | 我先把题目收敛成 ChatGPT 主站:文本聊天是 P0,文件/搜索/工具/Agent/Canvas/Code/Voice 是可插拔平面。 | 左侧写 P0/P1/P2 范围框。 | user、workspace、conversation、model tier、surface。 | 不一开始画满所有功能;先给可用主链路,再按追问加功能面。 |
| 2. 需求和规模 | 我把 DAU/QPS 转成并发流、input/output tokens/s、GPU seconds、事件写入量和存储增长。 | 容量漏斗:DAU -> turn/s -> token/s -> GPU pool -> event log。 | request_id、response_id、token_usage、tenant_budget、region。 | 连接层和推理层分开估算;1M SSE 连接不等于 1M 路 decode。 |
| 3. API 和数据模型 | 核心 API 是 create response + stream events;核心真源是 conversation、message、response、response_event 和 artifact。 | ERD:Conversation -> Message/Response -> ResponseEvent -> Artifact/ToolRun。 | idempotency_key、seq、status、version、outbox、ledger。 | 事件追加比原地覆盖更容易断线续传、审计、重放和计费去重。 |
| 4. 请求主链路 | 请求经过入口鉴权、会话装配、上下文构建、安全检查、模型路由、GPU 推理、SSE relay 和事件持久化。 | 端到端流水线:Edge -> Chat Service -> Context -> Safety -> Router -> Inference -> Stream。 | trace_id、policy_decision、context_pack、model_version、stream_cursor。 | 同步链路只放必须步骤;搜索、文件处理、评估和索引更新尽量异步化。 |
| 5. 瓶颈定位 | TTFT 看 admission/queue/prefill/first decode,TPOT 看 decode step/batching/relay;RAG 看 source deadline 和 rerank。 | 延迟瀑布:edge、context、safety、prefill、decode、relay、persist。 | TTFT_model、TTFC_user、TPOT、queue_depth、cache_hit、source_p99。 | 降 TTFT 不一定降 TPOT;缩上下文、prefix cache 和小模型路由要权衡质量。 |
| 6. 高可用和恢复 | 服务按无状态入口、状态机、事件日志、GPU pool、异步 worker 分层扩展;断线按 response_id + last_seq 续传。 | 多区域/多 cell 图:global edge、regional control plane、cell-local data plane。 | cell_id、region_id、lease、checkpoint、DLQ、replay cursor。 | 跨区域强一致会增加延迟;多数会话 pinned 到 home region,灾难时用可重放状态恢复。 |
| 7. RAG / 连接器 | RAG 不是把向量库塞进 prompt,而是 ingestion、ACL、freshness、retrieval、citation 和 no-answer 的可审计系统。 | Connector sync -> index -> query-time ACL -> rerank -> source snapshot -> grounded answer。 | connector_id、doc_id、chunk_id、ACL_version、index_version、citation_span。 | 预同步降低延迟,但撤权和删除必须 query-time 再校验;来源不够就 no-answer。 |
| 8. Agent / 工具 | 模型只产出工具意图;真正副作用由 orchestrator 经过 schema、policy、confirmation、idempotency 和 audit 放行。 | Planner -> Policy -> Tool Gateway -> Executor -> Audit/Compensation。 | tool_call_id、risk_level、approval_id、idempotency_key、rollback_plan。 | 强确认牺牲自动化速度,但保护支付、邮件、代码提交和外部系统写操作。 |
| 9. Canvas / Code Executor | Canvas 是版本化 artifact 编辑,Code Executor 是隔离 sandbox job;两者都要把输出变成可审计、可回滚的 artifact。 | Artifact branch/diff/rebase + Sandbox queue/resource/network/file isolation。 | artifact_id、revision_id、patch_id、sandbox_job_id、quota、scan_result。 | Canvas 优先交互延迟和可撤销;Code 优先隔离、资源上限和结果可复现。 |
| 10. 安全、观测、发布闭环 | 最后把安全门禁、trace、eval、canary、version pinning、kill switch 和数据回流闭环讲清楚。 | Online trace -> eval sample -> release gate -> canary -> rollback/data registry。 | policy_version、prompt_version、eval_set、judge_version、rollout_bucket、data_eligibility。 | 安全失败不能被平均满意度抵消;坏 rollout 回滚后还要冻结污染样本并补 hard negative。 |
| 时间 | 做什么 | 输出 |
|---|---|---|
| 0-5 分钟 | 澄清产品边界、模型来源、MVP、规模和 SLA | 先问清是消费级、企业版、Agent 子题还是 Code Interpreter 子题。 |
| 5-10 分钟 | 列 P0/P1/P2 需求和容量估算 | 把 QPS 转成活跃流、token/s、GPU sizing 和存储事件量。 |
| 10-20 分钟 | 画入口、会话、上下文、安全、模型路由、GPU、流式和事件流 | 主图先覆盖端到端链路,旁边挂 RAG、工具、Agent、Canvas 和评估平面。 |
| 20-30 分钟 | 讲请求状态机、API、数据模型和断线恢复 | 把 response_id、seq、幂等键、response_events 和 outbox 讲清楚。 |
| 30-40 分钟 | 按面试官偏向深挖 GPU、RAG/工具、安全或多区域 | 不要平均展开;选择最匹配追问的一条线讲到故障和 tradeoff。 |
| 40-45 分钟 | 总结瓶颈、降级、风险和下一步 | 用成本、延迟、安全、质量和可用性做 recap,表现工程判断。 |
| 时间 | 做什么 | 输出 |
|---|---|---|
| 45 分钟主线完成 | 到 45 分钟必须已经交付 P0 架构、API/数据模型、请求状态机、容量、HA、安全、观测和一个扩展点。 | 如果 45 分钟还没讲到 failure mode 和 tradeoff,后面 15 分钟再精彩也很难补救。 |
| 45-50 分钟 | 按面试官兴趣选择一个深挖:RAG/Connectors、Agent/Tools、Canvas、Code Executor、Realtime Voice 或 GPU serving。 | 选择标准是刚才被追问最多、风险最高、最能体现工程深度的一条线。 |
| 50-55 分钟 | 把深挖线讲到状态机、权限、幂等、失败恢复、降级和指标,例如工具误操作如何确认/回滚。 | 不要只列组件名;每个组件都要有真源、状态迁移、失败动作和可观测信号。 |
| 55-58 分钟 | 补发布和 eval:offline eval、safety hard gate、shadow replay、canary、version pinning、kill switch。 | 强调发布对象包括 model、prompt、router、tool schema、index、memory policy 和 safety policy。 |
| 58-60 分钟 | 用一张 recap 收口:瓶颈在哪里、如何扩容、如何降级、如何回滚、哪些需求暂不做。 | 最后要让面试官听到取舍:成本/延迟/质量/安全/可用性哪个优先。 |
30 秒版本
我先保证 P0 主链路:用户发消息 -> 鉴权/配额 -> 会话和上下文 -> 安全 -> 模型推理 -> 流式事件落库 -> 观测。
3 分钟版本
主链路讲完后,按追问点名 Memory/Projects、RAG/Apps、Agent/Tools、Canvas、Code Executor、Voice、Tasks/Pulse、评估发布。
深挖版本
深挖只选一条线讲透:后端高可用、AI infra/GPU、产品平台、安全合规、Agent 工具、实时语音或发布训练闭环。
| 面试官偏向 | 深挖主线 | 判断 |
|---|---|---|
| 后端高并发 / 高可用 | 长连接、SSE/WebSocket、response_events、seq 恢复、幂等、outbox、限流、降级、多区域 active-active。 | 重点证明系统能承受大量活跃流,并且断线、重试、重复提交不会乱序或重复扣费。 |
| AI infra / GPU | token/s sizing、prefill/decode、KV cache、batching、prefix cache、chunked prefill、模型路由和 GPU 成本。 | 把 HTTP QPS 翻译成 input/output tokens、并发流、显存和 GPU seconds,比背硬件数字更重要。 |
| RAG / Connectors | connector sync、chunking、embedding/index、query-time ACL、rerank、citation、freshness、no-answer、revoke propagation。 | 真正考点是权限和来源可证,不是“接一个向量库”;ACL unknown、source stale 或引用不足时要 fail closed。 |
| Agent / Tools | planner、tool schema、policy engine、risk level、dry-run、用户确认、idempotency key、audit、rollback/compensation。 | 模型只提议工具调用;副作用必须由受控执行层、确认 UI 和审计账本放行。 |
| Canvas / Artifacts | artifact_id、revision graph、局部 diff、patch apply、conflict/rebase、preview、share/export、version restore。 | Canvas 是协同编辑/版本系统问题,不是把长文本塞回聊天窗口;要讲可撤销、可比较、可发布。 |
| Code Executor / Sandbox | job queue、microVM/container、network/file/resource isolation、package allowlist、artifact scan、egress policy、quota、timeout。 | Code Interpreter/Data Analysis 的核心是隔离和可复现;不能让模型直接拿宿主机权限。 |
| Memory / Projects / Tasks / Pulse | memory eligibility、project-scoped context、scheduled job、proactive card、data retention、user controls、delete propagation。 | 长期状态要能解释、编辑、删除、隔离;后台任务要按用户授权和过期策略运行。 |
| 安全合规 | 指令层级、policy eval、DLP、prompt injection、工具确认、tenant isolation、删除传播、Business/API 数据边界。 | 安全是硬门禁,不能被平均满意度、成本或速度指标抵消。 |
| Voice / Realtime | session setup、WebRTC/WebSocket、audio-native realtime model、VAD、barge-in、first audio、reconnect、ASR/TTS fallback、audio safety。 | 实时语音不是普通 chat 加麦克风;首音频、打断和弱网恢复是核心体验指标。 |
| Observability / Cost | TTFT_model、TTFC_user、TPOT、burn rate、trace span、eval gate、cost attribution、billing ledger。 | 指标必须接动作:扩容、限流、降模型、回滚、冻结出账或修复数据边界。 |
| Release / Training | offline eval、safety hard gate、shadow replay、risk-based canary、version pinning、rollback、feedback/data eligibility。 | 发布对象不只有模型,还包括 prompt、router、tool schema、index、memory policy 和 safety policy。 |
| 维度 | 高分信号 | 中等信号 | 危险信号 |
|---|---|---|---|
| Token 容量和 GPU sizing | 从 DAU/QPS 推到 turn/s、input/output token/s、并发流、KV residency、GPU seconds 和预算限流。 | 能区分 QPS、连接数和 token 吞吐,但 GPU 显存、batching 或长上下文压力讲得较粗。 | 只说“加机器/加 GPU”,或者把 HTTP QPS 当成模型吞吐单位。 |
| 持久化流式和断线恢复 | 用 response_id、seq、response_events、outbox 和 replay cursor 解释断线续传、重复提交和账务去重。 | 知道 SSE/WebSocket 和重连,但 durable event log 与最终状态不够清楚。 | 把流式状态只放内存;断线后重新跑模型、重复执行工具或重复扣费。 |
| 权限和数据边界 | tenant_id everywhere、query-time ACL、撤权传播、Temporary Chat/Business/API 默认不训练、删除先阻断读取再传播。 | 能讲 RBAC/SSO/审计,但训练资格、临时会话和连接器数据边界较模糊。 | 把权限只固化在索引里;ACL 服务故障还继续回答;把企业/API 数据混入公共训练。 |
| RAG 来源和 no-answer | 设计 connector sync、freshness、source snapshot、citation span、groundedness eval 和 citation miss 降级。 | 知道向量检索和引用,但没有解释来源快照、撤权、stale source 和 no-answer 阈值。 | 让模型伪造引用;权限未知或来源不足时仍生成确定答案。 |
| 工具副作用和 Agent 控制 | 工具有 schema、policy、risk level、dry-run、用户确认、幂等键、audit trail、rollback/compensation。 | 知道要确认高风险动作,但对 tool call 状态机、重复执行和补偿策略讲得少。 | 模型直接调用生产 API;没有确认、审计、幂等和回滚。 |
| Canvas / Code Executor | Canvas 讲 artifact/revision/diff/rebase/preview/share/export;Code 讲 sandbox queue、网络/文件/资源隔离和 artifact scan。 | 能说明两者是扩展面,但没有讲版本图、冲突处理或 sandbox 资源治理。 | 把 Canvas 当富文本框;把 Code Executor 当普通后台脚本运行。 |
| Eval gate 和发布 | offline eval、安全硬门禁、judge 校准、shadow replay、risk-based canary、stable bucket、version pinning 一起讲。 | 知道灰度和回滚,但 eval 泄漏、judge drift 和版本兼容性不够明确。 | 只看线上点击率或平均满意度;安全/隐私回归仍继续放量。 |
| Rollback 和数据回流 | 坏 rollout 能按模型/prompt/router/tool schema/index/policy 回滚,并冻结污染样本、补 hard negative 和 postmortem action。 | 能说 kill switch,但对旧会话 pinning、训练候选冻结和回放验证较弱。 | 回滚只切流量,不处理已生成 artifact、污染 eval/训练数据和账务/审计影响。 |
| 追问 | 回答骨架 | 补强点 |
|---|---|---|
| 如何降低 TTFT? | 路由小模型、prefix cache、chunked prefill、就近入口、减少上下文、冷热模型预热。 | 还要区分真实延迟和感知延迟:SSE 能先显示第一个 token。 |
| 如何从 DAU 算容量? | DAU -> 峰值同时在线 -> turn/s -> input/output token/s -> 活跃流 -> GPU seconds、KV residency、事件写入量。 | 连接层和推理层分开算:1M 连接不等于 1M 个请求同时 decode。 |
| TTFT 和 TPOT 有何区别? | TTFT 主要看 admission、queue、prefill、first decode、relay;TPOT 主要看 decode step、batching 和 stream relay。 | TTFT 优化不一定改善 TPOT;长上下文常拖慢 prefill,长回答常暴露 decode 吞吐。 |
| 如何防幻觉? | RAG、引用、rerank、grounding verifier、工具结果结构化、高风险拒答和离线评测。 | 不能承诺消灭幻觉,只能降低概率并让风险可观测。 |
| 如何做 1M 并发? | 连接层水平扩展、stream relay、队列回压、GPU 调度、多区域、降级和严格配额。 | 并发连接数和 GPU token 吞吐是两类瓶颈,要分别算。 |
| 如何处理工具误操作? | 工具 schema、权限、dry-run、用户确认、幂等、补偿、审计和高风险拒绝。 | 模型不能直接拥有生产权限,必须通过受控执行层。 |
| 断线后如何恢复? | 客户端带 response_id 和 last_seq 重连;服务端从 response_events 续传,模型继续跑或返回已完成结果。 | 事件要可重放,最终态要 durable;不能依赖内存里的连接状态。 |
| 如何避免重复执行和重复扣费? | 写请求带 idempotency_key;tool call、billing usage、artifact publish 都有 ledger/outbox 去重。 | 幂等要覆盖入口、工具、账务和通知,不只是 HTTP retry。 |
| 什么时候做 PD 分离? | 长 prompt、高并发、TTFT/TPOT 都吃紧且网络足够好时;短请求和小模型先用统一 serving。 | 不要把新词默认画进架构,先讲基线、指标和适用边界。 |
| Redis 和 KV Cache 有什么区别? | Redis 缓业务热状态;KV Cache 是模型 attention 的 K/V 张量,驻留在 GPU/高性能内存体系。 | 这是大模型系统设计里很常见的混淆点。 |
| 如何设计企业版? | SSO、RBAC、tenant_id everywhere、ACL RAG、审计、数据删除、区域驻留和 admin policy。 | 企业场景最大的坑通常是权限穿透,不是向量库本身。 |
| 如何控成本? | 按 model/tier/tenant/surface 拆 tokens、GPU seconds、KV residency、sandbox minutes、connector sync 和 egress。 | 动作包括降模型、缩上下文、prefix cache、预算限流、异步化和暂停低价值后台研究。 |
| 如何做可观测? | root request span 串 inference、retrieval、tool、agent、code、safety、billing;SLO 用 good/bad event 和 burn rate。 | 不要只说日志;要能从一次坏回答回放到具体版本和责任平面。 |
| 新模型或工具 schema 如何灰度? | 先 offline eval 和 safety gate,再 shadow replay、risk-based canary、stable bucket、version pinning 和 kill switch。 | 旧会话 pinned 到旧版本;安全失败直接 block 或回滚,不能用平均满意度抵消。 |
| 如何避免 eval set 泄漏? | golden set 与训练候选分库、近重复检测、dataset lineage、访问审计、holdout rotation、blind human labels。 | 泄漏会让发布门禁虚高;发现泄漏后要废弃受污染分片、重跑基线并补独立 hard negative。 |
| LLM-as-judge 如何可信? | 用人工标注校准、pairwise agreement、judge version pinning、rubric examples、bias test 和低置信人工复核。 | judge 是规模化筛查器,不是真理源;judge model 升级也要走 release gate。 |
| 坏 rollout 如何回滚并处理数据? | 按 model/prompt/router/tool/index/policy 版本回滚,冻结受影响 feedback、trace 和训练候选,补事故样本到 eval。 | 回滚流量只是第一步;还要处理污染数据、错误 artifact、客户通知、账务和 postmortem。 |
| 企业权限撤销如何生效? | 撤权写 audit/tombstone,query-time ACL 必查;索引异步清理,ACL unknown 或 tombstone 未确认时 no-answer。 | 不能只靠索引构建时的 ACL;权限变化要先阻断读取,再慢慢清理派生索引。 |
| Temporary Chat、Business、API 数据边界? | Temporary Chat 不进历史/memory/训练;Business/API 默认不用于公共训练;连接器原始同步数据只按授权用于上下文。 | 数据边界必须落到字段和管线:eligibility tag、retention、delete propagation、training registry 和审计。 |
19. 资料地图
本页参考的公开资料和已有答案
这里列的是设计依据,不是逐字引用。页面内容用公开资料做事实校验,用系统设计面试语境重新组织。
OpenAI 产品事实
ChatGPT、Canvas、Agent、Projects、Tasks/Pulse、Connectors、Memory、Voice 和 Temporary Chat 都使用官方资料支撑。
OpenAI API / Realtime
Streaming、Realtime WebRTC/WebSocket/VAD、MCP connectors、Actions、Retrieval、File search 和 Code Interpreter 支撑开发者侧设计。
数据、隐私与训练边界
Data Controls、Temporary Chat、Memory、Business/API 数据策略、反馈和 eval 数据进入训练的边界单独列出。
评估与发布
Evals、Graders、Model Spec、Preparedness Framework 和 release gate 资料支撑灰度、回滚和安全门禁。
GPU serving / RAG / 数据系统
vLLM、TensorRT-LLM、FAISS、Kafka、Redis 等一手资料支撑高吞吐推理、检索和事件化后端。
SRE、流式与发布基础设施
Google SRE、OpenTelemetry GenAI、MDN SSE/WebSocket、Kubernetes 和 Argo Rollouts 支撑高可用与渐进式发布。
安全、工具与沙箱
OpenAI prompt injection、Agent safety、OWASP LLM Top 10、Firecracker 和 gVisor 支撑工具确认、隔离和最小权限。
面试材料与用户分享页
公开面试文章用于理解问法;两个 ChatGPT 分享页仅作结构启发,不作为事实依据。
OpenAI 产品能力
这些链接支撑正文对 ChatGPT 页面实际功能、用户入口和产品边界的描述。
- OpenAI ChatGPT 对话产品的公开入口和能力定位。
- ChatGPT capabilities overview Search、Deep research、文件、Data Analysis、Voice、Canvas、Memory、Projects 和 GPTs 的能力总览。
- ChatGPT Search Web search、实时信息、来源和搜索结果体验。
- Group chats in ChatGPT 群聊独立会话、邀请链接、成员、个人 memory/custom instructions 隔离和不支持功能列表。
- Deep research in ChatGPT 多步研究、研究计划、引用报告、文件和连接应用数据源。
- GPTs in ChatGPT Custom GPTs、GPT Store、instructions、knowledge、capabilities、apps/actions 和隐私边界。
- Introducing canvas Canvas 的独立编辑界面、局部修改和版本恢复。
- Canvas help Canvas 在 ChatGPT 内的使用方式和交互边界。
- Introducing ChatGPT agent Agent 的浏览器、终端、连接器和可中断执行形态。
- ChatGPT agent help Agent 的使用限制、确认动作和数据处理说明。
- ChatGPT agent system card Agent 安全控制、终端访问和高风险能力评估。
- Projects in ChatGPT 项目级上下文、文件和会话组织。
- Tasks in ChatGPT 定时任务和异步触发的产品入口。
- ChatGPT Pulse 主动研究、Gmail/Calendar 等个性化上下文边界。
- Apps in ChatGPT (原 Connectors) Apps/Connectors 的用户授权、第三方数据接入和自定义 MCP connector 边界。
- Apps with sync OpenAI 在 2025-12-17 后将 connectors 统一纳入 Apps 命名;同步应用会预先索引知识源。
- Memory FAQ Saved memories、reference chat history、删除和训练选择。
- Voice Mode FAQ ChatGPT Voice 的 multimodal voice、限制、转写和音视频训练选择。
- Images in ChatGPT ChatGPT Images 的创建、编辑、保存、管理和可用平台。
- Temporary Chat FAQ Temporary Chat 不进历史、不使用/创建 memory、最多 30 天安全保留。
OpenAI API / 开发者能力
这些资料支撑 API 层的流式、实时语音、工具、连接器、检索和代码执行设计。
- Streaming responses SSE 流式响应、增量事件和客户端渲染模型。
- Responses API reference Responses API 的请求、响应对象、状态和 stream_options 等开发者契约。
- Realtime overview 低延迟原生语音、多模态输入输出、WebRTC/WebSocket 起点。
- Realtime WebRTC 浏览器侧 WebRTC、ephemeral token 和 data channel。
- Realtime VAD server VAD、semantic VAD 和 speech started/stopped 事件。
- Realtime conversations Realtime 会话事件、WebRTC/WebSocket 通道和打断语义。
- MCP connectors OpenAI 工具连接器、MCP 安全风险和调用边界。
- Building MCP servers MCP server 生命周期、集成方式和风险说明。
- GPT Actions authentication Actions 的 OAuth/API key 鉴权设计。
- Retrieval 检索增强上下文的官方开发者指南。
- File search 托管文件检索、向量化和工具返回。
- Data analysis with ChatGPT ChatGPT Data Analysis 的文件处理、表格图表和 Python/Jupyter 沙箱体验。
- Code Interpreter API 侧沙箱代码执行工具。
数据、隐私与训练边界
这些链接用于约束 Business/API、个人 ChatGPT、Temporary Chat、Memory 和反馈样本的使用边界。
- Data Controls FAQ Improve the model for everyone、导出、删除和 Temporary Chat 数据控制。
- How your data is used 个人服务、opt-out、反馈样本和 Temporary Chat 的训练边界。
- OpenAI API data controls API 默认不用于训练、abuse monitoring 和 retention 控制。
- Business data privacy Business、Enterprise、Edu、API 默认不训练公开模型。
- Memory FAQ memory 与 chat history、删除传播和训练选择的关系。
- Temporary Chat FAQ 临时会话的历史、memory、训练和安全保留边界。
评估、模型规范与发布
这些资料支撑 offline eval、grader、safety hard gate、Preparedness gate、canary 和 rollback。
- Evaluation best practices 评估集构造、指标解释和上线前质量门禁。
- OpenAI Evals Evals 平台、实验和模型/提示词对比。
- OpenAI Graders 自动评分器、结构化评分和回归测试。
- Model Spec evals 模型行为规范和规范评估思路。
- Preparedness Framework 高风险能力评估和部署前安全门禁。
- Safety checks API 工具安全检查和安全测试流程。
- Prompting prompt 版本化、评估和 prompt caching。
GPU serving、RAG 与数据系统
这些资料支撑容量估算、KV cache、batching、chunked prefill、向量检索、事件流和缓存层。
- vLLM PagedAttention PagedAttention、KV cache 管理和 serving throughput。
- TensorRT-LLM chunked prefill prefill/decode 并发、chunked prefill 和吞吐优化。
- NVIDIA NIM LLM metrics TTFT、ITL/TPOT、TPS 和 RPS 等推理压测指标。
- FAISS 向量相似度搜索和大规模 ANN 检索。
- Apache Kafka design 日志模型、分区、消费者和持久化事件流设计。
- Apache Kafka documentation conversation event、outbox、异步任务和审计流。
- Redis rate limiter 分布式限流、窗口计数和过载保护实现。
- Redis documentation 会话缓存、限流、幂等键和短期状态。
SRE、流式协议与渐进发布
这些资料支撑高可用、SLO、burn rate、流式连接恢复、Kubernetes 健康检查和灰度发布。
- Google SRE: SLOs 服务级目标、错误预算和 SLO 驱动的可靠性管理。
- AWS Reliability Pillar 可靠性、隔离、故障恢复、灾备和负载测试的云架构检查框架。
- AWS Operational Excellence Pillar 运维可观测、变更管理、事件响应和持续改进。
- AWS Cost Optimization Pillar 成本归因、容量选择、弹性和资源生命周期管理。
- OpenTelemetry GenAI semconv GenAI trace、metrics、model/tool span 的语义规范。
- MDN Server-sent events 文本流式输出常见的 SSE 协议模型。
- MDN WebSocket 双向实时通道和连接生命周期。
- Kubernetes pod lifecycle readiness/liveness/startup probe 和滚动期间健康语义。
- Argo Rollouts canary、blue-green、analysis 和 progressive delivery。
安全、工具调用与沙箱
这些资料支撑 prompt injection、MCP/Agent 工具风险、确认梯度、代码执行隔离和最小权限。
- OpenAI prompt injections 间接 prompt injection、用户控制和 consequential action 确认。
- Safety in building agents agent prompt injection、structured outputs、tool approvals 和 trace graders。
- OpenAI MCP risk notes connector/MCP 中的 prompt injection 和敏感工具调用风险。
- OWASP LLM Top 10 LLM01 prompt injection、excessive agency、sensitive information disclosure 等风险分类。
- OWASP MCP Top 10 MCP 生命周期中的上下文欺骗、tool poisoning 和跨工具数据风险。
- Firecracker microVM 隔离、快速启动和多租户执行环境。
- gVisor 容器 syscall 隔离和用户态内核沙箱。
面试参考与用户给定材料
这些资料用于理解问法和回答组织;分享页只作结构启发,不作为事实来源。
- Educative ChatGPT system design 公开面试文章,帮助理解 ChatGPT system design 常见讨论面。
- System Design Handbook OpenAI 类系统设计面试的结构化参考。
- ByteByteGo Alex Xu / ByteByteGo system design 体系的高层结构和图解风格参考。
- ByteByteGo system design interview framework 澄清需求、容量估算、高层设计、深挖和收尾的面试流程参考。
- 用户给定分享页 仅作容量估算、主链路和追问模板启发。
- 用户补充分享页 仅作查漏补缺和结构启发,不作为事实依据。