主题
处理多个回调
使用callbacks参数可以在创建对象时传递信息给回调处理程序。
python
from typing import Any, Dict, List, Union
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.callbacks.base import BaseCallbackHandler
from langchain_core.agents import AgentAction
from langchain_community.llms import Ollama
# 首先,定义自定义回调处理器实现
class MyCustomHandlerOne(BaseCallbackHandler):
def on_llm_start(
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
) -> Any:
print(f"on_llm_start {serialized['name']}")
def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:
print(f"on_new_token {token}")
def on_llm_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""Run when LLM errors."""
def on_chain_start(
self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any
) -> Any:
print(f"on_chain_start {serialized['name']}")
def on_tool_start(
self, serialized: Dict[str, Any], input_str: str, **kwargs: Any
) -> Any:
print(f"on_tool_start {serialized['name']}")
def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:
print(f"on_agent_action {action}")
class MyCustomHandlerTwo(BaseCallbackHandler):
def on_llm_start(
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
) -> Any:
print(f"on_llm_start (I'm the second handler!!) {serialized['name']}")
# 实例化处理器
handler1 = MyCustomHandlerOne()
handler2 = MyCustomHandlerTwo()
llm = Ollama(model="qwen2:1.5b", callbacks=[handler2])
# 设置代理。只有“llm”会为handler2发出回调
tools = load_tools(["llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
# handler1 的回调将由参与 Agent 执行的每个对象(llm、llmchain、tool、agent executor)发出
agent.run("江苏的省会是哪里", callbacks=[handler1])
输出
shell
n_llm_start Ollama
on_llm_start (I'm the second handler!!) Ollama
on_new_token
on_new_token 作为一个
on_new_token 语言
on_new_token 模型
on_new_token ,
on_new_token 我
on_new_token 无法
on_new_token 直接
on_new_token 访问
on_new_token 实时
on_new_token 的数据
on_new_token 源
on_new_token 来
on_new_token 回答
on_new_token 关于
on_new_token 江苏省
on_new_token 的问题
on_new_token 。
on_new_token 然而
on_new_token ,
on_new_token 我可以
on_new_token 提供
on_new_token 一个
on_new_token 可能
on_new_token 的答案
on_new_token 。
江苏
on_new_token 的
on_new_token 省
on_new_token 会
on_new_token 是
on_new_token 南京市
on_new_token 。
Final
on_new_token Answer
on_new_token :
on_new_token 江
on_new_token 苏
on_new_token 的
on_new_token 省
on_new_token 会
on_new_token 是
on_new_token 南京市
on_new_token 。
on_new_token