资讯动态

大模型Token消耗全链路优化:从对话历史到缓存与模型路由

发布时间:2026/10/20 21:51:38 来源:尧图企业网站定制
先讲一个我近期遇到的典型场景。某问答系统上线刚满一周看着后台的 token 账单人直接懵了——对话轮次并不多每次回答也就几百字月底一算消耗量却高得离谱。你大概率也踩过类似的坑问题不是“回答有多长”而是每一次请求都背着整段对话历史在赶路路费按全程计算。这篇文章不玩虚的直接把 token 到底怎么被消耗、以及我从实战里总结的几套减量策略拆开讲清楚覆盖对话习惯、提示词设计、工程架构和接口参数四个层面。适合正在做问答类应用、接了模型 API 的开发者也适合那些只是把对话工具当日常助手、却觉得“越聊越贵”的普通用户。1. token消耗的底层逻辑先搞清楚钱到底烧在哪1.1 token的“体重”不同内容和语言的计数差异token 是大模型处理文本的最小单位可以把它的工作方式理解为“把一段话切成均匀的小块再逐块消化”。切得粗还是细直接决定同样一段文字要占多少个 token。按主流模型的分词逻辑大概换算英文大约每 4 个字符算 1 个 token一个常见英文单词基本在 1 到 1.5 个 token 之间中文因为字符信息密度更高一个汉字通常会被切成 1 到 2 个 token——常用字往往是 1 个生僻的专业名词则可能被拆成更长一串。内容类型大致换算关系备注英文约 4 个字符 ≈ 1 token常见单词约 1~1.5 token中文1 个汉字 ≈ 1~2 token专业名词、生僻字会被拆得更碎代码波动很大受格式影响明显同样规模的脚本不同格式化风格差异可超过 30%这个差异在系统设计阶段就容易埋坑。比如你要给对话设定“最大长度”如果按字符数去估算上下文误差会非常大。我的习惯是先拿一批真实语料跑一次计数统计出“每千字的 token 密度”再反推这个模型上下文窗口能容纳多少轮对话。代码场景更要小心缩进、符号、长变量名都会推高 token 数别看单次差异不大高频请求下就是实打实的成本差。1.2 最大的隐形消耗每轮对话都背着“全部历史”走路这是我想重点讲透的第一课。很多人以为一次 API 请求的 token 消耗约等于“这次输入的问题 模型输出的答案”事实完全不是这样。以主流的商用对话模型来说每一轮新请求都需要把系统提示词、工具定义、历史对话、当前问题一起送进去模型才能“记得”之前聊了什么。也就是说第 10 轮提问时前 9 轮的问答会被原封不动地重新计费一次。算笔账就清楚了。假设每轮用户输入 300 token、模型回答 500 token每轮产生约 800 token。第 1 轮请求只需要送 800第 2 轮要送 800 800 1600第 3 轮要送 2400……到第 10 轮光是输入就要送 7200 token。整个会话累计下来输入侧的消耗几乎按“轮次 × 平均单轮量”的平方级速度增长。这还是在问答比较精简的情况下如果每轮里还夹着长文档片段、日志、报错堆栈涨得更快。所以“token 过多”的根因通常不在输出长度而在输入侧的对话历史。我从多次账单复盘里得到的结论是一段 20 轮的长对话中输入 token 往往能占到总消耗的 85% 以上。先把这件事想明白后面的优化方向才不会跑偏。1.3 隐藏账单系统提示词、工具定义和失败重试除了对话历史还有三块容易被无视的消耗。第一块是系统提示词。你精心打磨的 2000 token 人设描述不是只付一次钱而是在每一次请求里都被完整计费。请求量大时这块固定成本相当可观。第二块是工具定义。如果你给模型开了函数调用能力每个函数的名称、参数说明、请求格式定义也会在每次请求中被一并送进去。工具定义多了光这块就可能吃掉上千 token而且工具数量越多、字段描述越细账单越肥。第三块是失败重试。模型输出超时、格式校验不过、内容被安全策略拦住你重试一次整套上下文就要再付一次费。这些“回炉费”经常被排除在项目初期的成本估算之外但它真实存在有时占比还不低。把这四块消耗理清之后“token 过多”就从一个模糊的抱怨变成了清晰的成本优化题哪些输入能减重哪些历史该压缩哪些请求可以复用。2. 不写复杂代码也能做到的减量对话与提示词层面的瘦身不少场景根本不需要一上来就上复杂工程架构先在对话形态和提示词上动刀就能砍掉三四成消耗。我建议先做这层“软减量”把简单手段用尽再碰缓存和路由避免系统过早复杂化。2.1 给对话装上“遗忘机制”聊天应用里最常见的浪费是把“对话纪要”当成“逐字稿”一直背着。用户跟客服机器人聊了 30 轮其中 25 轮早就不重要了但第 30 轮提问时前面 25 轮照样要一起付费。最直接的做法是设一个轮数或 token 阈值超过之后自动做两件事把旧对话里仍然关键的信息——用户明确提过的约束、已确认的事实、待办事项——压缩成几句话其余不重要的细节直接丢弃。优先级怎么定我的经验是用户明确给过的约束预算、偏好、截止时间最该保留寒暄、重复解释、中间态的试错过程最该丢弃。“遗忘机制”可以在产品层直接实现比如界面上保留 20 轮展示但真正传给模型的只有最近 5 轮原文 前面内容的 100 字摘要。实现上先不用引入复杂算法固定阈值触发即可判断条件是“对话轮数 N”还是“预估 token M”取决于你的场景。N 设小一点8 轮左右M 设为上下文窗口的 1/3留足空间给当前问题和新回答。2.2 提示词模板减重从“长篇说明书”到“精确约束”第二个常见浪费是提示词写得又长又重复。我见过不少系统提示词开头的客套话和背景铺垫就占几百 token真正起约束作用的只有最后两句。模型不像人需要“铺垫情绪”它需要的是边界清晰、信息密集的指令。冗长版往往长这样“你是一个智能客服助手你要用友好、专业、热情的语气回答用户问题……我们的产品主打……目标用户是……请按照以下步骤……”这些话本身不是错但如果你把产品介绍、话术规范、回答格式一股脑塞进去它们就会在每一个请求里重复计费。精简版的做法是把不可变的产品常识从提示词里挪走放到代码侧做检索或规则匹配提示词里只留三样东西——角色的一句话定义、回答需要遵守的硬性格式约束、当前会话真正需要动态变化的信息。举个例子与其在提示词里写一整段退货政策让模型记住不如在代码里命中 FAQ 后把对应政策片段作为临时上下文注入。固定知识不进提示词这是省 token 又不容易出错的关键。2.3 少放示例或让示例只在需要时出现第三刀砍在示例上。示例是告诉模型“按这个格式来”的最快方式但代价很高一个 200 token 的回答示例每次请求都会完整计费。如果系统里挂了 5 个示例相当于每轮请求背上 1000 token 的固定包袱。更聪明的做法是动态加载示例。给维护的示例打上用途标签比如“投诉语气示例”“商品参数抽取示例”“地址识别格式示例”程序先判断当前请求属于哪一类只把对应的 1~2 个示例拼进提示词而不是把所有示例一股脑带上。实测下来示例总量通常能砍掉 60% 以上输出格式稳定性没有明显下降。如果暂时没精力做动态加载至少做一件事检查每个示例是否冗余。两个示例教会模型的如果是同一件事删掉其中一个能用一句话描述的格式就不要用完整对话去展示。3. 工程化截流会话压缩、缓存与模型分流提示词和对话习惯的优化是“软减量”稳定有效。但请求量大、对话深、用户多的产品光靠这层还不够得上一些硬手段。我按收益从大到小排序来讲。3.1 摘要式压缩让历史以最省钱的形态继续存在前面说的“遗忘机制”是一种轻量压缩工程上更完整的方案是每当上下文接近阈值时调用一次轻量模型把前面所有对话压成一份结构化摘要之后每一轮都携带“摘要 最近 N 轮原文”。摘要任务通常不需要旗舰模型单独选一个便宜的轻量模型来干这个活成本很低。摘要怎么压才算压得好我常用“四分类”格式用户信息、已解决事项、待办事项、未满足需求。这样后面回溯时能快速定位关键信息而不是在一段不分层的话里翻找。摘要质量直接决定压缩后的连贯性实践里我发现摘要哪怕牺牲细节也不能省“用户意图”和“待办”这两项一丢模型很容易答非所问。触发时机单独说一句不要在每一轮结束都压缩那既多花一次调用钱又容易反复丢失原文细节。合理做法是设“水位线”当最近几轮累计预估 token 超过上下文窗口的 60% 时才对最早的部分执行一次压缩。这种带迟滞的触发策略能显著降低压缩频率。3.2 请求级缓存相同的问题别问第二遍问答、客服类应用里大量用户问的是同一批高频问题。默认情况下每一次提问都会完整走一遍模型如果你在应用层加一道缓存重复请求可以直接挡下来省下的不止是重复对话的 token还有延迟。缓存分两级。第一级是精确缓存用户问题一模一样就直接返回历史答案适合操作指引、政策查询这种有标准答案的内容实现成本低但收益有限。第二级是语义缓存先通过嵌入向量计算用户问题的相似度超过阈值就复用历史答案。“怎么退货”和“退货流程是什么”其实是一个问题语义缓存能接住这种表述变化。语义缓存需要额外花费嵌入模型的 token但嵌入成本远低于一次完整对话总体仍然划算。缓存要注意两个细节。一是缓存只适合事实类、稳定类的问答答案一旦随库存、价格、政策变化就得设置有效期按天或按小时过期。二是命中缓存时要在日志里打标记否则后续优化根本分不清哪些消耗是被缓存省掉的哪些是真实支出。我因为这个标记缺失第一轮优化复盘时差点做出错误判断。3.3 模型分级路由简单的活交给简单的模型很多团队让所有请求都走同一个旗舰模型这是 token 账单的大头。但一次对话里的任务难度差异极大有的请求只需要做问题归类有的只是从文档里抽一个字段有的却要综合多份材料做复杂推理。给所有任务都安排同一个价位的模型相当于全员坐头等舱出差。更经济的做法是分级路由先用一个轻量模型做意图识别和难度判断简单请求直接由轻量模型完成识别为复杂任务的才转发给旗舰模型。路由本身也要花一次轻量模型的 token但轻量模型单价低、输出短这笔前置开销可以忽略。关键是判断规则要稳。我见过有人按“问题长度”判断难度结果短问题里藏着一堆歧义长问题里反而是闲聊效果很差。后来改成“关键词规则 轻量模型分类 文档命中数量”三合一才稳定下来。模型分级有一个不能省的前提维护一个质量回归集。把过去容易答错的请求攒起来每次调整路由规则后跑一遍确保省了钱但没有牺牲核心体验。没有这道护栏模型分流很容易变成“便宜是便宜了用户投诉也上来了”。4. 接口参数与监控把最后两成消耗从细节里挤出来前面几层优化做完通常能省五成以上。如果还想更极致一些藏在接口参数和调用细节里的“余量”也能挤一挤。这一节更偏向已有工程体系的开发场景。4.1 先澄清三个常见误区输出上限、温度与局部更新几乎每周都有人问“我把 max_tokens 调小输入 token 是不是也能省”不是。max_tokens 只控制单次输出的最大长度对输入侧完全没有约束。你把 max_tokens 从 2000 降到 200该送的对话历史一分都不会少。它省的是“输出太长被截断后反复重试”的间接成本和超长无用输出的浪费。第二个误区是温度参数。temperature 调低只会让输出更稳定保守不会让 token 变少在某些场景下低温度反而让模型倾向重复常见句式增加输出长度。真正减少输出 token 的是终止序列——比如约定回答必须以“END”结尾模型生成到指定标记就停避免把结尾客套话也编完。在让模型输出固定格式的场景里这招很管用。第三个误区是“增量更新”。不少开发者以为对话接口支持只传最后一条新消息实际上主流商用对话接口大多不支持这种增量模式每次必须携带完整上下文。所以别指望在参数层找增量入口老老实实做上下文压缩才是正道。倒是有一个现代服务商普遍提供的机制值得利用提示词前缀缓存。同一段稳定前缀反复出现时第二次开始会对这段前缀打折计费。如果你的服务商支持把系统提示词、工具定义、模板前缀设计成完全不变的字符串固定成本能被明显压下去。这个机制我在高频短对话场景实测能再省 20%~30%。4.2 批量接口与异步任务避开实时调用的溢价如果系统里有大量非实时任务——比如半夜批量生成摘要、离线处理用户留言、人工审核辅助——尽量走服务商提供的批量接口而不是逐个实时调用。批量接口单价通常更低还可以安排在非高峰时段执行不需要秒级响应但能实打实降成本。这里要提醒的是批量任务要处理“失败重试”的聚合。批量接口经常会遇到部分样本失败如果你对失败样本写一个死循环式重试那点优惠瞬间会被重试成本吃掉。正确做法是给重试设上限区分“可恢复失败”和“永久失败”把失败样本集中到下一轮批量任务里统一处理。4.3 把 token 消耗变成可观测的数据没有度量就没有优化。我强烈建议从第一天起在日志层记录每个请求的输入 token、输出 token、模型型号、是否命中缓存、会话 ID。这些字段是为了回答几个关键问题单个用户平均一次会话烧多少 token哪个功能模块最费哪个会话异常膨胀了监控数据的第二个用途是预警。长对话失控往往不是突然发生的而是每天涨一点。给单会话累计 token 设一个告警阈值一旦某个会话超过正常值的三倍就标记出来人工介入。我遇到过最典型的一次某个自动化脚本用错误的重试逻辑反复调用接口一个晚上烧掉接近一个月预算。当时如果有会话级告警这种事故能提前几分钟拦下来。定量的分析还能帮你验证优化效果。每次改造上线前先在测试环境用同一套问答集跑一遍记录 token 变化上线后隔一周拉真实数据对比。没有这套流程前面所有优化手法都只是“感觉上省了”。5. 实测复盘一套问答系统从账单超支到消耗减半理论讲完分享一次完整的优化过程。这是一套面向内部员工的售后问答系统高峰时段一天大概 5000 次请求单次会话平均 8~10 轮刚上线时月度 token 消耗直接超出预算。具体数字不便写全我重点讲每一次改动带来的变化和踩过的坑。5.1 基线分析超支的钱到底去了哪上线第一周结束我拉出全量日志做了一次消耗拆分。结果很有代表性输入侧占 89%输出侧只占 11%再往下拆输入侧系统提示词和工具定义占 15%历史对话占 74%而历史对话里又有大约 60% 是“对当前答案没有贡献的旧轮次”。也就是说账单大头里的绝对主力是那些早该被遗忘的旧对话。这个结果最大的价值是确定了优化顺序先压缩历史对话其次精简固定提示词最后再考虑缓存和模型路由。如果一开始就忙着接语义缓存可能只能省下 5%~10%方向就错了。5.2 三轮改造每一刀砍下去的效果第一轮只做软减量系统提示词从 1200 token 压到 350 token工具定义从 8 个精简到 4 个历史对话改成“最近 5 轮原文 更早内容摘要”。没有缓存、没有换模型这一轮就把单会话平均 token 从约 9800 降到了约 5600降幅 43%。改动成本大约是一周开发和测试时间收益立竿见影。改造轮次主要动作平均单会话 token相对基线降幅基线无约 9800-第一轮提示词精简 对话截断 摘要约 5600-43%第二轮语义缓存 模型分级路由约 3900-60%第三轮固定前缀适配缓存机制约 3500-64%第二轮上缓存和分级路由FAQ 类高频问题命中语义缓存简单咨询走轻量模型只有推理类问题才进旗舰模型。两项叠加后单会话平均 token 再降 30% 左右。我们用 200 条回归集对比回答完全正确率从 91% 降到 90%属于可接受误差范围成本却降了一大截。第三轮是适配服务商的前缀缓存机制把系统提示词和开头几个固定回合的问题模板改成完全不变的字符串确保前缀恒定。这轮对长尾会话不明显但对高频短会话有效整体又省了约 10%。三轮下来总消耗约为原来的四成用户侧体感几乎没有变化。我不说“一劳永逸”因为这些数据会随业务变化漂移每季度都得重新校准一轮。5.3 优化路上的三个坑希望你直接绕开第一个坑是过度压缩导致对话失忆。我曾经把“最近轮数”从 5 轮压到 3 轮结果用户在 4 轮前提供的订单号后面被模型反复追问。检查后才发现摘要没把“订单号”这类实体放进“用户信息”分类丢在了旧轮次里。修复方式是给摘要模板加“关键实体”字段并让压缩模型优先提取编号、日期、金额这类信息。第二个坑是缓存命中率虚高。语义缓存上线后有个热闹的假象命中率看着不低但很多命中发生在“答案会变”的场景比如查库存、查审批状态用户拿到的是昨天的结果。后来加了业务规则层的时效判断命中前先确认数据源更新时间才把省钱和准确性的平衡做好。第三个坑是分级路由判断失误。早期我把“问题短”判定为简单任务结果用户一句“你们这个怎么用”被路由到轻量模型回答模板化严重。后来调整为“轻量模型分类 关键词黑名单 文档命中情况”三层判断复杂的歧义问题才基本拦住。任何路由策略都必须在真实验证集上跑过不能凭直觉上线。说到这我想起这些年做过的大大小小的对话项目。每一回只要我先花半天把日志里的 token 消耗结构画出来基本都能在输入侧找到七八成的浪费——旧对话背了太多、固定内容太重、重复问题答了太多次。说句实在话token 优化不需要什么炫技方案把“记账”做清楚再按“对话瘦身 → 提示词减重 → 摘要压缩 → 缓存分流 → 监控复盘”一步步来数字自然会往下掉。我现在每接一个新项目都有一个雷打不动的习惯第一周不上任何花哨功能先把消耗基线跑出来。如果你正被 token 账单追着跑不妨也从这个习惯开始——它比任何优化框架都便宜。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