跳至主要内容

如何跟踪代币使用情况

先决条件

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

本笔记本介绍了如何跟踪特定调用的代币使用情况。

使用 AIMessage.usage_metadata

许多模型提供商会在聊天生成响应中返回代币使用信息。如果可用,此信息将包含在由相应模型生成的 AIMessage 对象中。

LangChain AIMessage 对象包含一个 usage_metadata 属性,适用于支持的提供商。如果已填充,此属性将是一个具有标准键的对象(例如,“input_tokens” 和“output_tokens”)。

OpenAI

npm install @langchain/openai
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
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 参数来启用。

信息

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