系统设计
系统设计题需要把模型放进完整的数据与执行链路。先明确用户、成功标准和约束,再讨论组件;每增加一层,都解释它解决哪个已经出现的问题。
常见题目
| 场景 | 必须讲清的边界 | 建议先复习 |
|---|---|---|
| 企业知识库问答 | 权限、更新、引用、无答案 | RAG 生产实践 |
| 客服 Agent | 查询与写入、审批、幂等、人工接管 | 工具调用 |
| 代码助手 | 仓库范围、命令执行、测试、变更审查 | Agent 安全 |
| 多模态文档审核 | OCR/图像证据、页码坐标、人工复核 | 多模态 RAG |
| 评估平台 | 数据集版本、评分规则、复审、发布门禁 | 训练评估 |
回答框架
- 定义任务:服务谁,输入是什么,成功时留下什么可检查的结果。
- 列出约束:数据新鲜度、授权范围、延迟、预算、可接受失败和不可自动执行的动作。
- 画出数据流:区分离线接入和在线请求,说明每个组件读写的状态。
- 建立基线:先用最少组件跑通,再根据失败样本增加复杂度。
- 解释故障:每条关键路径说明超时、重试、结果未知和回滚策略。
- 给出验收:质量、权限、成本和性能分别如何衡量。
示例:企业制度问答系统
下面的规模仅作为面试练习设定:有一万份制度文档,按部门授权,工作日更新;用户需要带来源的答案。先询问并确定更新时限、并发和延迟目标,不能从文档数量直接推算机器配置。
离线接入
文档源 → 解析 → 去重与版本化 → 按结构切分 → 建立关键词/向量索引。每个片段绑定 document_id、版本、章节和权限关联标识。新版本索引构建完成后切换可见版本;删除与撤权应传播到检索、答案缓存和原文访问路径。
在线请求
认证身份 → 服务端确定可访问范围 → 召回 → 重排与去重 → 组装上下文 → 生成带证据 ID 的回答 → 引用校验。查不到证据时返回明确的不足说明;不得把无权限片段交给模型后再让模型“不要说出来”。
答案缓存的键至少考虑规范化问题、权限范围和知识版本。查询相同不代表两个用户应收到相同答案。
评估与发布
- 检索:正确证据是否进入候选,分别看术语、语义、多跳和例外条款。
- 生成:关键断言是否被证据支持,是否遗漏适用条件。
- 权限:跨部门、撤权和旧缓存用例是否阻断泄露。
- 体验:按相同负载测 P95 延迟、错误率和每个成功问题的成本。
先使用固定验证集选方案,再在独立测试集报告结果。发布保留文档索引、模型、提示和配置版本,以便回退。
追问角度
| 故障 | 先看什么 | 止损与后续修复 |
|---|---|---|
| 更新后仍答旧制度 | 文档、索引、缓存的版本 | 暂停旧答案缓存;修复版本传播 |
| P95 延迟突然升高 | 分段耗时、队列等待、上游限流 | 控制并发、预算内降级;压测定位瓶颈 |
| 工具超时却已经写入 | 请求 ID、幂等键、业务状态 | 查询结果后恢复;避免盲目重放 |
| 模型升级后引用失真 | 同样上下文下的新旧模型输出 | 回退版本;补入回归集 |
| 人工接管率上升 | 按接管原因分桶 | 区分授权不足、数据不足和能力失败 |
一个常见容量计算错误
平均并发 ≈ 到达率 × 平均响应时间 只适用于满足稳定性等条件的同一系统边界,不能用平均值保证 P95/P99 服务目标。模型服务还受输入/输出长度、批处理和 token 限额影响。容量方案需要真实长度分布、到达模式和失败率的压测记录,相关练习见 部署推理。
自测
在上述设计上加入“代用户提交报销申请”:指出新增的工具权限、确认内容、幂等记录和恢复路径。若架构图只多出一个 LLM 方框,说明执行边界还没有讲清。