一、面试题目
面试官:结合工程实践,讲一讲高并发、低延迟、高可用 AI 服务落地经验,包含架构设计、性能优化、稳定性保障、限流熔断、可观测性、部署策略。
二、知识储备
1. 核心目标
- 高并发:支持万级 QPS、大流量突发、热点削峰
- 低延迟 :对话/推理/向量检索控制在 百毫秒级
- 高可用:多可用区、故障自动切换、0 核心业务宕机
- 可扩展:弹性扩缩容、模型服务化、分层解耦
整体架构:接入层 → 网关层 → 调度层 → 模型推理层 → 向量检索层 → 缓存层 → 监控告警层
2. 高并发落地经验
(1)请求层:限流、熔断、削峰、排队
- 多级限流:网关限流 + 模型层限流,区分普通用户/付费用户/内部调用
- 令牌桶/漏桶 + 队列削峰:突发流量排队,拒绝瞬时打满
- 熔断降级:模型超时/异常时,切缓存答案、兜底话术、静态模板
- 批量请求合并:向量检索、Embedding 批量推理,减少调用次数
(2)推理层:模型优化,提升吞吐
- 量化压缩:FP16 / INT8 / INT4 量化,显存占用降 70%+,并发翻倍
- KV Cache 复用、PagedAttention,大幅提升长文本吞吐
- 动态批处理 Batch:小请求合并批量推理
- 模型分层部署:简单问题小模型,复杂问题大模型,避免大模型被小请求打崩
(3)缓存层:热点请求全链路缓存
- 高频问题缓存答案、Embedding 向量、检索结果
- Redis 多级缓存,热点问题直接返回,不进模型
- 实时数据缓存(库存、天气、物流),减少 DB/API 压力
(4)向量库高并发
- Milvus 分片、分区、冷热分离
- 索引预构建、IVF_FLAT / HNSW 合理选型
- 向量查询做缓存,相同 Query 复用向量结果
3. 低延迟优化经验(核心面试重点)
(1)网络优化
- 就近部署、同机房调用,减少跨地域延迟
- 内网通信、GRPC 替代 HTTP,减少序列化开销
- 长连接复用、连接池优化
(2)推理延迟优化
- 流式输出(SSE),边生成边返回,体感延迟大幅降低
- 控制上下文长度,精简 Prompt,减少 Token 生成量
- 开启推理加速库:vLLM、TensorRT、DeepSpeed
(3)RAG 链路延迟优化
- 多路召回 + 重排异步化,非关键步骤后台执行
- 预计算高频向量、预加载常用知识库
- 限制 Reranker 候选集大小,避免重排过慢
(4)链路精简
能不调用大模型就不调用大模型
简单问答直接规则+缓存,复杂问题再上 LLM
4. 高可用落地经验
(1)多活架构
- 多可用区部署,一挂另一个自动顶
- 无状态服务,容器化弹性扩缩容(K8s)
- 模型多实例冗余,避免单点故障
(2)故障自愈
- 健康检查、自动重启异常实例
- 流量自动切流、故障节点剔除
- 模型服务熔断、降级、优雅失败
(3)数据高可用
- 向量库主从、备份、快照
- 实时数据 MySQL 主从 + Redis 集群
- 多租户数据隔离,避免一个租户拖垮全局
(4)灰度发布 & 蓝绿发布
- 新版本小流量灰度,验证稳定后全量上线
- 可快速回滚,防止模型版本事故
5. 可观测性(必备工程经验)
- 全链路 Trace:从用户请求 → 网关 → 调度 → 模型 → 向量库,每个环节耗时打点
- 指标监控:QPS、延迟 P95/P99、错误率、显存使用率、队列长度
- 日志审计:Prompt、回答、调用时间、用户ID全留痕
- 告警体系:延迟突增、错误率飙升、显存打满、队列堆积实时告警
6. 生产级最佳实践总结(面试直接背)
- 简单问题缓存+小模型兜底,复杂问题上大模型,分层降本提效
- 推理层做量化、PagedAttention、批量推理,提升并发、降低延迟
- 网关做限流熔断、削峰排队,保护模型不被打崩
- 向量库分片+缓存+冷热分离,支撑高并发检索
- 部署采用多可用区+无状态+弹性扩缩容,保障高可用
- 全链路监控+灰度发布,提前发现隐患,快速回滚
三、破局之道(面试满分话术)
高并发低延迟高可用 AI 服务,本质是架构分层 + 推理优化 + 流量管控 + 缓存兜底 + 多活容灾 + 可观测性 。
通过模型量化、推理加速、批量处理 提升吞吐;通过限流熔断、削峰缓存 扛住流量;通过多可用区、灰度发布、故障自愈 保障稳定;通过全链路监控 提前发现问题。
核心原则:能缓存不计算,能小模型不大模型,能规则不推理,优先保障核心链路稳定。
四、极简代码/配置示意
Python 限流+熔断伪代码
python
import time
from functools import lru_cache
# 1. 热点缓存
@lru_cache(maxsize=10000)
def hot_query_cache(query):
return llm(query)
# 2. 限流简单实现
class RateLimiter:
def __init__(self, max_qps):
self.max_qps = max_qps
self.count = 0
self.last_reset = time.time()
def allow(self):
now = time.time()
if now - self.last_reset > 1:
self.count = 0
self.last_reset = now
if self.count < self.max_qps:
self.count += 1
return True
return False
# 3. 熔断降级
def ai_service(query):
limiter = RateLimiter(100)
if not limiter.allow():
return "当前访问繁忙,请稍后重试"
try:
return hot_query_cache(query)
except Exception:
return "系统繁忙,已为您兜底回答"
JS 极简版
javascript
// 简单限流+缓存
const cache = new Map();
let qps = 0;
let resetTime = Date.now();
function rateLimitCheck(maxQps = 100) {
const now = Date.now();
if (now - resetTime > 1000) {
qps = 0; resetTime = now;
}
return qps++ < maxQps;
}
async function aiService(query) {
if (!rateLimitCheck()) return "访问繁忙";
if (cache.has(query)) return cache.get(query);
try {
const res = await llm(query);
cache.set(query, res);
return res;
} catch {
return "系统繁忙,请稍后";
}
}