工程化02:成本控制

从Token预算、缓存策略、模型分层到请求合并,掌握大模型应用的成本优化策略。

字数 1367 阅读时长 ≈ 4 分钟 2026-7-18 2026-7-27
工程化02:成本控制

大模型应用的成本主要来自 Token 消耗,包括输入 Token 和输出 Token。有效的成本控制需要从多个维度入手:预算管理、缓存策略、模型选择、请求优化等。

Token 预算管理

Token 消耗计算

维度计算方式示例
输入 Token输入文本长度 × 单价1000 Token × $0.0015 = $0.0015
输出 Token输出文本长度 × 单价1000 Token × $0.002 = $0.002
总成本输入成本 + 输出成本$0.0015 + $0.002 = $0.0035
每千请求成本单次成本 × 1000$0.0035 × 1000 = $3.5

模型定价对比

模型输入单价($/k)输出单价($/k)单次请求(1k输入+1k输出)
GPT-4o0.00050.0015$0.002
GPT-40.0030.006$0.009
GPT-3.5 Turbo0.00010.0002$0.0003
Claude 3 Sonnet0.00030.0015$0.0018
Claude 3 Haiku0.0000250.000125$0.00015

预算设置策略

策略说明示例
每日预算设置每日最大消耗$100/天
月度预算设置月度最大消耗$3000/月
单次预算设置单次请求最大消耗$0.01/次
用户预算按用户设置消耗上限1000 Token/用户/天

预算监控实现

@Service
public class BudgetService {
    private final AtomicLong dailyUsage = new AtomicLong(0);
    private final long dailyBudget = 100_000; // 100,000 Token/天
    
    public boolean checkBudget(long tokens) {
        long current = dailyUsage.addAndGet(tokens);
        return current <= dailyBudget;
    }
    
    public void resetDailyUsage() {
        dailyUsage.set(0);
    }
    
    public double getRemainingBudget() {
        return (dailyBudget - dailyUsage.get()) * 0.0001 / 1000; // 转换为美元
    }
}

缓存策略

缓存层次设计

层次缓存内容有效期命中率目标
L1 内存缓存高频请求结果5-10分钟80%+
L2 分布式缓存中频请求结果30分钟-1小时60%+
L3 持久化缓存低频请求结果24小时40%+

缓存实现示例

@Service
public class ModelCacheService {
    private final Cache<String, String> l1Cache = Caffeine.newBuilder()
        .expireAfterWrite(5, TimeUnit.MINUTES)
        .maximumSize(10_000)
        .build();
    
    private final RedisTemplate<String, String> redisTemplate;
    
    public String get(String prompt) {
        String cached = l1Cache.getIfPresent(prompt);
        if (cached != null) {
            return cached;
        }
        
        cached = redisTemplate.opsForValue().get(prompt);
        if (cached != null) {
            l1Cache.put(prompt, cached);
            return cached;
        }
        
        return null;
    }
    
    public void put(String prompt, String response) {
        l1Cache.put(prompt, response);
        redisTemplate.opsForValue().set(prompt, response, 30, TimeUnit.MINUTES);
    }
}

缓存失效策略

策略说明适用场景
时间过期固定时间后失效内容不频繁变化
主动失效更新时主动删除内容需要实时更新
版本控制基于版本号失效知识更新场景
LRU 淘汰最近最少使用淘汰缓存容量有限

模型分层策略

模型选择依据

因素说明选择建议
任务复杂度简单任务用小模型分类、摘要用 Haiku
精度要求高要求用大模型复杂推理用 GPT-4
成本预算预算有限用便宜模型批量处理用 Haiku
响应时间低延迟用小模型实时交互用 Haiku
上下文长度长上下文用大模型代码分析用 GPT-4

分层调用示例

