Kotlin (または Java ) で OpenAPI を使う
この記事は mob Adevent Calendar 5 日目の記事になります。
本日は Kotlin (または Java ) で OpenAPI を使う方法を説明します。
aallam/openai-kotlin を使おう
Kotlin で OpenAPI を使う場合は、下記のライブラリを使うのが良いと思います。
2023/12/02現在はアップデートも早く、OpenAPI 側の変更に対する対応もかなり早いです。たしか2weekしないくらいで新しいAPI にも対応していたはずです。
サポート機能
ほぼ?全ての機能に対応しています。
下記は 2023/12/02現在 Betaな機能。 Assistants にも対応。
下記は Deprecatedなもの.
使い方
セットアップ
下記を build.gralde.kts に追加します。
dependencies {
implementation(platform("com.aallam.openai:openai-client-bom:3.6.1"))
implementation("com.aallam.openai:openai-client")
runtimeOnly("io.ktor:ktor-client-okhttp")
...
}
実装方法
オーソドックスな Chat API の実装例を紹介します。
Chat API
OpenAIのインスタンスを作る際に、 token として API Keys で作成した APIキー を渡します。
ChatCompletionRequest を組み立て、 openAI.chatCompletion
にリクエストを渡せばOKです。
val openAI = OpenAI(token = apiKey)
val request = ChatCompletionRequest(
model = ModelId("gpt-4-1106-preview"),
messages = listOf(
ChatMessage(
role = ChatRole.User,
content = "こんにちは"
)
),
responseFormat = ChatResponseFormat.JsonObject
)
val result = openAI.chatCompletion(request)
val content = result.choices.firstOrNull()?.message?.content
result
の choices.firstOrNull()?.message?.content
に返答結果が入っています。
choices.firstOrNull()?.message?.toolCalls
に Call Function の結果などが入っています。
Vison API
Vision API も chatCompletion を使います。
Modelを gpt-4-vision-preview
にすれば、もう Vision API を使うことになります。
画像は ByteArray なデータを Base64 にエンコードしたものを、 messageContent に ImagePart として渡せばOKです。
val openAI = OpenAI(token = apiKey)
val base64 = Base64.getEncoder().encodeToString(... /* 画像の ByteArray */)
val request = ChatCompletionRequest(
model = ModelId("gpt-4-vision-preview"),
messages = listOf(
ChatMessage(
role = ChatRole.User,
messageContent = ListContent(
listOf(
TextPart(
text = "画像にあるテキストをまとめて、得られる知見、事実を簡潔に説明してください。"
),
ImagePart(
imageUrl = ImagePart.ImageURL(url = "data:image/jpeg;base64,$base64")
)
)
)
)
),
)
val result = openAI.chatCompletion(request)
val content = result.choices.firstOrNull()?.message?.content
Embedding API
RAG を構築したりする人以外はなかなか使わないかもですが、 文字情報をベクトル化する Embedding API の実装方法も紹介します。
val openAI = OpenAI(token = apiKey)
val list = ["今日はxxxxxx", "明日はxxxxxx"]
val request = EmbeddingRequest(
model = ModelId("text-embedding-ada-002"),
input = list
)
val result = openAI.embeddings(request)
val embeddings = result.embeddings
embeddings には index と embedding(1536次元のベクトル) があるので、 inputに指定した list と付き合わせて使いましょう。
ベクトル情報は型は List<Double>
で 1536個の数値が入っています。
まとめ
Chat API や Vision API は使うユースケースがいろいろ考えられますし、さくっと使えるので是非是非使ってみてください!
Discussion