LLMs Get Lost In Multi-Turn Conversation
1. Motivation(研究动机)
- 现有评测与真实使用的错位:对话日志研究已表明用户指令经常 underspecified(信息不完整、分多轮逐步澄清),但主流 LLM 评测仍以 single-turn、fully-specified 为主——模型在“实验室式”一次性完整指令下得分很高,却缺少在“真实对话式”逐步披露约束下的系统证据。
- 本文要回答的问题:在同一批底层任务上,若把完整指令改写成多轮逐步揭示的 sharded 形式,模型从 FULL(单轮完整) 到 SHARDED(多轮欠指定) 的性能变化有多大?性能损失主要来自“能力上限(aptitude)”还是“跨随机种子的波动(unreliability)”?
- 为何重要:多轮欠指定对话是 Chat 类产品的主形态;若模型在多轮中 过早给出终稿式答案、错误假设后无法纠偏,会直接伤害 用户体验、系统可靠性与产品采纳(论文亦讨论 novice 用户更难一次性给出完整需求)。
2. Idea(核心思想)
- 核心洞见:用 sharded simulation 把高质量 single-turn benchmark 的完整指令拆成若干 shard,每轮最多揭示一个 shard,从而构造可控的 multi-turn underspecified 对话;在此设定下,multi-turn 相对 single-turn 的平均性能显著下滑(论文报告约 39%),且下滑主要由 unreliability 急剧上升 驱动,而非 aptitude 崩盘——即模型并非“完全不会做”,而是“很容易在错误轨迹上越走越偏、难以恢复”(get lost and don’t recover)。
- 与常见 multi-turn 评测的差异:许多 prior work 的 multi-turn 更像 episodic 子任务串联(每轮子任务可相对独立打分);本文强调 underspecification:模型必须跨轮 融合尚未一次性给全 的信息才能完成同一生成任务,从而更贴近“用户边聊边补需求”的真实形态。
3. Method(方法)
3.1 实验框架总览(Simulator)
Figure 1 解读:该 teaser 对比了 fully-specified single-turn 与 underspecified multi-turn 的对话形态,并示意在 Aptitude–Unreliability 平面上,multi-turn 往往伴随 aptitude 适度下降 与 unreliability 大幅上升。它对应论文对 “Lost in Conversation” 现象的总括:同一模型在更真实的对话披露节奏下会系统性变差,且变差不只是“平均变差”,还包含“同样条件下多次采样差异巨大”。
直觉段落(为何会走丢):当用户只给出一部分约束时,模型为“显得有用”往往会 补全缺失细节(assumptions) 并 过早输出接近终稿的答案(premature answer attempt)。一旦这些假设与后续 shard 冲突,后续轮次里模型又倾向于 锚定自己上一轮的长输出,把“用户需求”和“自己编造/推导过的内容”搅在一起,导致 纠错成本高、轨迹发散;再叠加 T=1 的随机性,就会出现“有时很好、有时很差”的 高 unreliability。
3.2 Sharding:从 fully-specified 到 sharded instructions
Figure 2 解读:论文用 GSM8K 风格示例说明 shard 1 通常承载 高层意图,后续 shard 逐步补充 背景、约束、关键数值 等;所有 shard 联合起来应与原始 fully-specified instruction 信息等价。该例子帮助读者建立“同一任务、两种输入形态”的对照,是后文 FULL vs SHARDED 对比的基础。
Sharding 流程解读:论文采用 半自动 sharding pipeline(附录 C 细节):先用 GPT-4o 生成/自检候选 shard,再由作者 人工审阅与修订,以保证 shard 集合满足形式化性质(附录 B 定义 valid sharded instruction 的 5 条性质,如信息覆盖、逐步揭示约束等)。每个任务最终约 90–120 条 sharded 指令(与原始 single-turn 指令配对),全量实验共 600 条指令。
3.3 多轮模拟器:User Simulator + Assistant + System(分类/抽取/评测)
Figure 3 解读:每一轮流程可概括为:User Simulator 揭示最多一个 shard(并自然语言改写以贴合对话);Assistant 自由生成回复;System 将 assistant 回复策略分类(clarification / hedging / answer attempt 等),若判定为 answer attempt 则 Answer Extractor 抽取可评测片段,再由 Task Evaluator 打分;正确则结束,否则继续直到 shard 耗尽或任务完成。User Simulator 在论文主实验中使用 GPT-4o-mini,并可访问完整 shard 集合与对话状态,用于选择“下一轮最自然揭示哪一个 shard”。
3.4 五种 simulation types(FULL / CONCAT / SHARDED / RECAP / SNOWBALL)
Figure 4 解读:FULL 用原始完整指令单轮评测;SHARDED 是主设定(多轮逐步揭示);CONCAT 把 shards 以 bullet 形式拼回单轮,用来检验“性能下降是否主要来自 sharding 重述/信息损失”,论文发现 CONCAT 平均约为 FULL 的 95.1%,支持“主因不是 concat 重述本身,而是 multi-turn + underspecification”。RECAP / SNOWBALL 在后续实验中作为“重复/累积回顾用户侧信息”的干预手段(见结果与 Table 2)。
3.5 六个生成任务(Code / Database / Actions / Math / Data-to-text / Summary)
Figure 5 解读:任务覆盖编程与 NL 生成:Code(HumanEval & LiveCodeBench)、Database(Spider text-to-SQL)、Actions(BFCL API 调用)、Math(GSM8K)、Data-to-text(ToTTo)、Summary(Summary of a Haystack,长上下文多文档)。评测指标沿用原 benchmark:Code/DB/Actions/Math 以二元正确性为主并映射到 0–100;Data-to-text 用 BLEU;Summary 用论文中的 LLM-as-a-judge Joint Score(覆盖与引用/归因)。
3.6 Aptitude 与 Unreliability(核心度量)
对同一指令在固定 simulation type 下重复模拟 N 次,得到分数集合 (S={S_i}_{i=1}^{N})(每次 (S_i\in[0,100]))。论文定义:
并定义可靠性(与 unreliability 互换使用):
后文简记 A、U。直观上:A 近似“最好那一档表现(上尾)”,U 刻画“最好与最差模拟运行之间的落差”。
Figure 6a 解读:论文用箱线图示意:aptitude 对应高分位(上须/上尾),unreliability 对应 90–10 分位间距 所描述的“跨随机种子波动幅度”。这解释了为何平均性能 (P) 的大幅下降可能主要来自“尾部变差 + 波动变大”,而不等于模型完全失去解题能力。
3.7 开源代码与实现映射(microsoft/lost_in_conversation)
Code reference:
main@ba6b9a21(2025-06-23) — 以下伪代码与文件映射基于该 commit 的仓库状态
| Paper 概念 | 源码文件(相对仓库根目录) | 关键类/函数 |
|---|---|---|
| 主入口:选择 FULL/CONCAT/SHARDED 并并行跑对话 | run_simulations.py | run_simulation(),ConversationSimulatorFull / ConversationSimulatorSharded |
| Multi-turn 对话循环(user→assistant→system verify→eval) | simulator_sharded.py | ConversationSimulatorSharded.run() |
| Single-turn FULL/CONCAT(拼接 shard bullet) | simulator_full.py | ConversationSimulatorFull.run() |
| User Simulator(LLM JSON 输出下一回复 + 揭示 shard_id) | user_agent.py | UserAgent.generate_response(),prompts/user_agent.txt |
| System:策略分类 + answer span 抽取 | system_agent.py | SystemAgent.verify_system_response(),SystemAgent.extract_answer() |
| 任务评测钩子(per-task evaluator) | tasks/ 与 tasks.py(注册/分发) | get_task(),task.evaluator_function() |
Simulator(SHARDED)— PyTorch/工程风格伪代码(对应 simulator_sharded.py 结构):
class ConversationSimulatorSharded:
def run(self) -> tuple[bool, float | None]:
shards = self.sample["shards"]
while True:
revealed = self._revealed_shard_ids()
if len(revealed) == len(shards):
break
user_text, shard_id, _ = self.user_agent.generate_response(
self.trace, self.sample, temperature=self.user_temperature
)
self.trace.append({"role": "user", "content": user_text})
if shard_id != -1:
self.trace.append({"role": "log", "content": {"type": "shard_revealed", "shard_id": shard_id}})
assistant_msg = generate_chat(
self.trace, model=self.assistant_model, temperature=self.assistant_temperature
)
self.trace.append({"role": "assistant", "content": assistant_msg})
verdict, _ = self.system_agent.verify_system_response(self.trace)
if verdict["response_type"] != "answer_attempt":
continue
extracted = self.system_agent.extract_answer(self.trace)
metrics = self.task.evaluator_function(extracted, self.sample)
is_correct = metrics.get("is_correct")
score = metrics.get("score")
if is_correct:
return True, scoreSharding 数据形态(数据集侧)— 伪代码(对应 data/sharded_instructions_600.json schema):
sample = {
"task_id": "sharded-...",
"task": "code|database|actions|math|data2text|summary|translation",
"shards": [{"shard_id": 1, "shard_text": "..."}, ...],
# ... task-specific keys: tests, schema, references, etc.
}Scoring(FULL/CONCAT)— 伪代码(对应 simulator_full.py):
def run_full_or_concat(sample, *, concat: bool) -> tuple[bool, float | None]:
system_msg = task.generate_system_prompt(sample)
user_msg = (
task.populate_concat_prompt(sample) if concat else task.populate_fully_specific_prompt(sample)
)
assistant_msg = generate_chat(
[{"role": "system", "content": system_msg}, {"role": "user", "content": user_msg}],
model=assistant_model,
temperature=temperature,
)
extracted = system_agent.extract_answer(trace_from_messages(system_msg, user_msg, assistant_msg))
metrics = task.evaluator_function(extracted, sample)
return bool(metrics.get("is_correct")), metrics.get("score")3.8 主结果图(FULL→SHARDED 的性能变化可视化)
Figure(性能变化图)解读:该图用于直观展示从 FULL 到 SHARDED 的系统性下滑(论文在 Table 1 中给出逐模型逐任务的 (P) 明细;图中汇总表达“普遍受损”)。阅读时建议把它与 CONCAT≈0.951×FULL 的结论一起理解:下滑主要来自 多轮欠指定交互,而非单纯的“shard 文本改写”。
4. Experimental Setup(实验设置)
- 数据与规模:6 个任务各 90–120 条 sharded 指令,共 600 条;主实验对 FULL / CONCAT / SHARDED 三种 simulation type,在 15 个模型上对每个 (model, instruction, simulation type) 重复 N=10 次采样,总计 >200,000 simulated conversations(论文摘要/正文)。温度默认 T=1(另附温度扫描实验,见 Table 3)。
- Baseline 模型(15 个,论文列举):OpenAI:GPT-4o-mini, GPT-4o, o3, GPT-4.1;Anthropic:Claude 3 Haiku, Claude 3.7 Sonnet;Google:Gemini 2.5 Flash, Gemini 2.5 Pro;Meta:Llama 3.1-8B-Instruct, Llama 3.3-70B-Instruct, Llama 4 Scout;AI2:OLMo-2-13B;Microsoft:Phi-4;DeepSeek:Deepseek-R1;Cohere:Command-A。版本与接入细节见 Appendix H。
- 指标:平均表现 (P)、aptitude (A_{90})、unreliability (U^{90}_{10})(定义见 §3.6);并报告 RECAP/SNOWBALL 与 Translation 附加实验。
- 成本:论文估计实验总成本约 $5,000(API 调用)。
5. Experimental Results(实验结果)
5.1 平均性能:Lost in Conversation((P))
- FULL→SHARDED:论文指出比较 FULL 与 SHARDED 时,每个模型在每个任务上都出现性能下降,跨任务平均降幅为 39%(“average degradation of -39%”)。
- CONCAT 对照:CONCAT 平均为 FULL 的 95.1%,用于支持“主要损失来自 multi-turn underspecification,而非 sharding 重写本身”。较小模型在 CONCAT 上相对 FULL 的退化更明显(论文给出约 86–92% 量级的相对表现区间,用于说明其对 paraphrase/bullet 拼接更敏感)。
- 补充:Translation(第 7 个任务,主表外):GPT-4o-mini 在 FULL/CONCAT/SHARDED 的 BLEU 为 41.7 / 43.4 / 42.1;GPT-4o 为 35.9 / 38.5 / 40.9(Table 4)。论文解释该任务的 multi-turn 形态更接近 episodic(逐句可局部完成),因此不呈现“走丢”模式。
说明:Table 1 给出每个模型在 6 个任务上 FULL/CONCAT/SHARDED 的 (P) 明细,并给出相对 FULL 的两列跨任务平均降幅;笔记不再逐格抄表以避免 OCR/排版顺序引入误差,建议以 PDF 原表为准做精确引用。
5.2 Aptitude vs Unreliability 分解((A) 与 (U))
Figure 6b 解读:在 single-turn 设定下,更高 aptitude 的模型往往 unreliability 更低;但在 SHARDED 设定下,aptitude 从 FULL 到 SHARDED 的平均下降约 16%,而 unreliability 平均上升约 112%(more than doubling),且强模型在 multi-turn 下也会进入“高 unreliability 平台”。这与论文对现象的定义一致:大幅 (P) 下滑主要来自 unreliability 飙升,而不是“模型完全不会做”。
5.3 Gradual sharding:从 2 个 shard 开始就“开始走丢”
Figure 6c 解读:在 31 条指令上把 shard 数从 2 扩到 8(GPT-4o 与 GPT-4o-mini),结果显示 只要进入 2-shard(两轮及以上) 的欠指定对话,就会出现“aptitude 小幅受损 + unreliability 大幅上升”的模式;论文据此强调:把信息一次性给全(1-shard / FULL) 对可靠性最关键。
5.4 机制与附加实验(论文归纳)
Figure(回答长度/冗长度相关图)解读:Appendix F 将根因归纳为:(1) 过早给出完整答案尝试、(2) 过度依赖先前错误尝试导致答案膨胀、(3) 中间轮次信息利用不足(loss-of-middle)、(4) 过度冗长引入更多假设;并指出 reasoning 模型 平均回复更长(约 +33%),可能放大假设与混淆。Figure 用于支撑“verbosity / bloated answer”与行为退化相关的讨论(以论文附录细节为准)。
RECAP / SNOWBALL(Table 2,四个任务子集均值):
| Model | FULL | CONCAT | SHARDED | RECAP | SNOWBALL |
|---|---|---|---|---|---|
| GPT-4o-mini | 86.8 | 84.4 | 50.4 | 66.5 | 61.8 |
| GPT-4o | 93.0 | 90.9 | 59.1 | 76.6 | 65.3 |
温度扫描(Table 3,(U^{90}_{10})):在 FULL/CONCAT 下降低 assistant temperature 可显著降低 U;但在 SHARDED 下 GPT-4o-mini 几乎不随 assistant temperature 改善可靠性,GPT-4o 也仅有 约 15–20% 量级的温和改善;即便 AT=0, UT=0,U 仍可能维持在大约 30% 左右(论文讨论现代 LLM 在 T=0 仍非完全确定性)。
5.5 Limitations(作者自述,Section 9)
- 自动化模拟不等于真实人类对话:对话结构偏理想化(例如每轮揭示信息、最终总会给全任务所需信息),且缺少真实对话中的挫折退出、术语误解、目标不可行等;作者认为观测到的退化可能是 低估。
- 任务范围:聚焦 analytical generation(编程/SQL/API/数学/表格描述/引用式摘要),未覆盖开放域创意写作等;创意评测本身仍不成熟。
- 语言/模态:主要覆盖 英文文本;多语言与多模态对话外推需进一步研究。
5.6 结论(Conclusion)
在固定任务集上,multi-turn underspecified 对话会系统性拉低表现;现象核心是 可靠性崩溃式变差 与 错误轨迹难以恢复,常见中介行为包括 早承诺终稿答案、错误假设、过度依赖历史错误输出。论文呼吁 LLM builders 将 multi-turn reliability 与 aptitude 并列优化,并指出 仅靠降温度/简单 agent 式拼接 不足以解决 SHARDED 下的高 U。