LangChain.js中追踪OpenAI模型Token用量与成本的实现指南


langchain.js中追踪openai模型token用量与成本的实现指南

本教程详细介绍了如何在LangChain.js项目中准确追踪OpenAI模型(如GPT-3.5-turbo)的Token用量和运行成本。针对LangChain.py中`get_openai_callback()`在J*aScript框架中缺失的问题,我们将重点讲解如何利用LangChain.js的`callbacks`属性,通过实现`handleLLMEnd`回调函数来实时捕获并累计每次LLM运行的提示词和完成Token,从而有效管理和分析模型消耗。

引言:LangChain.js中Token用量追踪的挑战

在开发基于大型语言模型(LLM)的应用时,准确追踪Token的消耗至关重要,它直接关系到成本控制和性能优化。在LangChain的Python版本中,get_openai_callback()提供了一个便捷的方式来获取LLM调用的Token用量和成本。然而,在LangChain.js框架中,并没有一个直接对应的getOpenAICallback()函数,这使得许多开发者在尝试获取这些数据时遇到了困难。

例如,一些开发者可能会尝试使用如下代码(由一些AI助手提供),但会发现chain.getOpenAICallback等方法并不存在于LangChain.js的实际API中:

// 这是一个错误的尝试,该函数在LangChain.js中不存在
const { Chain } = require("langchain");

async function getChainRunCost(chainRunId) {
  const chain = new Chain();
  const callback = await chain.getOpenAICallback(chainRunId); // ❌ 此函数不存在
  const cost = callback.cost;
  return cost;
}

本文将深入探讨LangChain.js中正确追踪OpenAI模型Token用量的方法,核心在于利用其强大的回调(Callbacks)机制。

理解LangChain.js中的回调机制

LangChain.js提供了一个灵活的回调系统,允许开发者在LLM或链(Chain)执行过程中的不同阶段插入自定义逻辑。这些回调函数可以在LLM开始、结束、错误发生时被触发,从而提供了一个观察和干预执行流程的窗口。对于Token用量追踪,我们主要关注handleLLMEnd这个回调事件,它在每次LLM调用完成时触发,并提供该次调用的详细输出信息,包括Token用量。

实现Token用量追踪

要在LangChain.js中追踪Token用量,我们需要在初始化LLM实例时,通过callbacks属性配置一个回调处理器。在这个处理器中,我们将实现handleLLMEnd方法来捕获Token数据。

核心代码示例

以下代码展示了如何使用ChatOpenAI模型,并配置handleLLMEnd回调函数来累计Prompt Token、Completion Token和总Token用量:

达奇AI论文写作 达奇AI论文写作

达奇AI论文辅助写作平台,在校学生、职场精英都在用的AI论文辅助写作平台

达奇AI论文写作 106 查看详情 达奇AI论文写作
import { ChatOpenAI } from 'langchain/chat_models/openai';
import { HumanMessage } from 'langchain/schema'; // 用于构造Chat模型输入

// 定义全局变量用于累计Token用量
// 在实际应用中,这些变量可能需要存储在更持久的存储中,或与用户会话关联
let totalCompletionTokens = 0;
let totalPromptTokens = 0;
let totalExecutionTokens = 0;

// 初始化ChatOpenAI模型实例,并配置回调
const llm = new ChatOpenAI({
    // 配置回调函数数组
    callbacks: [
      {
        /**
         * 在LLM调用结束时触发
         * @param {object} output - LLM调用的输出结果
         * @param {string} runId - 当前运行的唯一ID
         * @param {string} [parentRunId] - 父级运行的ID
         * @param {string[]} [tags] - 与运行相关的标签
         */
        handleLLMEnd: (output, runId, parentRunId, tags) => {
          // 从输出中提取Token用量信息
          // 注意:llmOutput?.tokenUsage 结构可能因模型和版本而异,建议进行空值检查
          const { completionTokens, promptTokens, totalTokens } = output.llmOutput?.tokenUsage || {};

          // 累计Token用量
          totalCompletionTokens += completionTokens ?? 0;
          totalPromptTokens += promptTokens ?? 0;
          totalExecutionTokens += totalTokens ?? 0;

          console.log(`--- LLM Run ID: ${runId} ---`);
          console.log(`  Prompt Tokens (本次): ${promptTokens ?? 0}`);
          console.log(`  Completion Tokens (本次): ${completionTokens ?? 0}`);
          console.log(`  Total Tokens (本次): ${totalTokens ?? 0}`);
          console.log(`  累计 Prompt Tokens: ${totalPromptTokens}`);
          console.log(`  累计 Completion Tokens: ${totalCompletionTokens}`);
          console.log(`  累计 Total Tokens: ${totalExecutionTokens}`);
        },
      },
    ],
    modelName: 'gpt-3.5-turbo-0613', // 推荐使用此模型版本以确保Token追踪的准确性
    temperature: 0.7, // 其他LLM配置,例如温度
    // openaiApiKey: process.env.OPENAI_API_KEY, // 确保您的API Key已配置
});

