# 在运行时传递回调函数的有效方法,提升编程灵活性和效率!
## 引言
在现代编程中,回调函数是一个强大且灵活的工具,它能够在对象执行时动态地处理事件。在这篇文章中,我们将探讨如何在运行时传递回调函数,从而简化代码复杂度,提升程序的灵活性。
## 主要内容
### 什么是回调函数?
回调函数是指一段可执行的代码(通常是函数),它作为参数传递给其他代码(如函数、方法等),并在某个事件发生时(如一个操作完成时)被调用。回调函数在异步编程、事件驱动编程等场景广泛应用。
### 在运行时传递回调
相比在对象创建时传递回调函数,运行时传递回调函数可以减少代码重复,并确保所有相关对象都能正确响应事件。这在需要处理多个嵌套对象时尤为重要。
例如,使用 `callbacks` 关键字参数将回调函数传递给 `Agent`,可以确保 `Agent` 及其所涉及的所有对象(如工具、LLM)都会正确处理这些回调。
### 示例代码
以下示例展示了如何在使用 `langchain` 库进行对话时传递回调函数:
```python
from typing import Any, Dict, List
from langchain_anthropic import ChatAnthropic
from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.messages import BaseMessage
from langchain_core.outputs import LLMResult
from langchain_core.prompts import ChatPromptTemplate
class LoggingHandler(BaseCallbackHandler):
def on_chat_model_start(self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs) -> None:
print("Chat model started")
def on_llm_end(self, response: LLMResult, **kwargs) -> None:
print(f"Chat model ended, response: {response}")
def on_chain_start(self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs) -> None:
print(f"Chain {serialized.get('name')} started")
def on_chain_end(self, outputs: Dict[str, Any], **kwargs) -> None:
print(f"Chain ended, outputs: {outputs}")
callbacks = [LoggingHandler()]
llm = ChatAnthropic(model="claude-3-sonnet-20240229")
prompt = ChatPromptTemplate.from_template("What is 1 + {number}?")
chain = prompt | llm
# 使用API代理服务提高访问稳定性
chain.invoke({"number": "2"}, config={"callbacks": callbacks})
常见问题和解决方案
- 回调函数未被触发: 确保回调函数已正确传递并绑定到相应的对象。
- 多个回调函数冲突: 确保不同模块的回调函数不互相干扰,并结合日志调试。
总结和进一步学习资源
在运行时传递回调函数可以极大提升代码灵活性和模块化程度。继续学习以下资源,进一步提升您的技能:
参考资料
- Langchain API Reference: ChatAnthropic, BaseCallbackHandler
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---