[LangChain] 23. 回调机制

news/2025/11/26 22:58:54/文章来源:https://www.cnblogs.com/Answer1215/p/19274899

invoke/stream() 方法,方法签名如下:

invoke/stream(input: Input,options?: RunnableConfig
): AsyncGenerator<StreamEvent<Output>>

1. 输入参数 (input)

类型:Input

invoke() 方法保持一致:

  • 如果是 LLM:可以传字符串、BaseMessageBaseMessage[]
  • 如果是 Chain / Runnable:则是该 Chain 约定的输入对象(例如 { input: "..." }
  • 如果是 Embeddings:通常是字符串或字符串数组

换句话说,input 的类型由具体的 Runnable 实例 决定。

2. 配置参数

类型:RunnableConfig(可选)
常见字段包括:

  • configurable:运行时传入的上下文配置(例如用户 ID、对话 ID,用于内存/持久化关联)。
  • tags:给运行标记,用于调试、Tracing。
  • metadata:附加元信息,方便日志或监控。
  • callbacks:传入回调函数(如 handleLLMNewToken 等),可用于实时处理 token。类似于生命周期钩子方法。
  • maxConcurrency:并发控制。
  • timeout:超时设置。

对具体模型(如 ChatOpenAI)而言,它的 CallOptions 还会扩展出模型厂商特定的调用参数(例如 stoptools 等)。

callbacks 配置项对应的值是一个「回调对象数组」,允许你监听和响应模型执行过程中的关键事件。

{callbacks: [{handleLLMStart(llm, prompts) {console.log("模型开始运行", prompts);},handleLLMEnd(output) {console.log("模型运行完成", output);},handleLLMError(error) {console.error("模型出错", error);},}]
}

这些对象中的函数就是回调钩子方法,每个钩子对应一个事件点:

钩子函数名 触发时机 说明
handleLLMStart(llm, prompts) 模型开始调用前 llm 为当前模型实例,prompts 是输入
handleLLMEnd(output) 模型生成成功返回结果时 output 是一个 LLMResult 对象
handleLLMError(error) 模型调用出错时 error 为异常对象
handleLLMNewToken 生成新token的时候 流式响应模式下,每个 token 输出时

课堂演示

演示 callbacks 的使用

import { ChatOpenAI } from "@langchain/openai";
import dotenv from "dotenv";
dotenv.config();
import { fileLoggingHandler } from "./fileLog.js";
import { consoleLoggingHandler } from "./consoleLog.js";const llm = new ChatOpenAI({model: "gpt-4o-mini",temperature: 0,apiKey: process.env.API_KEY,streaming: true,
});const stream = await llm.stream("你好", {callbacks: [fileLoggingHandler,consoleLoggingHandler,],
});for await (const chunk of stream) {process.stdout.write(chunk.content);
}
export const consoleLoggingHandler = {handleLLMStart() {console.log("模型即将开始运行...");},handleLLMEnd() {console.log("模型输出已完成。");},handleLLMError(err) {console.error("模型执行出错:", err.message);},
};
export const consoleLoggingHandler = {handleLLMStart() {console.log("模型即将开始运行...");},handleLLMEnd() {console.log("模型输出已完成。");},handleLLMError(err) {console.error("模型执行出错:", err.message);},
};

除了上面介绍的这些钩子方法以外,常用的钩子方法还有这些:

钩子名称 触发时机 典型用途
handleLLMStart 模型开始执行前 打印提示、启动计时器
handleLLMEnd 模型生成结束后 打印结果、计算时长
handleLLMError 模型执行中出错 捕获错误、上报日志
handleToolStart 工具调用前 查看参数、记录调用链
handleToolEnd 工具调用成功返回后 打印输出
handleChainStart 链条开始运行前 输出入口信息
handleChainEnd 链条运行完成 打印最终输出、分析执行树

插件化处理

可以将其做成一个插件,这样更清晰、可复用性更强。

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

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

相关文章

本地环境自建的es重启,http和https访问es,nested数据类型及设置es别名

本地环境自建的es重启,http和https访问es,nested数据类型及设置es别名本地环境自建的es重启,http和https访问es,nested数据类型及设置es别名 link:https接口的支持判断,http升级到https需求https://www.cnblogs.com/…

一文入门 LangChain 开发

2024-05-22 [[Ollama]] [[N_LangChain]] [[N_LangGraph]] LangChain github langchain 项目页 github langgraph 项目页 官方文档 introduction 官方文档 0.2 introductio 0.2 langserve 官方文档 0.1 Components La…

freedom of speech

but N cannot be bad. I think its just the difference between cultures.

七、设备模型

一、概述kobject内核抽象出来的通用对象,对应/sys目录下的一个文件 kset是kobject的一个扩展,一个kset尅包含多个kobject,将多个kobject通过parent进行关联,实现了层次化的结构 sysfs虚拟文件系统,向用户空间提供…

Scrum冲刺阶段 Day Three

一、站立会议纪要 1. 已完成工作 后端开发:设计用户与文件表结构 实现注册登录接口 实现文件上传接口 实现全局异常处理 封装请求拦截器前端开发:搭建前端基础框架 开发注册登录页面2. 今日计划工作实现文件列表查询…

鼎鉴时代锋芒 智启品牌新章 ——2025品牌智鉴榜荣耀登临

当全球产业重构与消费升级浪潮澎湃交汇,品牌早已成为衡量时代实力的核心标尺,更是穿越周期、引领变革的核心力量。2024 品牌智鉴榜,以 “智识为基、专业为刃、价值为魂”,历经百日全域筛查、多维体系核验、业界权威…

深入解析:MTK5G旗舰系列——天玑9500/9400/9300/9200/9000在AI和处理器性能、DDR频率及UFS的深度对比分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

迈向人机共育的文明语法:AI元人文理论体系深度阐释——内观照叙事模型

迈向人机共育的文明语法:AI元人文理论体系深度阐释——内观照叙事模型 我们正站在一个文明史的奇点上。人工智能不再是遥远的科幻,而是深度介入社会运作、伦理决策与意义构建的“文明参与者”。传统的“价值对齐”范…

Day25综合案例一--CSS精灵--京东服务

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

Intellij扩展列表

开发idea插件,需要找到可用的扩展点,之前都是直接在网上搜索,最近详细看了下官方文档, 发现已经给我们列好了所有可用的扩展点 文档位置 https://plugins.jetbrains.com/docs/intellij/plugin-extensions.html#exp…

agentic terminal coding

opencode: https://github.com/sst/opencode The AI coding agent built for the terminalWhat is OpenCode? OpenCode is an open source agent that helps you write and run code directly from the terminal.[*] …

the badness of USA

it has no bad review. Maybe R/N/G can get the real worst some, but theres no even in the people they killed so much. so USA never changes. somehow.

Day3 Scrum冲刺博客

Day3 Scrum冲刺博客 1. 团队会议 todo补充会议照片 1)昨天已完成的工作前端实现个人设置弹窗以及问答模式静态页面,实现问答模式缓存 "关于我们"细节修正后端完成爬虫数据的数据清洗 增加爬虫程序适配的信…