// 示例:如何使用这个LLM实例进行多次调用
async function runTokenTrackingExample() {
    console.log("--- 第一次LLM调用 ---");
    const response1 = await llm.call([
        new HumanMessage('请用一句话介绍大型语言模型。')
    ]);
    console.log("Response 1:", response1.content);

    console.log("\n--- 第二次LLM调用 ---");
    const response2 = await llm.call([
        new HumanMessage('请简述LangChain框架的核心作用。')
    ]);
    console.log("Response 2:", response2.content);

    console.log("\n--- 所有LLM调用结束 ---");
    console.log(`最终累计 Prompt Tokens: ${totalPromptTokens}`);
    console.log(`最终累计 Completion Tokens: ${totalCompletionTokens}`);
    console.log(`最终累计 Total Tokens: ${totalExecutionTokens}`);

    // 根据Token用量估算成本 (示例,实际成本请参考OpenAI定价)
    // 以下价格基于GPT-3.5 Turbo 0613模型,请查阅最新官方定价
    const promptCostPerKToken = 0.0015; // 每千个输入Token的价格 (美元)
    const completionCostPerKToken = 0.002; // 每千个输出Token的价格 (美元)

    const estimatedCost = 
        (totalPromptTokens / 1000) * promptCostPerKToken + 
        (totalCompletionTokens / 1000) * completionCostPerKToken;

    console.log(`估算总成本: $${estimatedCost.toFixed(6)}`);
}

// 运行示例函数
runTokenTrackingExample();

代码解析

  1. 全局变量: totalCompletionTokens, totalPromptTokens, totalExecutionTokens 用于在多次LLM调用之间累计Token用量。在实际应用中,这些变量可能需要与特定的用户会话或请求上下文绑定。
  2. ChatOpenAI初始化: 在创建ChatOpenAI实例时,传入一个callbacks数组。数组中的每个元素都是一个回调对象。
  3. handleLLMEnd方法: 这是关键所在。当LLM完成一次响应后,handleLLMEnd会被调用。
    • output参数包含了LLM调用的结果,其中output.llmOutput?.tokenUsage对象存储了本次调用的completionTokens(完成Token)、promptTokens(提示词Token)和totalTokens(总Token)。
    • 我们通过解构赋值获取这些值,并使用空值合并运算符?? 0确保在tokenUsage不存在时默认为0,提高代码健壮性。
    • 将获取到的Token用量累加到全局变量中。
  4. modelName: 'gpt-3.5-turbo-0613': 原始问题提到,在特定版本(如0.0.116)的LangChain.js中,使用ChatOpenAI和gpt-3.5-turbo-0613模型能够更可靠地返回Token用量。对于其他模型或LLM类型,可能需要进行测试验证。
  5. 成本估算: 示例中包含了基于OpenAI官方定价的简单成本估算逻辑。请务必参考OpenAI最新的定价信息。

