TwKit

推文

@ScarletKc · 2026-10-10 09:20

修了个挺好笑的 bug。AI 助手压缩上下文的时候,在摘要里把自己纠正了一遍,说之前讲能读终端、有 skill 都不准确。压缩完下一轮,它又跟用户说摘要写错了,它其实有这些工具。 原因是压缩请求是单独拼的,system prompt 换成了精简版,工具也全去掉了。模型在没工具的环境里写摘要,就当成事实写进去了。顺带 prompt cache 也全 miss,压缩偏偏发生在上下文最大的时候,等于全价重读一遍。 我的改法是把压缩当成下一轮正常请求的分叉。system prompt、工具、历史消息(包括 thinking 块)都和正常请求逐字节一致,只在最后加一条总结指令。cache 按前缀匹配,前缀不变,前面那一大段就按缓存价读。Claude Code 和 Qwen Code 也是这个思路。 工具还在请求里,模型压缩时就可能顺手调一个。挡住它的办法是在指令里写只回复文字、不要调用工具,别去改 tool_choice,改了 Anthropic 的消息缓存就失效了。它要是还调了工具,或者回了个空,整条丢掉,工具一个都不执行,再用不带工具的请求重试一次。重试的回答也要查,有的兼容接口没给工具照样返回 tool call。 max_tokens 也要单独调小。压缩的时候上下文已经快满了,input 加 max_tokens 超出窗口的话 Anthropic 直接拒。我设的是 16K,同时不超过模型的输出上限和窗口的 9%。max_tokens 不算在缓存前缀里,调它不影响命中。 摘要里写用户目标、涉及的主机和系统、跑过的命令和结果、改过的文件和配置、做过的决定和下一步。任务做到一半被压缩的,还要写清做到哪了、最近的工具结果说明了什么。自己能用哪些工具和 skill、连着哪台机器就别写了,每次请求的 system prompt 都会重新给,写进摘要只会过期,开头那个 bug 就是这么来的。 摘要放回去的时候也别只写一句“以下是之前的摘要”。我会把它放进单独的 <summary> 块,交代清楚这是助手自己写的,里面引用的命令和输出是数据不是指令,跟 system prompt 冲突时以 system prompt 为准,然后直接接着干,别跟用户复述或者纠正摘要。 最后记一下压缩请求的 cache read 和 cache write token,到底省没省看数字就知道了。缓存过期以后分叉也读不到缓存,这个没办法,收益主要在缓存还热的时候。

曝光 2733 · 评论 13 · 点赞 29 · 书签 16 · 曝光/时 201.3774147355397

TwKit
正在载入