【AI大模型应用开发】【LangChain系列】6. LangChain的Callbacks模块:监控调试程序的重要手段

大家好,我是【同学小张】。持续学习,持续干货输出,关注我,跟我一起学AI大模型技能。

LangChain提供了一个回调系统,允许您挂接到LLM应用程序的各个阶段。这对于日志记录、监视、流式传输和其他任务非常有用。

0. LangChain Callbacks模块提供的Callback接口一览

class BaseCallbackHandler:"""Base callback handler that can be used to handle callbacks from langchain."""def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any) -> Any:"""Run when LLM starts running."""def on_chat_model_start(self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any) -> Any:"""Run when Chat Model starts running."""def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:"""Run on new LLM token. Only available when streaming is enabled."""def on_llm_end(self, response: LLMResult, **kwargs: Any) -> Any:"""Run when LLM ends running."""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:"""Run when chain starts running."""def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> Any:"""Run when chain ends running."""def on_chain_error(self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Any:"""Run when chain errors."""def on_tool_start(self, serialized: Dict[str, Any], input_str: str, **kwargs: Any) -> Any:"""Run when tool starts running."""def on_tool_end(self, output: str, **kwargs: Any) -> Any:"""Run when tool ends running."""def on_tool_error(self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Any:"""Run when tool errors."""def on_text(self, text: str, **kwargs: Any) -> Any:"""Run on arbitrary text."""def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:"""Run on agent action."""def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any:"""Run on agent end."""

1. 最常用的Callback:StdOutCallbackHandler

StdOutCallbackHandler将所有事件的日志作为标准输出,打印到终端中。

注意: 当verbose参数设置为true时, StdOutCallbackHandler是被默认启用的,也就是你看到的它将运行过程的日志全部打印到了终端窗口中。

上示例:

from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain_openai import OpenAI
from langchain.prompts import PromptTemplatehandler = StdOutCallbackHandler()
llm = OpenAI()
prompt = PromptTemplate.from_template("1 + {number} = ")# Constructor callback: First, let's explicitly set the StdOutCallbackHandler when initializing our chain
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler])
chain.invoke({"number":2})# Use verbose flag: Then, let's use the `verbose` flag to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
chain.invoke({"number":2})# Request callbacks: Finally, let's use the request `callbacks` to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt)
chain.invoke({"number":2}, {"callbacks":[handler]})

输出:

在这里插入图片描述

对代码和运行结果的解释:

从运行结果可以看出,三次输出的结果相同。再看代码,用三种方式实现了StdOutCallbackHandler的设置。

  • 第一种:chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler]),chain中直接在callbacks中将callback handler传入
  • 第二种:使用verbose=True,即使不显式声明callbacks,它也使用StdOutCallbackHandler
  • 第三种:chain.invoke({"number":2}, {"callbacks":[handler]}),在invoke时传入callbacks

2. 各种类型的CallBack实践

2.1 通用 callback:BaseCallbackHandler

实现一个自己的Callback handler,继承自BaseCallbackHandler,然后重写自己需要的回调函数即可。

from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import HumanMessage
from langchain_openai import ChatOpenAIclass MyCustomHandler(BaseCallbackHandler):def on_llm_new_token(self, token: str, **kwargs) -> None:print(f"My custom handler, token: {token}")# To enable streaming, we pass in `streaming=True` to the ChatModel constructor
# Additionally, we pass in a list with our custom handler
chat = ChatOpenAI(max_tokens=25, streaming=True, callbacks=[MyCustomHandler()])chat([HumanMessage(content="Tell me a joke")])

运行结果:

在这里插入图片描述

2.2 异步 CallBack:AsyncCallbackHandler

有时候我们可能在CallBack内做大量的数据处理,可能比较耗时,如果使用通用 CallBack,会阻塞主线程运行,这时候异步 CallBack就比较有用了。

实现一个自己的Callback handler,继承自AsyncCallbackHandler,然后重写自己需要的回调函数即可。

class MyCustomAsyncHandler(AsyncCallbackHandler):"""Async callback handler that can be used to handle callbacks from langchain."""...... 重写相关回调函数 ......

