
本文旨在解决LangChain.js开发者在监控OpenAI模型令牌使用量和相关成本时遇到的挑战,尤其是在缺乏Python中`get_openai_callback()`直接对应功能的情况下。文章将详细介绍如何通过利用`ChatOpenAI`模型中的`handleLLMEnd`回调函数,精确地追踪每次模型运行的提示令牌、完成令牌及总令牌消耗,从而实现更精细的成本管理和性能分析。
在开发基于LangChain.js和OpenAI的项目时,准确追踪大型语言模型(LLM)的令牌消耗是优化成本和分析性能的关键一环。与LangChain Python框架中提供便捷的get_openai_callback()方法不同,LangChain.js目前并未提供一个直接的、等价的API来轻松获取每次链运行的令牌使用和成本信息,这给许多开发者带来了困扰。本文将详细阐述一种有效的方法,通过利用LangChain.js中LLM回调机制,实现对OpenAI模型令牌消耗的精确监控。
LangChain.js提供了强大的回调系统,允许开发者在LLM生命周期的不同阶段注入自定义逻辑。对于追踪令牌消耗,handleLLMEnd回调函数是理想的选择。这个函数会在每次LLM调用结束时被触发,并提供包含令牌使用信息的output参数。
以下是实现令牌追踪的完整代码示例:
import { ChatOpenAI } from 'langchain/chat_models/openai';
import { HumanMessage } from 'langchain/schema';
// 定义全局变量来累积令牌使用量
let totalCompletionTokens = 0;
let totalPromptTokens = 0;
let totalExecutionTokens = 0;
// 实例化ChatOpenAI模型,并配置回调函数
const llm = new ChatOpenAI({
// 配置回调数组
callbacks: [
{
// handleLLMEnd在LLM调用结束后触发
handleLLMEnd: (output, runId, parentRunId?, tags?) => {
// 从output中安全地提取tokenUsage信息
const { completionTokens, promptTokens, totalTokens } = output.llmOutput?.tokenUsage || {};
// 累加令牌数量,确保处理undefined情况
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 for this run: ${totalTokens ?? 0}`);
console.log(`Current Accumulated Total Tokens: ${totalExecutionTokens}`);
},
},
],
// 推荐使用特定的模型版本,例如 'gpt-3.5-turbo-0613'
// 注意:某些模型或版本可能存在令牌统计不准确的问题
modelName: 'gpt-3.5-turbo-0613',
// 其他OpenAI API参数,例如 temperature, openAIApiKey等
temperature: 0.7,
openAIApiKey: process.env.OPENAI_API_KEY, // 确保从环境变量获取API Key
});
// 示例:执行一次LLM调用
async function runExampleChat() {
console.log("Starting LLM call...");
const response = await llm.call([
new HumanMessage("请用一句话介绍一下大型语言模型。"),
]);
console.log("LLM Response:", response.content);
console.log("\n--- Final Token Usage Summary ---");
console.log(`Total Prompt Tokens Across All Runs: ${totalPromptTokens}`);
console.log(`Total Completion Tokens Across All Runs: ${totalCompletionTokens}`);
console.log(`Total Execution Tokens Across All Runs: ${totalExecutionTokens}`);
// 重置计数器以便进行下一次独立测试(可选)
totalCompletionTokens = 0;
totalPromptTokens = 0;
totalExecutionTokens = 0;
}
// 调用示例函数
runExampleChat().catch(console.error);
// 示例:执行另一次LLM调用
async function runAnotherExampleChat() {
console.log("\nStarting another LLM call...");
const response = await llm.call([
new HumanMessage("解释一下云计算的优势。"),
]);
console.log("LLM Response:", response.content);
console.log("\n--- Final Token Usage Summary ---");
console.log(`Total Prompt Tokens Across All Runs: ${totalPromptTokens}`);
console.log(`Total Completion Tokens Across All Runs: ${totalCompletionTokens}`);
console.log(`Total Execution Tokens Across All Runs: ${totalExecutionTokens}`);
}
// 可以在适当的时机调用 runAnotherExampleChat()
// setTimeout(() => runAnotherExampleChat().catch(console.error), 3000);尽管LangChain.js目前没有像Python那样直接的get_openai_callback()方法来获取令牌消耗,但通过利用ChatOpenAI的callbacks属性和handleLLMEnd回调函数,开发者可以有效地追踪每次LLM调用的令牌使用情况。这种方法不仅有助于精确监控成本,还能为性能分析和资源优化提供宝贵的数据。在实施时,请务必关注模型兼容性、成本计算逻辑以及在复杂应用场景下的计数器管理。
以上就是在LangChain.js中高效追踪OpenAI模型令牌消耗与成本的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号