在LangChain.js中调用OpenAI模型时,每次交互都会产生对应的Token消耗,不同模型的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-turbo | 0.0015 | 0.002 |
| gpt-4 | 0.03 | 0.06 |
| gpt-4-turbo | 0.01 | 0.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