langchain从入门到精通(七)——利用回调功能调试链应用 - 让过程更透明

1. Callback 功能介绍

Callback 是 LangChain 提供的回调机制,允许我们在 LLM 应用程序的各个阶段使用 hook (钩子)。钩子的含义也非常简单,我们把应用程序看成一个一个的处理逻辑,从开始到结束,钩子就是在事件传送到终点前截获并监控事件的传输。
在这里插入图片描述

Callback 对于记录日志、监控、流式传输等任务非常有用,简单理解, Callback 就是记录整个流程的运行情况的一个组件,在每个关键的节点记录响应的信息以便跟踪整个应用的运行情况。
例如:

  1. 在 Agent 模块中调用了几次 tool,每次的返回值是什么?
  2. 在 LLM 模块的执行输出是什么样的,是否有报错?
  3. 在 OutputParser 模块的输出解析是什么样的,重试了几次?
    Callback 收集到的信息可以直接输出到控制台,也可以输出到文件,更可以输入到第三方应用,相当于独立的日志管理系统,通过这些日志就可以分析应用的运行情况,统计异常率,运行的瓶颈模块以便优化。在 LangChain 中,callback 模块中具体实现包括两大功能,对应 CallbackHandler 和CallbackManager 。
  4. CallbackHandler:对每个应用场景比如 Agent 或 Chain 或 Tool 的纪录。
  5. CallbackManager:对所有 CallbackHandler 的封装和管理,包括了单个场景的 Handle,也包括运行时整条链路的 Handle。不过在 LangChain 的底层,这些任务的执行逻辑由回调处理器( CallbackHandler )定义。
    CallbackHandler 里的各个钩子函数的触发时间如下:
    以下是 LangChain Callback 事件机制中常见的事件及其对应的触发时机和方法名称的完整表格,适用于实现自定义的 CallbackHandler

事件名称事件触发时机相关方法(Callback 方法名)
Chat Model Start当聊天模型(如 ChatOpenAI)开始执行时on_chat_model_start
LLM Start当大语言模型(如 OpenAI、Anthropic)开始执行时on_llm_start
LLM New Token当 LLM 生成新 token(流式输出)时on_llm_new_token
LLM End当 LLM 执行结束时on_llm_end
LLM Error当 LLM 执行出错时on_llm_error
Chain Start当整个链(Chain)开始运行时on_chain_start
Chain End当整个链运行结束时on_chain_end
Chain Error当链运行出错时on_chain_error
Tool Start当工具(Tool)开始执行时on_tool_start
Tool End当工具执行结束时on_tool_end
Tool Error当工具执行出错时on_tool_error
Agent Action当 Agent 执行某个动作(如调用工具)时on_agent_action
Agent Finish当 Agent 执行完毕(完成任务)时on_agent_finish
Retriever Start当 Retriever(检索器)开始工作时on_retriever_start
Retriever End当 Retriever 检索结束时on_retriever_end
Retriever Error当 Retriever 出错时on_retriever_error
Text任意文本输出事件(用于自定义链、Tool、Agent 的输出)on_text
Retry当某个组件(如 LLM、Tool)触发重试机制时on_retry

