在LangChain.js中追踪OpenAI模型Token使用量与成本的教程


在LangChain.js中追踪OpenAI模型Token使用量与成本的教程

本文旨在解决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.js中Token追踪的挑战

许多从LangChain Python迁移到LangChain.js的开发者会发现,Python版本中方便的get_openai_callback()函数在J*aScript框架中并不存在。尽管尝试通过一些非官方或由聊天机器人生成的代码(例如尝试调用chain.getOpenAICallback())来解决,但这些方法往往无效,因为相关函数在LangChain.js中并不存在。这使得开发者难以直接获取每次LLM调用后的Token消耗数据。

解决方案:利用handleLLMEnd回调函数

LangChain.js提供了一个灵活的回调系统,允许开发者在LLM生命周期的不同阶段注入自定义逻辑。解决Token追踪问题的关键在于利用handleLLMEnd回调函数,它会在每次LLM调用结束时被触发。通过将此回调函数配置到LLM实例中,我们可以在模型完成响应后,从回调参数中提取Token使用量信息。

Text-To-Pokemon口袋妖怪 Text-To-Pokemon口袋妖怪

输入文本生成自己的Pokemon,还有各种选项来定制自己的口袋妖怪

Text-To-Pokemon口袋妖怪 1494 查看详情 Text-To-Pokemon口袋妖怪

核心实现步骤

  1. 导入必要的模块:首先,需要从langchain/chat_models/openai中导入ChatOpenAI类。
  2. 定义Token计数器:声明全局或模块作用域的变量,用于累积不同类型的Token(例如,totalCompletionTokens、totalPromptTokens、totalExecutionTokens)。
  3. 配置ChatOpenAI实例:在初始化ChatOpenAI实例时,通过callbacks属性传入一个包含自定义回调对象的数组。
  4. 实现handleLLMEnd回调:在回调对象中,定义handleLLMEnd方法。此方法接收output、runId等参数。output对象中包含了LLM调用的结果和重要的元数据,包括llmOutput?.tokenUsage,其中包含了completionTokens(完成Token)、promptTokens(提示Token)和totalTokens(总Token)。
  5. 累积Token数据:在handleLLMEnd函数内部,提取completionTokens、promptTokens和totalTokens,并将其累加到预先定义的计数器中。

示例代码

以下是实现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);
*/

注意事项与成本计算

  1. 模型版本与类型:根据原始问题和答案,特别提到将模型设置为'gpt-3.5-turbo-0613'时,Token统计功能在ChatOpenAI中表现良好。这可能意味着某些旧版本模型或非ChatOpenAI类的LLM实例在Token统计方面可能存在差异或限制。建议开发者在使用时,根据实际情况测试所选模型和LLM类的Token报告行为。
  2. llmOutput的可用性:output.llmOutput对象可能不总是存在或包含tokenUsage属性。在代码中,使用可选链操作符(?.)和空值合并运算符(??)来安全地访问这些属性,并在它们缺失时提供默认值(如0),以避免运行时错误。
  3. 链(Chain)中的应用:当您将这个配置了回调函数的llm实例传递给LangChain中的各种链(如ConversationalRetrievalQAChain)时,只要链内部调用了该llm实例,handleLLMEnd回调就会自动触发,从而实现对整个链运行过程中LLM调用的Token追踪。
  4. 成本计算:获取到Token使用量后,计算实际成本相对简单。您需要查阅OpenAI的官方定价页面,获取您所使用模型的每千Token价格。例如,如果gpt-3.5-turbo的提示Token价格为$0.0015/1K tokens,完成Token价格为$0.002/1K tokens,那么: 总成本 = (totalPromptTokens / 1000) * 提示Token价格 + (totalCompletionTokens / 1000) * 完成Token价格 请注意,不同模型和版本(如gpt-4系列)的定价策略可能不同,务必参考最新官方文档。
  5. 异步操作与并发:如果您的应用涉及多个并发的LLM调用,并且所有调用都共享同一个llm实例,那么全局的totalCompletionTokens等变量将会累积所有调用的Token。如果需要按用户会话或特定任务进行隔离的Token追踪,您可能需要将这些计数器封装在更细粒度的作用域内,例如每个请求或每个用户会话创建一个新的llm实例或一个专门的Token统计对象。

总结

尽管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

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

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

点击免费数据支持

提交您的需求,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.