记录一下那天晚上的排查过程。gpt-4o 的 system 只有 800 token,日志里 cached_tokens 一直是 0,同样的前缀重复请求也按全价扣,账单比预估高 30%。
刚开始盯着「请求间隔超过缓存保留时间」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。缓存只对 1024 token 以上的前缀生效。还有一种是前缀里有动态内容,每次都不完全相同。
不容易想到的是,不同项目 key 之间不共享缓存。
上来先看响应里的缓存字段
python -c "import json;d=json.load(open('resp.json'));print(d['usage'].get('prompt_tokens_details'))"
接着统计 system 的实际 token
python -c "import tiktoken;print(len(tiktoken.get_encoding('cl100k_base').encode(open('sys.txt').read())))"
再往下把固定策略补到 1200 token
python -c "print('append static policy until 1200 tokens')"
连续两次相同请求验证
python ask.py --model gpt-4o --same-prefix --repeat 2
中途换过一次思路,把范围缩到最小的那一层,反而快了。
怎么算真的好了,看的是同一批现象。第二次请求的 cached_tokens 大于 1000,输入费用下降约一半,输出不受影响。
缓存有最小长度门槛,前缀太短时优化无效,把稳定的部分合并到前面比拆开更划算。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
