Conversation History
Conversation History 是用户和 Agent 之间的历史对话消息。它是上下文的重要组成部分,但不能无限累积,需要截断和摘要策略。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
Conversation History
一句话定义
Conversation History 是用户和 Agent 之间的历史对话消息。它是 LLM 理解”之前聊了什么”的基础,但不能无限累积——需要截断、摘要或分层管理。
核心原理
消息格式
messages = [
{"role": "system", "content": "你是一个健康助手"},
{"role": "user", "content": "我膝盖疼"},
{"role": "assistant", "content": "疼了多久?"},
{"role": "user", "content": "一周了"},
{"role": "assistant", "content": "有没有肿胀?"},
]
历史管理策略
| 策略 | 原理 | 适用场景 |
|---|---|---|
| 全量保留 | 所有消息都传 | 短对话 |
| 滑动窗口 | 只保留最近 N 轮 | 中等对话 |
| 摘要压缩 | 旧消息生成摘要 | 长对话 |
| 重要性排序 | 保留重要消息 | 复杂对话 |
滑动窗口实现
def get_recent_messages(messages: list, window_size: int = 10) -> list:
"""保留最近 N 轮对话(一轮 = user + assistant)"""
# 保留 system message
system_msgs = [m for m in messages if m.role == "system"]
other_msgs = [m for m in messages if m.role != "system"]
# 取最后 window_size * 2 条(每轮 2 条)
recent = other_msgs[-(window_size * 2):]
return system_msgs + recent
常见坑
- 全量历史塞进上下文: token 爆炸
- 截断太激进: 丢失关键上下文
- 不区分消息类型: 工具调用结果和闲聊同等对待
- 半截消息: 流式中断的 assistant 消息被当作历史