电商网站开发app意义,重庆网站建设网站建设,苏州园区限电,网站模拟效果1. Callback 功能介绍
Callback 是 LangChain 提供的回调机制#xff0c;允许我们在 LLM 应用程序的各个阶段使用 hook #xff08;钩子#xff09;。钩子的含义也非常简单#xff0c;我们把应用程序看成一个一个的处理逻辑#xff0c;从开始到结束#xff0c;钩子就是在…1. Callback 功能介绍
Callback 是 LangChain 提供的回调机制允许我们在 LLM 应用程序的各个阶段使用 hook 钩子。钩子的含义也非常简单我们把应用程序看成一个一个的处理逻辑从开始到结束钩子就是在事件传送到终点前截获并监控事件的传输。
Callback 对于记录日志、监控、流式传输等任务非常有用简单理解 Callback 就是记录整个流程的运行情况的一个组件在每个关键的节点记录响应的信息以便跟踪整个应用的运行情况。 例如
在 Agent 模块中调用了几次 tool每次的返回值是什么在 LLM 模块的执行输出是什么样的是否有报错在 OutputParser 模块的输出解析是什么样的重试了几次 Callback 收集到的信息可以直接输出到控制台也可以输出到文件更可以输入到第三方应用相当于独立的日志管理系统通过这些日志就可以分析应用的运行情况统计异常率运行的瓶颈模块以便优化。在 LangChain 中callback 模块中具体实现包括两大功能对应 CallbackHandler 和CallbackManager 。CallbackHandler对每个应用场景比如 Agent 或 Chain 或 Tool 的纪录。CallbackManager对所有 CallbackHandler 的封装和管理包括了单个场景的 Handle也包括运行时整条链路的 Handle。不过在 LangChain 的底层这些任务的执行逻辑由回调处理器 CallbackHandler 定义。 CallbackHandler 里的各个钩子函数的触发时间如下 以下是 LangChain Callback 事件机制中常见的事件及其对应的触发时机和方法名称的完整表格适用于实现自定义的 CallbackHandler 事件名称事件触发时机相关方法Callback 方法名Chat Model Start当聊天模型如 ChatOpenAI开始执行时on_chat_model_startLLM Start当大语言模型如 OpenAI、Anthropic开始执行时on_llm_startLLM New Token当 LLM 生成新 token流式输出时on_llm_new_tokenLLM End当 LLM 执行结束时on_llm_endLLM Error当 LLM 执行出错时on_llm_errorChain Start当整个链Chain开始运行时on_chain_startChain End当整个链运行结束时on_chain_endChain Error当链运行出错时on_chain_errorTool Start当工具Tool开始执行时on_tool_startTool End当工具执行结束时on_tool_endTool Error当工具执行出错时on_tool_errorAgent Action当 Agent 执行某个动作如调用工具时on_agent_actionAgent Finish当 Agent 执行完毕完成任务时on_agent_finishRetriever Start当 Retriever检索器开始工作时on_retriever_startRetriever End当 Retriever 检索结束时on_retriever_endRetriever Error当 Retriever 出错时on_retriever_errorText任意文本输出事件用于自定义链、Tool、Agent 的输出on_textRetry当某个组件如 LLM、Tool触发重试机制时on_retry
在 LangChain 中使用回调使用 CallbackHandler 几种方式
在运行 invoke 时传递对应的 config 信息配置 callbacks推荐。在 Chain 上调用 with_config 函数传递对应的 config 并配置 callbacks推荐。在构建大语言模型时传递 callbacks 参数不推荐。 在 LangChain 中提供了两个最基础的 CallbackHandler分别是 StdOutCallbackHandler 和 FileCallbackHandler 。 使用示例如下
import dotenv
from langchain_core.callbacks import StdOutCallbackHandler
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
# 1.编排prompt
prompt ChatPromptTemplate.from_template({query})
# 2.创建大语言模型
llm ChatOpenAI(modelgpt-3.5-turbo-16k)
# 3.构建链
chain {query: RunnablePassthrough()} | prompt | llm | StrOutputParser()
# 4.调用链并执行
content chain.stream( 你好你是, config{callbacks: [StdOutCallbackHandler()]}
)
for chunk in content: pass自定义回调
在 LangChain 中想创建自定义回调处理器只需继承 BaseCallbackHandler 并实现内部的部分接口即可例如
#!/usr/bin/env python
# -*- coding: utf-8 -*-import time
from typing import Dict, Any, List, Optional
from uuid import UUIDimport dotenv
from langchain_core.callbacks import StdOutCallbackHandler, BaseCallbackHandler
from langchain_core.messages import BaseMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.outputs import LLMResult
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAIdotenv.load_dotenv()class LLMOpsCallbackHandler(BaseCallbackHandler):自定义LLMOps回调处理器start_at: float 0def on_chat_model_start(self,serialized: Dict[str, Any],messages: List[List[BaseMessage]],*,run_id: UUID,parent_run_id: Optional[UUID] None,tags: Optional[List[str]] None,metadata: Optional[Dict[str, Any]] None,**kwargs: Any,) - Any:print(聊天模型开始执行了)print(serialized:, serialized)print(messages:, messages)self.start_at time.time()def on_llm_end(self,response: LLMResult,*,run_id: UUID,parent_run_id: Optional[UUID] None,**kwargs: Any,) - Any:end_at: float time.time()print(完整输出:, response)print(程序消耗:, end_at - self.start_at)# 1.编排prompt
prompt ChatPromptTemplate.from_template({query})# 2.创建大语言模型
llm ChatOpenAI(modelgpt-3.5-turbo-16k)# 3.构建链
chain {query: RunnablePassthrough()} | prompt | llm | StrOutputParser()# 4.调用链并执行
resp chain.stream(你好你是,config{callbacks: [StdOutCallbackHandler(), LLMOpsCallbackHandler()]}
)for chunk in resp:pass