Embedding 服务的高并发怎么扛?在线和离线向量化怎么分开?
面试怎么回答
在线查询向量化是单条短文本、要求几十毫秒延迟;离线文档向量化是批量长文本、追求吞吐,混在一起离线会把在线拖慢。所以第一原则是隔离:在线和离线用不同的实例或 GPU 池,在线预留容量;必须共用时在线高优先级,离线限速并放在夜间。在线服务用动态批处理在几毫秒窗口内合并请求,缓存高频文本的向量,用推理加速和合适精度,按 QPS 弹性扩缩,故障时检索降级为纯关键词检索。离线任务大批次按长度分组、按内容哈希去重、只增量处理,用外部 API 时优先批处理接口。最关键的是在线离线必须用同一模型版本和相同预处理,每条向量记录模型版本。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
RAG 系统里,每次用户提问都要先把问题向量化;知识库更新时又要批量向量化大量文档。某天批量任务一启动,在线问答的延迟从 1 秒涨到了 5 秒。面试官问这题,想看你如何设计一个同时服务在线和离线需求的 Embedding 服务。
两类负载的差异
- 在线查询向量化:单条、文本短(一个问题)、要求低延迟(几十毫秒),QPS 随用户量波动;
- 离线文档向量化:批量、文本长(文档片段)、追求高吞吐,对延迟不敏感,量大时可能持续几小时。
混在一起,离线的大批量长文本会占满资源,在线请求排队。
隔离是第一原则
- 资源隔离:在线和离线使用不同的部署实例(或不同的 GPU 池),在线实例预留容量;
- 优先级队列:如果必须共用,在线请求高优先级,离线请求只用剩余容量;
- 离线限速:离线任务的并发和速率由调度方控制,不允许无限制地压上去;
- 时间错峰:大规模的离线向量化放在夜间低峰期。
在线服务的优化
- 动态批处理:在几毫秒的窗口内把多个在线请求合并成一批推理,提高 GPU 利用率,同时控制延迟;
- 缓存:高频问题、相同文本的向量缓存起来,命中就不用再算;
- 模型加速:用推理优化框架、合适的精度(FP16 / INT8);
- 弹性扩缩容:按 QPS 和延迟自动扩缩;
- 超时和降级:Embedding 服务故障时,检索可以降级为纯关键词检索,保证系统可用。
离线任务的优化
- 大批次推理,按文本长度分组减少填充;
- 用内容哈希去重,相同的片段只算一次;
- 增量处理:只处理新增和修改的文档;
- 如果用外部 API,优先用批处理接口。
一致性
在线和离线必须使用同一个模型的同一个版本、同样的预处理(比如文本规范化、截断规则),否则问题向量和文档向量不在同一个空间里,检索效果会悄悄下降。每条向量记录模型版本,服务端校验。