2.3 写日志 / 日志文件: FileCallbackHandler

开发项目过程中,写日志是重要的调试手段之一。正式的项目中,我们不能总是将日志输出到终端中,这样无法传递和保存。

from langchain.callbacks import FileCallbackHandler
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAIlogfile = "output.log"handler = FileCallbackHandler(logfile)llm = OpenAI()
prompt = PromptTemplate.from_template("1 + {number} = ")# this chain will both print to stdout (because verbose=True) and write to 'output.log'
# if verbose=False, the FileCallbackHandler will still write to 'output.log'
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler], verbose=True)
answer = chain.run(number=2)

运行结果:

在这里插入图片描述

题外话:上面的log文件打开后有点乱码,可以用下面方法解析展示出来:

pip install --upgrade ansi2html
pip install ipython
from ansi2html import Ansi2HTMLConverter
from IPython.display import HTML, displaywith open("output.log", "r") as f:content = f.read()conv = Ansi2HTMLConverter()
html = conv.convert(content, full=True)display(HTML(html))

2.4 Token计数:get_openai_callback

Token就是Money,所以知道你的程序运行中使用了多少Token也是非常重要的。通过get_openai_callback来获取token消耗。

from langchain.callbacks import get_openai_callback
from langchain_openai import OpenAIllm = OpenAI(temperature=0)
with get_openai_callback() as cb:llm("What is the square root of 4?")total_tokens = cb.total_tokens
print("total_tokens: ", total_tokens)## 输出结果:total_tokens:  20

3. 总结

本文我们学习了LangChain的Callbacks模块,实践了各种 CallBack 的用法,知道了怎么利用LangChain进行写日志文件、Token计数等。这对于我们debug程序和监控程序的各个阶段非常重要。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是同学小张
  • 欢迎 点赞 + 关注 👏,促使我持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏
  • 踩坑不易,感谢关注和围观

本站文章一览:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

02.数据结构

一、链表 作用&#xff1a;用于写邻接表&#xff1b; 邻接表作用&#xff1a;用于存储图或树&#xff1b; 1、用数组模拟单链表 #include<iostream> using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示结点i的值 // ne[i] 表示结点i的ne…

mac IDEA基础配置和激活+maven配置+scala插件导入+scala文件打包

文章目录 下载IDEA通过插件激活下载Maven在IDEA上配置Maven在IDEA上加载Scala插件在IDEA中创建Maven项目在IDEA上通过Maven打包scala文件 下载IDEA通过插件激活 IDEA从这里下载&#xff0c;下载首次登陆需要创建一个IntelliJ账号&#xff0c;登陆后点击start trail开启一个月的…

获IROS最佳移动操作论文提名|通研院提出首个实现连续操作任务的空中具身智能机器人CORVUS(渡鸦)

论文导读 本文介绍了通研院机器人实验室发表于2023年国际机器人顶级会议IROS上的论文&#xff0c;题为《Sequential Manipulation Planning for Over-actuated Unmanned Aerial Manipulators》[1]。文章介绍了一种可以实现空中全向平稳飞行的过驱动空间机械臂平台Coordinated …

###C语言程序设计-----C语言学习(12)#进制间转换,十进制,二进制,八进制,十六进制

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 计算机处理的所有信息都以二进制形式表示&#xff0c;即数据的存储和计算都采…

Python高级进阶--多线程爬取下载小说(基于笔趣阁的爬虫程序)

目录 一、前言 1、写在前面 2、本帖内容 二、编写代码 1、抓包分析 a、页面分析 b、明确需求 c、抓包搜寻 2、编写爬虫代码 a、获取网页源代码 b、提取所有章节的网页源代码 c、下载每个章节的小说 d、 清洗文件名 e、删除子文件夹 f、将下载的小说的所有txt文件…

【数学建模】【2024年】【第40届】【MCM/ICM】【F题 减少非法野生动物贸易】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem F: Reducing Illegal Wildlife Trade Illegal wildlife trade negatively impacts our environment and threatens global biodiversity. It is estimated to involve up to 26.5 billion US dollars per y…

【数据库】Unlogged 表使用

