多轮对话里前面的要求忽然不被遵守,上下文长度是常见嫌疑,但它不是唯一解释。更常见的情况是要求被分散写在十几轮里,越靠后的要求越容易盖住越早的,或者要求本身写得含糊、无法核对。判断方向可以先定下来:不要急着调窗口参数或换模型,而是用逐轮追加要求的方式,找到第一条从满足变成不满足的要求落在第几轮,再决定是缩短会话还是把要求前置。
“聊久了就不守要求”多数可以在本地复现:固定几条可核对的要求,每轮只追加一条,记录每条要求从满足变成不满足的轮次以及该轮新增内容量。如果新会话里一次性前置同样的要求就恢复正常,问题更可能出在要求的位置和表述方式,而不是上下文长度本身;反过来才需要考虑缩短会话或精简历史。这套方法只能定位现象,具体阈值需要结合你使用的模型、会话长度和任务类型确认。
设计一组逐轮追加的测试要求
要让“什么时候开始不遵守”可被观察,要求必须满足两个条件:能用肉眼判断是否满足,且彼此不冲突。建议准备六到八条,每轮只追加一条,其他提问方式保持一致。
- 每次回复以「要点:」开头
- 回复末尾加一行「置信度:高 / 中 / 低」
- 固定输出三个字段:问题 / 方案 / 验证方式
- 不要出现「综上所述」「众所周知」
- 数字保留两位小数
- 提到文件名时用反引号包住
- 只处理与指定主题相关的问题
第一轮不要带任何格式要求,只给一个普通任务作为基线;从第二轮起,每轮在消息末尾追加一条,并重复同一个任务或同一类问题。示意骨架如下,把具体任务替换成你自己的内容即可。
第 1 轮:帮我总结这段文本,输出三行。
第 2 轮:(同一任务)从现在起,每条回复开头加一行「要点:」。
第 3 轮:(同一任务)回复里不要出现「综上所述」。
第 4 轮:(同一任务)输出固定三个字段:问题 / 方案 / 验证方式。
...
避免使用“专业一点”“再简洁些”“注意格式”这类主观要求,它们会让后面的判定变成争论,而不是核对。
用固定模板记录每轮结果
不要靠事后回忆。每轮结束立刻记一行,并且把当时已经提过的所有要求都核一遍,不能只核最新那条。
轮次:
本轮追加的要求:
本轮任务:
要求1(开头「要点:」)是否满足:
要求2(禁用「综上所述」)是否满足:
要求3(三字段结构)是否满足:
要求4(数字两位小数)是否满足:
明显偏差位置:
本轮新增内容量(用户输入字数 / 助手回复字数 / 累计轮数):
这是一个本地记录模板,用记事本、表格或代码注释都可以,不依赖任何工具方接口或日志字段。记录的是可对照的原始结果,不是对模型的评价,也不需要在记录里写猜测原因。
定位第一个不遵守的轮次
把每轮记录横着看,逐列核对历史要求,找出第一条状态从满足变成不满足的要求,对应的那一轮就是丢失位置。这里有几种情况需要区分:
- 某条要求第一次失效后一直不再满足:说明它在当前会话里已经压不住,可以优先前置。
- 同一条要求时好时坏:更像是表述方式或当轮任务干扰,不一定是上下文被截断。
- 多条要求在同一轮集体失效:通常是该轮追加的内容和已有要求发生冲突,或任务本身变复杂。
同时记录该轮的新增内容量——用户这轮输入了多少字、到该轮为止一共提了几条要求、会话累计了多少轮。这些不需要精确到 token,用字符数和轮数就够,目的是让“第几轮、当时堆了多少东西”变成可重复的事实,而不是一句“感觉聊太久了”。
把长会话和重开会话做一次对照
定位到失效轮次后,做一次对照。A 组在原会话里继续追加要求,一直走到失效轮次之后两三轮;B 组新开会话,把全部要求一次性写在第一条消息里,然后问同一个问题。两组的问题、要求文字、模型和参数保持一致,否则差异说明不了什么。
A 组:长会话继续追加 → 观察到第 N 轮失效
B 组:新会话 + 首条消息一次性前置全部要求 → 问同一个问题
比较:哪几条要求守住了,哪几条仍然丢
- B 组守住、A 组不守:更可能是长会话中靠前的要求被后续内容冲淡。处理方向是把硬要求前置,并在会话中少量复述,而不是无止境地缩短历史。
- 两组都不守:更可能是要求本身冲突、表述含糊,或超出当前模型能稳定执行的范围,需要改措辞、把要求拆小。
- 只有部分要求丢:说明失效和要求类型相关,比如格式类容易被守住、禁止类容易被突破。把最容易丢的写进开头约束块。
对照不需要跑很多次,一次能观察到稳定差异就足够作为决策依据;如果想更稳,可以换一个问题再走一遍同样流程。
定下会话管理规则
把上面的观察固化成能直接照做的规则。
必须放在会话开头的三类要求:
- 输出格式与结构:例如固定字段、必须返回 JSON、必须分成三条。
- 硬性禁止项:例如禁止出现某些词、禁止改动代码、禁止引用外部内容。
- 角色与边界:例如只处理某类问题,超出范围先确认。
出现下面两个信号就重开会话,不要在原会话里反复解释补丁:同一条要求连续两轮不一致;或者一轮里两条以上要求同时失效。前者说明这条要求已经压不住,后者说明会话里冲突信息太多。
重开后用一句话把历史结论带过去,例如:“之前已确认:输出三字段、不要出现『综上所述』、数字保留两位小数,现在继续处理 X。”把约束压成一行前置,通常比重新描述一遍经过更有效,也能避免把之前的错误示范重新带回上下文。
【固定约束】
1. 每次回复以「要点:」开头,末尾加「置信度:高 / 中 / 低」
2. 输出三个字段:问题 / 方案 / 验证方式
3. 不要出现「综上所述」「众所周知」
4. 只处理与 X 相关的问题,其他请求先确认
【当前任务】
...
如果重开之后仍然很快失效,说明约束块本身太长或要求之间互相牵制。先把约束块压到三到四条,再逐条加回去,用同一套记录模板观察哪一条是负担。