多轮法律咨询里事实被说错或被漏掉,通常不是单一原因。可行的排查顺序是:先把现象钉在会话记录上,看第一次改写或遗漏发生在第几轮、属于哪类事实;再用同一份事实清单每轮原样重贴,看错误是否稳定复现;最后才去调上下文长度或改提示词。跳过前两步直接加长上下文或换模型,往往既没定位问题,也看不出改动有没有生效。以下做法只依赖会话记录、请求日志和可重复的提问,不依赖任何内部指标。
先看差异位置,再看重贴清单后的稳定性,最后才动上下文或提示词。错误只出现在长会话后段、缩短轮次后消失,多半与上下文截断或注意力分散有关;在第 2 到 3 轮、上下文很短时也照错,通常是指令里没把事实写成不可改写的约束项。两种判断都需要用同一份事实清单重复验证,且结论只对该接入方式和该提示词版本成立,换环境要重新确认。
在会话记录里标出第一次给出的事实和后续被模型改写的点
先把整段咨询会话按轮次导出。多数接入方式会在请求日志或 messages 数组里保留每一轮的原文,取最近一次出问题的会话即可。然后逐轮填一张对照表,表格只做一件事:标出模型第一次改写或漏掉事实的位置。下面的格式示例中数值为占位,需替换成你自己的会话记录。
| 轮次 | 用户给出的原始事实 | 模型后续复述 | 差异标记 |
|---|---|---|---|
| 第 1 轮 | 借款时间、出借人、金额 | —— | 锚点(原始事实,不可动) |
| 第 2 轮 | 还款方式 | 复述金额与时间 | 无差异 |
| 第 3 轮 | 补充担保人 | 时间被改成另一个月份 | C(改项) |
| 第 5 轮 | 追问诉讼时效 | 未再提担保人 | L(漏项) |
差异标记建议只保留四类:漏项 L、改项 C、增项 A、顺序错位 O。标完通常能看出问题集中在哪类。改项集中在时间、金额这类高辨识度字段,一般先怀疑提示词没有把事实列为禁止改写的约束;从某一轮起早期事实整体消失,同时日志里实际发出的 messages 总长度接近模型上限,则优先怀疑截断。查看请求日志时要注意接入层是否在发送前做过裁剪,不同网关对超长 messages 的处理策略不一样,需要结合环境确认是报错还是静默截头。
把事实拆成当事人、时间、金额、行为、诉求
提示词锁不住事实,常常是因为事实本身没有被写成可核对的结构。把案件事实拆成五类,每项给唯一标识,后面每轮重问时就能逐项对差,而不是靠肉眼比对整段叙述。
| 类别 | 标识示例 | 记录内容 | 来源轮次 | 可核对形式 |
|---|---|---|---|---|
| 当事人 | P-01 / P-02 | 出借人、借款人、担保人 | 第 1、3 轮 | 名称原样,不改称谓 |
| 时间 | T-01 / T-02 | 借款日、约定还款日 | 第 1 轮 | 完整年月日 |
| 金额 | M-01 | 本金、已还金额 | 第 1、2 轮 | 数字加币种 |
| 行为 | A-01 | 交付方式、催告动作 | 第 2 轮 | 动作加对象 |
| 诉求 | D-01 | 请求返还本息、主张时效中断 | 第 5 轮 | 一句话,不带推断 |
把这张表以结构化文本放进提示词,比写成一段自然语言更稳,因为标识可以被要求原样复述:
{
"facts": [
{"id": "P-01", "type": "party", "value": "出借人姓名", "source_turn": 1},
{"id": "T-01", "type": "time", "value": "借款日(完整年月日)", "source_turn": 1},
{"id": "M-01", "type": "amount", "value": "本金金额与币种", "source_turn": 1},
{"id": "A-01", "type": "act", "value": "交付方式", "source_turn": 2},
{"id": "D-01", "type": "demand", "value": "当事人诉求", "source_turn": 5}
],
"rules": [
"以上事实只读:不得改写、不得补全、不得推定",
"缺口记为未知,不要用合理推测填充",
"回答末尾按 id 逐项复述所依据的事实"
]
}
替换项是 facts 里的 value 与 source_turn,rules 可保留。这段结构放在 system 或每轮用户消息开头都行,关键是位置固定,便于比较不同位置的差异。
用固定事实清单重问,观察模型是否丢项或改项
复现方式很简单:每轮提问都把同一份事实清单原样粘贴在最前面,问题本身换不同问法,连续跑三轮以上。粘贴动作不要省略,哪怕上一轮已经贴过——省略之后就无法区分是模型忘了还是上下文被裁掉了。
请只依据下列事实回答,事实为只读,不得改写或补全。
[事实清单]
P-01 当事人:…
T-01 时间:…(完整年月日)
M-01 金额:…
A-01 行为:…
D-01 诉求:…
[问题]
按上述事实说明诉讼时效的起算点。
[输出要求]
1) 先列出你使用到的 fact id;
2) 再给分析;
3) 若某项事实缺失,写“未知”,不要推定。
每轮把模型输出的 fact id 和对应内容抄进记录表,与事实清单逐项比对。判断稳定还是偶发的标准是:同一清单、同一问法重复多次,错误始终落在同一个 id 且改法一致,属于稳定问题,值得改提示词或改检索;每次错的 id 都不一样,先怀疑采样随机性,以及历史轮次里混进了与本问无关的叙述带偏了判断。这一步的验证方式是看记录表里同一个 id 的复述是否前后一致,风险边界是:即使多轮都不错,也不代表换问法后仍不错,问法本身就是变量。
区分上下文长度限制与提示词未锁定事实
到这一步再做对照实验。每次只改一个变量,改完用同一份事实清单重跑,记录错误是否消失。
| 变化项 | 观察点 | 倾向判断 |
|---|---|---|
| 只保留最近两三轮加事实清单 | 改项、漏项明显减少或消失 | 与上下文相关,早期信息被稀释或截断 |
| 轮次不变,把事实清单和只读规则写进 system | 错误消失且多轮保持 | 提示词未锁定事实,约束缺位 |
| 每轮重贴清单,system 不变 | 错误减少但仍有个别改项 | 两种因素叠加,先修提示词再压轮次 |
| 三项都做过,错误依旧 | 同一 id 反复被两种说法交替 | 事实本身存在歧义或前后表述冲突,回到第 2 步重拆 |
操作上建议固定参数再比:温度、top_p、是否流式都保持一致,否则差异无法归因。若怀疑截断,去看请求日志里实际发出的 messages 字符或 token 数与模型上限的距离,而不是看本地拼好的完整文本长度,两者常常不一样。反过来,如果缩短轮次后错误消失,但也同时改了提示词,这个对照就作废了,需要重跑一次只改一项。
整理一份多轮法律咨询的事实核对模板
把前面几步合成一张可复用的核对表,每次遇到丢事实的会话就照着填。表分三块:事实清单、轮次记录、判断结论。
[一] 事实清单
id | 类别 | 内容(原文照抄) | 来源轮次 | 备注
P-01 | 当事人 | … | 1 |
T-01 | 时间 | … | 1 |
M-01 | 金额 | … | 1 |
A-01 | 行为 | … | 2 |
D-01 | 诉求 | … | 5 |
[二] 轮次记录(每轮重贴清单后填写)
轮次 | 使用的 fact id | 模型复述是否一致 | 差异标记(L/C/A/O) | 备注
2 | | 是 / 否 | |
3 | | | |
[三] 判断结论
差异首次出现轮次:
错误是否稳定复现:
缩短轮次后是否改善:
system 内锁定事实后是否改善:
结论:上下文相关 / 提示词未锁定 / 两者叠加 / 事实本身有歧义
下一步动作与复查时间:
使用要点:差异标记只填 L、C、A、O 四种,避免描述性文字;结论栏必须写清依据是哪一次对照,否则下次复查无从比对。这张模板的价值在于让现象可复现、可比较,它不判断法律结论本身,事实的采信和主张仍要由经办人负责。