计数闸门不等于上下文管理
一、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 的场景才跨刷新保留。
相关
- 上下文成本由基础上下文和会话数决定 —— 为什么压了历史也不小
- 上下文按信任等级分层
- Agent模型接入与额度机制
- 实时与异步
- 先定位归属层再动手 —— 本条是该骨架的一处实例