#模块十:系统设计、业务落地与成本权衡

#109. 设计一个基于 LLM 的客服系统,最核心的模块有哪些?

#标准答案

一个基于 LLM 的客服系统,核心模块至少包括:请求接入层、用户身份与会话管理、知识检索层、模型调用层、工单/业务系统工具集成层、监控评测层、安全治理层,以及人工兜底机制。更具体一点讲,用户请求进来后,系统要先知道这个用户是谁、历史上下文是什么、是否命中已有 FAQ 或缓存;如果进入 LLM 链路,就要先检索知识,再决定是否调用订单、退款、物流等工具,最后把结果输出给用户。

为什么这些模块都重要?因为客服不是一个纯问答场景,而是“信息查询 + 业务执行 + 风险控制”的组合。没有知识检索会胡说,没有工具系统无法真办事,没有人工兜底会在高风险场景失控。所以面试里最好把客服系统讲成业务系统,而不是一个聊天 demo。


#深度解析

1. 客服系统的七层架构图

┌─────────────────────────────────────────────────────────┐
│ 接入层(Gateway)                                        │
│ 负载均衡、限流、鉴权、多租户隔离                         │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 会话管理层(Session)                                    │
│ 用户身份、历史对话、上下文窗口、多轮状态                 │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 意图路由层(Intent Router)                              │
│ FAQ 匹配 → 直接回答 / LLM 路由 → 生成回答 / 人工 → 转接  │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 知识检索层(RAG)                                        │
│ 知识库召回、重排序、上下文组织                           │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 模型调用层(LLM)                                        │
│ Prompt 组装、模型选择、流式输出、失败重试               │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 工具集成层(Tools)                                      │
│ 订单查询、退款、物流、工单创建、用户信息查询             │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 输出治理层(Guardrail)                                  │
│ 安全审查、事实校验、格式约束、敏感操作确认               │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 监控与兜底层(Observability & Escalation)               │
│ 日志、指标、告警、人工兜底、满意度回访                   │
└─────────────────────────────────────────────────────────┘

2. 各模块的关键设计决策

模块 核心决策 选项 A 选项 B 选择依据
会话管理 上下文长度 只保留最近 3 轮 保留完整历史 问题复杂度 vs 成本
意图路由 是否用 LLM 判断意图 小模型分类器 LLM 判断 延迟要求和准确率
知识检索 检索范围 全库检索 按用户画像/问题类型预过滤 召回率 vs 速度
模型选择 简单/复杂问题分流 全量用大模型 简单问题小模型 成本结构
工具调用 同步/异步 同步等待结果 异步+状态轮询 工具响应时间
人工兜底 触发条件 仅用户要求 自动检测(情绪/置信度) 用户体验 vs 成本

3. 客服系统的特殊挑战

挑战 原因 解决方案
情绪识别 愤怒用户需要优先处理 情绪分类器 + 升级策略
多轮一致性 用户可能改变诉求 状态机跟踪当前意图
业务规则约束 退款有金额/时限规则 规则引擎 + LLM 结合
隐私合规 涉及用户订单、个人信息 数据脱敏 + 访问审计
高峰期扩容 促销时咨询量激增 10 倍 弹性伸缩 + 排队机制

4. 典型客服系统的数据流

用户:"我的订单为什么还没发货?"
    │
    ├── 意图路由:判断为"物流查询"
    │
    ├── 会话管理:提取用户身份、关联订单号
    │
    ├── 工具调用:查询订单系统
    │       └── 返回:订单 #12345,状态"仓库处理中"
    │
    ├── 知识检索:查询"发货延迟"相关 FAQ
    │       └── 返回:延迟原因、预计时间
    │
    ├── LLM 生成:综合工具和知识,生成回答
    │       └── "您的订单 #12345 正在仓库处理中,
    │            预计明天发货。 delay 原因是..."
    │
    ├── Guardrail:检查是否有敏感信息泄露
    │
    └── 输出给用户

5. 面试官常见深挖追问

  • "客服系统里,LLM 回答错了导致用户损失(如错误退款),责任怎么划分?"
    • 答:这是系统设计的核心问题。技术上:1)高风险操作(退款、改单)必须人工确认或规则引擎校验,不能由 LLM 直接执行;2)LLM 只生成"建议",执行层独立校验;3)所有操作留痕审计。责任上:系统设计者需确保"机器不拥有最终决策权",LLM 是助手而非代理。如果因为 guardrail 缺失导致错误执行,是系统架构缺陷。
  • "如果客服系统的 LLM 回答质量下降,怎么快速定位是哪个模块的问题?"
    • 答:分层排查。1)先看意图路由日志:问题是否被正确分类?如果路由错了,后续全错;2)检查工具调用:返回数据是否正确?如果工具返回错误数据,LLM 会基于错误信息回答;3)检查知识检索:召回的文档是否相关?4)看 LLM 输入的完整 prompt:上下文组织是否有问题?5)对比相同 prompt 在不同模型上的输出,判断是模型能力问题还是 prompt 问题。每层都有独立日志是快速定位的关键。

#110. 如何降低 LLM API 成本?

#标准答案

降低 LLM API 成本,最重要的原则不是“统一换小模型”,而是让昂贵算力只花在真正值得的请求上。常见方法包括:做模型分级路由,让简单请求走小模型;做缓存,减少重复问答;压缩上下文和历史消息,减少无效 token;提升 RAG 精度,避免把大量噪声文档塞进 prompt;让小模型先做分类、过滤、改写,难题再升级到大模型。

更成熟的回答还会提到失败重试优化和流量分层:不要对每次失败都机械重试最贵模型,也不要让低价值用户请求和高价值任务共用同一高成本链路。这样回答会显得你理解成本治理是架构问题,而不是只会说“换便宜接口”。


#深度解析

1. LLM API 成本的构成分析

总成本 = 输入 token 成本 + 输出 token 成本 + 重试成本 + 缓存未命中成本

输入成本驱动因素:
    ├── 上下文长度(历史对话、RAG 文档)
    ├── 系统 prompt 长度
    └── 用户输入长度

输出成本驱动因素:
    ├── 回答长度(verbosity)
    ├── 生成步数(每个 token 都计费)
    └── 失败重试次数

典型价格参考(GPT-4 级别):

  • 输入:$10 / 1M tokens
  • 输出:$30 / 1M tokens
  • 一个含 3K 输入 + 500 输出 token 的请求 ≈ $0.045

