计数闸门不等于上下文管理

**用「消息条数 ≤ 20」当护栏不是上下文窗口管理:服务端既不截断也不滑动窗口,要么全塞要么 400。最坏输入没有 token 级兜底,用户体验是"聊到第 11 轮突然报错"。**

一、20 条是数组元素数,不是轮数

每次用户发问都会往数组里塞 user + 空的 assistant 占位,所以 20 条 ≈ 10 轮用户提问就触顶。第 11 轮服务端直接返回 400(前端把它当错误弹出)。

关键点:这个限制只管这一次请求,判断依据是 body.messages 的全量长度,不做截断、不做滑动窗口。

二、每轮实际上下文上限(无护栏)

服务端只是把 system + messages 全量转发:

组成量级
system prompt(含词条正文 context 预算)12000 字符
历史消息 20 × 2000 字40000 字符
合计≈ 52000 字符 ≈ 5~9 万 token

两个限制(条数、单条字数)独立校验、乘起来没人管。真要触发,要么模型报 context 超限,要么被网关静默截断 —— 表现为"AI 忘了前面说过的话"。实际因为 prompt 强制简短很少打满,但这是一个没有护栏的边界。

三、输出侧

max_tokens: 2048(约 1300~2000 中文字)。对"2-5 句"的 prompt 约束绰绰有余,几乎不会打满 —— 除非模型失控或 reasoning 挤占预算(见 Agent模型接入与额度机制)。

四、推论

  • 计数闸门 ≠ 上下文管理:前者是硬拒绝,后者应是滑动窗口 / 按 token 截断 / 摘要压缩。
  • 会话状态的生命周期要一起看:前端 state 只在组件存活期,刷新即失;只有落 sessionStorage 的场景才跨刷新保留。

相关