#25 Scalaで学ぶAI API(ChatGPT等)の呼び出し方の基本
#25 Scalaで学ぶAI API(ChatGPT等)の呼び出し方の基本
ChatGPTのようなAI(人工知能)が返す文章を、自分のプログラムから使ってみたいと思ったことはありませんか。実はこうしたAIの多くは「API」という仕組みを通じて、誰でもプログラムから呼び出せるようになっています。今回はScalaという言語を使って、AI APIを呼び出す基本のやり方を見ていきましょう。
AI APIとは何か
API(エーピーアイ)とは「Application Programming Interface」の略です。あるソフトウェアの機能を、別のプログラムから使えるようにするための窓口のようなものです。ChatGPTなどのAIサービスは、インターネット経由でリクエスト(依頼)を送ると、AIが考えた答えをレスポンス(返答)として返してくれるAPIを公開しています。
このやり取りは多くの場合「REST API」と呼ばれる形式で行われます。難しく聞こえますが、要するに「決まった形のURLに、決まった形のデータを送ると、決まった形のデータが返ってくる」というシンプルな約束事だと考えれば大丈夫です。データのやり取りには「JSON」というテキスト形式がよく使われます。JSONは`{"key": "value"}`のように、名前と値をペアで書く、人にも読みやすいデータの書き方です。
ScalaでHTTP通信をするには
ScalaはJava仮想マシン(JVM)上で動く言語で、Javaの豊富なライブラリ(便利な部品集)がそのまま使える点が特徴です。ただ、素のJavaのHTTP通信の書き方はやや冗長なので、Scala向けのHTTPクライアントライブラリを使うのが一般的です。代表的なものに「sttp」というライブラリがあります。
sttpを使うと、次のようなイメージでリクエストを組み立てられます。
import sttp.client3._
val request = basicRequest
.header("Authorization", s"Bearer $apiKey")
.header("Content-Type", "application/json")
.body(jsonBody)
.post(uri"https://api.example.com/v1/chat")
val response = request.send(backend)
println(response.body)
ここで`basicRequest`にヘッダー(通信の付加情報)やボディ(送信するデータ本体)を設定しています。そのうえで`.post`でPOSTリクエスト(データを送信する種類のリクエスト)を送っています。難しい設定を一つずつ積み木のように組み立てていくイメージです。
APIキーの扱い方には注意する
多くのAI APIは「APIキー」と呼ばれる、自分専用の合言葉のような文字列を使って利用者を識別します。上のコード例にある`Authorization`ヘッダーがそれにあたります。このAPIキーは、他人に知られてしまうと勝手に使われてしまう可能性があります。そのため、ソースコードに直接書き込まず、環境変数(OSが管理する設定値)から読み込むのが安全な方法です。
val apiKey = sys.env.getOrElse("API_KEY", "")
`sys.env`はScalaで環境変数を取得するための書き方です。こうしておけば、コードをGitHubなどに公開しても、APIキー自体が漏れる心配がありません。
レスポンスの扱い方とJSONパース
APIから返ってくるレスポンスはJSON形式の文字列であることがほとんどです。この文字列をScalaのプログラムで扱いやすい形に変換する作業を「パース(解析)」と呼びます。Scalaには「circe」や「play-json」といったJSONを扱うためのライブラリがあります。これらを使うと、JSONの中身をcase class(データをまとめて表現するための入れ物のようなクラス)に変換できます。
case class ChatResponse(reply: String)
import io.circe.parser.decode
val result: Either[Error, ChatResponse] = decode[ChatResponse](response.body)
ここで登場する`Either`は、Scalaらしい書き方のひとつです。「成功したら右側(Right)に結果、失敗したら左側(Left)にエラー情報を入れる」という型で、成功と失敗の両方をきちんと表現できます。JavaやPythonの例外処理(try-catch)に近い役割ですが、失敗する可能性そのものを型として明示できる点がScalaらしい発想です。
Scalaならではの注意点
Scalaで通信処理を書くときは、`Future`という「これから完了する予定の処理結果」を表す仕組みがよく登場します。API呼び出しのようにネットワーク越しの処理は時間がかかります。そのため、処理の完了を待つ間も他の作業ができるよう、非同期(処理の完了を待たずに次へ進める仕組み)で扱うのが一般的です。最初のうちは「今すぐ結果が返ってこない処理がある」という感覚に戸惑うかもしれませんが、慣れてくるとむしろ効率的な書き方だと感じられるはずです。
また、ライブラリの追加は`sbt`(Scala標準のビルドツール)の設定ファイルに1行追加するだけで済みます。JavaScriptのnpmやPythonのpipに近い感覚で、必要な部品を取り込めます。
まとめ
ScalaからAI APIを呼び出す基本は、(1)HTTPクライアントでリクエストを組み立てる、(2)APIキーは環境変数などで安全に管理する、(3)返ってきたJSONをcase classにパースして扱う、という3つの流れで理解できます。`Either`や`Future`といったScalaらしい型に最初は戸惑うかもしれませんが、一つずつ試していけば、AI APIとの連携も着実に身につけられるでしょう。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Scalaをもっと学びたい方には「実践Scala入門」がおすすめです。
コメント
コメントを投稿