大模型Token成本优化:5个上下文压缩与缓存实战技巧

发布时间:2026/9/25 11:58:04

大模型Token成本优化:5个上下文压缩与缓存实战技巧 1. 上下文窗口不是免费的午餐先搞清楚Token到底花在哪很多人第一次被账单吓到是在某个深夜盯着后台用量曲线发呆——明明只是让AI帮忙改了几段代码、读了两份文档怎么一天下来消耗的Token够买好几杯咖啡。问题往往不在你问了多少次而在于每次提问时你悄悄塞进去的上下文有多重。先把账算清楚。大模型的计费逻辑是按Token双向计费你发过去的输入prompt 上下文算一次模型吐回来的输出算一次。而上下文这个东西有个致命特性——它是累积的。在一个多轮对话或Agent任务里第N轮请求通常会把前面N-1轮的历史全部带上于是输入Token量会随着轮次近似线性甚至平方级增长。举个直观的例子假设每轮对话平均产生500 Token到第20轮时光历史就有近1万Token而你这一轮真正想问的可能只有50 Token。也就是说95%以上的钱花在了回忆上而不是思考上。更麻烦的是上下文塞满之后模型不只是变贵还会变傻。这不是玄学而是有明确机制的。主流大模型的注意力机制在处理长上下文时对中间位置的信息召回率会明显下降业界俗称lost in the middle。当你的上下文里混着大量无关的日志、重复的代码、过期的对话模型抓重点的能力会被稀释输出质量断崖式下跌。你花了更多钱得到了更差的结果这是最亏的一种情况。所以省Token这件事本质上是两件事的合体省钱和保智商。下面这5个做法是我在实际项目里反复验证过的从最粗暴的截断到相对精细的压缩都有你可以按自己的场景挑着用。2. 做法一给上下文设硬上限别让历史无限膨胀2.1 滑动窗口不是万能药但它是第一道防线最直接的办法是给对话历史设一个硬性的Token上限超过就丢弃最老的部分。这就是经典的滑动窗口策略。实现上很简单维护一个消息列表每次新增消息后从头部开始累加Token数超过阈值就把最早的消息删掉直到降到阈值以下。但这里有个坑很多人第一次做会踩粗暴地按条数删而不是按Token删。一条消息可能是一句好的也可能是粘贴进来的三千字文档按条数删会导致窗口大小剧烈波动。正确做法是用分词器tokenizer实际计算每条消息的Token数按Token预算来裁剪。# 以常见的消息列表为例按Token预算裁剪历史 def trim_history(messages, max_tokens, count_tokens): # 从最新往旧累加保留最近的对话 kept [] total 0 for msg in reversed(messages): t count_tokens(msg[content]) if total t max_tokens: break kept.append(msg) total t return list(reversed(kept))2.2 系统提示词要单独保护别被窗口挤掉滑动窗口有个隐蔽的副作用它可能把系统提示词system prompt也一起裁掉。系统提示词通常定义了角色、输出格式、安全约束一旦丢失模型行为会立刻跑偏。所以裁剪逻辑里必须把系统提示词排除在外永远保留只对用户和助手的对话轮次做窗口。我的习惯是给系统提示词单独留一个预算比如总预算8000 Token系统提示词固定占1000剩下7000给对话历史。这样即使对话很长角色设定也不会丢。2.3 什么时候该用滑动窗口什么时候不该用滑动窗口适合闲聊型、任务连续性不强的场景比如客服问答、日常助手。但如果你的任务是根据前面所有讨论逐步推导一个结论那丢掉早期上下文可能直接导致结论错误。这种情况下滑动窗口只能作为兜底真正的主力应该是后面要讲的摘要压缩。提示滑动窗口的阈值不要拍脑袋定。建议先用真实业务数据跑一遍统计平均每轮对话的Token分布再取一个覆盖80%场景的值。我一般会把它设成模型上下文上限的30%到50%留足余量给输出。3. 做法二把长历史压成摘要用信息密度换Token3.1 摘要压缩的核心思路让模型自己记笔记滑动窗口是忘掉旧的摘要压缩是把旧的浓缩成一句话。思路是当对话历史超过一定长度时调用一次模型把前面的历史总结成一段简短的摘要然后用这段摘要替换掉原始历史。这样原本几千Token的内容可能被压到几百Token信息密度大幅提升。关键在于摘要的粒度。我试过几种方案效果差别很大摘要策略Token节省信息保留适用场景全量一次性摘要高中长对话、主题集中分段滚动摘要中高超长任务、多主题只摘关键决策点高中低任务型Agent结构化摘要JSON中高需要精确回溯3.2 滚动摘要处理超长任务的正确姿势如果任务特别长一次性摘要会丢失太多细节。这时候用滚动摘要维护一个历史摘要字段每当新增的对话累积到一定量就把旧摘要 新对话一起喂给模型生成新的摘要。这样摘要本身也在不断更新既控制了长度又保留了演进过程。def rolling_summarize(old_summary, new_messages, llm): prompt f已有摘要 {old_summary} 新增对话 {format_messages(new_messages)} 请把以上内容合并成一段不超过300字的摘要保留关键决策、结论和未完成事项。 return llm.invoke(prompt)3.3 摘要最容易丢的三类信息实测下来摘要压缩最常丢的是这三样具体的数字和参数比如阈值设为0.75被摘成设置了阈值、否定性约束比如不要用递归被漏掉、未完成的待办。所以我在写摘要提示词时会明确要求模型保留所有数值、所有禁止事项、所有TODO。这一条小小的约束能救回很多后续的返工。注意摘要本身也要花Token调用模型生成摘要所以别太频繁地触发。我一般设置在历史超过预算的70%时才触发一次摘要避免为了省Token反而多花Token。4. 做法三RAG检索替代全量投喂只给模型看相关的4.1 全量投喂是最大的浪费源很多人做知识库问答时习惯把整个文档库塞进上下文或者把检索到的十几篇文档全部丢给模型。这是Token消耗的重灾区。一份技术文档动辄上万Token你塞五份进去光输入就五万Token而模型真正需要的可能只是其中两段。RAG检索增强生成的正确用法是先用向量检索或关键词检索从知识库里捞出最相关的少量片段只把这些片段放进上下文。检索质量决定了Token效率——检索得准三段就够检索得糙塞三十段也没用。4.2 检索片段的数量和长度怎么定这里有两个参数要调召回条数top-k和单条长度chunk size。我的经验值是top-k 先设3到5观察召回内容是否覆盖了答案。如果经常漏再往上加但一般不超过8。chunk size 控制在300到500 Token一段太大则单条浪费太小则语义不完整。加一个重排序rerank步骤把召回的片段按相关性重新排序只取前2到3条进上下文。这一步能砍掉一半以上的无效Token。4.3 检索结果要去重和截断实际检索出来的片段经常高度重复尤其是文档里有大量模板化内容时。进上下文之前先做一次相似度去重把重复度超过阈值的片段丢掉。另外如果某个片段特别长可以在句子边界处截断只保留最相关的部分而不是整段照搬。def dedup_and_truncate(chunks, sim_threshold0.9, max_len500): kept [] for c in chunks: if any(similarity(c, k) sim_threshold for k in kept): continue kept.append(truncate_at_sentence(c, max_len)) return kept这套组合拳下来同样的问答任务输入Token通常能降到全量投喂的十分之一甚至更低而答案质量反而更稳因为模型不用在一堆噪音里找信号了。5. 做法四让Agent少绕路工具调用别把结果全背回来5.1 Agent的Token黑洞工具返回结果做Agent开发的人都知道Token消耗的大头往往不是对话而是工具调用的返回结果。你让Agent去查一个接口返回一大坨JSON让它读一个文件返回整个文件内容让它跑一次搜索返回十条网页摘要。这些结果全部进入上下文几轮下来上下文就爆了。解决办法是在工具层做过滤而不是把原始结果直接丢给模型。具体来说接口返回的JSON只提取模型真正需要的字段其余丢弃。文件读取支持按行范围或按符号如函数名读取而不是整文件读。搜索结果先做摘要只把标题和关键句给模型需要详情时再二次调用。5.2 工具描述本身也占Token容易被忽略的一点每个工具的schema描述都占Token。如果你给Agent挂了20个工具光工具定义可能就两三千Token而且每一轮请求都要带上。所以工具要精简功能重叠的合并不常用的按需动态加载。我见过一个项目挂了40多个工具光工具描述就吃掉了上下文的三分之一纯属浪费。5.3 用计划-执行分离减少往返Agent绕路的另一个原因是边想边做每一步都要把完整上下文带上。改成先规划、再执行的模式第一轮让模型输出一个任务计划简短后续执行时只带当前步骤相关的上下文而不是全部历史。这样每一轮的输入都能控制在很小的范围。提示Agent的每一步都建议记录Token消耗做成监控面板。我自己的项目里就是靠这个面板发现某个工具调用平均返回8000 Token优化后降到500整体成本直接砍半。6. 做法五缓存与复用别让相同的上下文重复计费6.1 提示词缓存把不变的部分缓存起来现在很多模型服务商支持提示词缓存prompt caching对于反复出现的相同前缀比如固定的系统提示词、固定的知识库片段缓存命中后计费大幅降低有的甚至能降到原价的十分之一。这个特性对Agent和长系统提示词的场景特别友好。用法上关键是把稳定不变的内容放在前面把变化的内容放在后面。因为缓存是按前缀匹配的如果你的系统提示词每次都变缓存永远命中不了。所以系统提示词要尽量固定动态内容用户输入、检索结果放到后面。6.2 相同问题的结果缓存如果你的应用里有大量重复或高度相似的问题比如FAQ场景可以在应用层做一个语义缓存把问题和答案存起来新问题先查缓存相似度超过阈值就直接返回根本不调用模型。这一层能省下的Token是100%因为压根没请求。6.3 批处理合并请求如果有一批独立的短任务要处理别一个个发请求。把多个任务合并成一个请求让模型一次性输出多个结果可以省掉重复的系统提示词和上下文开销。当然要注意别合并太多导致单次输出过长一般控制在模型输出上限的60%以内比较稳。7. 五个做法怎么组合一套可落地的省Token流水线单独用某一个做法效果有限组合起来才能形成合力。我在实际项目里的流水线是这样的入口层语义缓存拦截重复问题命中直接返回。检索层RAG只召回top-3并重排序去重截断后再进上下文。历史层滑动窗口兜底超过70%预算触发滚动摘要。工具层工具返回结果在代码里过滤只给模型必要字段。请求层固定前缀开启提示词缓存动态内容后置。这套流水线跑下来同样的业务量Token消耗相比最初的全量投喂 无限历史版本通常能降到15%到25%而且因为上下文更干净模型输出质量反而更稳定。省Token和提质量在这里不是矛盾的而是同一件事的两面。最后分享一个我踩过的坑别为了省Token把上下文压得太狠。有一次我把摘要阈值调得过低结果模型丢失了关键约束输出了一堆不符合要求的代码返工花的时间远超省下的那点钱。省Token的前提是不损害任务成功率这个平衡点需要你用真实数据去调而不是拍脑袋。建议每次调整压缩策略后都跑一遍回归测试集确认成功率没有下降再上线。
延伸阅读