@Service
public class ModelRoutingService {
    public String route(String prompt, TaskType type) {
        ModelConfig config = switch (type) {
            case SIMPLE -> ModelConfig.HAIKU;
            case NORMAL -> ModelConfig.SONNET;
            case COMPLEX -> ModelConfig.GPT_4O;
            case LONG_CONTEXT -> ModelConfig.GPT_4_TURBO;
        };
        return modelService.generate(prompt, config);
    }
}

enum TaskType {
    SIMPLE,      // 分类、提取、简单问答
    NORMAL,      // 普通对话、中等难度问答
    COMPLEX,     // 复杂推理、代码生成
    LONG_CONTEXT // 长文档分析、多文档对比
}

动态降级

触发条件降级策略恢复条件
成本超预算大模型 → 小模型成本回到预算内
响应超时大模型 → 小模型响应时间恢复正常
API 不可用在线模型 → 本地模型API 恢复可用
流量突增全量大模型 → 部分小模型流量恢复正常

请求合并优化

请求合并场景

场景问题优化方案
批量处理多次请求开销大合并为单次批量请求
多轮对话重复发送历史上下文使用上下文压缩
相似请求相同请求重复处理请求去重
并发请求多个用户请求相似内容结果共享

批量请求示例

@Service
public class BatchModelService {
    public List<String> generateBatch(List<String> prompts) {
        if (prompts.isEmpty()) {
            return List.of();
        }
        
        // 将多个prompt合并为一个请求
        String combinedPrompt = String.join("\n---\n", prompts);
        
        String response = modelService.generate(combinedPrompt, 
            ModelConfig.builder()
                .model("gpt-4o")
                .temperature(0.1)
                .build());
        
        // 拆分响应
        return Arrays.asList(response.split("\n---\n"));
    }
}

上下文压缩

方法说明效果
摘要压缩对历史对话生成摘要减少 50%-70% Token
关键信息提取只保留关键信息减少 60%-80% Token
语义压缩使用 Embedding 检索关键片段减少 70%-90% Token
滚动窗口只保留最近 N 轮对话固定 Token 消耗

成本优化最佳实践

成本优化矩阵

优化维度措施预期节省
模型选择使用合适的模型30%-70%
缓存策略缓存重复请求20%-50%
请求优化压缩上下文10%-30%
批量处理合并相似请求10%-20%
预算控制设置消费上限避免超支

成本监控体系

Token 消耗收集 → 实时统计 → 预算告警 → 自动降级

                              成本分析报告

成本分析指标

指标说明计算方式
总 Token 消耗输入 + 输出 Tokensum(input_tokens + output_tokens)
平均单次消耗每次请求平均 Tokentotal / request_count
成本/请求每次请求平均成本total_cost / request_count
缓存命中率缓存命中比例cache_hits / total_requests
模型分布各模型使用比例model_requests / total_requests

常见问题与解决方案

问题1:成本超支

表现:实际消耗超过预算

解决方案

  • 设置严格的预算上限
  • 实现自动降级
  • 优化模型选择策略
  • 增加缓存命中率

问题2:缓存命中率低

表现:缓存没有有效减少请求

解决方案

  • 分析请求模式
  • 调整缓存策略
  • 增加缓存层次
  • 实现请求去重

问题3:模型选择不当

表现:简单任务使用了大模型

解决方案

  • 建立任务分类体系
  • 实现智能路由
  • 设置模型使用规则
  • 定期分析模型使用情况

问题4:上下文过长

表现:历史对话导致 Token 消耗过大

解决方案

  • 实现上下文压缩
  • 使用滚动窗口
  • 提取关键信息
  • 减少不必要的历史

项目判断清单

  • 成本超支 → 设置预算上限和告警
  • 重复请求多 → 实现多层缓存策略
  • 简单任务用大模型 → 建立模型分层路由
  • 上下文过长 → 实现上下文压缩
  • 需要批量处理 → 实现请求合并
  • 缓存命中率低 → 分析请求模式调整策略
  • 需要实时监控 → 建立成本监控体系
  • 成本波动大 → 实现动态降级策略