つまった問題
langchain.jsでChatGPTAPIを利用したチャットボットを作る際に、トークンをかぞえたかったので以下のようにコールバックを設定していた。
import { OpenAI } from "@langchain/openai";
let totalCompletionTokens = 0;
let totalPromptTokens = 0;
let totalTokens = 0;
const model = new OpenAI({
openAIApiKey: process.env.OPEN_AI_API_KEY,
modelName: "gpt-3.5-turbo",
callbacks: [
{
handleLLMEnd(output) {
console.log(JSON.stringify(output, null, 2));
totalCompletionTokens += output.llmOutput?.tokenUsage?.completionTokens ?? 0;
totalPromptTokens += output.llmOutput?.tokenUsage?.promptTokens ?? 0;
totalTokens += output.llmOutput?.tokenUsage?.totalTokens ?? 0;
},
},
],
});
//以下省略
しかし、ログを確認するとoutput
にgenetations
だけが存在しており、llmOutput
が含まれていなかった。
{
"generations": [
[
{
"text": "やほー"
}
]
]
}
llmOutput
がないと、以下の変数たちにtoken数がカウントアップできない。
totalCompletionTokens += output.llmOutput?.tokenUsage?.completionTokens ?? 0;
totalPromptTokens += output.llmOutput?.tokenUsage?.promptTokens ?? 0;
totalTokens += output.llmOutput?.tokenUsage?.totalTokens ?? 0;
解決策
langchainjsのissueですでに聞かれてた。
I think the reason is that the GPT-3.5-turbo model can only be used for Chat models.
I had to update my old code from 'OpenAI' to 'ChatOpenAI', and that fixed the issue.
つまり、OpenAI
をインポートしていたのを
import { OpenAI } from "@langchain/openai";
//・・・
const model = new OpenAI({
//・・・
ChatOpenAI
をインポートするように変えるだけみたいです。
import { ChatOpenAI } from "@langchain/openai";
//・・・
const model = new ChatOpenAI({
//・・・
結果
llmOutput
が返ってきた。(途中でConversationSammaryを使うようにしたから結果の対称性が微妙ですみません。)
{
"generations": [
[
{
"text": "The human greets the AI with \"やほー.\" The AI responds enthusiastically with \"やほー!\"",
"message": {
"lc": 1,
"type": "constructor",
"id": [
"langchain_core",
"messages",
"AIMessage"
],
"kwargs": {
"content": "The human greets the AI with \"やほー.\" The AI responds enthusiastically with \"やほー!\"",
"additional_kwargs": {}
}
},
"generationInfo": {
"finish_reason": "stop"
}
}
]
],
"llmOutput": {
"tokenUsage": {
"completionTokens": 25,
"promptTokens": 150,
"totalTokens": 175
}
}
}
参考記事