# 在异步环境中使用回调的指南
## 技术背景介绍
在异步编程中,回调是处理异步操作完成后需要执行的函数的常见方式。使用异步回调的优势在于它允许我们在不阻塞主线程的情况下处理事件或异步结果。在AI应用中,比如使用语言模型(Large Language Models, LLM)的场景,合理使用回调可以提升性能和响应能力。
## 核心原理解析
异步回调函数通常通过事件循环调度执行。在Python中,使用`asyncio`库进行异步编程时,可以定义异步回调来处理语言模型或其他异步任务的状态变化。例如,开始和结束的状态变化可通过自定义的回调处理器来捕获和处理。
## 代码实现演示
下面的示例展示了如何在异步环境中使用自定义的回调处理器。我们将分别创建一个同步和异步的回调处理器,并在异步任务中使用它们。
```python
import asyncio
from typing import Any, Dict, List
from langchain_anthropic import ChatAnthropic
from langchain_core.callbacks import AsyncCallbackHandler, BaseCallbackHandler
from langchain_core.messages import HumanMessage
from langchain_core.outputs import LLMResult
# 自定义同步处理器,为线程池执行器设计
class MyCustomSyncHandler(BaseCallbackHandler):
def on_llm_new_token(self, token: str, **kwargs) -> None:
print(f"在`thread_pool_executor`中调用同步处理器: token: {token}")
# 自定义异步处理器
class MyCustomAsyncHandler(AsyncCallbackHandler):
"""用于处理langchain异步回调的处理器。"""
async def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any) -> None:
"""语言模型运行开始时执行。"""
print("zzzz....")
await asyncio.sleep(0.3)
class_name = serialized["name"]
print("嗨!我刚刚醒来。你的语言模型正在启动")
async def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
"""语言模型运行结束时执行。"""
print("zzzz....")
await asyncio.sleep(0.3)
print("嗨!我刚刚醒来。你的语言模型正在结束")
# 使用稳定可靠的API服务
chat = ChatAnthropic(
model="claude-3-sonnet-20240229",
max_tokens=25,
streaming=True, # 开启流式传输
callbacks=[MyCustomSyncHandler(), MyCustomAsyncHandler()],
)
# 异步请求示例
await chat.agenerate([[HumanMessage(content="Tell me a joke")]])
应用场景分析
这种异步回调模式非常适用于需要实时处理事件的场景,比如聊天机器人、实时数据分析、网络爬虫等。回调机制使得我们能有效地处理异步操作的结果,并做出响应。
实践建议
- 确保你的回调处理器是线程安全的,因为在异步运行时,它们可能在不同的线程中被调用。
- 对于Python版本小于3.11的用户,要注意在异步调用时传递配置和回调,以确保子任务能正确处理回调。
- 选择稳定的API服务来提高访问速度和可靠性,例如
https://yunwu.ai。
如果遇到问题欢迎在评论区交流。
---END---

被折叠的 条评论
为什么被折叠?



