LangChain.js中如何追踪OpenAI模型Token用量与成本

来源:网站主作者:老毕头衔:草根站长
导读:本期聚焦于小伙伴创作的《LangChain.js中如何追踪OpenAI模型Token用量与成本》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《LangChain.js中如何追踪OpenAI模型Token用量与成本》有用,将其分享出去将是对创作者最好的鼓励。

在LangChain.js中调用OpenAI模型时,每次交互都会产生对应的Token消耗,不同模型的Token定价存在差异,准确追踪用量和成本能够帮助开发者合理控制应用运行支出,避免不必要的资源浪费。

LangChain.js中如何追踪OpenAI模型Token用量与成本

Token用量追踪的核心原理

LangChain.js的OpenAI模型封装类在每次调用完成后,会将本次请求的Token使用数据返回到响应结果中,我们可以通过响应对象的llm_output属性获取具体的用量信息,其中包含输入Token数、输出Token数等核心数据。

关键数据字段说明

  • input_tokens:本次请求输入给模型的Token总数,包含提示词、上下文等内容
  • output_tokens:模型生成回复产生的Token总数
  • total_tokens:本次请求消耗的Token总量,等于输入Token加输出Token

基础用量追踪实现步骤

首先我们需要安装必要的依赖包,确保项目中已经引入LangChain.js的OpenAI相关模块,然后按照以下步骤实现用量提取。

1. 安装依赖

如果还未安装相关依赖,可以执行以下命令完成安装:

npm install langchain @langchain/openai

2. 编写基础追踪代码

下面的代码演示了单次调用OpenAI模型时获取Token用量的完整流程:

import { ChatOpenAI } from "@langchain/openai";

// 初始化OpenAI模型实例,替换为自己的API密钥
const model = new ChatOpenAI({
  openAIApiKey: "your_openai_api_key",
  modelName: "gpt-3.5-turbo",
});

// 调用模型并获取响应
const response = await model.invoke("请介绍一下JavaScript的闭包概念");

// 提取Token用量数据
const tokenUsage = response.llm_output?.token_usage;
if (tokenUsage) {
  console.log("输入Token数:", tokenUsage.input_tokens);
  console.log("输出Token数:", tokenUsage.output_tokens);
  console.log("总Token数:", tokenUsage.total_tokens);
} else {
  console.log("未获取到Token用量数据");
}

成本自动计算实现

获取到Token用量后,我们需要结合OpenAI对应模型的定价规则计算本次调用的成本,不同模型的输入、输出Token定价不同,需要分别处理。

定价规则参考

以下是常见OpenAI模型的参考定价(单位:美元/千Token):

模型名称输入Token单价输出Token单价
gpt-3.5-turbo0.00150.002
gpt-40.030.06
gpt-4-turbo0.010.03

成本计算代码实现

我们可以封装一个通用的成本计算函数,根据模型名称和Token用量自动计算成本:

// 定义模型定价映射表
const modelPricing = {
  "gpt-3.5-turbo": { input: 0.0015, output: 0.002 },
  "gpt-4": { input: 0.03, output: 0.06 },
  "gpt-4-turbo": { input: 0.01, output: 0.03 },
};

/**
 * 计算OpenAI模型调用成本
 * @param {string} modelName 模型名称
 * @param {number} inputTokens 输入Token数
 * @param {number} outputTokens 输出Token数
 * @returns {number} 成本(美元)
 */
function calculateCost(modelName, inputTokens, outputTokens) {
  const pricing = modelPricing[modelName];
  if (!pricing) {
    throw new Error(`未找到模型${modelName}的定价信息`);
  }
  // 转换为千Token单位计算
  const inputCost = (inputTokens / 1000) * pricing.input;
  const outputCost = (outputTokens / 1000) * pricing.output;
  return inputCost + outputCost;
}

// 结合之前的用量数据计算成本
if (tokenUsage) {
  const cost = calculateCost("gpt-3.5-turbo", tokenUsage.input_tokens, tokenUsage.output_tokens);
  console.log("本次调用成本:", cost.toFixed(6), "美元");
}

批量调用与累计统计

在实际应用场景中,我们往往需要统计多次调用的累计Token用量和总成本,可以通过维护全局计数器的方式实现:

// 累计统计变量
let totalInputTokens = 0;
let totalOutputTokens = 0;
let totalCost = 0;

// 封装带统计的模型调用函数
async function invokeWithStats(prompt, modelName = "gpt-3.5-turbo") {
  const model = new ChatOpenAI({
    openAIApiKey: "your_openai_api_key",
    modelName: modelName,
  });
  const response = await model.invoke(prompt);
  const tokenUsage = response.llm_output?.token_usage;
  if (tokenUsage) {
    // 累计用量
    totalInputTokens += tokenUsage.input_tokens;
    totalOutputTokens += tokenUsage.output_tokens;
    // 计算本次成本并累计
    const cost = calculateCost(modelName, tokenUsage.input_tokens, tokenUsage.output_tokens);
    totalCost += cost;
    // 打印本次和累计数据
    console.log(`本次调用: 输入${tokenUsage.input_tokens}Token, 输出${tokenUsage.output_tokens}Token, 成本${cost.toFixed(6)}美元`);
    console.log(`累计数据: 总输入${totalInputTokens}Token, 总输出${totalOutputTokens}Token, 总成本${totalCost.toFixed(6)}美元`);
  }
  return response;
}

// 测试多次调用
await invokeWithStats("什么是Promise");
await invokeWithStats("async和await的区别");

常见问题与注意事项

注意:部分旧版本的LangChain.js可能将Token用量放在响应的usage字段中,开发时需要根据实际使用的版本调整取值路径。

如果调用的是OpenAI的流式输出接口,Token用量数据会在流式响应结束后统一返回,不能在流式传输过程中获取实时用量。另外如果使用了LangChain的链或者代理模式,需要确保最后一步模型调用的响应能够被正确捕获,避免用量数据丢失。

当切换不同模型时,记得及时更新定价映射表中的对应价格,避免成本计算出现偏差,OpenAI的定价可能会调整,建议定期核对最新的官方定价规则。

LangChain.jsOpenAIToken用量追踪成本计算修改时间:2026-07-07 17:06:36

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。