多轮对话压缩历史消息时保留任务状态的提示设计
来源:17golang原创
时间:2026-09-20 13:07:44 278浏览 收藏
多轮对话压缩历史消息时,真正要保留的不是“上一段对话的缩写”,而是下一轮任务能够继续执行的状态。实践中建议把摘要固定成六类字段:任务目标、已确认决策、硬约束、未完成动作、待确认问题、证据引用。这样即使删掉几十轮闲聊,模型仍知道做到了哪里、不能改什么、下一步要补哪项信息。
Hugging Face Transformers 的聊天输入使用带有 role 和 content 的消息列表,随后由 chat template 转换为模型需要的序列。摘要最好作为独立的状态消息注入,而不是把所有历史重新拼进一个超长字符串。
官方参考地址:https://huggingface.co/docs/transformers/main/chat_templating
- 压缩目标是保留可恢复状态,不是逐句复述历史。
- 决策、约束和未完成动作必须分栏,不能混成一段自然语言。
- 恢复时使用“状态摘要 + 最近原文”的组合,并检查待办是否闭环。
先把历史消息拆成可恢复的状态字段
摘要提示的第一条规则是“只写会影响后续动作的事实”。例如用户已经确认使用 PostgreSQL,就应落在“已确认决策”;“暂时不考虑迁移”应落在“硬约束”;“还没有提供生产数据样本”则属于“待确认问题”。三者混在一段话里,恢复时很容易被模型重新解释。
建议使用固定键名,并允许空数组,不要为了让摘要看起来完整而编造内容。下面的模板是提示设计示例,字段名稳定比修辞更重要:
# 这个函数只负责生成摘要提示;它不执行模型调用,也不替代业务校验
def build_summary_prompt(messages):
return f"""
你是对话状态整理器。只根据给定消息提取已明确说出的事实,禁止猜测。
输出 JSON,必须包含:goal、decisions、constraints、open_actions、questions、evidence。
每个数组元素都写成可独立理解的一句话;没有内容就输出空数组。
保留否定约束、数值、文件名和未完成动作的负责人;不要复述寒暄和重复背景。
历史消息:
{messages}
"""
这里的关键不是让模型“总结得像人”,而是让输出能被程序和下一轮提示稳定读取。若某条结论没有明确来源,就放入 questions 或 evidence,不要悄悄升级为已确认决策。

用固定提示模板区分事实、约束和未完成动作
压缩失败通常不是摘要太短,而是优先级没有写进提示。可以把规则分成三层:第一层保留用户明确决定;第二层保留会导致返工的限制;第三层记录下一步和阻塞点。对于冲突消息,保留最近一次明确决定,同时把冲突写进 questions,等待用户确认。
摘要恢复时,不要把它伪装成用户原话。可以使用单独的状态消息,再接最近几条原文:
# 恢复顺序让模型先看到状态,再看到最近语境;recent_messages 只保留必要窗口
def build_context(state_summary, recent_messages):
state_text = "对话状态(仅使用其中已确认事实):\n" + state_summary
recent_text = "最近消息(用于补充语境,不覆盖硬约束):\n" + recent_messages
return [
{"role": "system", "content": state_text},
{"role": "user", "content": recent_text},
]
如果使用支持 chat template 的模型,仍应遵循目标模型要求的消息角色和模板,不要自行拼接特殊控制符。状态摘要解决的是内容记忆,chat template 解决的是消息格式,两者不能互相替代。
按触发阈值和质量检查决定压缩粒度
不要等到上下文已经超限才压缩。可以在预计输入 token 达到窗口的 60%~70% 时触发一次,先保留最近一小段原文,再生成状态摘要。这里的比例是工程起点,不是所有模型都适用;真正上线前要结合模型窗口、工具调用长度和输出预留空间调整。
压缩结果至少做四项轻量检查:goal 不为空、硬约束没有消失、每个 open action 都有动作描述、questions 没有被错误地写入 decisions。高风险任务还应保留对应的原文片段或消息 ID,方便追溯,而不是只保存模型改写后的句子。

用决策表选择摘要加原文的组合方式
| 场景 | 推荐组合 | 必须保留 | 不适合 |
|---|---|---|---|
| 普通问答、低风险 | 短摘要 + 最近 4~8 条消息 | 目标、结论、未答问题 | 保存全部闲聊 |
| 代码修改或配置迁移 | 结构化摘要 + 关键代码片段 | 文件名、约束、待改位置、验证命令 | 只保留自然语言结论 |
| 多人协作或长流程 | 结构化摘要 + 消息 ID/证据 | 负责人、依赖、阻塞项、决策来源 | 把推测写成已完成 |
常见误区是只压缩“用户消息”,丢掉助手已经承诺的动作;或者把工具返回值全文塞进摘要,导致摘要再次膨胀。更稳妥的做法是只保存工具结果中的结论、标识和可复查引用,并给每个待办保留状态:pending、blocked 或 done。
常见问题
摘要越短,模型就越不容易跑偏吗?
不一定。删除硬约束和未完成动作会让摘要更短,却会增加返工。应先保证状态字段完整,再压缩重复背景。
能不能只保留最后一条 assistant 消息?
不建议。最后一条消息可能只包含局部回答,无法覆盖用户的否定条件、尚未确认的分支和待办责任人。
摘要里要不要保留原始对话全文?
低风险任务通常不需要;代码、合规或争议场景应保留消息 ID、关键片段或外部存档引用,让摘要可以被追溯。
-
475 收藏
-
361 收藏
-
328 收藏
-
272 收藏
-
312 收藏
-
364 收藏
-
387 收藏
-
170 收藏
-
183 收藏
-
467 收藏
-
487 收藏
-
310 收藏
-
199 收藏
-
173 收藏
-
301 收藏
-
398 收藏
-
科技周边 · 人工智能 | 16小时前 | 错误处理 · mcp · 工具调用 · AI工程 · MCP工具错误 isError structuredContent CallToolResult JSON-RPC错误208 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习