11|Agent+RAG 系统如何控制成本?有哪些优化方法
P2 · rag
🏷 标签:agent, rag, cost-optimization, efficiency
1️⃣ 考察意图
面试官想考察你能否从“系统架构师”视角,而非“调包侠”视角,平衡效果与成本。这题是典型的系统设计 + 工程取舍类型,刁钻点在于:Agent+RAG 的成本不是线性叠加,而是指数级放大——一次 Agent 循环可能触发多次 LLM 调用和多次检索,成本失控往往发生在“决策循环”而非单次推理。答好了能展示你对 token 经济学、模型选择策略、以及缓存/压缩等工程手段的实战理解,证明你能在预算约束下设计可落地的生产系统。
2️⃣ 标准答
成本优化分三个层面:模型级、系统级、策略级。每个层面都有明确的 trade-off 和落地坑。
模型级:选对“发动机”
- 用小模型做“粗活”,大模型做“细活”:核心思路是任务分拆。Agent 的规划、工具调用、简单推理用 7B-13B 模型(如 Qwen2.5-7B-Instruct),只有最终答案生成或复杂推理才调用 70B+ 模型(如 GPT-4o)。为什么这么做:小模型 token 成本是大模型的 1/10-1/20,但精度在简单任务上差距不大(【通用知识】MMLU 上 7B 模型可达 60-70%,70B 模型 80-85%)。坑:小模型在工具调用格式(function calling)上容易出错,必须做严格的 schema 校验和重试逻辑,否则错误调用会反噬成本。
- 使用专用检索模型替代通用 LLM 做 rerank:不要用 GPT-4 做 rerank,用 Cohere Rerank 3 或 BGE-Reranker-v2-M3(成本低 100 倍,效果接近)。trade-off:专用 reranker 需要额外部署,但单次推理成本从 $0.01 降到 $0.0001 级别。
系统级:减少“空转”
- 语义缓存(Semantic Caching):对用户 query 做 embedding,在缓存池中找相似度 > 0.95 的历史结果直接返回。落地坑:缓存命中率取决于 query 分布,电商客服场景可达 40%,但开放域问答可能只有 5%。需要设置 TTL(如 5 分钟)避免过时信息。工具推荐:Redis + FAISS 做近似搜索。
- 批处理(Batching):将多个 Agent 子任务的 LLM 调用合并为 batch API 请求。OpenAI batch API 成本降低 50%,但延迟增加 2-3 小时。取舍:适合离线分析任务,不适合实时对话。
- 查询压缩(Query Compression):用 LLMLingua 或 Selective Context 压缩 prompt 中的检索结果,压缩率 2-5 倍,效果损失 < 5%。坑:压缩后可能丢失关键实体,必须保留 top-k 结果中的实体锚点(如人名、日期)。
策略级:让 Agent 学会“省钱”
- 主动决策(Cost-Aware Planning):Agent 在规划时,对每个子任务估算 token 消耗,如果预算超支,自动降级(如用 BM25 替代向量检索,或跳过 rerank)。实现:在 ReAct 循环中加入一个
budget_tracker,每次调用前检查剩余 token,低于阈值时切换策略。 - 混合检索(Hybrid Search):稀疏检索(BM25)成本几乎为零(只需倒排索引),稠密检索(如 DPR)需要 GPU 推理。策略:先用 BM25 做快速初筛(top-100),再用稠密检索做精排(top-10),比纯稠密检索成本降低 80%,效果仅下降 3-5%。坑:BM25 对同义词不敏感,需要配合 query 扩展(如用 WordNet 或 LLM 生成同义词)。
- 减少不必要的检索:Agent 不是每次都需要检索。如果用户 query 是常识性问题(如“1+1=?”),直接用小模型回答,跳过 RAG 流程。实现:加一个
retrieval_trigger分类器(可用 0.5B 的 DistilBERT),判断是否需要检索,成本几乎为零。
总结:成本优化不是一刀切,而是建立“成本-效果”的 Pareto 曲线,根据业务场景选择最优配置。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从模型级、系统级、策略级三个层面回答。模型级:用小模型做简单任务、专用 reranker 替代通用 LLM;系统级:语义缓存、批处理、查询压缩减少无效调用;策略级:Agent 主动预算管理、混合检索、检索触发分类器。总结一句:成本优化是系统工程,核心是让每一分钱都花在刀刃上,通过分层策略和动态降级实现。”
4️⃣ 高频追问 & 应对
追问 1:你提到语义缓存,如果用户 query 语义相似但意图不同(比如“今天天气”和“今天天气如何”),缓存会误命中吗?
这是经典问题。解决方案是双阈值策略:先用 embedding 相似度(如 0.95)做粗筛,再用 LLM 做“意图一致性”校验(用 0.5B 小模型,成本极低)。如果意图不一致,降级为重新检索。另外,缓存 key 可以加入上下文 hash(如对话轮次 ID),避免跨轮次误命中。实际落地中,误命中率可控制在 1% 以下。
追问 2:你提到用小模型做规划,但小模型在复杂多步任务上容易出错,怎么平衡?
核心是错误回滚机制。小模型规划后,用大模型做一次“规划验证”(只验证不生成,成本低)。如果验证失败,回退到大模型重新规划。另一种方案是渐进式升级:先让小模型执行,如果执行过程中出现工具调用错误或置信度低(如 logprob < -0.5),再升级到大模型。这比全程用大模型节省 60-70% 成本。
追问 3:混合检索中,BM25 和稠密检索的权重怎么调?
没有固定权重,需要动态调整。一种做法是:对每个 query,用一个小模型(如 0.5B)预测“query 的词汇匹配度”,如果词汇匹配度高(如“iPhone 15 价格”),BM25 权重设为 0.7;如果语义匹配更重要(如“推荐类似《三体》的书”),稠密检索权重设为 0.8。另一种更简单的方法:用 Reciprocal Rank Fusion(RRF)合并排序,k 值设为 60,效果稳定且无需调参。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“用更便宜的模型就行,比如 GPT-3.5 替代 GPT-4” → ✅ 正确切入:要区分任务,小模型做简单任务,大模型做复杂任务,并加验证机制,否则效果断崖下降。
- ❌ 说“缓存所有结果,减少重复调用” → ✅ 正确切入:缓存需要语义匹配和 TTL,否则过时信息或误命中会损害用户体验,必须加校验。
- ❌ 说“用 BM25 替代所有向量检索,成本最低” → ✅ 正确切入:BM25 对同义词和语义理解差,必须配合 query 扩展或混合检索,否则召回率下降 30%+。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“我在项目中实现了成本监控仪表盘,发现 70% 的 token 消耗来自 rerank 阶段,于是用 Cohere Rerank 替代 GPT-4,成本降低 90%,效果仅下降 2%”切入。
- 如果你只做过传统 NLP:用“传统 NLP 中,我们通过特征选择减少模型输入维度,类似地,在 RAG 中通过查询压缩减少 prompt 长度”类比迁移,展示跨领域思考。
- 如果你是校招无项目:聚焦“我复现了 LLMLingua 论文,在 TriviaQA 上验证了压缩率 3 倍时准确率仅下降 1%,并分析了压缩对实体召回的影响”,展示论文理解和动手能力。
- LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models
- Semantic Caching for LLMs: A Survey of Techniques and Trade-offs
- Cohere Rerank 3: Efficient and Accurate Document Ranking
- Reciprocal Rank Fusion (RRF): A Simple and Effective Method for Combining Search Results
- Cost-Aware Planning in Agent Systems: Budget-Constrained Task Decomposition