2. 成本优化策略矩阵

策略 原理 节省幅度 风险
模型路由 简单请求用小模型(GPT-3.5),复杂请求用大模型(GPT-4) 50-80% 路由错误导致效果下降
缓存 相同/相似 query 直接返回答案 20-40% 过时信息
上下文压缩 只保留关键历史,删除冗余 20-30% 丢失上下文
RAG 优化 提高召回精度,减少噪声文档 15-25% 召回率下降
输出约束 限制最大输出长度 10-20% 回答不完整
批量处理 合并多个请求一次性处理 10-15% 延迟增加
自托管 开源模型替代 API 50-90% 运维成本、效果差距

3. 模型路由的决策框架

请求进入
    │
    ├── 意图分类(轻量模型/规则)
    │       ├── 简单 FAQ → GPT-3.5 / 开源 7B
    │       ├── 复杂推理 → GPT-4
    │       ├── 创意生成 → GPT-4 / Claude
    │       └── 代码生成 → 专用代码模型
    │
    └── 置信度评估
            ├── 高置信度 → 直接用分类结果路由
            └── 低置信度 → 默认走大模型(保守策略)

4. 缓存策略的精细化设计

缓存类型 匹配方式 命中率 适用场景
精确匹配 query 完全一致 低(5-10%) 高频固定问题
语义匹配 embedding 相似度 > 阈值 中(15-30%) 相似问题不同表述
模板匹配 匹配预设模板,填充变量 高(30-50%) 结构化查询
结果摘要缓存 缓存 RAG 检索结果 中(20-40%) 知识库查询

5. 面试官常见深挖追问

  • "成本优化会不会损害用户体验?怎么平衡?"
    • 答:会,所以需要"分层优化"而非"一刀切"。1)对高价值用户/任务保持大模型,低价值场景用小模型;2)缓存只用于事实性问题,创意/推理问题不走缓存;3)模型路由设置置信度阈值,不确定时保守用大模型;4)A/B 测试验证优化后的用户满意度,确保成本下降不以满意度崩溃为代价。关键是:成本优化是渐进过程,每步都要监测业务指标。
  • "如果老板要求成本降 50%,但效果不能降,你会怎么做?"
    • 答:三板斧。1)路由优化:分析请求分布,把 60% 的简单请求切到小模型(降本 40%);2)缓存建设:对 Top 20% 高频 query 做语义缓存(降本 15%);3)上下文瘦身:优化 RAG 策略,减少每请求 30% 的输入 token(降本 10%)。合计降本 50%+,效果影响通过 A/B 测试控制在 <2% 满意度下降。如果仍不够,考虑自托管开源模型处理简单任务。

#111. 流式输出的价值是什么?

#标准答案

流式输出最大的价值,是显著改善用户体感。即使总完成时间没变,只要用户能更早看到首 token 或首段结果,等待焦虑就会明显下降,产品会显得“更快、更活”。这对长回答、搜索辅助、代码解释、客服对话尤其重要。

从产品角度看,流式输出还方便用户中途打断、追问或提前获得部分可用信息,因此它不只是时延优化技巧,也是交互设计手段。面试里如果能把“首 token 延迟”和“总完成时间”区分开,会更专业,也更接近真实产品指标,因为很多用户感知主要由前者决定而不是由完整生成结束时间决定,这一点在客服和搜索类产品里尤其明显。


#深度解析

1. 流式输出 vs 非流式:用户感知差异

指标 非流式输出 流式输出 用户体验差异
首 token 延迟 = 总生成时间 ~500ms-2s 流式让用户"立即"看到响应
总完成时间 T T(不变) 实际未缩短,但感知大幅改善
等待焦虑 高(黑屏/转圈) 低(内容逐步出现) 流式降低 50%+ 的用户流失
中途打断率 用户看到方向不对可提前停止
有效信息获取 最后才能获得 逐步获得 用户可提前基于部分信息行动

2. 流式输出的技术实现原理

非流式:
用户输入 → 模型生成完整回答 → 一次性返回
    └── 用户等待:预填充 + 全部解码时间

流式:
用户输入 → 模型开始生成
    └── 首 token 到达用户:仅预填充时间
    └── 后续 token:随生成实时推送
    └── 用户感知延迟 = 预填充时间(通常 0.5-2s)

关键:流式不减少总 token 生成时间,但把"等待完整结果"变成"边看边等"。

3. 流式输出的产品价值

场景 流式价值 原因
代码生成 极高 开发者可提前看到代码结构,方向不对立即打断
长文写作 极高 用户可提前判断风格是否符合预期
搜索摘要 用户可能在前两句就获得所需信息
客服对话 对话显得更自然、更像真人
数据分析 需要完整结果才能理解,但流式仍减少焦虑
API 调用 下游系统通常需要完整 JSON

4. 流式输出的技术挑战

挑战 说明 解决方案
中断处理 用户中途打断,后端生成仍在继续 支持取消信号(cancel token)
格式完整性 Markdown/JSON 流式输出可能截断 客户端做容错渲染
缓存困难 流式响应难以缓存 先完整生成再模拟流式推送
成本不变 总 token 数未减少 流式是体验优化,不是成本优化
前端复杂度 需处理逐字渲染、打字机效果 成熟的 SDK(如 OpenAI stream)

5. 面试官常见深挖追问

  • "流式输出能不能降低服务器成本?"
    • 答:不能降低生成成本(总 token 数一样),但可能降低连接成本。非流式需要保持连接直到完整生成结束(可能 10-30s),流式连接虽然更长但数据持续流动,可减少连接超时重试。真正降低成本的是:流式让用户更快判断是否需要继续,从而降低平均生成长度(用户提前打断)。但这是间接效果,不是流式本身降低成本。
  • "流式输出的首 token 延迟由什么决定?怎么优化?"
    • 答:首 token 延迟 = 预填充时间(prompt 处理 + 第一个 token 生成)。优化方法:1)缩短 prompt(上下文压缩);2)使用更快的模型或小模型做首 token;3) speculative decoding 加速首 token;4)预热(保持模型常驻显存,避免冷启动);5)对于已知问题类型,预生成常见开头(如"根据您的查询...")再流式后续内容。

#112. 模型路由通常想解决什么问题?

#标准答案

模型路由要解决的核心问题,是不同请求并不值得同样昂贵的模型和同样慢的链路。简单问答、模板任务、低风险请求,完全没必要一律走最大模型;而复杂推理、高价值客户、高风险任务,又不能随便降配。模型路由就是把“请求特征”和“模型能力/成本”匹配起来。

