こんにちは!KCompanyの八木です。 本日からOpenAI APIのリファレンス入門シリーズをやっていこうと思います。 基本的に本家のAPIリファレンスの内容にそってやってみた(内容をまとめてみた)、という内容になります。 一回目の今日はGETTING STARTEDの内容をやってみようと思います。 それではっそくいってみましょう!
開発環境
実際の内容に入る前に、私の開発環境についてお伝えしておきます。
- OS: MacOS
- Node.js: 22.1.0
ですので、原則としてNode.jsを使って説明していきます。ただし、説明の進行上、Curlを使ったものも含まれます。(APIリファレンスには他にもCurlやPythonを使ったバージョンもあります。Curlバージョンは別途またまとめるかもしれません。Pythonについては、筆者が今のところ利用するシーンが少ないため、劣後になっています。) 本投稿では、Node.jsなどの開発環境自体の構築については割愛しています。
イントロダクション
OpenAI APIは、HTTPリクエストを通じてAPI通信が可能です。基本的にどのようなプログラミング言語にも対応しているようですが、代表的なものとしてNode.js, Pythonなどがあります。開発者コミュニティによって、コミュニティライブラリも作られています。
例えばNode.jsであれば、以下でインストールが可能です。
npm install --save openai
# or
npm install openai@^4.0.0
認証
APIキー
OpenAI APIを使うには、APIキーが必要です。APIキーを使って、API利用の認証を得ることができます。APIキーは外部に漏らさないよう慎重に管理しましょう。
APIキーは、ユーザーアカウントやサービスアカウントごとに作成できます。サービスアカウントは主に本番環境へのアクセスを提供するために使用されます。
各APIキーは1.プロジェクトキー、2.ユーザーキーがあります。
- プロジェクトキー
- 特定のプロジェクト向け
- ユーザーキーよりセキュリティ上、優れている
- ユーザーキー
- 従来のAPIキー。ユーザーにひも付き全組織・全プロジェクトにアクセスできる
- 広範なアクセス権限の反面、セキュリティ上のベストプラクティスとしては非推奨
APIリクエスト時は常に以下のHTTPヘッダーを含める必要があります。
Authorization: Bearer OPENAI_API_KEY
組織とプロジェクト(オプション)
ユーザーキーを利用している場合、APIリクエストに特定の組織やプロジェクトを指定するためのヘッダーを追加する必要があります。
APIキーの取得
APIキーの取得には、OpenAIアカウントを作成・ログインし、APIキーのページに遷移してください。
Create new secret keyボタンを押下し、適切な名前等を設定してください。
APIキーはご自身で適切な場所に秘匿し保存してください。
APIキーの設定(Node.js/MacOS)
以下、Quickstartのドキュメントを参考にしています。
全てのプロジェクトでAPIキーを設定することで、SDKが自動的にAPIキーを検出してくれるため、コードを書く必要がなくなります。以下、詳細の設定手順です。
- ターミナルを開く
- アプリケーションフォルダ内にあるターミナルを開くか、Spotlight(Command + Space)を使って検索します。
- bashプロファイルを編集
- 以下のコマンドを使用して、プロファイルファイルをテキストエディタで開きます。新しいバージョンのMacOSでは
~/.zshrc
を使用します。
nano ~/.bash_profile # or nano ~/.zshrc
- 以下のコマンドを使用して、プロファイルファイルをテキストエディタで開きます。新しいバージョンのMacOSでは
- 環境変数を追加:
- エディタで、以下のようにAPIキーを設定します。
your-api-key-here
の部分を実際のAPIキーに置き換えてください。
export OPENAI_API_KEY='your-api-key-here'
- エディタで、以下のようにAPIキーを設定します。
- 保存して終了:
- 変更を保存するためにCtrl + Oを押し、その後Ctrl + Xを押してエディタを閉じます。
- プロファイルを読み込む:
- 以下のコマンドを使用して、更新されたプロファイルを読み込みます。
source ~/.bash_profile # or source ~/.zshrc
- 設定の確認:
- 以下のコマンドを入力して、設定が正しく行われたか確認します。ターミナルにAPIキーが表示されれば成功です。
echo $OPENAI_API_KEY
APIリクエストの実行
以下をターミナルで実行することにより、Open AI APIを通じて、レスポンスを得ることができます。$OPENAI_API_KEYはご自身で取得したものに書き換えてください。以下は、ユーザーが「これはテストですと言って」とAI(アシスタント)に聞いている例になります。
curl https://api.openai.com/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer $OPENAI_API_KEY"
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"temperature": 0.7
}'
なお、上記のリクエストではgpt-3.5-turboのモデルを使っています。その他のモデルを確認したい場合はModelsのページを確認してみてください。以下は上記のリクエストに対するレスポンスです。
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1677858242,
"model": "gpt-3.5-turbo-0613",
"usage": {
"prompt_tokens": 13,
"completion_tokens": 7,
"total_tokens": 20
},
"choices": [
{
"message": {
"role": "assistant",
"content": "nnThis is a test!"
},
"logprobs": null,
"finish_reason": "stop",
"index": 0
}
]
}
これでAPIとの初めてのリクエストが成功しました!choicesオブジェクトのmessage.contentの中に、「これはテストです」という内容が返ってきているのが分かります。その他の構造についてはresponse objectに記載があります。
ストリーミング
ストリーミングとは?
OpenAI APIでは、クライアント側に少しずつ結果をリアルタイムで返すことができるストリーミング機能を提供しています。この機能により、リクエストに対する応答を部分的に受け取る事が可能です。例えば、カスタマーサポート用のチャットボットを作る場合、ストリーミング機能がなければ画面に何も表示されないまま待たされますが、ストリーミング機能があれば少しずつでも結果をみることができます。
ストリーミングの仕組み
ストリーミング機能は、Server-sent events(SSE)標準に従って実装されています。SSEは、サーバーからクライアントに対して一方向のデータストリームを送信するための標準的な方法になります。この標準を使用することで、リアルタイムなデータデータ更新を効率的に処理できます。
対応API
ストリーミングは、Chat Completions APIとAssistants APIの両方でサポートされています。例えば、Node.jsでは以下のように実装できます。
import OpenAI from "openai";
const openai = new OpenAI();
async function main() {
const stream = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [{ role: "user", content: "Say this is a test" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
}
main();
サンプル
以下では、Chat Completions APIにおけるストリーミングの動作について説明しています。Chat Completions APIでは、チャットの応答をリアルタイムでストリーミングすることができます。これにより、チャットボットやインタラクティブなアプリケーションのユーザーエクスペリエンスが向上します。
Server-sent Eventsの解析について
先ほどもお伝えしたように、Server-sent Events (SSE)は、サーバーからクライアントに対して一方向のデータストリームを送信するための技術です。
SSEの解析は一見簡単そうに思えますが、実際には慎重に行う必要があります。単純に改行(n)でデータを分割するような方法では、解析エラーが発生する可能性があります。具体的には、SSEメッセージが改行を含む場合のメッセージ断片化、データが複数行にまたがる問題、そしてエンコードの問題などがあるためです。
こうした問題を解決するために、既存のクライアントライブラリを利用されることが推奨されています。
以上で、今回の投稿は終了となります。いかがでしたでしょうか。
次回はChat completionについてめとめていければと考えています!