注意事项与最佳实践

  1. 模型与版本兼容性:

    • ChatOpenAI与特定模型: 原始问题中提到,在LangChain.js的0.0.116版本中,使用ChatOpenAI结合modelName: 'gpt-3.5-turbo-0613'可以稳定地获取Token用量。对于其他模型或LLM类型(如OpenAI而非ChatOpenAI),或不同版本的LangChain.js,Token用量报告的准确性可能会有所不同,甚至可能无法获取。建议开发者在实际项目中进行测试验证。
    • 框架更新: LangChain.js是一个快速迭代的框架,API可能会发生变化。务必查阅最新官方文档,以确保回调机制和Token用量报告的兼容性。
  2. 集成到复杂链中:

    • 即使您使用的是ConversationalRetrievalQAChain、BufferMemory和向量搜索等复杂组件,只要最终调用的底层LLM实例(例如ChatOpenAI)配置了callbacks,handleLLMEnd函数就能够捕获到每次LLM交互的Token用量。这是因为这些高级链的执行流程中,仍然会触发其内部LLM实例的调用。
  3. 成本估算:

    • 获取Token用量是进行成本估算的基础。您可以根据OpenAI官方公布的定价模型(通常按每千个输入/输出Token计费)来计算每次LLM调用或整个会话的预估成本。
    • 示例成本计算公式:总成本 = (累计提示词Token / 1000) * 提示词单价 + (累计完成Token / 1000) * 完成单价 请注意,OpenAI的定价会根据模型版本和类型有所不同,务必参考最新的官方价格表。
  4. 数据持久化与监控:

    • 在生产环境中,简单地使用全局变量累计Token可能不足。您可能需要将这些数据发送到日志系统、监控平台或数据库中,以便进行长期分析、生成报告和设置成本预警。
  5. 健壮性与错误处理:

    • 在handleLLMEnd回调函数中,始终对output.llmOutput?.tokenUsage进行空值或未定义检查(例如使用?.操作符和|| {}默认值),以防止因某些特殊情况(如LLM调用失败或响应格式不一致)导致程序崩溃。

总结

通过利用LangChain.js提供的回调机制,特别是handleLLMEnd函数,开发者可以有效地追踪OpenAI模型在每次运行中的Token用量。这种方法不仅解决了LangChain.py中get_openai_callback()在J*aScript框架中缺失的问题,还提供了一个灵活且强大的方式来监控和管理LLM应用的资源消耗。掌握这一技术,对于构建成本效益高、可观测性强的LLM应用至关重要。

以上就是LangChain.js中追踪OpenAI模型Token用量与成本的实现指南的详细内容,更多请关注其它相关文章!


# 运算符  # 淡水营销推广网站  # 专业的网站建设与推广  # 吴中seo优化营销推广  # 天蒙山网络营销推广渠道  # 天河高端网站建设哪个好  # 白云网站seo排名  # seo每周计划  # 抖音的seo服务  # 网站推广火丶星21  # 象山网站改版建设  # 有何  # 不存在  # 有所不同  # 它是  # javascript  # 剪切板  # 论文写作  # 它在  # 全局变量  # 回调  # cos  # gpt  # openai  # ai  # 回调函数  # 处理器  # js  # java  # python 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  使用Google服务账号实现Google Drive API无缝集成与文件访问  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  管理打开的编辑器:固定、分组和关闭技巧  解决Flex容器横向滚动内容截断与偏移问题  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  《via浏览器》强制缩放网页设置方法  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  德邦物流在线查询系统 德邦快递货物运输追踪  《下一站江湖2》风神腿获取攻略  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  获取WooCommerce产品在后台编辑页面的分类ID  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  mysql中如何配置字符集和排序规则_mysql字符集排序配置  《波斯王子:失落的王冠》剑术大师打法攻略  铁路12306官网登录入口 铁路12306在线购票官方平台  WPS文字如何进行简繁转换  b站如何管理订阅_b站订阅标签分类管理  我居然低估了 DeepSeek,这次更新它做到了这些!  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  yy漫画登录页面官方入口_yy漫画在线阅读网址入口  AO3官方镜像链接 | 最新防走失网址永久收藏  Python模块化编程:避免循环导入与共享函数的最佳实践  优化Leaflet弹出层图片显示:条件渲染策略  《腾讯相册管家》注销账号方法  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  济南公交卡手机充值指南  谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法  苹果如何下载nanobanana  《偃武》甘宁技能详解  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  口腔诊所管理软件推荐  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  盲鳗善于分泌黏液猜猜主要用来做什么  餐馆菜篮选购指南  cad视图选项卡不见了怎么办_cad视图标签恢复显示方法  OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法  网站体验不好=浪费钱:如何提升-用户体验效果差  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  优化 React onClick 事件处理:函数引用与箭头函数的对比  荣耀Magic7拍照夜景噪点处理_荣耀Magic7相机优化  江苏大剧院会员卡购买步骤  基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口  抖音作品被限流怎么办 抖音内容优化与流量恢复方法 

 2025-11-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.