做 LLM 应用开发的工程师,这两年应该都有一个共同感受:模型越来越聪明,项目预算却越来越不够用。一个看起来挺简单的 RAG 问答系统,从 POC 走到生产环境之后,推理账单比服务器账单还高;一个带 Agent 循环的功能,用户只问了一次,后台悄悄调了三轮模型。智能确实在涨,成本也在涨,关键问题是两者并不是按同一个速度在涨。
这个阶段,决定一个 LLM 应用能不能继续做下去、能不能规模化,主要矛盾已经不是“模型不够聪明”,而是“聪明的模型到底该用在哪一步”。把最强的模型用在所有环节,是一种省事但昂贵的做法;真正成熟的方案,是让任务按难度分配模型,用工程手段控制成本,把预算花在最需要智能的地方。
这篇文章不讨论“哪个模型最强”,而是讨论“你的任务到底需要多强”。我会从能力分层、成本构成、模型路由、典型场景选型和落地步骤几个角度展开,读完你可以对自己的 LLM 应用做一次成本体检,并且找到一条可执行的降本路径。
1. 智能与成本为什么要放在一起讨论
先说一个很直接的观察:传统软件的成本结构是相对稳定的。写好代码、买好服务器,成本大头基本在研发和运维侧,业务量上来之后边际成本很低。LLM 应用完全不一样,每一次调用都是一次真实支出,模型输出多少 token、调了多少轮、上下文塞了多大,都直接体现在账单上。
这意味着过去写代码时不需要操心的东西,现在变成了核心设计问题:这个功能真的需要大模型吗?需要哪一档的大模型?如果模型答错了,重试一次的成本由谁承担?
从实际项目来看,成本失控往往不是发生在单次调用上,而是发生在调用链路上。一个标准的 Agent 任务会经历“规划 → 工具调用 → 结果分析 → 再规划”的循环,表面上用户只提了一个需求,实际可能触发了 5 次甚至 10 次模型请求。每次请求如果都用旗舰模型,成本自然按倍数放大。
另一个容易被忽视的趋势是模型选择的多样性。今天同一个业务场景,你可以用几乎免费的本地小模型,也可以用能力顶级的云端推理模型,两者单次调用价格可能相差数十倍。能力差距确实存在,但并没有想象中那么大,尤其是在信息抽取、文本分类、格式转换这类偏“记忆型”的任务上,中小模型的表现已经非常稳定。
所以,智能与成本之间的真正问题不是“贵不贵”,而是“花出去的钱买到了多少有用的智能”。如果一个任务用小模型就能完成 95 分,花十倍价格用旗舰模型做到 97 分,这笔溢价对业务来说很可能不划算。判断哪些任务值得溢价,哪些任务不该多花钱,就是这篇文章要解决的核心问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 智能到底是什么:能力分层与任务匹配
“智能”这个词很容易让人产生误解。很多人会下意识地把智能等同于模型参数规模、榜单分数或者生成质量,但在工程视角下,智能应该被理解为“模型在特定任务上稳定完成任务的能力”。
这里有一个容易被忽略的事实:大模型的能力不是均匀分布的。一个模型可能在代码生成上很强,在长文本精确抽取上却很一般;可能在数学推理上接近满分,却记不住产品文档里的一个具体字段格式。如果只凭整体印象选模型,很容易“大材小用”或者“选错方向”。
比较实用的做法,是把 LLM 应用里的任务按认知复杂度分档。这里给出一个通用分层方式:
- 规则层:关键词匹配、正则、查表就能完成,不需要模型。
- 抽取与分类层:实体识别、意图分类、情感判断、格式整理。这类任务输出结构固定,小模型表现已经足够好。
- 改写生成层:润色、摘要、翻译、补全。需要模型有一定语言能力,但对深度推理要求不高,中等模型即可。
- 单步推理层:代码生成、SQL 生成、具体问题分析。模型需要真正理解逻辑,推荐使用大参数模型。
- 多步规划层:复杂项目分析、带工具调用的 Agent 任务、长文档综合判断。这类任务需要多步推理和全局规划,才值得使用当前最强模型。
用客服场景举个例子。用户说“我要退货”,这属于意图分类,一个小模型或者规则引擎就能解决。但如果用户说“我上周买的手机出现绿屏,已经过了一周退货期,但我觉得应该是质量问题,你们能不能特殊处理”,这个问题就涉及规则理解、权益判断和情绪安抚,可能需要更大模型参与。
代码场景更典型。补全一个函数、改一个变量名,中小模型完全能胜任;但“帮我重构这个模块,保持对外接口不变,同时把性能问题修复掉”,就需要模型具备全局代码理解能力,这种任务才是旗舰模型的用武之地。
基于这个分层,我们可以得到本文最重要的一个判断:不要先选模型,再分配任务;要先拆任务,再匹配模型。 大多数 LLM 应用里的调用,真正落到“多步规划层”的比例其实不高,大量请求都停留在抽取和改写层,这些请求完全可以由便宜模型承接。
3. LLM 成本的真实构成:不止是 token 单价
如果只看 token 单价,成本模型很简单:输入 token 数乘以输入单价,加上输出 token 数乘以输出单价。但真实项目的成本构成远不止这些,至少还有四个放大因素。
第一是上下文重复计费。每次调用大模型,系统提示词、工具定义、历史对话记录都会被完整计费。一个 5000 token 的系统提示词,在一轮 10 次调用的 Agent 任务里会被重复计算 10 次,这等于凭空多出了 45000 token 的输入成本。很多团队只顾调 prompt,没意识到 prompt 长度本身就在烧钱。
第二是重试成本。模型输出是概率性的,一次生成失败、格式解析失败或者业务校验不通过,往往需要重新调用。如果业务方对准确率要求高,一次成功率的微小差距会被放大成可观的额外支出。便宜模型省钱的前提是它足够稳定,如果它让整个流程重试三次,成本可能比一次昂贵模型还高。
第三是延迟成本。大模型响应慢,用户等待时间变长,会直接影响产品体验和转化率。为了降低延迟,有些团队会额外增加并发实例或者购买更高等级的服务,这些都是隐形成本。而且长响应时间意味着用户更可能重复输入、反复刷新,进一步放大调用量。
第四是私有化部署成本。自托管模型需要一次性购买 GPU 硬件,还要承担机房电力、运维人力、模型迭代升级的持续投入。GPU 利用率低的时候,私有化部署的单次成本可能远超 API 调用。只有在调用量足够大、流量峰值稳定、数据安全要求高的前提下,私有化才具备成本优势。
下面给一个通用的成本估算函数,实际项目可以直接套用:
python复制def estimate_cost(input_tokens, output_tokens,
input_price_per_million, output_price_per_million):
"""
输入输出单价按每百万 token 计费,传入数字即可。
例如输入 10 元/百万 token,则传入 10。
"""
input_cost = input_tokens / 1_000_000 * input_price_per_million
output_cost = output_tokens / 1_000_000 * output_price_per_million
return input_cost + output_cost
def monthly_estimate(daily_calls, avg_input_tokens, avg_output_tokens,
prices, peak_factor=1.2):
"""
daily_calls: 日均调用次数
peak_factor: 流量高峰放大系数,默认按 1.2 估算
"""
one_call = estimate_cost(
avg_input_tokens, avg_output_tokens,
prices["input_price"], prices["output_price"]
)
monthly = daily_calls * one_call * 30 * peak_factor
return monthly
计算时建议把“重试率”“上下文重复倍数”单独列成参数,而不是拍脑袋。比如某个 Agent 任务平均调用 4 次模型,上下文重复率为 3 倍,那么实际成本就不是“单次调用 × 任务数”,而是“单次调用 × 4 × 3 × 任务数”。把这些参数写进估算模型,成本问题会变得透明很多。
4. 智能成本曲线的四个重要变化
单纯讨论“智能 vs 成本”是不够的,还要看到这条曲线正在发生结构性变化。从行业趋势来看,至少有四个变化会直接影响模型选型。
第一个变化是推理模型的普及。以 o1、DeepSeek R1 为代表的推理模型,通过多生成几轮内部思维链来提升准确性。它们单次调用更慢、更贵,但在数学、代码、逻辑规划类任务上,能够显著降低人工排查和重试的次数。对于复杂研发任务,贵一点反而可能是整体成本的下降。
第二个变化是 API 价格的大幅下调。过去几年里,主流厂商和开源模型的 API 价格多次下调,单位 token 成本已经比早期低了一个数量级。价格下降意味着纯“生成文字”的任务越来越便宜,但旗舰模型与小型模型之间的价格差依然存在,这个差距反而让分级路由更有价值。
第三个变化是开源中小模型的实用性增强。7B 到 70B 参数范围的模型,经过量化、蒸馏和针对性微调之后,在很多垂直任务上的表现已经接近更大规模的闭源模型。它们可以被部署在单张消费级 GPU 上,延迟更低,数据不出内网,适合高并发、强隐私场景。
第四个变化是蒸馏和合成数据的工程化。越来越多的团队采用“大模型生成高质量数据 → 小模型微调 → 小模型上线”的范式。这个范式等于用一次性的离线成本,换取了在线调用时持续的低成本,非常适合意图分类、实体抽取、内容审核这类高频重复任务。
这四个变化叠加起来,会给开发者一个明显信号:模型的“强弱”边界在模糊,成本差异却在拉大。 一种新的智能分级策略因此变得值得提倡:把复杂推理交给推理模型,把高频稳定任务交给小模型,把中间层交给标准模型。这已经不只是省钱技巧,而是 LLM 应用架构设计的一部分。
5. 任务分级与模型路由:最核心的省钱手段
5.1 五级任务模型
要让“按需分配”落地,需要一套具体的分级规则。下表是实践里比较通用的一套五级模型,你可以根据自己的业务调整:
| 级别 | 任务类型 | 示例 | 推荐模型档位 | 相对成本 |
|---|---|---|---|---|
| L0 | 规则处理 | 正则匹配、关键词过滤、查表 | 不需要模型 | 极低 |
| L1 | 抽取与分类 | 意图识别、实体抽取、情感判断 | 小模型/微调模型 | 低 |
| L2 | 生成改写 | 摘要、润色、翻译、格式整理 | 中等模型 | 中 |
| L3 | 单步推理 | 代码补全、SQL 生成、问题分析 | 大参数模型 | 高 |
| L4 | 多步规划 | Agent 规划、长文分析、项目级重构 | 推理模型/旗舰模型 | 极高 |
这套分级表的核心逻辑是:每一级只向上借一级能力,不出意外情况不越级。 比如 L1 的任务就用 L1 模型,当 L1 模型连续两次失败,再升级到 L2;而不是每一次都直接从 L4 开始。
5.2 一个可落地的路由实现
路由模块的核心工作很简单:根据任务类型或输入特征,决定调用哪个模型。可以用一个配置化的映射表来实现。
python复制# routing_demo.py
# 模型名只是示例,请替换为你实际接入的模型标识
ROUTING_RULES = {
"intent_detect": "mini",
"entity_extract": "mini",
"sentiment_analysis": "mini",
"rewrite": "standard",
"translate": "standard",
"summarize": "standard",
"code_completion": "standard",
"code_review": "premium",
"data_analysis": "premium",
"agent_planning": "reasoning",
}
MODEL_MAP = {
"mini": "your-small-model",
"standard": "your-medium-model",
"premium": "your-large-model",
"reasoning": "your-reasoning-model",
}
DEFAULT_TIER = "standard"
def get_model_for_task(task_type: str) -> str:
tier = ROUTING_RULES.get(task_type, DEFAULT_TIER)
return MODEL_MAP[tier]
在实际系统中,这个映射表不要写死在代码里,建议放到配置中心或者数据库表中,方便运营同学在模型价格变化时动态调整,不用发版。
调用侧只需要一行代码的改动:
python复制# 伪代码,按你实际使用的 SDK 接入
def run_task(task_type: str, prompt: str):
model = get_model_for_task(task_type)
messages = [{"role": "user", "content": prompt}]
result = call_llm(model, messages)
return result
这里的 call_llm 需要根据你使用的云厂商或开源模型服务封装,可以是标准 OpenAI 兼容接口,也可以是自己的网关服务。只要把路由逻辑独立出来,后续调整模型成本极低。
5.3 路由的兜底设计
模型路由不是一锤子买卖,需要考虑兜底和降级,否则小模型的不稳定会直接影响用户体验。
一个比较稳妥的策略是“失败升级”:先用路由规则选出的模型调用,如果出现超时、解析失败、空输出,或者置信度低于阈值,就自动向上一级模型发起重试。这样既保证了大多数请求使用低成本模型,又保证了极端情况下的兜底能力。
另一个思路是在路由前增加一个小的前置分类器。对于“该用哪个模型”这种分类任务,本身用一个小模型或传统机器学习模型就能完成,成本几乎可以忽略不计。前置分类器的输出就是路由信号,再结合置信度阈值做降级,整体可靠性会比规则映射高很多。
需要注意,路由本身要避免“滥用兜底”。如果小模型频繁失败导致不断升级,系统会退化回“全量使用旗舰模型”的状态,成本反而失控。建议对每个任务的升级率设置监控,一旦超过 5% 就要考虑调整模型档位或优化提示词。
6. 其他工程杠杆:缓存、异步、超时与降级
模型路由是成本控制的“主杠杆”,但它不是唯一手段。以下几个工程手段虽然不直接改变模型选择,却能在调用链路层面大幅压缩支出。
6.1 语义缓存
很多用户的提问是重复的,或者相似度极高。对完全相同的问题做精确缓存是最基本的做法,而语义缓存可以进一步提升命中率:将新问题向量化,与历史问题的向量做相似度比较,命中后直接返回历史答案,不调用大模型。
python复制# semantic_cache_demo.py
from typing import Callable, Optional
# embed 和 cosine_similarity 按你使用的向量库封装
def embed(text: str) -> list:
# 调用 embedding 模型,返回向量
pass
def cosine_similarity(vec_a: list, vec_b: list) -> float:
# 余弦相似度计算
pass
class SemanticCache:
def __init__(self, threshold: float = 0.92):
self.items = []
self.threshold = threshold
def get(self, question: str) -> Optional[str]:
q_vec = embed(question)
for item in self.items:
if cosine_similarity(q_vec, item["vector"]) >= self.threshold:
return item["answer"]
return None
def set(self, question: str, answer: str):
self.items.append({
"question": question,
"answer": answer,
"vector": embed(question)
})
缓存适合答案相对固定的任务,比如产品百科问答、政策解释、常见问题解答。对于需要强时效性或个性化内容的场景,缓存命中率低,还可能导致旧答案误导用户,需要谨慎使用。
6.2 批量异步调用
不是所有任务都需要低延迟。数据分析报表、批量文档处理、离线内容审核,这些任务完全可以放入消息队列异步执行。异步最大的价值不是省 token,而是让你能用“时间”换“价格”:选择更慢但更便宜的模型档位,或者选择有折扣的批量 API。
6.3 输出预算与重试策略
很多模型的成本超支,不是因为模型太贵,而是因为输出太长。为每个任务设置合理的 max_tokens,可以有效控制成本,同时倒逼提示词设计更精确。比如“只输出 JSON,不要解释”,就能避免模型生成大段无关文字。
重试策略上,建议加上退避和次数上限。一次失败重试两三次可以接受,但如果连续五次都失败,大概率是输入本身有问题,继续重试只是烧钱。对 Agent 任务尤其要设置单任务的模型调用次数上限,防止死循环。
7. 三个典型场景的选型与成本对比
理论讲完,用三个真实常见的业务场景对比“无脑旗舰方案”和“分级路由方案”的成本量级。下面表格中的“成本倍率”是以无脑使用旗舰模型的月成本为 1.0 作为基准,具体金额会因为不同模型定价而不同。
7.1 场景 A:智能客服意图识别与情绪分析
客服系统的任务是识别用户意图、判断情绪等级、触发对应话术。这类任务输出结构固定,样本数据可以持续积累,非常适合微调小模型。
| 方案 | 模型选择 | 单次成本倍率 | 月成本倍率 |
|---|---|---|---|
| 无脑旗舰 | 每个请求都用旗舰模型 | 1.0 | 1.0 |
| 分级路由 | 意图识别用微调小模型,复杂情绪分析用标准模型 | 0.05 - 0.1 | 0.05 - 0.1 |
实际项目中,如果工程量足够,甚至可以用规则引擎先处理“我要退款”“查余额”这类高频简单意图,让模型只处理长尾复杂问题,成本还能再降一级。
7.2 场景 B:代码生成助手
代码助手最容易掉进“全程旗舰”的坑。实际上代码任务的复杂度差距极大:补全一个函数、写一个工具脚本、审查整个模块的性能,完全不是同一层级的问题。
| 方案 | 模型选择 | 单次成本倍率 | 月成本倍率 |
|---|---|---|---|
| 无脑旗舰 | 所有请求用大参数模型 | 1.0 | 1.0 |
| 分级路由 | 简单补全用标准模型,中大型任务用大模型,架构规划用推理模型 | 0.2 - 0.4 | 0.2 - 0.4 |
7.3 场景 C:RAG 知识库问答
知识库问答的瓶颈通常在检索,而不是生成。如果检索结果质量差,再强的模型也答不对。这种情况下,盲目升级模型不如优化召回逻辑、重排策略和上下文压缩。
| 方案 | 优化方向 | 单次成本倍率 | 月成本倍率 |
|---|---|---|---|
| 无脑旗舰 | 模型换成最强的,上下文全塞进去 | 1.0 | 1.0 |
| 工程优化 | 改进检索 + 中小模型生成 + 上下文裁剪 | 0.1 - 0.3 | 0.1 - 0.3 |
这三个场景说明同一个道理:成本优势不是靠某一个模型带来的,而是靠整个调用链路的工程优化。 选型时先分析任务瓶颈在推理、检索还是生成,再决定预算花在哪里。
8. 常见误区与调整方法
智能成本优化最大的障碍往往不是技术,而是几个惯性思维。下面列出实践中最常遇到的六个误区。
| 误区 | 表现 | 调整方法 |
|---|---|---|
| 只看跑分 | 根据榜单分数选模型,上线后发现业务效果不达标 | 建立自己的评测集,覆盖真实业务输入,对比不同模型的“任务完成率” |
| 上下文越长越好 | 把所有检索结果无脑塞进 prompt | 检索结果做重排和裁剪,只保留与问题高度相关的内容 |
| 只算单次成本 | 只比较一次调用的价格,忽略重试率和重复计费 | 用“完成一个业务任务的真实成本”作为比较单位 |
| 忽略延迟 | 只盯着账单,用户因为太慢而流失 | 监控 P95 延迟,延迟过高时改用更快的模型或异步方案 |
| 小模型必然不准 | 认为小模型效果一定差,所有任务都用大模型 | 用测试集跑一遍小模型,配合提示词优化,确认是否达到业务底线 |
| 没有兜底 | 路由到小模型后失败就报废 | 设计“失败升级”机制,并监控升级率 |
误区里最值得展开的是“小模型必然不准”。在很多场景下,小模型效果差不是因为它能力不够,而是因为提示词没有针对它的能力特点优化。大模型能猜出模糊指令的意图,小模型可能理解不了,需要更明确的任务描述和 few-shot 示例。只要把提示词工程做到位,小模型的效果提升往往非常明显。
另一个容易被低估的成本是“系统提示词”。一个 3000 token 的系统提示词不会被计入研发成本,但它会出现在每一次调用里。优化系统提示词,去掉不必要的历史信息、压缩工具定义、使用更简洁的格式描述,对整个系统的成本影响是持续的。
9. 落地建议:从打点到灰度切换
智能与成本的平衡不是一个一次性决策,而是一个持续优化的过程。如果你不想只在概念上理解,而是真正在自己的项目里落地,可以按下面四步推进。
第一步是打点统计。把应用中所有 LLM 调用点列出来,记录模型名、任务类型、输入 token、输出 token、时延、重试次数和业务结果。没有数据就没有成本优化基础,这一步千万不能省。
第二步是任务分级。用一周真实流量进行分类统计,看看哪些调用属于 L1 抽取分类、哪些属于 L2 生成改写、哪些真正属于 L3/L4 复杂推理。很多团队做完这一步会发现,80% 的调用其实用不到大模型。
第三步是配置路由并灰度。把路由规则下发到配置中心,先让一部分流量走新路由,对比业务指标是否变化。如果业务指标不退步,再逐步放量。灰度期间重点观察用户的投诉率、任务的失败率和升级率。
第四步是设置预算护栏。为每个业务方设置月度 token 预算和成本看板,当某项成本超过阈值时自动告警。这样成本问题不会在月底账单来的时候才暴露,而是每天都能看到。
实践到这一步,你会得到一个比较健康的 LLM 应用状态:简单任务用便宜模型完成,复杂任务用昂贵模型兜底,每一次调用都有据可查,每一次模型切换都有灰度依据。智能与成本的平衡没有一次性的标准答案,它只属于那些愿意持续测量、持续调整的团队。希望这篇文章能帮你找到第一条优化路径。
