langchain callback学习

news2025/1/19 23:17:53

文章目录

  • 一.quickstart
  • 二.Async callbacks
  • 三.把回调消息写入文件
    • 如何提取出来
      • 正则表达式
      • 官方的方法

一.quickstart

  • 官方文档在此:https://python.langchain.com/docs/modules/callbacks/

  • 发现自己之前用langchain都是纯纯只是跑通,要能灵活使用还是得深入研究一下框架的,还有仔细看文档的…

  • callback其实就是当时刚开始用langchain感觉神奇的地方,就是各种行为都能看到输出

  • 跑一下官方的demo
    在这里插入图片描述

  • LangChain 的回调系统允许开发者在 LLM 应用程序的各个阶段设置hook。这意味着,无论是日志记录、监控、数据流处理还是其他任何任务,开发者都可以精确地控制和管理。

    开发者可以通过使用 API 中的回调参数来订阅不同的事件。这些事件对应于处理器对象的列表,它们是预定义的并期望按照特定方式实现。

  • 回调处理程序

    在 LangChain 中,CallbackHandlers 是实现 CallbackHandler 接口的对象。这个接口为开发者提供了一系列方法,每个方法对应于可以被订阅的事件。

    LangChain 中定义了一个 BaseCallbackHandler 类,这是一个基本的回调处理程序,它提供了处理来自 LangChain 的回调的功能。
    在这里插入图片描述

  • 在 LangChain 的 API 中,几乎所有的对象(例如 Chains、Models、Tools、Agents 等)都支持回调参数。可以在两个主要位置使用它:

  • 构造函数回调:这些是在对象创建时定义的,并且对于该对象上的所有调用都是通用的。

  • 请求回调:这些是在执行方法(如 run() 或 apply())时定义的,并且仅适用于特定的请求。

    此外,API 的大多数对象都支持 verbose 参数。这是一个非常有用的工具,特别是在调试过程中,因为它会将所有事件记录到控制台。

二.Async callbacks

import asyncio
from typing import Any, Dict, List

from langchain.chat_models import ChatOpenAI
from langchain.schema import LLMResult, HumanMessage
from langchain.callbacks.base import AsyncCallbackHandler, BaseCallbackHandler


class MyCustomSyncHandler(BaseCallbackHandler):
    def on_llm_new_token(self, token: str, **kwargs) -> None:
        print(f"Sync handler being called in a `thread_pool_executor`: token: {token}")


class MyCustomAsyncHandler(AsyncCallbackHandler):
    """Async callback handler that can be used to handle callbacks from langchain."""

    async def on_llm_start(
        self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
    ) -> None:
        """Run when chain starts running."""
        print("zzzz....")
        await asyncio.sleep(0.3)
        class_name = serialized["name"]
        print("Hi! I just woke up. Your llm is starting")

    async def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
        """Run when chain ends running."""
        print("zzzz....")
        await asyncio.sleep(0.3)
        print("Hi! I just woke up. Your llm is ending")


# 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=[MyCustomSyncHandler(), MyCustomAsyncHandler()],
)

await chat.agenerate([[HumanMessage(content="Tell me a joke")]])

在这里插入图片描述
注意 await chat.agenerate([[HumanMessage(content="Tell me a joke")]]) 这个写法在jupyternotebook中可以,.py文件不行
.py文件中可以像下面这样

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(chat.agenerate([[HumanMessage(content="Tell me a joke")]]))
    loop.close()

在这里插入图片描述

三.把回调消息写入文件

  • https://python.langchain.com/docs/modules/callbacks/filecallbackhandler
    在这里插入图片描述

  • 跑一下它的demo

    from loguru import logger
    
    from langchain.callbacks import FileCallbackHandler
    from langchain.chains import LLMChain
    from langchain.llms import OpenAI
    from langchain.prompts import PromptTemplate
    
    logfile = "output.log"
    
    logger.add(logfile, colorize=True, enqueue=True)
    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)
    logger.info(answer)
    

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

如何提取出来

正则表达式

  • chatgpt教我的
    在这里插入图片描述
  • 试了下有点问题
    在这里插入图片描述
    第一步没提取干净,然后最后1+2=3的3也没写出来

官方的方法

在这里插入图片描述
在这里插入图片描述