因此它的本质,是在效果、成本、时延之间做动态折中。一个成熟系统通常还会把风险等级、SLA、历史成功率、工具需求等一起纳入路由,而不是只按问题长度粗暴切分。换句话说,路由本身就是一种资源调度策略,也是在把大模型能力当稀缺资源分配,而不是默认所有请求都值得最贵推理。


#深度解析

1. 模型路由的三维决策空间

                    效果 ↑
                         │
    小模型 ──────────────┼─────────────→ 大模型
    (快/便宜/效果一般)   │    (慢/贵/效果好)
                         │
    ←────── 成本 ────────┼──────── 时延 ──────→

路由决策不是单维度的"简单/复杂",而是综合考虑:

  • 效果维度:任务对准确率的敏感度
  • 成本维度:模型调用费用
  • 时延维度:用户可接受的等待时间

2. 路由策略的分类

策略类型 决策依据 实现方式 适用场景
规则路由 固定规则(如问题长度、关键词) if-else / 正则 简单场景、确定性高
模型路由 小模型预测请求复杂度 训练分类器 中等复杂度、规则难以覆盖
成本敏感路由 用户等级、预算限制 配额系统 多租户、分级服务
效果反馈路由 历史成功率 在线学习 动态优化
混合路由 多因素加权 规则 + 模型组合 生产环境

3. 路由系统的典型架构

请求进入
    │
    ├── 特征提取
    │       ├── 文本特征(长度、语言、领域关键词)
    │       ├── 用户特征(等级、历史偏好)
    │       └── 上下文特征(时间、并发量)
    │
    ├── 路由决策
    │       ├── 规则引擎(快速过滤)
    │       └── ML 模型(复杂判断)
    │
    ├── 模型选择
    │       ├── 简单任务 → GPT-3.5 / 开源 7B
    │       ├── 标准任务 → GPT-4 / Claude
    │       ├── 复杂推理 → GPT-4o / 专用模型
    │       └── 创意生成 → Claude / Gemini
    │
    └── 后评估
            └── 记录路由决策 + 实际效果
            └── 用于优化路由策略

4. 路由决策的常见特征

特征 简单任务指示 复杂任务指示
问题长度 短(<50 字) 长(>200 字)
关键词 "什么是"、"定义" "分析"、"比较"、"推理"
领域 FAQ、通用知识 专业领域、数学、代码
历史模式 常见问题 罕见问题
工具需求 无需工具 需多步工具调用
用户等级 普通用户 VIP / 企业客户

5. 面试官常见深挖追问

  • "路由错误把复杂请求分给简单模型,导致效果差,怎么处理?"
    • 答:三层防护。1)保守策略:不确定时默认走大模型(宁可过度分配也不漏配);2)降级检测:简单模型输出后做质量评估(如置信度、格式校验),不达标时升级到大模型重试;3)反馈学习:收集路由错误样本,持续优化路由模型。关键是把路由错误的影响限制在"多花了成本"而不是"损害了体验"。
  • "模型路由和模型ensemble有什么区别?"
    • 答:路由是"选一个",ensemble 是"用多个"。路由:根据请求特征选择最合适的单一模型,成本低但可能错过其他模型的优势;ensemble:多个模型同时生成,综合结果(如投票、排序),效果通常更好但成本翻倍。实践中可以先路由到候选模型子集,再在小范围内 ensemble,平衡成本和效果。

#113. 什么是 rate limiting,它为什么对 LLM 服务特别重要?

#标准答案

rate limiting 就是对请求频率、并发规模或资源消耗做限制,防止某个用户、某类流量或某个异常模式把系统拖垮。对 LLM 服务尤其重要,因为模型调用成本高、时延长、资源敏感,一旦被恶意刷接口、脚本误调或突发流量打爆,损失会比普通 Web 服务大得多。

它的意义不仅是防止系统过载,也是在做成本治理和风险控制。比如高成本工具调用、长上下文推理、批量生成任务,都需要更细粒度的速率限制,而不是只看 QPS。很多时候限流策略本身就是保障 SLA 的一部分,也是避免异常流量拖垮全局服务、影响高价值请求的手段。


#深度解析

1. Rate Limiting 的多维粒度

粒度 限制对象 典型阈值 目的
用户级 单个用户/API Key 10-100 RPM 防止个别用户滥用
IP 级 单个 IP 地址 100-1000 RPM 防止 DDoS、爬虫
模型级 特定模型 按 GPU 容量 保护后端模型实例
功能级 特定功能(如工具调用) 更严格 高成本操作单独限制
全局级 整个系统 按总容量 防止系统整体过载
Token 级 输入+输出 token 总量 按分钟/小时 成本控制

2. LLM 服务限流的特殊挑战

挑战 原因 普通 Web 服务 LLM 服务
成本敏感 单次调用费用高 限流主要是防过载 限流 = 直接省钱
时延长 生成耗时几秒到几十秒 短连接可快速释放 长连接占用资源久
资源不均 不同请求消耗差异大 按 QPS 限制即可 需按 token/复杂度限制
状态累积 KV cache、上下文窗口 无状态 有状态,资源占用累积
排队效应 高并发时队列积压 简单拒绝或等待 需考虑超时、降级

3. 限流算法对比

算法 原理 优点 缺点 适用场景
固定窗口 每窗口固定配额 简单 窗口边界突发 简单场景
滑动窗口 平滑计算最近 N 秒 平滑 计算稍复杂 通用场景
令牌桶 匀速产生令牌,请求消耗 允许突发 参数调优 需要弹性的场景
漏桶 请求进入桶,匀速流出 严格平滑 无突发能力 严格限速

4. 生产级限流策略

请求到达
    │
    ├── 第一层:全局限流(保护系统)
    │       └── 超过总容量 → 直接拒绝 + 建议重试时间
    │
    ├── 第二层:用户限流(公平使用)
    │       └── 超过用户配额 → 降级服务 / 排队 / 收费升级
    │
    ├── 第三层:功能限流(成本控制)
    │       └── 高成本功能(如代码生成)→ 单独限制
    │
    ├── 第四层:模型限流(资源保护)
    │       └── 特定模型过载 → 路由到其他模型
    │
    └── 第五层:应急限流(异常处理)
            └── 检测到攻击模式 → IP 封禁 / 验证码

