
本文旨在解决langchain.js用户在追踪openai模型token使用量和成本时遇到的挑战。不同于python版本提供的`get_openai_callback()`,langchain.js框架中没有直接对应的api。我们将详细介绍如何通过配置llm实例的`callbacks`属性,利用`handlellmend`回调函数来实时捕获并累计每次模型运行的token消耗数据,并提供代码示例及注意事项,帮助开发者有效管理和优化llm应用成本。
在开发基于大型语言模型(LLM)的应用时,尤其是在使用OpenAI等服务时,精确追踪Token的使用量和相应的成本是至关重要的。这不仅有助于成本控制,还能为模型性能优化提供数据支持。LangChain作为一个强大的LLM应用开发框架,在Python版本中提供了便捷的get_openai_callback()机制来处理这一需求。然而,对于LangChain.js的开发者而言,寻找一个等效且有效的Token追踪方案却是一个常见的困扰。
许多从LangChain Python迁移到LangChain.js的开发者会发现,Python版本中方便的get_openai_callback()函数在J*aScript框架中并不存在。尽管尝试通过一些非官方或由聊天机器人生成的代码(例如尝试调用chain.getOpenAICallback())来解决,但这些方法往往无效,因为相关函数在LangChain.js中并不存在。这使得开发者难以直接获取每次LLM调用后的Token消耗数据。
LangChain.js提供了一个灵活的回调系统,允许开发者在LLM生命周期的不同阶段注入自定义逻辑。解决Token追踪问题的关键在于利用handleLLMEnd回调函数,它会在每次LLM调用结束时被触发。通过将此回调函数配置到LLM实例中,我们可以在模型完成响应后,从回调参数中提取Token使用量信息。
Text-To-Pokemon口袋妖怪
输入文本生成自己的Pokemon,还有各种选项来定制自己的口袋妖怪
1494
查看详情
以下是实现Token追踪的示例代码:
import { ChatOpenAI } from 'langchain/chat_models/openai';
import { BaseMessage } from 'langchain/schema';
// 定义用于累积Token使用量的变量
let totalCompletionTokens = 0; // 模型生成的Token数量
let totalPromptTokens = 0; // 用户输入的提示Token数量
let totalExecutionTokens = 0; // 总Token数量 (提示Token + 完成Token)
// 初始化ChatOpenAI实例,并配置回调函数
const llm = new ChatOpenAI({
// 配置callbacks属性,传入一个回调函数数组
callbacks: [
{
// handleLLMEnd 在每次LLM调用结束时触发
handleLLMEnd: (output, runId, parentRunId?, tags?) => {
// 从 output.llmOutput?.tokenUsage 中获取Token使用详情
const { completionTokens, promptTokens, totalTokens } = output.llmOutput?.tokenUsage || {};
// 累加Token数量,使用 ?? 0 确保在值为 undefined 时默认为 0
totalCompletionTokens += completionTokens ?? 0;
totalPromptTokens += promptTokens ?? 0;
totalExecutionTokens += totalTokens ?? 0;
console.log(`--- LLM Run ${runId} Ended ---`);
console.log(`Prompt Tokens: ${promptTokens ?? 0}`);
console.log(`Completion Tokens: ${completionTokens ?? 0}`);
console.log(`Total Tokens for this run: ${totalTokens ?? 0}`);
console.log(`Current Accumulated Total Tokens: ${totalExecutionTokens}`);
},
},
],
// 指定模型名称,注意某些模型版本可能对Token统计有特定要求
modelName: 'gpt-3.5-turbo-0613',
// 其他配置,例如温度等
temperature: 0.7,
});
// 示例:执行一次LLM调用
async function runLLMExample() {
console.log("Starting LLM call...");
const messages: BaseMessage[] = [
{ role: "user", content: "请用一句话描述什么是人工智能?" }
];
const result = await llm.call(messages);
console.log("LLM Response:", result.content);
// 可以在此处或后续需要时打印累积的Token数量
console.log("\n--- Overall Token Usage ---");
console.log(`Total Prompt Tokens: ${totalPromptTokens}`);
console.log(`Total Completion Tokens: ${totalCompletionTokens}`);
console.log(`Total Execution Tokens: ${totalExecutionTokens}`);
}
// 调用示例函数
runLLMExample().catch(console.error);
// 示例:在链中使用LLM
// 如果你使用的是ConversationalRetrievalQAChain等链,
// 只要该链内部使用了上面配置的llm实例,
// 同样会自动触发handleLLMEnd回调并累积Token。
/*
import { ConversationalRetrievalQAChain } from "langchain/chains";
import { BufferMemory } from "langchain/memory";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { MemoryVectorStore } from "langchain/vectorstores/memory";
async function runChainExample() {
const vectorStore = await MemoryVectorStore.fromTexts(
["LangChain 是一个用于开发由语言模型驱动的应用程序的框架。", "它简化了与大型语言模型的交互。"],
[{ id: 1 }, { id: 2 }],
new OpenAIEmbeddings()
);
const chain = ConversationalRetrievalQAChain.fromLLM(
llm, // 使用上面配置了回调的llm实例
vectorStore.asRetriever(),
{
memory: new BufferMemory({
memoryKey: "chat_history", // 必须与链的 memoryKey 匹配
inputKey: "question",
outputKey: "text",
returnMessages: true,
}),
returnSourceDocuments: true,
}
);
console.log("\nStarting Chain call...");
const res = await chain.call({
question: "什么是LangChain?",
chat_history: []
});
console.log("Chain Response:", res.text);
console.log("\n--- Overall Token Usage After Chain ---");
console.log(`Total Prompt Tokens: ${totalPromptTokens}`);
console.log(`Total Completion Tokens: ${totalCompletionTokens}`);
console.log(`Total Execution Tokens: ${totalExecutionTokens}`);
}
// runChainExample().catch(console.error);
*/尽管LangChain.js没有像Python版本那样直接的get_openai_callback()函数,但通过利用其灵活的callbacks机制和handleLLMEnd回调,我们依然可以有效地追踪OpenAI模型的Token使用量。这种方法不仅提供了精确的Token数据,也为开发者进行成本分析和性能优化奠定了基础。理解并正确应用这一技术,将帮助您更好地管理和维护基于LangChain.js的LLM应用。
以上就是在LangChain.js中追踪OpenAI模型Token使用量与成本的教程的详细内容,更多请关注其它相关文章!
# 运算符
# QQ营销推广活动的活动预算
# 洛龙本地网站建设
# 徐州网站建设大全
# 网站推广排名哪家有名
# 图书营销推广策略
# 北极seo
# 附近的seo方案
# 谷歌seo和page哪个好
# 网络营销及推广方式包括
# 丹寨建设网站
# 结束时
# 如何使用
# 有何
# 自定义
# 它是
# javascript
# 这一
# 自己的
# 使用量
# 回调
# 应用开发
# gpt-4
# gpt
# openai
# ai
# 回调函数
# 人工智能
# js
# java
# python
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
如何高效地基于键列值映射DataFrame中的多个列
Python定时发送QQ消息
百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置
Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理
React应用中Commerce.js数据加载与状态管理最佳实践
性能与资源监视器快捷打开
C++如何实现单例模式_C++线程安全的单例模式写法
百度网盘如何设置上传限额
极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方
德邦物流在线查询系统 德邦快递货物运输追踪
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
PHP页面重载时变量值不重置的实现方法
韩小圈网页版PC端入口 韩小圈网页版官方网站入口
《美篇》取消会员自动续费方法
J*aScript二进制处理_ArrayBuffer与Blob
J*aScript桌面应用_Electron多进程架构实战
Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解
京东物流快递破损了怎么办_京东快递破损理赔流程
《图怪兽》退出登录方法
b站网页版入口 哔哩哔哩官方网站直接进入
Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程
iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法
申通快递查询 申通物流快递单实时查询入口
如何在mysql中使用索引提示_mysql索引提示优化方法
使用Selenium在无头Chrome中交互动态菜单和复选框的策略
谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录
电脑视频号|直播|如何分享屏幕
修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现
b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法
sf漫画官网登录入口直达_sf漫画官方正版网址
c++如何掌握指针的核心用法_c++指针入门到精通指南
如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?
苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法
网易云音乐闹钟铃声设置教程
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
Python对象引用与属性赋值:理解链表中的行为
Mac hosts文件在哪里_Mac修改hosts文件详细教程
Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】
C#解析来自网络的XML流数据 实时错误处理与重试机制
Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】
composer licenses 命令:如何检查项目依赖的许可证?
c++如何使用std::thread::join和detach_c++线程生命周期管理
PHP中实现JSON数据数组分页的教程
《异星探险家》古怪的物品作用介绍
京东快递包裹信息查询入口 京东快递官方查询平台入口
苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程
POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩
sublime怎么在文件中显示代码结构大纲_sublime符号列表功能
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
精通VS Code多光标编辑以实现闪电般快速的修改
2025-11-24
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。