LangChain 聊天历史概念指南

前提条件
在学习本指南之前,建议您先了解以下概念:
概述
聊天历史是用户与聊天模型之间对话的记录。它用于在整个对话过程中维护上下文和状态。聊天历史是一系列消息的序列,每个消息都与特定的角色相关联,如"用户"(user)、“助手”(assistant)、“系统”(system)或"工具"(tool)。
对话模式
典型对话结构
大多数对话都以系统消息开始,该消息为对话设置上下文。然后是包含用户输入的用户消息,接着是包含模型响应的助手消息。
助手可能直接回应用户,或者如果配置了工具,可能请求调用工具来执行特定任务。
两种主要对话模式
完整的对话通常涉及两种交替消息模式的组合:
-
用户和助手之间的来回对话模式
- 代表传统的问答式交互
- 用户提问,助手回答
-
助手和工具消息之间的"代理式"工作流程
- 助手调用工具执行特定任务
- 工具返回执行结果
- 助手基于工具结果继续对话
对话流程示例
系统消息: "你是一个有用的助手,可以帮助用户解决问题。"
用户消息: "今天天气怎么样?"
助手消息: "我需要调用天气工具来获取当前天气信息。"
工具消息: "当前温度25°C,晴天"
助手消息: "根据天气数据,今天是晴天,温度25°C,天气很好!"
管理聊天历史
为什么需要管理聊天历史?
由于聊天模型对输入大小有最大限制,因此管理聊天历史并根据需要进行修剪以避免超出上下文窗口是很重要的。
保持正确的对话结构
在处理聊天历史时,保持正确的对话结构至关重要。
关键管理准则
对话结构要求:
对话应遵循以下结构之一:
-
标准对话结构:
- 第一条消息是"用户"消息或"系统"消息
- 然后是"用户"消息,接着是"助手"消息
- 最后一条消息应该是"用户"消息或包含工具调用结果的"工具"消息
-
工具调用结构:
- 使用工具调用时,"工具"消息只能跟在请求工具调用的"助手"消息之后
- 工具消息必须包含相应工具调用的结果
消息修剪策略
# 示例:基本的消息修剪逻辑
def trim_messages(messages, max_tokens=4000):
"""
修剪消息列表以适应模型的上下文窗口
保持对话结构的完整性
"""
# 始终保留系统消息(如果存在)
system_messages = [msg for msg in messages if msg.role == "system"]
other_messages = [msg for msg in messages if msg.role != "system"]
# 从最新消息开始保留,确保对话结构正确
trimmed_messages = system_messages
# 添加最近的消息,确保不超过令牌限制
current_tokens = calculate_tokens(system_messages)
for msg in reversed(other_messages):
msg_tokens = calculate_tokens([msg])
if current_tokens + msg_tokens <= max_tokens:
trimmed_messages.insert(-len(system_messages) or len(trimmed_messages), msg)
current_tokens += msg_tokens
else:
break
return trimmed_messages
内存管理最佳实践
-
保留重要上下文
- 始终保留系统消息
- 保留最近的用户-助手交互对
- 保留完整的工具调用序列
-
智能修剪策略
- 基于令牌数量而非消息数量进行修剪
- 优先保留最近的对话内容
- 确保工具调用的完整性
-
上下文压缩
- 对较早的对话进行摘要
- 提取关键信息点
- 使用向量存储保存长期记忆
实际应用场景
1. 客服聊天机器人
# 客服场景的聊天历史管理
class CustomerServiceChatHistory:
def __init__(self, max_context_length=8000):
self

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