5. 面试官常见深挖追问

  • "限流和降级有什么区别?什么时候限流,什么时候降级?"
    • 答:限流是"拒绝服务",降级是"降低服务质量但仍服务"。限流场景:用户配额用完、系统整体过载、检测到恶意流量。降级场景:模型过载时切到小模型、长上下文请求缩短处理、复杂任务简化流程。原则是:对"坏用户"限流,对"好用户"降级。好用户遇到系统压力时,宁可效果差一点也要继续服务;坏用户(滥用者)直接拒绝。
  • "如果一个用户的合法请求被限流了,怎么处理才能不流失用户?"
    • 答:分层处理。1)提示:明确告知用户当前配额和重置时间;2)排队:高价值用户进入优先队列而非直接拒绝;3)降级:提供免费的小模型替代方案;4)引导:提示升级套餐获得更多配额;5)缓冲:允许少量超限(如 10% burst),避免严格限制误伤。关键是让用户感受到"系统在合理管理资源"而不是"系统在拒绝我"。

#114. 线上服务为什么需要缓存?哪些地方可以缓存?

#标准答案

线上服务需要缓存,因为很多成本其实花在重复计算上。相同或高度相似的问题、相同的系统 prompt 前缀、重复文档的 embedding、重复的 RAG 召回结果,都可能一遍又一遍地被算。如果不缓存,系统会白白消耗 token、GPU 和外部 API 费用。

可缓存的地方很多:最终问答结果、检索结果、embedding、常用系统前缀、工具查询结果、甚至多轮对话中的 prefix cache。高分回答通常会补一句:缓存不是越 aggressive 越好,还要考虑时效性、用户隔离、权限边界和失效策略。


#深度解析

1. LLM 系统的缓存层次架构

用户请求
    │
    ├── L1: 结果缓存(Redis/Memcached)
    │       └── 精确/语义匹配,命中则直接返回
    │       └── 延迟:~1ms
    │
    ├── L2: Embedding 缓存
    │       └── 相同 query/文档的 embedding 复用
    │       └── 延迟:~5ms
    │
    ├── L3: 检索缓存
    │       └── 相同 query 的 RAG 召回结果复用
    │       └── 延迟:~10ms
    │
    ├── L4: Prefix Cache(vLLM 等)
    │       └── 共享系统 prompt 的 KV Cache
    │       └── 延迟:节省预填充时间
    │
    └── L5: 模型输出缓存
            └── 相同输入的生成结果复用
            └── 延迟:~500ms-5s(避免重新生成)

2. 各缓存层的详细设计

缓存层 缓存内容 匹配方式 TTL 命中率 节省
结果缓存 最终回答 精确/语义 1-24h 10-30% 100% 生成成本
Embedding 缓存 向量表示 内容哈希 长期 20-40% Embedding 计算
检索缓存 召回文档 Query 哈希 1-6h 15-25% 检索计算
Prefix Cache KV Cache Token 前缀匹配 动态 30-50% 预填充时间
工具结果缓存 API 返回 参数哈希 5-30min 40-60% 外部调用

3. 缓存设计的关键权衡

权衡维度 激进缓存 保守缓存 建议
时效性 可能返回过时信息 信息新鲜但命中低 按数据类型设 TTL
个性化 忽略用户差异 每用户独立缓存 公共内容共享缓存
隐私 可能泄露他人信息 安全但成本高 用户级隔离敏感内容
存储成本 存储压力大 存储小但计算多 LRU 淘汰 + 分层

4. Prefix Cache 的技术原理

系统 prompt(共享前缀)
    ↓
用户 A 提问:"什么是 LLM?"
    └── KV Cache: [系统 prompt KV] + [A 的问题 KV]

用户 B 提问:"什么是 Transformer?"
    └── 复用 [系统 prompt KV],只计算 [B 的问题 KV]
    └── 节省:系统 prompt 的预填充时间

vLLM 的 Prefix Cache 通过 block table 管理,相同前缀的 block 可以共享(copy-on-write),在多轮对话和高并发场景下显著降低 TTFT。

5. 面试官常见深挖追问

  • "缓存命中率 30% 算高还是低?怎么提升?"
    • 答:30% 对结果缓存是中等水平。提升方法:1)语义缓存:用 embedding 相似度而非精确匹配,捕捉同义表达;2)模板化:把常见问题抽象为模板(如"{产品}的价格是多少"),提高匹配泛化;3)预热:系统启动时预加载高频查询;4)组合缓存:缓存 RAG 检索结果而非最终回答,让 LLM 基于相同证据回答不同问题。语义缓存通常能把命中率从 30% 提升到 50%+。
  • "缓存和一致性怎么平衡?比如知识库更新了,缓存怎么办?"
    • 答:多级失效策略。1)主动失效:知识库更新时,发消息清空相关缓存条目;2)TTL 过期:设置合理过期时间(如 FAQ 24h,实时数据 5min);3)版本号:缓存 key 包含知识库版本号,更新后自动隔离旧缓存;4)校验抽样:定期抽样检查缓存结果与重新计算的结果是否一致。关键是"最终一致性"——允许短暂不一致,但确保在可接受时间内收敛。

#115. 设计一个支持 1 万并发用户 的企业知识问答系统,你会怎么拆架构?

#标准答案

这种系统更像一个完整平台,而不是单个模型接口。一个稳妥架构通常包括:网关层负责接入、鉴权和限流;查询理解层负责意图识别、改写和任务分流;RAG 检索层负责知识召回与重排;模型路由层负责选择模型和推理链路;缓存层负责减少重复计算;异步日志与评测层负责记录请求、做坏例分析;安全审核层负责权限与内容治理;人工兜底层负责高风险或低置信度场景。

为什么要这么拆?因为 1 万并发 下,瓶颈不只在模型推理,还在接入、检索、缓存、工具调用和观测。面试里最好再补一句:架构目标不是“让模型尽量聪明”,而是“在大并发下仍可控、可降级、可回滚”。


#深度解析

1. 万级并发系统的分层架构

