通常のAPIリクエストではレスポンスボディに利用トークンのカウント数は含まれる。
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
しかし「Server-Sent Events(SSE)」では、それをレスポンスで返さない。
【OpenAI】Kotlin OkHttp で Server-Sent Events (SSE)
👉 https://t.co/h5Dnk9gfkc#プログラミング #kotlin #openai #ChatGPT pic.twitter.com/uIdJj4KbpN— chanzmao (@maochanz) June 7, 2023
👉 【OpenAI】Kotlin OkHttp で Server-Sent Events (SSE)
従量制のAPIを利用している限り料金は気になりますよね。
プロンプトのトークンの数をアプリ側で独自にカウントすれば料金(利用トークン数から)は算定できるのでは?
🤖 JTokkit
Java のライブラリありますね。OpenAI公式でも紹介されているやつ。
👉 openai-cookbook/How_to_count_tokens_with_tiktoken.ipynb at main · openai/openai-cookbook · GitHub
豊富な Java ライブラリを使えるのは Kotlin の便利なところです。
👉 Counting Tokens for ChatML | JTokkit
とりあえずテストで動かしてみます。
dependencies {
testImplementation 'com.knuddels:jtokkit:0.4.0'
}
@Test
fun test_jtokkit() {
val messages = listOf(
Message("user", "こんにちはと言ってください。"),
Message("assistant", "こんにちは!")
)
val encoding = Encodings.newDefaultEncodingRegistry()
.getEncodingForModel(ModelType.GPT_3_5_TURBO)
val count = messages.sumOf { message ->
// GPT_3_5_TURBO without name
listOf(
4, // per message
encoding.countTokens(message.role),
encoding.countTokens(message.content)
).sum()
} + 3 // every reply is primed with <|start|>assistant<|message|>
println(count)
}
@Serializable
data class Message(
val role: String,
val content: String
)
メッセージごと、リプライごとのカウント追加が間違ってるのか、なんなのか。
少しカウント数ずれるんだけども。
🤖 まとめ
てか、返せよ Usage。
従量制の有料サービスなんだから。
👉 How to get total_tokens from a stream of CompletionCreateRequests - API - OpenAI Developer Forum
👉 How do you get token count when streaming - API - OpenAI Developer Forum
👉 How to determine the token usage for a session when using stream:true? - API - OpenAI Developer Forum
まあ、Webページで確認すればいいけども。
大して使ってないからどうでもいいか。