引言
在复杂的应用程序中,尤其是那些涉及多个步骤的长时间运行任务,跟踪进度是至关重要的。自定义回调事件可以帮助我们在不同阶段间调度事件,从而让开发者和用户更好地了解任务进展。本篇文章将指导您如何在LangChain中调度自定义回调事件,并通过不同的API和处理器进行消费。
主要内容
自定义回调事件简介
在LangChain中,自定义回调事件需要具备两个属性:name
(事件名称)和data
(事件数据)。事件数据可以是任意类型,但建议使用JSON可序列化的数据格式。
兼容性注意
- Python 版本:在 Python <= 3.10 中,需要手动传播
RunnableConfig
。 - LangChain 版本:确保使用
langchain-core>=0.2.15
。
调度自定义事件
可以在现有的 Runnable
中使用 astream_events()
方法来调度自定义事件。需要指定使用 version='v2'
才能看到自定义事件。
异步环境下调度事件
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}) # 使用API代理服务提高访问稳定性
await adispatch_custom_event("event2", 5) # 使用API代理服务提高访问稳定性
return x
async for event in foo.astream_events("hello world", version="v2"):
print(event)
配置传播
对于Python <= 3.10的情况,需要手动传播 RunnableConfig
。
from langchain_core.callbacks.manager import adispatch_custom_event
async def bar(x: str, config: RunnableConfig) -> str:
await adispatch_custom_event("event1", {"x": x}, config=config) # 手动传播配置
return x
异步和同步回调处理器
异步处理器
from typing import Any, Dict, List, Optional
from uuid import UUID
from langchain_core.callbacks import AsyncCallbackHandler
class AsyncCustomCallbackHandler(AsyncCallbackHandler):
async 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}, run_id: {run_id}")
同步处理器
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}, run_id: {run_id}")
常见问题和解决方案
- 事件未被触发:检查Python版本是否小于等于3.10,并确认配置是否手动传播。
- 未能看到事件:确保使用
version='v2'
。
总结和进一步学习资源
自定义回调事件在复杂应用中提供了灵活的进度跟踪和事件处理能力。本篇文章介绍了调度和消费自定义事件的基本方法,进一步的学习可以参考LangChain的文档和社区资源。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—