资讯动态

上下文与成本三重闸门:缓存、压缩、分档实战

发布时间:2026/10/29 19:06:40 来源:尧图企业网站定制
上下文与成本三重闸门:缓存、压缩、分档实战月底 API 用量报告拉出来,我盯着那条往上翘的曲线愣了三秒:功能没加几个,钱怎么烧得比订阅费还快?前言我做了十几年 C++/Qt 桌面软件,这两年给自己写的工具接了大模型接口,属于典型的"个人开发者订阅 + 少量按量调用"。刚上线时心里美啊:一次调用几毛几分,能花多少钱。两个月下来账单涨幅完全对不上功能数——真正失控的是上下文长度和调用档位,不是模型本身。后来我把整条链路拆成三道闸门:缓存(同一段前别再重复付费)、压缩(别把整个历史拖着走)、分档(别用大炮打蚊子)。这三件事做起来不难,坑都在细节里。下面把我踩过的和能直接抄的代码都摊开讲。价格数字我一律只讲量级,具体单价请以你用的模型官方定价页为准——数字会变,量级关系不太会变。一、账是怎么烧起来的先看一个容易被搞反的事实:输出单价通常比输入贵不少,但真正的大头往往在输入——因为输入是你自己无节制堆上去的。很多人盯着"回复别太长",却放任每轮请求塞进十几万 token 的对话历史、完整文档、全套工具定义。计费口径大致是这样:输入 = 系统提示 + 工具/函数 schema + few-shot 示例 + 全部历史消息 + 本轮问题 + 检索塞进来的片段输出 = 回复正文 + 思维链/推理 token(推理型模型会按输出价计,这块能占到总量的大半,是个隐形大户)有的模型对超长上下文分档计价,跨过某个长度阈值后整段单价上浮;延迟也随长度明显变差也就是说,"越用越笨"和"越用越贵"经常是同一个病根:上下文越长,关键信息越被稀释,注意力摊薄了,费用还翻倍。你把历史当资产越攒越多,模型把它当噪音,账单纯粹当提款机。我做桌面软件有个习惯:把"一次交互的成本"当成和"一次交互的延迟"同等重要的产品指标。这两者高度相关——上下文长了,首字延迟肉眼可见地变差,用户觉得"卡",于是不停追问、不停重发,请求数又上去,恶性循环。所以成本优化在我这儿从来不是财务的事,它是体验的一部分:用户等三秒和等十五秒,是同一个功能的两种产品。还有一个容易被忽略的量:重试成本。网络抖动、限流退避、答复不合格导致重问,每次都把整段上下文重新付一遍。我第一次遇到"没改任何逻辑、账单突然涨三倍",查出来是本地脚本里一个没有次数上限的 while 重试。# costguard/tokens.py# pip install tiktokenimporttiktoken# 编码名要和实际调用的模型对上;换模型记得换编码enc=tiktoken.get_encoding("o200k_base")defcount_tokens(text:str)-int:# disallowed_special=() 避免正文里出现特殊标记时直接抛异常returnlen(enc.encode(text,disallowed_special=()))defrender(messages)-str:"""把消息列表压成一整段文本用来估 token。"""return"\n".join(f"{m['role']}:{m['content']}"forminmessages)defestimate(messages)-int:# 每条消息还有少量结构开销,这里保守加 4/条returncount_tokens(render(messages))+4*len(messages)if__name__=="__main__":demo=[{"role":"system","content":"你是桌面应用的日志分析助手。"},{"role":"user","content":"帮我看下这段崩溃日志:"+"boom "*800},]print("估算输入 token:",estimate(demo))这个脚本我挂在本地跑,改动提示词或加检索片段之前先看一眼数字。任何"省成本"的优化,如果你没法量化它,最后都是玄学。二、第一道闸门:把静态前缀交给缓存主流厂商的提示缓存(prompt caching)本质上都是最长前缀匹配:你请求开头那段字节不变,服务端就把之前算好的 KV 复用,读取部分按很低的价格计(常见量级是原价的一到两成),写入会略贵一点,命中要付写入费,所以只有被反复读才划算。缓存通常有存活时间(分钟级,不活跃就过期),不是永久资产。想让命中率高,就一条铁律:把不变的放前面,会变的放最后。哪些是天然静态:角色与规则、输出格式约束、工具/函数 schema、few-shot 示例、版本号极低的领域词表。哪些是天坑:时间戳、随机 request_id、用户名、当前会话状态——写在开头等于亲手砸了自己的缓存。我踩过最疼的一次,是在系统提示第一行插了generated_at: { {now}},灰度上线后缓存命中率从 80% 掉到 5%,账单立刻翻倍。# cache_demo.py# pip install requestsimportrequests URL="https://api.example.com/v1/messages"HEADERS={"content-type":"application/json","authorization":"Bearer YOUR_TOKEN","x-api-version":"2023-06-01",}STATIC_SYSTEM=open("system_prompt.md",encoding="utf-8").read()BIG_DOC=open("knowledge_base.md",encoding="utf-8").read()# 长领域资料defask(user_text:str)-str:payload={"model":"your-model-id","max_tokens":800,"system":[# 断点打在静态段末尾:前面这一整块都可被缓存{"type":"text","text":STATIC_SYSTEM,"cache_control":{"type":"ephemeral"}},],"messages":[{"rol

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

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

免费获取报价 →
↑