Appearance
33. 超长多轮对话如何兼顾不断档和节省 Token?
难度 P1 高频 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min
本题阅读地图
- 💡 简要回答
- 📝 详细解析
- 🎯 面试总结
👔面试官:超长多轮对话如何兼顾不断档和节省 Token?
🙋♂️我:做摘要,把历史压缩一下。
👔面试官:对,但还有更细的策略:滑动窗口、周期性摘要、检索式补充、结构化记忆槽。你能系统讲吗?
🙋♂️我:滑动窗口就是只保留最近 N 轮?
👔面试官:对,但容易丢早期约束。周期性摘要每隔几轮压成结构化总结。检索式补充把旧对话写进向量库,按需召回而不是全塞。结构化记忆槽把关键信息落键值存储。四种手段要组合用。
💡 简要回答
四种常见手段:
| 手段 | 做法 | 适用 |
|---|---|---|
| 滑动窗口 | 只保留最近 N 轮 | 简单直接,但会丢早期约束 |
| 周期性摘要 | 每隔几轮压成结构化总结 | 保留目标、已确认事实、待办 |
| 检索式补充 | 旧对话写入向量库,按需召回 | 避免全量塞进上下文 |
| 结构化记忆槽 | 关键信息落键值存储 | 城市、等级、偏好等固定信息 |
核心原则:区分什么该原样保留、什么该摘要、什么该结构化、什么该按需检索。
📝 详细解析
滑动窗口
做法:只保留最近 K 轮对话。
python
messages = messages[-10:] # 只保留最近10轮优点:简单,Token 可控。
缺点:早期约束会丢失(如开头说的"不要发邮件")。
周期性摘要
做法:每 N 轮后,把历史生成摘要,替代原消息。
摘要结构:
json
{
"goal": "查询订单退款进度",
"confirmed": {"order_id": "12345", "amount": 299},
"todo": ["查询物流状态"],
"constraints": ["不要发邮件通知"]
}优点:保留关键信息,节省 Token。
缺点:摘要生成有成本,可能丢失细节。
检索式补充
做法:
- 把旧对话写入向量库
- 当前提问时,先检索相关历史片段
- 只把相关片段塞进上下文
优点:按需加载,避免全量塞。
缺点:检索有延迟,可能召回不准。
结构化记忆槽
做法:关键信息直接存键值对,不经过模型"回忆"。
json
{
"user_city": "北京",
"vip_level": "Gold",
"preferred_tone": "formal",
"last_order_id": "12345"
}优点:精确、快速、不耗 Token。
适用:固定属性类信息。
组合策略
实际项目常组合使用:
- 最近 5 轮:原样保留(滑动窗口)
- 更早对话:周期性摘要 + 检索式补充
- 关键事实:结构化记忆槽
🎯 面试总结
四种手段:滑动窗口、周期性摘要、检索式补充、结构化记忆槽。组合使用,区分什么该保留、摘要、结构化、检索。