┌─────────────────────────────────────────────────────────┐
│ CDN / WAF(边缘层)                                      │
│ 静态资源、DDoS 防护、地理就近接入                        │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ API Gateway(网关层)                                    │
│ 鉴权、限流、路由、负载均衡、SSL 终止                     │
│ 技术:Kong / Nginx / AWS API Gateway                     │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 查询理解服务(Query Understanding)                      │
│ 意图识别、Query Rewrite、敏感词过滤、任务分流            │
│ 技术:轻量 BERT / 规则引擎                               │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 检索服务集群(RAG Retrieval)                            │
│ Embedding 服务、向量数据库、重排序                       │
│ 技术:Milvus / Pinecone + Cross-Encoder                │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 模型推理集群(Inference)                                │
│ 多模型部署、自动扩缩容、批处理                           │
│ 技术:vLLM / TGI + K8s HPA                               │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 业务服务层(Business Logic)                             │
│ 工具调用、业务系统对接、结果组装                         │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 数据层(Data & Cache)                                   │
│ 知识库、缓存、日志、监控系统                             │
└─────────────────────────────────────────────────────────┘

2. 各层的关键设计参数

层级 核心指标 设计目标 扩展策略
网关 QPS、延迟 10K+ QPS,P99 < 50ms 无状态横向扩展
查询理解 准确率、延迟 准确率 > 90%,P99 < 20ms 轻量服务,CPU 密集型
检索 召回率、延迟 召回率 > 80%,P99 < 100ms 向量数据库分片
推理 吞吐量、GPU 利用率 利用率 60-80% 自动扩缩容(K8s HPA)
业务 成功率、延迟 成功率 > 99.9% 异步解耦

3. 容量规划估算

假设 1 万并发用户,平均每个用户每 10 秒发起 1 次请求:

峰值 QPS = 10,000 / 10 = 1,000 QPS

模型推理层:
    ├── 单 GPU(A100)处理能力:~50-100 QPS(取决于模型和序列长度)
    ├── 需要 GPU 数:1,000 / 75 ≈ 14 张 A100
    ├── 考虑峰值冗余(2x):28 张 A100
    └── 成本:~$50-100K/月(云)

检索层:
    ├── 单次检索延迟:~50ms
    ├── 并发需求:1,000 QPS
    ├── 向量数据库:3-5 个分片节点
    └── Embedding 服务:4-8 个实例

4. 高并发下的关键保障机制

机制 作用 实现
熔断 下游服务故障时快速失败 Circuit Breaker 模式
降级 系统过载时简化服务 小模型替代、减少 RAG 文档
限流 防止单用户拖垮系统 Token Bucket
隔离 防止故障扩散 线程池隔离、资源配额
回滚 新版本故障时恢复 蓝绿部署、金丝雀发布

5. 面试官常见深挖追问

  • "1 万并发下,如果模型推理层成为瓶颈,怎么扩展?"
    • 答:三层扩展。1)垂直扩展:升级 GPU(A100 → H100),单机处理能力提升 2-3 倍;2)水平扩展:增加模型实例数,负载均衡分发请求;3)效率优化:continuous batching、speculative decoding、量化,单机吞吐量提升 2-4 倍。通常先优化效率(成本低),再水平扩展(弹性好),最后垂直扩展(最直接但最贵)。
  • "万级并发下,如何保证知识库更新后所有用户看到最新内容?"
    • 答:最终一致性策略。1)知识库更新走 CI/CD 流水线,自动触发索引重建;2)向量数据库支持在线更新,新文档立即入库,旧文档标记失效;3)缓存层设置 TTL(如 5 分钟),保证最长 5 分钟内刷新;4)对于紧急更新(如错误信息修正),主动推送失效消息到缓存层。不要求所有用户实时看到最新内容,但确保在分钟级收敛。

#116. 如果老板要求“效果尽量好,但预算砍一半”,你会从哪些地方动刀?

#标准答案

第一步不是立刻砍模型,而是先看成本到底花在哪:是大量简单请求都走了大模型,还是 RAG 上下文太长,还是重复请求太多,还是工具链路重试太频繁。只有先做成本拆账,后面的优化才不会瞎砍。

真正动刀时,通常优先做模型分级路由、缓存、上下文压缩、无效请求过滤、RAG 提效和高成本链路瘦身。原则是优先砍“无效昂贵计算”,而不是一刀切把效果核心链路也砍坏。这样回答比直接说“换小模型”更像工程负责人视角,也更符合真实降本顺序,因为先优化浪费项通常最安全、对效果副作用也最小,后续再考虑是否需要调整主模型规格与服务层资源配置。


#深度解析

1. 成本拆解:钱到底花在哪?

总成本 100%
    ├── 模型推理成本(通常 40-60%)
    │       ├── 大模型调用(GPT-4 级别)
    │       └── 小模型调用(GPT-3.5 级别)
    ├── 上下文/token 成本(20-30%)
    │       ├── 系统 prompt
    │       ├── RAG 文档
    │       └── 历史对话
    ├── 检索成本(5-15%)
    │       ├── Embedding 计算
    │       └── 向量数据库查询
    ├── 外部工具成本(5-20%)
    │       ├── API 调用
    │       └── 数据库查询
    └── 基础设施成本(10-20%)
            ├── GPU/CPU 实例
            ├── 存储
            └── 带宽

2. 降本措施的优先级与效果

优先级 措施 降本幅度 效果影响 实施难度
P0 模型路由(简单请求走小模型) 30-50% 极小
P0 缓存建设 15-30%
P1 上下文压缩(RAG 去噪) 10-20%
P1 无效请求过滤 5-10%
P2 自托管开源模型替代 API 40-70%
P2 模型量化/蒸馏 20-40%
P3 减少功能/覆盖范围 20-50%

原则:先砍浪费,再砍规格,最后砍功能

3. 效果保护的降本策略

策略 1: 分层服务
    ├── VIP 用户 → 大模型(效果优先)
    ├── 普通用户 → 小模型(成本优先)
    └── 免费用户 → 缓存/小模型(极致降本)

策略 2: 动态降级
    ├── 高峰期:小模型 + 缓存
    ├── 低峰期:大模型 + 全功能
    └── 应急:只保留核心功能

策略 3: 效果监控闭环
    ├── 降本后 A/B 测试
    ├── 监控用户满意度、任务完成率
    └── 如果效果下降 >5%,回滚或调整

4. 具体场景的降本方案

场景 原方案 降本方案 节省
FAQ 问答 GPT-4 GPT-3.5 + 缓存 70%
文档摘要 GPT-4 + 长上下文 小模型 + 分段摘要 50%
代码生成 GPT-4 代码专用模型(Codex) 40%
RAG 检索 每请求重新 embedding Embedding 缓存 30%
多轮对话 保留 10 轮历史 保留 3 轮 + 摘要 20%