在 LangChain 中使用回调,使用 CallbackHandler 几种方式:

  1. 在运行 invoke 时传递对应的 config 信息配置 callbacks(推荐)。
  2. 在 Chain 上调用 with_config 函数,传递对应的 config 并配置 callbacks(推荐)。
  3. 在构建大语言模型时,传递 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(model="gpt-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(model="gpt-3.5-turbo-16k")# 3.构建链
chain = {"query": RunnablePassthrough()} | prompt | llm | StrOutputParser()# 4.调用链并执行
resp = chain.stream("你好,你是?",config={"callbacks": [StdOutCallbackHandler(), LLMOpsCallbackHandler()]}
)for chunk in resp:pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/87044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Postman做接口自动化测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 本文适合已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本: …

ELK日志文件分析系统——E(Elasticsearch)

目录 基本概念 一、架构设计 二、核心原理 三、关键特性 四、应用意义 部署步骤 ‌一、环境准备‌ ‌二、安装 Elasticsearch‌ ‌三、关键配置(elasticsearch.yml)‌ ‌四、启动与验证‌ ‌五、集群扩展(新增节点)‌ …

融智学教育观及其数学公式体系凝练汇总

摘要:本文系统阐述了邹晓辉教授的融智学教育观,通过原创数学公式体系构建了人机协同教育模型。核心内容包括:认知本体论(文明智慧当量方程)、方法论(七遍通训练算子)、生态位控制论(…

互联网大厂Java求职面试:AI大模型应用实践中的架构挑战与实战

互联网大厂Java求职面试:AI大模型应用实践中的架构挑战与实战 引言 在当今技术飞速发展的时代,AI大模型已成为企业数字化转型的重要引擎。无论是内容生成、智能客服、个性化推荐,还是知识图谱构建和语义理解,大模型的应用场景正在…

龟兔赛跑算法(Floyd‘s Cycle-Finding Algorithm)寻找重复数

龟兔赛跑算法(Floyd’s Cycle-Finding Algorithm)寻找重复数 问题描述 给定一个长度为 N1 的数组 nums,其中每个元素的值都在 [1, N] 范围内。根据鸽巢原理,至少有一个数字是重复的。请找出这个重复的数字。 要求: …

紫光展锐T8300以创新音频技术重塑感知世界

数字化时代,从语音通话到智能交互,从聆听音乐到创作Vlog,声音已成为隐形的基础措施。日益发展的音频技术正在重构用户感知世界的方式,重塑用户的听觉体验。 T8300是紫光展锐专为全球主流用户打造的5G SoC,采用了紫光展…

写作词汇积累(A):颇有微词、微妙(“微”字的学习理解)

一、颇有微词 1、基本介绍 【颇有微词】指对某人或某事有轻微的批评、不满或不同意见,但表达得含蓄委婉 【颇】表示程度较深,【微词】表示隐晦的批评 【微】表示隐晦的、不直白的,强调批评的委婉性 2、使用实例 1、尽管公司的新考勤制度…

flowable工作流的学习demo

1.spring 部署流程 删除部署 查看历史信息 加载一个默认的配置文件 里面包含用户名和数据库信息 加载自定义的配置文件 flowable.cfg.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

XCTF-misc-can_has_stdio?

下载得到一个文件 ┌──(kali㉿kali)-[~] └─$ file misc50 misc50: ASCII text, with very long lines (536)┌──(kali㉿kali)-[~] └─$ cat misc50 …

【编译工具】(自动化)AI 赋能的自动化测试工具:如何让测试效率提升 500% 并实现智能质检?

#『编程工具』提升效率征文挑战赛# 目录 引言&#xff1a;AI 如何重塑自动化测试格局 一、新一代 AI 测试工具核心能力解析 二、实战演示&#xff1a;Testim 智能测试平台 &#xff08;1&#xff09;智能录制测试流程 ① 步骤演示 ② AI 元素定位原理 &#xff08…

毛纪逆向分析

文章目录 毛纪逆向分析前言知识系统整体架构概述模块分析模块0模块1模块2模块3模块4模块5总结毛纪逆向分析 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学(系统理论和实战教程)、提供接单兼职渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698…

【力扣 简单 C】141. 环形链表

目录 题目 解法一&#xff1a;哈希 解法二&#xff1a;快慢指针 题目 解法一&#xff1a;哈希 struct node {struct ListNode* val;struct node* next; };struct hashSet {struct node** bucket;int size; };struct hashSet* hashSetInit(int size) {struct hashSet* hashS…

Eureka 服务注册与发现原理和使用

1.Eureka 基础概念 Eureka 是 Netflix 开发的服务注册与发现组件&#xff0c;是 Spring Cloud 微服务架构中的核心模块&#xff0c;用于解决微服务间的自动发现与通信问题。其核心功能包括&#xff1a; 服务注册&#xff1a;服务实例将自身信息&#xff08;IP、端口、健康状态等…

create_react_agent + MCP tools

文章目录 MCP tools 调用结果输出MCP Tool 内容成功返回失败返回 普通工具调用 https://blog.csdn.net/2401_89025022/article/details/148629902 MCP tools 调用 import time import asyncio import json from langgraph.prebuilt import create_react_agent from langch…

提示词Prompts(1)

摘要&#xff1a; 本文介绍了langchain.prompts中基础的提示词模板的用法&#xff0c;包括基础的文本模板、对话模板、小样本模板、以及主要两种样本选择器的用法。 文章目录 1. prompts介绍&#xff1f;2. 提示词模板体系 Prompt Templates2.1 基础文本模板 PromptTemplate2.2…

如何在 Elementary OS 上安装最新版本的 VirtualBox

Elementary OS 是一个基于 Ubuntu Linux 的发行版&#xff0c;它易于使用&#xff0c;对初学者友好&#xff0c;并且在用户中非常受欢迎。如果你是 Elementary OS 的用户&#xff0c;并且想在上面虚拟运行和探索其他操作系统&#xff0c;那么 Oracle VirtualBox 是一个非常不错…

uni-app项目loading显示方案

前情 uni-app是我比较喜欢的跨平台框架&#xff0c;它能开发小程序/H5/APP(安卓/iOS)&#xff0c;重要的是对前端开发友好&#xff0c;自带的IDE可视化的运行和打包也让开发体验也非常棒&#xff0c;公司项目就是主推uni-app&#xff0c;为了用户体验对于耗时操作&#xff0c;…

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)

写在前面的话&#xff0c;为了保持Sceneform-EQR始终是采用最新的filament&#xff0c;每隔一段时间我都会编译filament&#xff0c;并根据新增内容完善Sceneform-EQR。 现由于更换电脑&#xff0c;环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…

ARM 单片机定义变量绝对地址方法

在ARM单片机中&#xff0c;定义变量到绝对地址通常有以下几种方法&#xff08;以Keil MDK为例&#xff0c;其他工具链原理类似&#xff09;&#xff1a; 方法1&#xff1a;使用指针强制转换&#xff08;通用&#xff09; 直接通过指针访问指定地址&#xff1a; define REGIS…

为何AI推理正推动云计算从集中式向分布式转型

作者简介&#xff1a;Vineeth Varughese是Akamai亚太及日本地区的云产品市场负责人&#xff0c;在云计算、人工智能&#xff08;AI&#xff09;及市场进入策略&#xff08;GTM&#xff09;领域拥有丰富经验。 传统云平台在利用海量数据训练AI模型方面表现出色&#xff0c;但随着…