#25 Swiftで学ぶAI API(ChatGPT等)の呼び出し方の基本

SwiftアプリからAI API(ChatGPT等)を呼び出してみよう

最近は、アプリの中にChatGPTのような「AI(人工知能)」の機能を組み込む場面が増えてきました。実は、SwiftでもiPhoneアプリ(iOS)やMacアプリ(macOS)から、インターネット越しにAIサービスへ質問を送り、回答を受け取ることができます。この記事では、SwiftからAI APIを呼び出す基本的な流れと、初心者がつまずきやすいポイントを解説します。

そもそも「API」とは何か

API(エーピーアイ、Application Programming Interfaceの略)とは、あるプログラムやサービスの機能を、外部のプログラムから利用できるようにした「窓口」のようなものです。ChatGPTのようなAIサービスの多くは、インターネット上に用意された窓口(APIエンドポイント)にデータを送ると、AIが処理した結果を返してくれる仕組みになっています。

この「データを送って結果を受け取る」やり取りは、Web APIと呼ばれる形式で行われることが多くあります。SwiftアプリからもHTTP通信(Webページの読み込みなどに使われる通信方式)を使ってやり取りします。

SwiftでHTTP通信を行う基本:URLSession

Swiftで外部のサーバーと通信するときは、標準ライブラリに含まれるURLSessionというクラスを使うのが基本です。URLSessionは、URLを指定して通信リクエストを送り、結果を受け取るための仕組みで、追加のライブラリをインストールしなくても使えます。

Swift 5.5以降では、async/awaitという書き方が使えます。これを使うと、非同期処理(時間のかかる処理を待っている間も他の処理を止めない仕組み)をシンプルに書けるようになりました。以前は「完了したら呼ばれる関数(クロージャ)」を入れ子にして書く必要がありました。しかしasync/awaitのおかげで、あたかも上から下へ順番に処理が進むかのように読みやすいコードになります。JavaScriptのasync/awaitに近い感覚で書けるので、他言語の経験がある人にはなじみやすいはずです。

実際のコード例

以下は、AI API(ChatGPTのようなチャット形式の応答を返すAPI)に質問を送り、回答を受け取る簡単な例です。実際のAPI仕様はサービスによって異なるため、あくまで基本の流れをつかむためのサンプルとして見てください。

import Foundation

// APIに送る質問文からリクエストを組み立てて送信する関数
func askAI(question: String, apiKey: String) async throws -> String {
    let url = URL(string: "https://api.example.com/v1/chat/completions")!

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")

    // 送信するデータを辞書型で組み立て、JSON形式に変換する
    let body: [String: Any] = [
        "model": "gpt-4o-mini",
        "messages": [["role": "user", "content": question]]
    ]
    request.httpBody = try JSONSerialization.data(withJSONObject: body)

    // await をつけることで、通信が終わるまで待ってから次に進む
    let (data, response) = try await URLSession.shared.data(for: request)

    guard let httpResponse = response as? HTTPURLResponse,
          httpResponse.statusCode == 200 else {
        throw URLError(.badServerResponse)
    }

    // 受け取ったJSONを扱いやすい形に変換する(簡易的な例)
    let json = try JSONSerialization.jsonObject(with: data) as? [String: Any]
    let choices = json?["choices"] as? [[String: Any]]
    let message = choices?.first?["message"] as? [String: Any]
    return message?["content"] as? String ?? "回答を取得できませんでした"
}

この関数を呼び出す側は、次のようにtry awaitを付けて実行します。

Task {
    do {
        let answer = try await askAI(question: "Swiftとは何ですか?", apiKey: "取得したAPIキー")
        print(answer)
    } catch {
        print("エラーが発生しました: \(error)")
    }
}

ポイントは、try(失敗する可能性のある処理につける印)とawait(結果が返るまで待つ印)をセットで使う点です。SwiftではAPI呼び出しのようにエラーが起こりうる非同期処理を、通常のコードとほぼ同じ見た目で書けるのが大きな特徴です。

APIキーは絶対にコードへ直接書かない

AI APIを使うには、多くの場合「APIキー」と呼ばれる、いわば利用者を識別するための秘密の文字列が必要です。このAPIキーをソースコードに直接書き込んでしまうと、危険です。アプリを解析されたときや、コードをGitHubなどに公開したときに、第三者に盗まれて悪用されるおそれがあります。

実際の開発では、APIキーを次のような方法で管理するのが一般的です。

  • APIキーをアプリ本体には持たせず、自分で用意したサーバー経由でAI APIを呼び出す
  • ローカルでの検証時は、環境変数やXcodeの実行設定(Configuration)など、ソースコードの外に置く仕組みを使う
  • .gitignoreなどでキーを含むファイルをバージョン管理の対象から除外する

特に配布するアプリの場合、APIキーをアプリ内に埋め込む方式は推奨されません。あくまで学習用の検証段階では手元だけで完結させ、公開・配布する際は自分のサーバーを経由する構成を検討しましょう。

まとめ

SwiftからAI APIを呼び出す基本は、URLSessionでHTTPリクエストを組み立てることから始まります。そのあとasync/awaitで結果を待ち受け、返ってきたJSONから必要な情報を取り出す、という流れです。他言語の非同期処理経験があれば、Swiftのasync/awaitはすぐに馴染めるはずです。まずは自分の手元で小さなリクエストを送ってみて、レスポンスの形を確認するところから始めてみてください。APIキーの扱いだけは、学習段階から意識しておくと安心です。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

Swiftをもっと学びたい方には「これからつくる iPhoneアプリ開発入門」がおすすめです。

コメント

このブログの人気の投稿

#11 Rustで学ぶエラーハンドリングの基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本

#19 Goで学ぶテスト(単体テスト)の基本