5. 面试官常见深挖追问

  • "如果砍了 50% 预算后,核心指标掉了 10%,怎么办?"
    • 答:先定位是哪项措施导致的。1)分析指标下降的具体表现:是准确率降了?还是用户满意度降了?还是特定场景出问题?2)回溯最近实施的降本措施,逐一隔离验证;3)如果是模型降级导致,考虑"部分恢复"——只把高风险/高价值场景恢复大模型,其他场景保持小模型;4)如果是缓存导致信息过时,缩短缓存 TTL;5)最终目标:找到"效果损失最小"和"成本降低最大"的帕累托最优。
  • "自托管开源模型 vs 调 API,成本差距有多大?"
    • 答:差距显著但非简单替代。以处理 1M tokens 为例:GPT-4 API ≈ $30;自托管 Llama-3-70B(A100 单卡)≈ $3-5(电费+折旧)。但自托管有额外成本:1)运维人力;2)GPU 闲置成本(API 按量付费,自托管需预留容量);3)效果差距(开源模型通常弱于顶尖闭源模型)。综合看,简单任务自托管可省 60-80%,复杂任务可能省 30-50% 但效果有损失。通常混合策略:简单任务自托管,复杂任务 API。

#117. 如何做一个 LLM gateway,把请求路由到不同模型、不同供应商或不同规格实例?

#标准答案

LLM gateway 的核心,是把不同模型和不同供应商封装到统一入口后,再根据策略做路由与治理。它通常需要统一协议层、鉴权与限流、模型元数据管理、路由策略、失败回退、成本统计、日志与监控,以及版本和灰度控制。否则一旦模型和供应商一多,业务方会被接入细节淹没。

路由依据也不应只看“哪个模型最强”,而要综合任务类型、风险等级、延迟要求、预算、可用区、历史成功率和合规要求。高分回答一般会强调:gateway 的价值不只是转发请求,而是把模型治理和供应商治理抽象成统一控制面,这样业务层才不会和底层供应商强绑定。


#深度解析

1. LLM Gateway 的核心功能模块

┌─────────────────────────────────────────────────────────┐
│ 统一 API 接口(OpenAI-compatible / Custom)              │
│ 业务方只需调用一个端点                                   │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 治理层                                                   │
│ ├── 鉴权(API Key / OAuth)                              │
│ ├── 限流(Rate Limiting)                                │
│ ├── 计费(Cost Tracking)                                │
│ └── 审计(Audit Log)                                    │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 路由层(Routing)                                        │
│ ├── 模型选择(GPT-4 / Claude / Llama)                   │
│ ├── 供应商选择(OpenAI / Anthropic / Azure)             │
│ ├── 地域路由(就近 / 合规)                               │
│ └── 版本路由(模型版本 A/B)                             │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 弹性层(Resilience)                                     │
│ ├── 失败重试(Retry with backoff)                       │
│ ├── 熔断降级(Circuit Breaker)                          │
│ ├── 超时控制(Timeout)                                  │
│ └──  fallback(主供应商失败切备用)                       │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│ 供应商适配层                                             │
│ 统一不同供应商的 API 差异                                │
└─────────────────────────────────────────────────────────┘

2. 路由策略的设计

策略 决策依据 示例
任务类型路由 意图分类结果 代码生成 → Codex,创意写作 → Claude
成本敏感路由 用户等级/预算 免费用户 → GPT-3.5,付费用户 → GPT-4
延迟敏感路由 用户场景的延迟要求 实时对话 → 低延迟模型,批处理 → 高精度模型
合规路由 数据驻留要求 欧盟数据 → 欧盟部署的模型
负载均衡路由 各供应商/实例的当前负载 自动分配到最空闲的实例
效果反馈路由 历史成功率 某供应商近期错误率高 → 降低其权重

3. 多供应商治理的关键问题

问题 挑战 解决方案
API 差异 不同供应商参数名、返回格式不同 Gateway 统一封装为标准化接口
能力差异 同样叫 "GPT-4",不同供应商效果可能不同 统一评测基准,建立能力矩阵
成本差异 同样模型,不同供应商价格不同 动态比价,优先选择性价比高的
故障隔离 一个供应商故障影响全局 多供应商并行,快速 failover
数据合规 不同地区法规要求 数据本地路由,不出境

4. Gateway 的技术实现

# 伪代码示例
class LLMGateway:
    def route(self, request):
        # 1. 鉴权
        user = authenticate(request.api_key)
        
        # 2. 限流检查
        if not self.rate_limiter.allow(user):
            return RateLimitError()
        
        # 3. 路由决策
        strategy = self.select_strategy(request)
        provider = strategy.choose_provider(request)
        model = strategy.choose_model(request)
        
        # 4. 调用供应商
        try:
            response = provider.call(model, request)
        except ProviderError:
            # 5. Failover
            fallback = strategy.get_fallback()
            response = fallback.call(model, request)
        
        # 6. 记录日志和计费
        self.log(request, response, provider, model)
        self.charge(user, response.tokens)
        
        return response

5. 面试官常见深挖追问

  • "如果两个供应商的同一模型效果有差异,Gateway 怎么处理?"
    • 答:建立"效果基准测试"。1)定期用同一批测试集评测各供应商的同规格模型;2)建立效果评分卡(准确率、延迟、可用性);3)路由时参考评分卡,优先选择评分高的供应商;4)对效果差异大的场景(如特定语言、特定领域),建立"领域-供应商"映射表。关键是不要假设"同名模型效果相同",要持续监控和验证。
  • "Gateway 本身成为单点故障怎么办?"
    • 答:多层高可用设计。1)Gateway 服务本身多实例部署,前置负载均衡;2)Gateway 状态(如限流计数)存储在分布式缓存(Redis Cluster),单实例故障不丢失状态;3)路由配置存储在配置中心(如 Consul),支持动态更新;4)最极端情况,客户端支持直连供应商的 fallback 机制。Gateway 是基础设施,其可用性要求高于业务服务。

#118. 你如何设计 prompt 管理、版本管理、AB 实验和回滚?

#标准答案

prompt 不应该散落在代码里当匿名字符串,而应该配置化、版本化管理。每次改 prompt,都应有版本号、变更说明、适用场景和依赖模型记录;同时支持灰度发布,让一小部分流量先验证效果,而不是全量直接切换。