跑一下试试
在这里插入图片描述

  • 不过注意到这个html,那就简单了,用爬虫库就行

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'html.parser')
    
    # 提取<pre>标签中的内容
    pre_content = soup.find('pre', class_='ansi2html-content')
    
    # 获取所有的文本内容
    texts = pre_content.get_text().split('\n')
    
    # 过滤掉空行
    filtered_texts = [text.strip() for text in texts if text.strip()]
    
    print('\n'.join(filtered_texts))
    

    在这里插入图片描述
    之后可以把这个转换和提取流程加入到LLM chain运行过程中,就可以把东西提取出来了 ~

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

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

相关文章

freefilesync文件同步软件

下载 下载链接 https://freefilesync.org/download.php 往下拉&#xff0c;看到下载的链接 下载windows版本 下载地址&#xff1a; https://freefilesync.org/download/FreeFileSync_13.0_Windows_Setup.exe 直接复制到浏览器中访问就能下载 安装 双击安装包&#xff0c;一路默…

总结:JavaEE的Servlet中HttpServletRequest请求对象调用各种API方法结果示例

总结&#xff1a;JavaEE的Servlet中HttpServletRequest请求对象调用各种API方法结果示例 一方法调用顺序是按照英文字母顺序从A-Z二该示例可以用作servlet中request的API参考&#xff0c;从而知道该如何获取哪些路径参数等等三Servlet的API版本5.0.0、JSP的API版本&#xff1a;…

创建QDialog工程

创建QDialog工程 换掉图标 添加一个组件 水平布局 所有原件横向布局完成后&#xff0c;选中外框&#xff0c;点击Dialog,进行纵向布局 调整文本字体的大小 清空按钮的槽函数 下划线的槽函数 斜体的槽函数 加粗的槽函数 或者使用快剪辑&#xff1a;…

文心一言:文心大模型 4.0 即将发布

本心、输入输出、结果 文章目录 文心一言:文心大模型 4.0 即将发布前言文心 4.0 的成本问题架构文心 4.0 是否可以对标 GPT-4文心4.0 会不会收费弘扬爱国精神文心一言:文心大模型 4.0 即将发布 编辑:简简单单 Online zuozuo 地址:https://blog.csdn.net/qq_15071263 前言 …

【Java 进阶篇】JavaScript电灯开关案例:从原理到实现

JavaScript是一门强大的编程语言&#xff0c;它可以用来创建各种交互式网页应用。在这篇博客中&#xff0c;我们将通过一个简单的电灯开关案例来深入了解JavaScript的基础概念&#xff0c;包括HTML、CSS和JavaScript的结合使用。我们将从头开始构建这个案例&#xff0c;逐步引入…

Megatron-LM GPT 源码分析(一) Tensor Parallel分析

引用 本文基于开源代码 https://github.com/NVIDIA/Megatron-LM &#xff0c;通过GPT的模型运行示例&#xff0c;从三个维度 - 模型结构、代码运行、代码逻辑说明 对其源码做深入的分析。 Tensor Parallel源码分析

LabVIEW生产者消费者架构

LabVIEW生产者消费者架构 生产者/消费者模式可以轻松地同时处理多个进程&#xff0c;同时还能以不同速率迭代。 缓冲通信 当多个进程以不同速度运行时&#xff0c;就适合采用进程间缓冲通信。有了足够大的缓冲区后&#xff0c;生产者循环可以以快于消费者循环的速度运行&…

Java实现一个Redis可视化工具

https://github.com/tanhuang2016/RedisDesktopManagerFX https://gitee.com/hod_th/RedisDesktopManagerFX 老铁们,上面两个地址帮我点个star呢,谢谢 基本功能后面慢慢完善,有想法可以提需求哦 基本操作 string类型操作 list hash set zset类型操作

C++继承探究

文章目录 一、继承相关概念1、 基本概念2、继承方式3、如何构造基类4、基类和派生类对象赋值转换5、继承中的作用域 二、菱形继承的问题及解决方案三、虚继承的原理四、继承 VS 组合 一、继承相关概念 1、 基本概念 代码复用是编程语言设计的核心&#xff0c;对于一个函数&…

数学之-曼德勃罗

