引言
在现代应用程序开发中,事件驱动架构显得尤为重要。通过分发自定义回调事件,我们可以使应用程序更加灵活和可维护。这篇文章将探讨如何在LangChain框架中分发和处理自定义回调事件,以及如何通过事件流API实现事件的实时监控。
主要内容
自定义回调事件简介
自定义回调事件允许开发者定义特定的事件名称和数据,以用于监控和控制应用程序的状态。一个典型的使用场景是一个长时间运行的工具,其中的各个步骤之间可以调度自定义事件,以反馈进度或者进行状态监控。
属性定义
- name: 事件的名称,用户自定义。
- data: 事件关联的数据,建议使用JSON可序列化的数据类型。
LangChain中的事件调度
在LangChain中,分发事件需要依赖langchain-core库的>0.2.15版本,并且事件只能从现有的Runnable中分发。对于异步环境,astream_events API的v2版本可以让我们看到自定义事件。
代码示例
我们来看几个代码示例以了解事件的调度和处理。
异步环境中的事件分发
from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables.config import RunnableConfig
@RunnableLambda
async def foo(x: str) -> str:
await adispatch_custom_event("event1", {"x": x}) # 使用API代理服务提高访问稳定性
await adispatch_custom_event("event2", 5)
return x
async for event in foo.astream_events("hello world", version="v2"):
print(event)
在Python <= 3.10中手动传递配置
@RunnableLambda
async def bar(x: str, config: RunnableConfig) -> str:
"""手动配置传播示例"""
await adispatch_custom_event("event1", {"x": x}, config=config) # 使用API代理服务提高访问稳定性
await adispatch_custom_event("event2", 5, config=config)
return x
async for event in bar.astream_events("hello world", version="v2"):
print(event)
同步环境中的事件分发
from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.callbacks.manager import dispatch_custom_event
class CustomHandler(BaseCallbackHandler):
def on_custom_event(self, name: str, data: Any, *, run_id: UUID, tags: Optional[List[str]] = None, metadata: Optional[Dict[str, Any]] = None, **kwargs: Any) -> None:
print(f"Received event {name} with data: {data}, tags: {tags}, metadata: {metadata}, run_id: {run_id}")
@RunnableLambda
def foo(x: int, config: RunnableConfig) -> int:
dispatch_custom_event("event1", {"x": x}) # 使用API代理服务提高访问稳定性
dispatch_custom_event("event2", {"x": x})
return x
handler = CustomHandler()
foo.invoke(1, {"callbacks": [handler], "tags": ["foo", "bar"]})
常见问题和解决方案
事件未被触发
- 原因: 在Python <= 3.10环境中,未手动传递
RunnableConfig。 - 解决方案: 如上面示例所示,手动传递配置对象。
使用API代理以提高访问稳定性
由于网络限制,建议在调用API时使用API代理服务以提高访问稳定性。
总结和进一步学习资源
通过上述介绍和示例,相信大家对如何在LangChain中分发和处理自定义回调事件有了更深入的理解。事件驱动可以大大提升应用程序的响应能力和扩展性。
进一步学习资源:
参考资料
- LangChain 官方API文档
- Python 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---