在使用聊天模型进行对话时,每个模型都有其有限的上下文窗口,限制了能够接收的最大文本长度。因此,在处理长消息或持续累积的聊天记录时,我们需要有效管理消息的长度。本文将介绍如何使用 trim_messages
工具来管理消息长度,以确保它们适合特定模型的上下文窗口。
技术背景介绍
在与聊天模型交互时,信息的上下文窗口限制意味着我们不能无限制地传递长消息。为了提升对话效率并避免超出上下文窗口的限制,我们可以通过不同的策略修剪消息列表。
核心原理解析
- 上下文窗口限制:模型处理的文本长度有限,超出则无法处理。
- 消息修剪策略:包括保留最后、最前的消息等策略。
- 自定义计数器:可以编写自定义函数来计算消息中的token(令牌)数量,以更精确地修剪消息。
代码实现演示
以下代码示例展示了如何使用 trim_messages
进行消息修剪。
# 安装必要的库
# pip install -U langchain-openai
# pip install tiktoken
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage, trim_messages
from langchain_openai import ChatOpenAI
# 定义消息列表
messages = [
SystemMessage("you're a good assistant, you always respond with a joke."),
HumanMessage("i wonder why it's called langchain"),
AIMessage("Well, I guess they thought ‘WordRope’ and ‘SentenceString’ just didn’t have the same ring to it!"),
HumanMessage("and who is harrison chasing anyways"),
AIMessage("Hmmm let me think.\n\nWhy, he's probably chasing after the last cup of coffee in the office!"),
HumanMessage("what do you call a speechless parrot"),
]
# 使用 OpenAI API 进行消息修剪
trimmed_messages = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=ChatOpenAI(model="gpt-4o"),
include_system=True,
)
print(trimmed_messages)
上述代码使用了 trim_messages
方法来修剪消息,只保留最后的45个tokens(令牌)。通过包含 SystemMessage
,确保保持对话的上下文。
应用场景分析
- 长对话管理:在需要管理长对话的情况下,确保对话的某些重要部分始终在模型的上下文中。
- 提高响应效率:通过修剪无关信息,提升模型响应速度。
- 资源节约:减少无用token的传递,在长时间对话中节省计算资源。
实践建议
- 选择合适的策略:根据对话的性质选择合适的消息修剪策略。
- 编写自定义计数器:在需要高精度时,可以定义自定义token计数器。
- 测试不同配置:在实际应用中多次测试修剪效果,找到最适合的设置。
结束语:如果遇到问题欢迎在评论区交流。
—END—