Skip to main content

如何跟踪 Token 使用情况

前提条件

本指南假定您已经熟悉以下概念:

本笔记本将介绍如何跟踪特定调用的 Token 使用情况。

使用 AIMessage.usage_metadata

许多模型提供商会将 Token 使用信息作为聊天生成响应的一部分返回。当可用时,这些信息将包含在相应模型生成的 AIMessage 对象中。

LangChain 的 AIMessage 对象为支持的提供者包含一个 usage_metadata 属性。当填充时,该属性将是一个包含标准键的对象(例如,"input_tokens" 和 "output_tokens")。

OpenAI

:::提示 请参阅安装集成包的一般说明部分。 :::

npm install @langchain/openai @langchain/core
import { ChatOpenAI } from "@langchain/openai";

const chatModel = new ChatOpenAI({
model: "gpt-3.5-turbo-0125",
});

const res = await chatModel.invoke("Tell me a joke.");

console.log(res.usage_metadata);

/*
{ input_tokens: 12, output_tokens: 17, total_tokens: 29 }
*/

API Reference:

Anthropic

npm install @langchain/anthropic @langchain/core
import { ChatAnthropic } from "@langchain/anthropic";

const chatModel = new ChatAnthropic({
model: "claude-3-haiku-20240307",
});

const res = await chatModel.invoke("Tell me a joke.");

console.log(res.usage_metadata);

/*
{ input_tokens: 12, output_tokens: 98, total_tokens: 110 }
*/

API Reference:

使用 AIMessage.response_metadata

许多模型提供商会将 Token 使用信息作为聊天生成响应的一部分返回。当可用时,这些信息将包含在 AIMessage.response_metadata 字段中。

OpenAI

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

const chatModel = new ChatOpenAI({
model: "gpt-4o-mini",
});

const res = await chatModel.invoke("Tell me a joke.");

console.log(res.response_metadata);

/*
{
tokenUsage: { completionTokens: 15, promptTokens: 12, totalTokens: 27 },
finish_reason: 'stop'
}
*/

API Reference:

Anthropic

import { ChatAnthropic } from "@langchain/anthropic";

const chatModel = new ChatAnthropic({
model: "claude-3-sonnet-20240229",
});

const res = await chatModel.invoke("Tell me a joke.");

console.log(res.response_metadata);

/*
{
id: 'msg_017Mgz6HdgNbi3cwL1LNB9Dw',
model: 'claude-3-sonnet-20240229',
stop_sequence: null,
usage: { input_tokens: 12, output_tokens: 30 },
stop_reason: 'end_turn'
}
*/

API Reference:

流式传输

某些提供者在流式传输上下文中支持 Token 计数元数据。

OpenAI

例如,OpenAI 将在流的末尾返回一个包含 Token 使用信息的消息块。此行为由 @langchain/openai >= 0.1.0 支持,可以通过在调用时传递 stream_options 参数来启用。

info

默认情况下,流中的最后一条消息块将在消息的 response_metadata 属性中包含一个 finish_reason。如果我们在流模式下包含 Token 使用信息,则会在流的末尾添加一个包含使用元数据的额外消息块,这样 finish_reason 将出现在倒数第二条消息块上。

import type { AIMessageChunk } from "@langchain/core/messages";
import { ChatOpenAI } from "@langchain/openai";
import { concat } from "@langchain/core/utils/stream";

// Instantiate the model
const model = new ChatOpenAI({
model: "gpt-4o-mini",
});

const response = await model.stream("Hello, how are you?", {
// Pass the stream options
stream_options: {
include_usage: true,
},
});

// Iterate over the response, only saving the last chunk
let finalResult: AIMessageChunk | undefined;
for await (const chunk of response) {
if (finalResult) {
finalResult = concat(finalResult, chunk);
} else {
finalResult = chunk;
}
}

console.log(finalResult?.usage_metadata);

/*
{ input_tokens: 13, output_tokens: 30, total_tokens: 43 }
*/

API Reference:

使用回调

您还可以使用 handleLLMEnd 回调来获取 LLM 的完整输出,包括支持模型的 Token 使用情况。 以下是一个如何实现的示例:

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

const chatModel = new ChatOpenAI({
model: "gpt-4o-mini",
callbacks: [
{
handleLLMEnd(output) {
console.log(JSON.stringify(output, null, 2));
},
},
],
});

await chatModel.invoke("Tell me a joke.");

/*
{
"generations": [
[
{
"text": "Why did the scarecrow win an award?\n\nBecause he was outstanding in his field!",
"message": {
"lc": 1,
"type": "constructor",
"id": [
"langchain_core",
"messages",
"AIMessage"
],
"kwargs": {
"content": "Why did the scarecrow win an award?\n\nBecause he was outstanding in his field!",
"tool_calls": [],
"invalid_tool_calls": [],
"additional_kwargs": {},
"response_metadata": {
"tokenUsage": {
"completionTokens": 17,
"promptTokens": 12,
"totalTokens": 29
},
"finish_reason": "stop"
}
}
},
"generationInfo": {
"finish_reason": "stop"
}
}
]
],
"llmOutput": {
"tokenUsage": {
"completionTokens": 17,
"promptTokens": 12,
"totalTokens": 29
}
}
}
*/

API Reference:

下一步

您现在已经了解了如何在支持的提供者中跟踪聊天模型 Token 使用情况的一些示例。

接下来,请查看本节中有关聊天模型的其他指南,例如 如何让模型返回结构化输出如何为聊天模型添加缓存


Was this page helpful?


You can also leave detailed feedback on GitHub.