先澄清一个常见误区:在扣子(Coze)里配上下文窗口,你别指望平台会自动根据对话轮次或内容密度帮你缩放长度。所有窗口设置都是静态的,且直接影响每次API请求的token消耗量和响应质量。默认的8192是个硬性截断点,超了就直接丢信息。要真正平衡好记忆和成本,手动干预是绕不开的一步。得通过代码估算token、分层压缩高密度内容、选择性摘要、裁剪插件结果,最后用变量动态调整窗口长度,再用调试面板验证数据是否合理。

那么,具体怎么做?下面一步步拆开讲。
确认当前上下文窗口的实际占用与瓶颈点
打开Bot编辑页,点「设置」,展开「对话配置」,找到「上下文窗口大小」这个数值。默认是8192。别以为这就是你能用的token上限,它只是模型输入总长度的硬性截断点。真正决定成本的,是每次请求实际拼进去的上下文token数。
进「工作流」加一个「代码节点」,输入下面这段Python逻辑,跑一次测试对话:
import json; tokens = len(input.get("history", []).strip().encode("utf-8")) // 2 + 50; return {"estimated_tokens": tokens}
这个估算值虽然比真实token计数略保守,但能帮你迅速暴露问题:比如第3轮对话时,估算值是不是已经逼近6000了?这时如果插件再返回一个结果,就很容易触发截断,导致丢句。
【如果估算值持续大于5500,说明当前窗口虽然设了8192,实际使用已经逼近临界。这时候应该压缩而非扩容。】
按业务阶段分层控制上下文密度
第一步:识别高信息密度轮次
用户首次提问、上传文件、提交表单、触发插件后返回结构化数据——这四种节点产生的文本通常包含关键实体,比如订单号、身份证号、JSON字段,必须完整保留。其他像“好的”、“明白了”之类的确认语句,可以压缩。
第二步:启用 selective 摘要策略
在 bot_config.yaml 里把 summary_strategy 设为 "selective",而不是默认的 "auto"。前者只保留带命名实体、数字、URL、JSON key 的句子,后者会无差别保留所有语义块,结果就是摘要后仍然残留大量冗余停用词,浪费token。
第三步:对插件调用结果做前置裁剪
HTTP节点输出后,马上接一个「代码节点」,用正则过滤掉响应体里的 debug 字段、trace_id、冗余注释行。示例:response = input.get("output", ""); cleaned = re.sub(r'"debug":.*?[,}]', '', response)。这一步不清理,单次插件返回就可能多占300个token。
动态绑定窗口长度变量
方法一:基于会话轮次切换档位
在「变量」里新建一个 number 类型变量 context_size,初始值设为4096。然后通过「条件分支」节点,当 history.length 大于8时,更新为6144;大于12时,更新为8192。注意:这个变量得在「对话配置」→「上下文窗口大小」中填入 {{context_size}},而不是写死的数字。
方法二:依据用户身份分级分配
如果Bot接入了企业微信,可以通过「获取用户信息」插件读取 department 字段。比如销售部门会话设 context_size=8192,客服部门设=6144,IT支持设=4096。不同部门对话复杂度差异很大,硬性统一窗口,相当于让客服组为销售组的长对话买单,不划算。
【context_size 这个变量名必须跟 bot_config.yaml 里定义的一模一样,大小写也不能错。填错了就回退到平台默认值。】
验证窗口生效与成本变化
发布Bot之后,在「调试」面板发起三轮测试:第一轮只问“你好”,第二轮追加“我订单号是COZE20260703001”,第三轮问“它发货了吗”。每轮对话右侧都有「查看请求详情」,点开它,展开「Model Input」,把全文复制到在线token计算器(比如tiktoken)里。
对比三次的token数:如果第三轮比第一轮增长少于1200,说明裁剪和分层生效了。如果增长超过了2000,那就得检查「代码节点」是不是漏了正则清理,或者「条件分支」有没有正确连接到变量更新路径。