更多相关文章

2026/9/25 11:58:04

洛雪音乐桌面客户端:5 步从上手到调优

洛雪音乐桌面客户端:5 步从上手到调优 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 洛雪音乐桌面客户端是一款基于 Electron 开发的免费开源音乐软件,一…

2026/9/25 13:08:08

Claude Code Projects并行任务流:多线程AI编程与后台执行实战

1. 从“单线程对话”到“并行任务流”:这个功能到底解决了什么痛点用AI写代码这件事,最让人抓狂的从来不是模型不够聪明,而是它太“专注”了。你让它改一个登录模块的bug,它认认真真给你分析、改代码、跑测试,整个过程…

2026/9/25 13:08:08

macOS HP打印机配置全解:CUPS与AirPrint实战指南

1. 为什么 macOS 上装 HP 打印机总像在解一道物理题?——从“找不到打印机”到“一键打印”的真实路径你刚把那台崭新的 HP LaserJet Pro M15w 拆箱,插上 USB 线,打开 Mac,满怀期待地点开「系统设置」→「打印机与扫描仪」&#x…

2026/9/25 13:08:08

Agentic编排在Kubernetes上的落地实践:workspace管理与调度策略

1. 从"ax"这个标题说起:一个被低估的编排缩写第一次看到"ax"这个标题,很多人会以为是某个命令行工具的缩写,或者某个前端库的名字。但结合热搜词里的 agentic、orchestration、kubernetes、workspace 这几个词&#xff0…

2026/9/25 13:08:08

Win10远程桌面凭据错误根因分析与实战排错指南

1. 这不是网络问题,是Windows远程桌面协议在“装死”——从报错表象直击底层机制你输入用户名密码,点击连接,弹出“无法连接到远程计算机”,再试一次,变成“你的凭据不工作”。你重启服务、检查防火墙、确认IP没变、甚…

2026/9/25 13:03:07

GLM-OCR轻量级文档理解模型:0.9B参数下的表格识别与版面分析实战

1. 为什么0.9B参数的GLM-OCR值得单独拿出来聊第一次看到GLM-OCR技术报告的时候,我正蹲在工位上处理一批扫描版的项目验收单。那批PDF大概三百多页,里面混着表格、手写批注、印章、还有几页歪着扫进去的附件清单。当时用的是某款传统OCR工具,表…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