在进行基于聊天模型的开发时,我们常常面对消息上下文窗口有限的问题。这就要求我们有效地管理传递给模型的消息长度。本文将详细介绍如何使用 trim_messages 实用工具来精简消息列表,从而符合给定的 token 长度要求。
技术背景介绍
语言模型的上下文窗口具有有限容量,即限定了输入消息的 token 数量。如果我们的对话链很长或消息历史积累过多,就需要修剪消息以适应窗口大小。trim_messages 提供了一些基本策略用于修剪消息列表,使其符合上下文窗口的 token 限制。
核心原理解析
trim_messages 函数允许我们设置不同的修剪策略,如获取最后的 max_tokens 或获取最开始的 max_tokens。我们还可以通过传递一个语言模型或自定义的 token 计数器函数,精确计数消息的 token 数量以便正确修剪。
代码实现演示(重点)
以下是代码实现的几个示例,展示了 trim_messages 函数的不同用法:
获取最后的 max_tokens
# 安装必要库
# pip install -U langchain-openai
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"),
]
# 修剪消息以获取最后的 45 个 tokens
trimmed_messages = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=ChatOpenAI(model="gpt-4o")
)
print(trimmed_messages)
保留初始系统消息
trimmed_messages = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=ChatOpenAI(model="gpt-4o"),
include_system=True,
)
print(trimmed_messages)
允许部分拆分消息内容
trimmed_messages = trim_messages(
messages,
max_tokens=56,
strategy="last",
token_counter=ChatOpenAI(model="gpt-4o"),
include_system=True,
allow_partial=True,
)
print(trimmed_messages)
应用场景分析
在应用中,修剪消息可以帮助我们优化聊天历史,使其在长时间对话中不超过模型的上下文限制。这在使用语言模型进行问答、情感分析或推荐系统时尤为重要。
实践建议
- 选择合适的修剪策略:根据应用场景决定使用 “first” 或 “last” 等策略。
- 使用自定义 token 计算器:在需要精确计数的情况下,实现自定义 token 计算器。
- 结合实际应用:使用修剪工具链与聊天模型结合,确保对话流畅而不丢失关键上下文。
如果遇到问题欢迎在评论区交流。
—END—
777

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



