十
模型管理与成本控制
Model Management & Cost
调大模型是按 token 计费的。选错模型、参数没调对、缓存没做,一个月账单能让你怀疑人生。这一章讲怎么选模型、怎么调参数、怎么省钱。
| 模型 | 特点 | 什么时候用 |
|---|---|---|
| Qwen-Max | 最强,最贵 | 复杂推理、高质量写作。 |
| Qwen-Plus | 性价比均衡 | 日常对话、客服,主力模型。 |
| Qwen-Turbo | 最快,最便宜 | 简单分类、抽取、高频调用。 |
三个关键参数
| 参数 | 意思与建议 |
|---|---|
| temperature | 0~1。越低越确定(适合抽取、分类),越高越有创造力(适合写故事)。客服场景建议 0.3。 |
| top_p | 核采样,跟 temperature 二选一调,别同时瞎调。 |
| max_tokens | 限制输出长度。防止模型啰嗦半天,也防止 token 爆炸。 |
模型降级与 Token 计数
主模型挂了或限流了,自动切到备用模型(Max → Plus → Turbo),别让服务直接 500。另外每次调用返回里都带 token 使用量,记日志方便核算成本、排查为啥账单超了。
拿到 token 使用量
ChatResponse resp = chatClient.prompt(q).call().chatResponse();
Usage usage = resp.getMetadata().getUsage();
log.info("prompt tokens={}, completion tokens={}, total={}",
usage.getPromptTokens(),
usage.getCompletionTokens(),
usage.getTotalTokens());
多模型切换:一套代码接多个模型
Spring AI 抽象得好的地方在于:业务代码只认 ChatClient,底下接哪个模型随便换。想接通义千问就引 alibaba starter,想接 OpenAI 就换 OpenAI starter,业务代码一行不改。生产上可以做"主模型 + 备用模型":主模型超时了,自动切备用。
不同场景用不同模型(思路)
// 简单分类:用 Turbo,便宜快
chatClient.prompt().user(q).options(o -> o.model("qwen-turbo")).call();
// 复杂写作:用 Max,质量高
chatClient.prompt().user(q).options(o -> o.model("qwen-max")).call();
// 业务代码同一套,只是 options 里换了模型名
成本控制三板斧
① 能缓存就缓存:相同 Prompt 直接返回上次结果,别重复调模型。② 简单任务用小模型:分类这种活交给 Qwen-Turbo,别用 Max。③ 截断对话历史:别把 100 轮历史每次都发给模型。这三招能把账单砍到十分之一。
模型路由:一个入口,按请求分发到不同模型
上面是"业务代码自己在 options 里选模型"。模型路由(Routing)更进一步:做一个统一入口,根据请求内容自动决定该派给哪个模型——省钱又省心。这是企业级 AI 网关的核心能力。
| 路由策略 | 人话 |
|---|---|
| 按任务类型 | 分类/打标签走便宜小模型;写作/推理走大模型。 |
| 按成本预算 | 高峰期/预算紧张时自动降级到小模型,闲时再上大模型。 |
| 按可用性 | 主模型超时/报错,自动 fallback 到备用厂商(A 厂挂了切 B 厂)。 |
| 按敏感等级 | 含敏感词/内部数据的请求,路由到可私有化部署的模型,不发给公有云。 |
// 路由思路(伪代码):先判任务复杂度,再选模型 public ChatModel route(String query) { if (isSimpleClassification(query)) return smallModel; // 便宜快 if (isSensitive(query)) return localModel; // 私有化 return bigModel; // 默认大模型 }
论别一开始就自建网关
路由、fallback、限流、统计这一整套,自己写是个不小的工程。先在业务层用 if-else 把路由策略写出来,跑通再说;量大了再接专门的 LLM 网关(如 spring-ai-alibaba 的路由能力,或开源网关)。以当前版本能力为准。