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

ChatGPTのようなAI(人工知能)の機能を自分のアプリに組み込みたいとき、多くの場合は「AI API」と呼ばれる仕組みを使います。APIとは「Application Programming Interface」の略です。簡単に言えば、「あるサービスの機能を、プログラムから呼び出せるようにした窓口」のことです。この記事では、Rustから外部のAI APIをHTTPリクエストで呼び出す基本的な流れを、初心者向けに解説します。

AI APIを呼び出すとはどういうことか

ChatGPTを提供するOpenAI社などは、インターネット経由でAIに質問を送り、回答を受け取れる「AI API」を公開しています。これはWebブラウザで検索するときのように、決まった宛先(URL)にデータを送信し、返ってきた結果を受け取る仕組みです。この「データを送って結果を受け取る」通信方式を、HTTPリクエストと呼びます。Rustのプログラムからこの通信を行うことで、自分のアプリの中でAIに質問し、回答を取得できるようになります。

reqwestクレートを使う

Rustには標準でHTTP通信の機能は含まれていません。そこで使うのが「クレート」と呼ばれる外部ライブラリです。クレートはPythonのライブラリやJavaScriptのパッケージに近いもので、Cargo.tomlというファイルに追記するだけで簡単に導入できます。HTTP通信でよく使われるのがreqwestというクレートです。Cargo.tomlに次のように追記します(バージョン番号は執筆時点の例なので、実際に使う際は最新版を確認してください)。

[dependencies] reqwest = { version = "0.11", features = ["json"] } tokio = { version = "1", features = ["full"] } serde_json = "1.0"

ここでtokioという見慣れないクレートも一緒に入れています。これは「非同期処理」と呼ばれる、通信の待ち時間の間に他の処理を進められる仕組みを扱うためのものです。ネットワーク通信は結果が返ってくるまで時間がかかるため、Rustで通信処理を書く場合はこの非同期処理とセットで使うのが一般的です。

APIを呼び出すコードの流れ

実際にAI APIへリクエストを送るコードの骨格はおおよそ次のようになります。

#[tokio::main] async fn main() -> Result<(), Box> { let api_key = std::env::var("OPENAI_API_KEY")?; let client = reqwest::Client::new(); let res = client .post("https://api.openai.com/v1/chat/completions") .bearer_auth(api_key) .json(&serde_json::json!({ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "こんにちは"}] })) .send() .await?; let body = res.text().await?; println!("{}", body); Ok(()) }

ポイントは3つです。まず#[tokio::main]という目印(属性)を付けることで、非同期処理を扱えるmain関数になります。次にbearer_authで「このAPIキーを使う権限がある」ことをサーバーに伝えます。最後に.json(...)で送信したい内容をJSON形式(データをやり取りするための共通フォーマット)に変換して送っています。

APIキーの扱いに注意する

AI APIを使うには「APIキー」と呼ばれる、いわばパスワードのような文字列が必要です。このAPIキーをソースコードに直接書き込んでしまうと、GitHubなどで公開したときに誰でも使えてしまいます。勝手に使われて、高額な請求が発生する恐れもあります。上のコード例のように、環境変数(OSに設定しておく変数)からAPIキーを読み込む方法が基本です。加えて、.gitignoreにAPIキーを含むファイルを登録し、うっかり公開しないよう気を付けましょう。

Rustならではの注意点

PythonやJavaScriptでは、非同期処理を使わなくても比較的手軽にHTTP通信を書けることが多いです。ですがRustでは、async/awaitという非同期処理の書き方とほぼセットで通信処理を扱います。最初はこのResult型(成功か失敗かを表す型)や?演算子(エラーが起きたらすぐ処理を中断して呼び出し元に返す記法)に戸惑うかもしれません。ですが、通信エラーやAPIからの異常な応答を見逃しにくくなるという利点があります。エラー処理を後回しにできない分、最初の学習コストはやや高めですが、安全性の高いコードを書きやすいのがRustらしいところです。

まとめ

RustからAI APIを呼び出すには、reqwestクレートでHTTPリクエストを送り、tokioで非同期処理を扱うのが基本的な流れです。APIキーはコードに直接書かず、環境変数から読み込みましょう。さらに、通信結果はResult型でしっかりエラー処理することを意識すれば、Rustらしい安全なAI連携プログラムの第一歩を踏み出せます。

関連記事


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

参考書籍(PR)

Rustをもっと学びたい方には「実践Rust入門[言語仕様から開発手法まで]」がおすすめです。

コメント

このブログの人気の投稿

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

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

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