📑

Kotlin (または Java ) で OpenAPI を使う

2023/12/05に公開

この記事は mob Adevent Calendar 5 日目の記事になります。

本日は Kotlin (または Java ) で OpenAPI を使う方法を説明します。

aallam/openai-kotlin を使おう

Kotlin で OpenAPI を使う場合は、下記のライブラリを使うのが良いと思います。

https://github.com/aallam/openai-kotlin

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

resultchoices.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