成本与性能优化
RAG 的成本结构和纯 LLM 应用不同,钱花在四个地方,大头在生成。先看清构成,再谈优化。
成本构成
| 环节 | 成本特征 | 占比 |
|---|---|---|
| 嵌入 | 离线一次,按文档量计 | 小 |
| 向量库存储 | 按向量数量和维度 | 小到中 |
| 检索 | 查询嵌入推理加 ANN 查询 | 小 |
| 生成 | 每次请求按 token 计费,注入的上下文越多越贵 | 大头 |
生成侧的成本取决于注入量:Top-K 块越多、块越大,每轮 prompt 越贵。这里有个直接矛盾,检索质量要更多上下文,成本要更少 token。
生成侧优化
- 重排后少注入:召回 50 块只取 Top-5 到 10 进上下文,质量不降成本大降
- 上下文压缩:只留与问题相关的句子,去掉无关段落
- 模型路由:简单问题用便宜小模型,复杂问题才用大模型。可以省下可观成本
- Prompt 缓存:系统指令和稳定前缀缓存,长会话场景收益明显
检索侧优化
- 块大小与冗余:overlap 过大会让多个块携带相同信息,检索和生成双重浪费
- 向量量化:PQ 量化把向量压到原来的四分之一甚至更低,精度损失可控
- 降维:支持 MRL 的模型用低维子向量,存储和检索成本随维度下降
- 批量嵌入:索引构建时批量调用,摊薄调用开销
- 缓存高频查询:见缓存策略篇
延迟与吞吐
- 检索延迟:HNSW 参数(efSearch)在召回和速度之间调;混合检索两路并行而不是串行
- 生成延迟:流式输出降低首字等待感知;TTFT 主要花在输入 token 的 prefill 上,上下文越长越慢,压缩上下文同时省成本省延迟
- 吞吐:向量库连接池、批处理、热点查询缓存
一个典型的优化路径
- 评估集先量化现状(成本每查询、延迟 P95、质量指标)
- 重排 + 少注入:成本立降,质量不降反升
- 模型路由:简单问题走便宜模型
- 高频查询上语义缓存
- 每一步重新测量,指标没变好就回滚
面试追问
- RAG 成本大头在哪? 生成侧,按 token 计费,注入的上下文越多越贵。嵌入和检索都是小头
- 怎么降生成成本? 重排后少注入、上下文压缩、模型路由、Prompt 缓存。先压缩注入量,性价比最高
- 模型路由是什么? 按查询复杂度分发:简单问题用便宜小模型,复杂问题才用大模型
- 块大小和成本什么关系? 块越大、overlap 越大,检索结果携带的冗余越多,生成 token 越贵。质量允许时用小块
- 优化怎么验证? 评估集量化成本、延迟、质量三项指标,一次改一个变量,没变好就回滚。避免只盯着成本把质量改崩