AB 实验则要和明确指标绑定,比如成功率、用户满意度、成本、时延、人工转接率,而不是只凭主观感觉。回滚能力同样关键:一旦指标恶化,要能快速切回上一个稳定版本。所以这题的关键不是“会写 prompt”,而是会把 prompt 当成正式生产资产来治理,而不是临时经验或散落脚本,并且让变更可审计、可回放。


#深度解析

1. Prompt 管理的系统化方案

Prompt 仓库(Git / 配置中心)
    │
    ├── 目录结构
    │       ├── prompts/
    │       │       ├── customer_service/
    │       │       │       ├── v1.0.0.yaml
    │       │       │       ├── v1.1.0.yaml
    │       │       │       └── v1.2.0_beta.yaml
    │       │       └── code_generation/
    │       │               └── v2.0.0.yaml
    │       └── templates/
    │               └── common_prefix.yaml
    │
    └── 每个 prompt 文件的元数据
            ├── version: "1.2.0"
            ├── model: "gpt-4-turbo"
            ├── temperature: 0.7
            ├── description: "客服场景主 prompt"
            ├── author: "zhangsan"
            ├── created: "2026-01-15"
            └── tags: ["客服", "中文", "正式版"]

2. 版本管理策略

策略 做法 适用场景
语义化版本 major.minor.patch 所有生产 prompt
分支管理 main / dev / feature-xxx 多人协作开发
变更审批 PR Review + 测试通过 生产环境变更
版本锁定 服务启动时加载指定版本 确保可复现
热更新 配置中心推送,无需重启 紧急修复

3. AB 实验设计

实验设计
    ├── 假设:新 prompt v1.2 比 v1.1 用户满意度高 5%
    ├── 指标
    │       ├── 主要指标:用户满意度、任务完成率
    │       ├── 次要指标:成本、延迟、人工转接率
    │       └── 护栏指标:错误率、安全事件数
    ├── 流量分配
    │       ├── 对照组:50% 流量走 v1.1
    │       └── 实验组:50% 流量走 v1.2
    ├── 实验时长
    │       └── 至少 1 周(覆盖不同日期模式)
    └── 成功标准
            └── 主要指标提升显著(p < 0.05)且护栏指标无恶化

4. 回滚机制

回滚触发条件 回滚动作 回滚时间目标
错误率 > 阈值 自动切回上一版本 < 1 分钟
用户投诉激增 人工确认后回滚 < 5 分钟
AB 实验指标恶化 自动停止实验组 < 2 分钟
安全事件 立即回滚 + 告警 < 30 秒

回滚实现:配置中心保存最近 N 个稳定版本,切换时只需修改版本号指针,无需重新部署服务。

5. 面试官常见深挖追问

  • "Prompt 版本多了以后,怎么管理依赖关系?比如 prompt A 引用了 prompt B 的公共前缀。"
    • 答:用"模板继承"机制。1)公共部分(如系统角色定义)做成基础模板;2)业务 prompt 通过"继承+覆盖"引用基础模板;3)版本管理时,基础模板升级会自动影响所有继承者,但继承者可以选择锁定基础模板版本。类似于软件包管理(如 npm 的 dependency),明确声明依赖的版本范围,避免"隐式依赖导致意外变更"。
  • "AB 实验中,如果实验组效果比对照组好,但成本高 30%,怎么决策?"
    • 答:这取决于业务目标。1)如果是高价值场景(如付费用户),且满意度提升带来留存/付费增长 > 成本增加,选择上线;2)如果是普通场景,需要评估 ROI:每单位成本提升带来的效果增益是否值得;3)可以考虑"分层策略":只对高价值用户启用新 prompt,普通用户保持原方案。AB 实验的结论不是"好就上",而是"在约束条件下是否值得上"。

#119. 如果线上投诉激增,你会先看哪些指标,先排查哪几层?

#标准答案

先不要陷进单个案例,而要先看系统性指标有没有突变:流量是否异常、错误率和超时是否飙升、平均时延是否拉长、成本是否突然升高、模型路由是否变了、RAG 命中率是否下降、工具成功率是否变差、安全拦截是否突然增多。先找“什么时候开始出问题”和“哪一层一起变化”。

然后再按链路逐层排查:接入层、检索层、模型层、工具层、输出层。最后再抽具体 bad case 做深挖,确认是新 prompt 引入的问题、路由变更的问题、知识库更新的问题,还是供应商质量波动。这样回答体现的是系统化排障,而不是凭感觉猜,也更符合真实事故处理流程。


#深度解析

1. 投诉激增的"黄金 5 分钟"排查法

第 1 分钟:看大盘
    ├── 流量是否异常突增?(DDoS / 推广活动)
    ├── 错误率是否飙升?(系统性故障)
    └── 时延是否拉长?(资源瓶颈)

第 2 分钟:看分层
    ├── 接入层:QPS、并发、限流触发次数
    ├── 检索层:RAG 召回率、检索延迟
    ├── 模型层:模型错误率、路由分布、供应商状态
    ├── 工具层:工具成功率、外部 API 状态
    └── 输出层:安全拦截率、格式错误率

第 3 分钟:看变更
    ├── 最近 24h 是否有发布?(代码 / prompt / 模型)
    ├── 是否有配置变更?(路由规则 / 阈值)
    └── 供应商是否有异常?(Status Page)

第 4 分钟:看关联
    ├── 投诉类型分布(技术问题?体验问题?)
    ├── 用户群体(新用户?老用户?特定地区?)
    └── 时间模式(突发?渐进?周期性?)

第 5 分钟:定位根因
    └── 确认是变更导致 → 回滚
    └── 确认是外部依赖 → 降级 / failover
    └── 确认是容量不足 → 扩容
    └── 确认是未知问题 → 启动应急小组

2. 关键指标的异常模式识别

指标组合 可能根因 快速验证
流量 ↑ + 时延 ↑ + 错误率 ↑ 系统过载 看资源使用率
流量 → + 错误率 ↑ 代码/配置 bug 看最近变更
流量 ↓ + 投诉 ↑ 效果变差,用户不满 抽样 bad case
时延 ↑ + 错误率 → 慢查询累积 看数据库/检索状态
成本 ↑ + 效果 ↓ 模型/路由问题 看路由分布和模型输出

3. 逐层排查清单

层级 检查项 工具/方法
接入层 负载均衡、SSL、限流、CDN 网关日志、监控面板
应用层 服务状态、线程池、GC APM、JVM 监控
检索层 向量数据库、索引状态 检索日志、DB 监控
模型层 模型版本、路由策略、供应商 模型日志、供应商状态页
工具层 外部 API、数据库、缓存 调用链追踪
输出层 内容安全、格式校验 审核日志