参考: 分形系统介绍以及代码实现 - 知乎 Java实现高分辨率曼德伯罗特集 - 知乎 Mandelbrot集的最新变化形态一览——MandelBox&#xff0c;Mandelbulb&#xff0c;Burning Ship&#xff0c;NebulaBrot-CSDN博客

VL53L5CX驱动开发(5)----运动阈值检测

VL53L5CX驱动开发----5.运动阈值检测 概述视频教学样品申请源码下载生成STM32CUBEMX选择MCU串口配置IIC配置 INT设置配置使能与复位X-CUBE-TOF1串口重定向代码配置检测流程TOF代码配置主程序演示结果 概述 本章目的是展示如何充分利用VL53L5CX传感器的高级特性&#xff0c;通过…

【LLM微调范式1】Prefix-Tuning: Optimizing Continuous Prompts for Generation

论文标题&#xff1a;Prefix-Tuning: Optimizing Continuous Prompts for Generation 论文作者&#xff1a;Xiang Lisa Li, Percy Liang 论文原文&#xff1a;https://arxiv.org/abs/2101.00190 论文出处&#xff1a;ACL 2021 论文被引&#xff1a;1588&#xff08;2023/10/14&…

C# 图解教程 第5版 —— 第6章 方法

文章目录 6.1 方法的结构6.2 方法体内部的代码执行6.3 局部变量6.3.1 类型推断和 var 关键字6.3.2 嵌套块中的局部变量 6.4 局部常量6.5 控制流6.6 方法调用&#xff08;*&#xff09;6.7 返回值&#xff08;*&#xff09;6.8 返回语句和 void 方法6.9 局部函数6.10 参数&#…

关于数据链路层(初步)

以太网帧格式&#xff1a; 源地址和目的地址是指网卡的硬件地址&#xff08;也叫MAC地址&#xff09;&#xff0c;长度是48位&#xff0c;是在网卡出厂时固 化的&#xff1b; 帧协议类型字段有三种值&#xff0c;分别对应载荷的形式&#xff0c;有IP、ARP、RARP&#xff1b; …

Go-Python-Java-C-LeetCode高分解法-第十周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏&#xff0c;每日一题&#xff0c;和博主一起进步 LeetCode专栏 我搜集到了50道精选题&#xff0c;适合速成概览大部分常用算法 突…

LuaJit交叉编译移植到ARM Linux

简述 Lua与LuaJit的主要区别在于LuaJIT是基于JIT&#xff08;Just-In-Time&#xff09;技术开发的&#xff0c;可以实现动态编译和执行代码&#xff0c;从而提高了程序的运行效率。而Lua是基于解释器技术开发的&#xff0c;不能像LuaJIT那样进行代码的即时编译和执行。因此&…

手摸手Redis7配置哨兵模式(一主二从三哨兵)

安装redis #安装gcc yum -y install gcc gcc-c #安装net-tools yum -y install net-tools #官网https://redis.io/ cd /opt/ wget http://download.redis.io/releases/redis-7.0.4.tar.gz 解压至/opt/目录下 tar -zxvf redis-7.0.4.tar.gz -C /opt/ #编译安装 make make ins…

解决“本地计算机上的 mysql 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止”

电脑在服务中启动mysql报 如果你之前没有修改过数据库相关文件那么执行以下步骤 1.在数据库的根目录删除data文件&#xff08;删除前最好先备份一下&#xff09; 2&#xff0c;然后重新创建一个data文件夹 3.点击进入bin目录&#xff0c;点击上面的路径 4.点击后上面路径变蓝…

MATLAB——BP神经网络信号拟合程序

欢迎关注公众号“电击小子程高兴的MATLAB小屋” %% 学习目标&#xff1a;BP神经网络 %% 函数逼近 数据压缩 模式识别 %% 考虑要素&#xff1a;网络层数 输入层的节点数 输出层的节点数 隐含层的节点数 %% 传输函数 训练方法 %% 对信号曲线进行拟合 clear all; cle…

04_led灯闪烁

创建新的项目&#xff0c;步骤和教程2一样&#xff0c;项目结构和创建后的代码如下所示 具体代码如下所示&#xff1a;使用16进制加延迟的方式控制led的亮灭0表示亮1表示灭 #include <REGX52.H> #include <INTRINS.H> void Delay500ms() //11.0592MHz {unsigne…