如何跟踪代币使用情况
先决条件
本指南假设您熟悉以下概念
本笔记本介绍了如何跟踪特定调用的代币使用情况。
使用 AIMessage.usage_metadata
许多模型提供商会在聊天生成响应中返回代币使用信息。如果可用,此信息将包含在由相应模型生成的 AIMessage
对象中。
LangChain AIMessage
对象包含一个 usage_metadata
属性,适用于支持的提供商。如果已填充,此属性将是一个具有标准键的对象(例如,“input_tokens” 和“output_tokens”)。
OpenAI
提示
请参阅 此部分,了解有关安装集成包的一般说明。
- npm
- Yarn
- pnpm
npm install @langchain/openai
yarn add @langchain/openai
pnpm add @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 参考
- ChatOpenAI 来自
@langchain/openai
Anthropic
- npm
- Yarn
- pnpm
npm install @langchain/anthropic
yarn add @langchain/anthropic
pnpm add @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 参考
- ChatAnthropic 来自
@langchain/anthropic
使用 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 参考
- ChatOpenAI 来自
@langchain/openai
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 参考
- ChatAnthropic 来自
@langchain/anthropic
流式传输
某些提供商支持流式上下文中的代币计数元数据。
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 参考
- AIMessageChunk 来自
@langchain/core/messages
- ChatOpenAI 来自
@langchain/openai
- concat 来自
@langchain/core/utils/stream
使用回调
您还可以使用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 参考
- ChatOpenAI 来自
@langchain/openai
下一步
您现在已经看到了几个关于如何跟踪受支持提供商的聊天模型令牌使用情况的示例。
接下来,查看本节中其他有关聊天模型的操作指南,例如如何让模型返回结构化输出或如何为您的聊天模型添加缓存.