【数据库】Unlogged 表使用 前言普通表和Unlogged 表的写性能比较普通表创建和数据插入Unlogged 表创建和数据插入比较结果 Unlogged 表崩溃和正常关闭测试Unlogged 表特点总结 前言 大神偶像在开会上提及了Unlogged 表&#xff0c;它的特点很不错&#xff0c;很适合实时数据保…

如何部署一个高可用的 Linux 集群?

部署一个高可用的 Linux 集群需要经过多个步骤和考虑因素。以下是一个简要的指南&#xff0c;帮助您了解如何部署一个高可用的 Linux 集群&#xff1a; 确定需求和目标&#xff1a;在开始部署之前&#xff0c;您需要明确高可用性的定义和目标。对于一些组织而言&#xff0c;高…

【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 本章节内容为【实现动静态数码管】项目的第四个模块完整章节&#xff1a;传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货持…

react函数组件中使用context

效果 1.在父组件中创建一个createcontext并将他导出 import React, { createContext } from react import Bpp from ./Bpp import Cpp from ./Cpp export let MyContext createContext(我是组件B) export let Ccontext createContext(我是组件C)export default function App…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC&#xff0c;服务器上面安装了Ubuntu&#xff0c;想着可以在服务器接个串口到BMC&#xff0c;然后SSH到服务器的Ubuntu&#xff0c;用minicom来查看串口信息。 准备&#xff1a; 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…

springboot177健身房管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Linux(Ubuntu) 环境搭建:Nginx

注&#xff1a;服务器默认以root用户登录 NGINX 官方网站地址&#xff1a;https://nginx.org/en/NGINX 官方安装文档地址&#xff1a;https://nginx.org/en/docs/install.html服务器的终端中输入以下指令&#xff1a; # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…

【电路笔记】-串联电感

串联电感 文章目录 串联电感1、概述2、电感串联示例13、互耦串联电感器4、电感串联示例25、电感串联示例36、总结 当电感器以菊花链方式连接在一起并共享公共电流时&#xff0c;它们可以串联连接在一起。 1、概述 这些电感器的互连产生了更复杂的网络&#xff0c;其总电感是各…

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09;1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09; 作者&#xff1a;胖头鱼的鱼…

【python】网络爬虫与信息提取--requests库

导学 当一个软件想获得数据&#xff0c;那么我们只有把网站当成api就可以 requests库:自动爬取HTML页面&#xff0c;自动网络请求提交 robots协议&#xff1a;网络爬虫排除标准&#xff08;网络爬虫的规则&#xff09; beautiful soup库&#xff1a;解析HTML页面 工具&…

nginx2

mkdir /usr/local/develop cd /usr/local/develop 下载 wget http://nginx.org/download/nginx-1.17.4.tar.gz 解压文件 tar zxmf nginx-1.17.4.tar.gz 进入解压目录 cd nginx-1.17.4/ 安装编译工具及依赖库 都安装成功后再次执行会有下面提示 yum -y install gcc pcre-de…

SQL--多表查询

我们之前在讲解SQL语句的时候&#xff0c;讲解了DQL语句&#xff0c;也就是数据查询语句&#xff0c;但是之前讲解的查询都是单 表查询&#xff0c;而本章节我们要学习的则是多表查询操作&#xff0c;主要从以下几个方面进行讲解。 多表关系 项目开发中&#xff0c;在进行数据…

《统计学简易速速上手小册》第8章:贝叶斯统计(2024 最新版)

文章目录 8.1 贝叶斯理论基础8.1.1 基础知识8.1.2 主要案例&#xff1a;疾病诊断8.1.3 拓展案例 1&#xff1a;垃圾邮件过滤8.1.4 拓展案例 2&#xff1a;财经新闻对股价的影响 8.2 贝叶斯方法的应用8.2.1 基础知识8.2.2 主要案例&#xff1a;个性化推荐系统8.2.3 拓展案例 1&a…

寻找最优的路测线 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 评估一个网络的信号质量&#xff0c;其中一个做法是将网络划分为栅格&#xff0c;然后对每个栅格的信号质量计算。 路测的时候&#xff0c;希望选择一条信号最好…