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

#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:任务完成率、平均步数、工具成功率。当当前方案的健康度指标持续恶化,且瓶颈无法通过调优解决时,考虑升级。反之,如果上层方案维护成本过高、但效果提升有限,考虑降级。