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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87044.shtml
英文地址,請注明出處:http://en.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;但隨著…