[精通LangChain:如何高效修剪消息以适应上下文窗口]

# 精通LangChain:如何高效修剪消息以适应上下文窗口

## 引言

在使用大型语言模型时,我们常常面临上下文窗口限制的问题。为了让模型响应更准确,有时需要对输入消息进行修剪。在本篇文章中,我们将探讨如何使用`trim_messages`工具来管理消息长度,确保它们能适合模型的上下文窗口。

## 主要内容

### 修剪策略

在LangChain中,可以通过不同策略修剪消息,以下是一些关键方法:

- **获取最后的Tokens**:使用`strategy="last"`来保留消息列表中的最后若干tokens。
- **保留系统消息**:通过设置`include_system=True`,始终保留初始系统消息。
- **允许部分消息**:通过`allow_partial=True`来允许拆分消息内容。

### 自定义Token计数器

您可以创建自定义的Token计数器函数,计算消息列表中的Token数量,以满足特定需求。

### 链式操作

`trim_messages`可以与其他组件链式使用,提供了灵活的消息处理方式。

## 代码示例

以下是一个完整的代码示例,展示如何使用`trim_messages`工具:

```python
# pip install -U langchain-openai tiktoken
from langchain_core.messages import (
    AIMessage,
    HumanMessage,
    SystemMessage,
    trim_messages,
)
from langchain_openai import ChatOpenAI
import tiktoken
from typing import List

# 自定义Token计数器
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_per_message = 3
    tokens_per_name = 1
    for msg in messages:
        role = {
            HumanMessage: "user",
            AIMessage: "assistant",
            SystemMessage: "system"
        }.get(type(msg), "")
        num_tokens += (
            tokens_per_message
            + str_token_counter(role)
            + str_token_counter(msg.content)
        )
        if msg.name:
            num_tokens += tokens_per_name + str_token_counter(msg.name)
    return num_tokens

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"),
]

llm = ChatOpenAI(model="gpt-4o")  # 使用API代理服务提高访问稳定性
trimmed_messages = trim_messages(
    messages,
    max_tokens=45,
    strategy="last",
    token_counter=tiktoken_counter,
)

print(trimmed_messages)

常见问题和解决方案

  • 网络限制:在某些地区,访问API可能会受到限制。考虑使用API代理服务以提高访问的稳定性。
  • 消息类型不支持:确保传入的消息类型在自定义Token计数器中得到正确处理。

总结和进一步学习资源

修剪消息是处理自然语言处理任务的基础技能之一。通过本文,我们了解了如何在LangChain中高效修剪消息,并确保它们适应模型的上下文窗口。希望本文的内容能为你的项目提供帮助。

参考资料

  • LangChain 官方文档
  • OpenAI API 参考

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

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值