跳至主要内容

如何跟踪令牌使用情况

先决条件

本指南假设您熟悉以下概念

此笔记本介绍了如何跟踪特定调用的令牌使用情况。

使用 AIMessage.usage_metadata

一些模型提供商在聊天生成响应中返回令牌使用信息。如果可用,此信息将包含在对应模型生成的 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 参考

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 参考

使用 AIMessage.response_metadata

一些模型提供商在聊天生成响应中返回令牌使用信息。如果可用,它将包含在 AIMessage.response_metadata 字段中。

OpenAI

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

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

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 参考

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 参考

流式传输

一些提供商在流式传输上下文中支持令牌计数元数据。

OpenAI

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

信息

默认情况下,流中的最后一个消息块将包含 finish_reason,位于消息的 response_metadata 属性中。如果我们在流式传输模式下包含令牌使用情况,则会在流的末尾添加一个包含使用情况元数据的附加块,以便 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();

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 参考

使用回调函数

您也可以使用 handleLLMEnd 回调函数来获取 LLM 的完整输出,包括支持模型的令牌使用情况。以下是如何操作的示例

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

const chatModel = new ChatOpenAI({
model: "gpt-4-turbo",
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 参考

下一步

您现在已经了解了一些关于如何跟踪支持提供商的聊天模型令牌使用情况的示例。

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


此页面是否有用?


您也可以留下详细的反馈 在 GitHub 上.