#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アプリ開発入門」がおすすめです。
コメント
コメントを投稿