4. 事故响应的分级处理

级别 标准 响应时间 处理权限
P0 系统完全不可用 5 分钟内 任何人可立即回滚
P1 核心功能受损 15 分钟内 值班工程师 + TL
P2 体验下降、投诉增多 1 小时内 值班工程师
P3 边缘 case 异常 1 天内 排期修复

5. 面试官常见深挖追问

  • "如果所有指标都正常,但投诉确实在增加,可能是什么原因?"
    • 答:这是最难排查的"隐式故障"。可能原因:1)效果漂移:模型输出风格变化,用户不适应(如从正式变口语化);2)竞品效应:竞品推出新功能,用户预期提高;3)样本偏差:投诉来自特定群体(如新用户),整体指标被老用户"平均"掉了;4)情绪累积:小问题长期未修复,用户忍耐到达阈值。排查方法:1)分层分析(新老用户、不同地区);2)人工抽样 bad case;3)对比投诉前后输出样本的差异;4)用户调研。
  • "排查时如何区分'供应商问题'和'我们自己的问题'?"
    • 答:快速验证三步法。1)直连测试:绕过我们自己的系统,直接调用供应商 API 测试相同输入,如果问题复现 → 供应商问题;2)多供应商对比:同一输入发给多个供应商,如果只有一家出问题 → 该供应商问题;3)历史对比:对比该供应商历史输出和当前输出,如果风格/质量突变 → 供应商模型更新导致。自己的问题通常有变更记录可追踪,供应商问题需要去供应商 status page 确认。

#120. 你如何判断某个业务应该上纯 LLM、RAG、Agent,还是传统规则 + 小模型?

#标准答案

判断一个业务适合哪种方案,核心不是看技术热度,而是看任务本质。若流程稳定、规则清晰、容错低、调用频繁,传统规则加小模型通常更稳、更便宜;若核心问题是知识频繁更新、需要可追溯证据,RAG 更合适;若任务需要多步决策、调用外部工具并根据反馈持续推进,才更像 Agent;若只是开放式生成或简单问答,纯 LLM 可能已经够用。

现实里很多系统最后不是四选一,而是混合:规则负责边界和兜底,小模型负责分类和过滤,RAG 负责知识,Agent 负责复杂执行。面试里这样答,说明你能把技术选型建立在业务约束上,而不是追风口。


#深度解析

1. 技术选型的四维决策框架

                    知识确定性
                        ↑
    规则+小模型 ←───────┼───────→ RAG
    (流程固定)         │      (知识需更新)
                        │
    简单性 ←────────────┼──────── 复杂性
                        │
    纯 LLM ←────────────┼───────→ Agent
    (开放式问答)       │      (多步决策+工具)
                        ↓
                    任务开放性

2. 四种方案的能力边界对比

维度 规则+小模型 纯 LLM RAG Agent
知识时效性 需人工更新规则 受限于训练数据截止 实时知识库 实时知识库+工具
可解释性 高(规则透明) 中(可引用来源) 低(轨迹复杂)
成本 最低
延迟 最低(毫秒级) 中(秒级) 中(秒级) 高(多步累积)
容错要求 可严格约束 需后处理 guardrail 需检索准确性 需多层容错
开发周期 短(规则即代码) 中(需建知识库) 长(需设计工作流)
维护成本 中(规则膨胀) 中(知识库维护) 高(多组件协调)

3. 典型场景的选型决策

业务场景 推荐方案 理由
银行风控审批 规则+小模型 容错极低,需可解释,规则优先
电商 FAQ RAG 商品信息频繁更新,需准确引用
创意写作 纯 LLM 开放式生成,无需外部知识
智能客服(简单查询) RAG 知识库驱动,答案需准确
智能客服(复杂退款) Agent 需查询订单+判断规则+执行操作
代码补全 纯 LLM/Agent 上下文在代码中,复杂任务需工具
内容审核 规则+小模型 标准明确,需低延迟
研报生成 Agent 需多源数据+分析+写作

4. 混合架构的设计原则

用户请求
    │
    ├── 第一层:规则过滤
    │       ├── 黑名单/敏感词 → 直接拒绝
    │       ├── 简单模板匹配 → 直接回答
    │       └── 无法规则处理 → 进入下一层
    │
    ├── 第二层:意图分类(小模型)
    │       ├── FAQ 类 → RAG 检索回答
    │       ├── 闲聊类 → 纯 LLM 生成
    │       └── 业务操作类 → Agent 处理
    │
    └── 第三层:各方案执行
            ├── RAG:检索 → 生成 → 引用校验
            ├── LLM:直接生成
            └── Agent:规划 → 工具调用 → 执行

5. 选型常见陷阱

陷阱 错误做法 正确做法
过度工程 简单 FAQ 上 Agent 先用 RAG,复杂了再升级
技术驱动 因为 Agent 热门就用 Agent 根据任务复杂度选择
忽视成本 所有场景都用 GPT-4 简单场景用小模型/规则
忽视维护 大量规则硬编码 规则配置化,定期清理失效规则
忽视兜底 完全依赖 LLM 高风险场景必须人工审核

6. 面试官常见深挖追问

  • "如果一个业务现在用规则,但老板想上 LLM,你怎么说服他?"
    • 答:不是说服不上,而是评估是否值得。1)量化当前规则的覆盖率和维护成本——如果规则已经覆盖 95% 场景且维护成本可控,上 LLM 的收益有限;2)识别规则无法处理的场景(如开放式问答、语义理解),这些才是 LLM 的价值点;3)提案"渐进式迁移":先在小模型/LLM 处理规则覆盖不了的场景,逐步扩展;4)给出 ROI 估算:投入成本 vs 预期收益(用户满意度提升、人工介入减少)。用数据说话,而不是用技术热度说服。
  • "四选一之后,怎么判断要不要升级或降级?"
    • 答:建立"方案健康度"指标。1)规则+小模型:规则膨胀度(规则数/月增速 > 20% 说明该升级)、覆盖率;2)纯 LLM:幻觉率、用户满意度;3)RAG:检索准确率、答案忠实度;4)Agent:任务完成率、平均步数、工具成功率。当当前方案的健康度指标持续恶化,且瓶颈无法通过调优解决时,考虑升级。反之,如果上层方案维护成本过高、但效果提升有限,考虑降级。