完整教程:内核里常用宏BUG_ON/WARN_ON/WARN_ONCE

完整教程:内核里常用宏BUG_ON/WARN_ON/WARN_ONCE2025-11-26 22:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

贪心专题笔记(从b站左程云老师那上完后的笔记)

https://www.bilibili.com/video/BV1ST4y1s7XT/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=56781f0f92104550238c449cb1aebd72 关键:用对数器验证 1.如果要排序,保证排序具有…

Agent编写全攻略(超详细)从零基础到精通,一篇搞定,不看后悔,赶紧收藏!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做题警醒

1.一定要写边界条件,不要偷懒不要偷懒!!! 经典案例题目https://www.luogu.com.cn/problem/P3763 这里一开始没把根节点单独考虑,直接将st1的赋值为0,st2的也复制为0 2.链式向前星建完图遍历是注意head[]写的是节点不…

动态规划可能性展开

1.以结尾展开可能性 从0……i中,判断i,然后调用0……i-1的可能性(可以是以i这个下标为结尾,也可以是0……i的范围上,也可以是以i下标所放的值进行展开) 2.定义往往从递归的定义出发,但是为了避免讨论边界的麻烦…

微软发布 Godot C# 游戏开发教程:godot-csharp-essentials

对于希望踏入游戏开发领域的 C# 开发者来说,一个令人振奋的好消息是:微软在其 GitHub 上发布了一个全新的开源项目microsoft/godot-csharp-essentials:https://github.com/microsoft/godot-csharp-essentials。这个仓…