2022年11月に、ChatGPTがリリースされ、2023年3月に、ChatGPTと同様のモデルを利用できるAPI(gpt-3.5-turbo)がリリースされました。
リリース当時は、
「ChatGPTがAPIで使える」
「ChatGPTを従量課金で使える」
「ChatGPT API をカスタマサポートに導入して生産性爆上げ!」
「ChatGPT搭載サービスを開発して大儲けだ!」
などなど喜びの声が聞こえてきました。
OpenAI API概要
ChatGPTの運営元であるOpenAIは、ChatGPTをリリースする前から元々GPTモデルのAPIサービスを提供していました。もっとも、日本語の精度は非常に低かったため日本国内ではあまり有名ではありませんでしたが。
そのため、実はOpenAIのAPIサービスはChatGPTのモデルであるgpt-3.5-turbo以外にもたくさんあります。
以下にOpenAIが提供するAPIサービスをまとめました。
- Chat : ChatGPTに搭載されているチャット用のモデルの文章生成API
- Embeddings : エンべディング処理を実行するためのAPI
- Moderations : テキストがOpenAIのポリシーに違反しないかチェックするAPI
- Images (DALL E) : 画像を生成するAPI
- Audio (Whisper) : 音声の文字起こしをするAPI
OpenAI APIを利用するメリット
ChatGPTがリリースされ、無料で使える今、なぜOpenAIのAPIを利用するのでしょうか。
それはChatGPTをそのまま使うよりも大きなメリットがあるからです。
- カスタムChatGPTを開発できる
- プロンプト最適化、Embeddings、Fine-tune(未リリースだが)などを活用すれば汎用的なChatGPTではなく、自社のニーズに特化した非常に賢いチャットボットを開発できます。
- コストが最適化できる
- ChatGPTはユーザーごとの課金で、利用しなくても費用が発生しますが、APIならば利用量に基づく従量課金なので使った分だけ支払えば良いです。(だからこそ逆に高くなる可能性も当然あります)
- 自社サービスに組み込める
- 自社が提供しているWebサービスやアプリなどのシステムにChatGPTを搭載することができます。
APIキーを作成する
OpenAIのAPIを利用するために、APIキーを発行しましょう。
まず、OpenAIのAPIサイトにアクセス・ログインします。
次に、画面右上の自分のアイコンをクリックして「View API Keys」をクリックします。↓
次に、「+ Create a new secret key」をクリックします。
https://platform.openai.com/account/api-keys
すると、キーの名前をつけられるので、好きな名前を付与して「Create secret key」をクリックします。名前はオプションなのでつけなくてもOKです。
これでキーが作成できたはずです。
ライブラリ
公式ライブラリ
OpenAIのAPIを利用するための公式ライブラリは、PythonとNode.jsで用意されています。
Python用ライブラリ
openai-python
https://github.com/openai/openai-python
Node.js用ライブラリ
openai-node
https://github.com/openai/openai-node
トークン数カウント用ライブラリ(Python)
tiktoken
https://github.com/openai/tiktoken
非公式ライブラリ
非公式でOpenAI APIを利用するライブラリも多くあります。一部を紹介します。
- Node.jsライブラリ chatgpt-api https://github.com/transitive-bullshit/chatgpt-api
- 中級者向け?プロンプティングを容易にするMicrosoft製のPythonライブラリ guidance https://github.com/guidance-ai/guidance
- LLMアプリケーション開発における抽象化フレームワーク LangChain https://github.com/langchain-ai/langchain
- LangChain.js https://github.com/hwchase17/langchainjs
では、ここからは、それぞれのAPIの概要と使い方を解説します。
Chat Completions API (ChatGPTのAPI) を使う
多くの方がこのChatの利用を検討していると思いますので、Chatに関しては情報量を多めに解説します。
Chatは、シンプルにChatGPTのように会話内容を生成させるAPIです。
ChatGPT同様にGPT-3.5やGPT-4を利用できますが、APIでの名称はやや異なり、
以下のような基本モデルがあります。
- gpt-4
- gpt-4-32k
- gpt-3.5-turbo
- gpt-3.5-turbo-16k
その他にも「gpt-4-0613」「gpt-4-32k-0613」といった日付が付与されているものもありますが、特段の理由がない限りは上記のものを使いましょう。上記モデル名を利用することで、モデルが改善されたときにも自動で対応できます。
なぜgpt-3.5には”turbo”が付いているのかといえば、おそらくChatGPTの無料プランで使えるような応答速度が少し遅いバージョンのGPT-3.5と区別するためでしょう。
つまり、APIで利用するGPT-3.5(gpt-3.5-turbo)はChatGPT有料プランのような応答速度が速いバージョンのGPT-3.5です。
使い方
Pythonライブラリを利用して、以下のようにコードを書きます。このコードを実行すると、応答のテキストが数文字ずつstreaming出力されます。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
],
stream=True
)
for chunk in completion:
print(chunk.choices[0].delta)
streamingをTrueにすると、SSE(Server Sent Events) として出力されます。
一方で、streaming出力をしない場合には以下の様に書きます。こちらのほうがややコードが短くなります。このコードを実行すると、応答が全て完了したら、丸ごと出力してくれます。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
]
)
print(completion.choices[0].message)
リクエストボディ
パラメータ名型デフォルト値説明modelstring必須使用するモデルのID。messagesarray必須これまでの会話を構成するメッセージのリスト。role (string, 必須)メッセージの作者の役割です。system、user、assistant、functionのいずれかを入れます。content (stringまたはnull, 必須)メッセージの内容です。すべてのメッセージにおいて、contentは必須です。ただし、functionを呼び出すためのassistantのメッセージの場合、contentはnullである場合があります。name (string, 任意)メッセージの発言者の名前です。ユーザーやチャットボットに命名したいときに使えますね。functionsarray任意モデルがJSON入力を生成できる関数のリスト。function_callstring/object任意モデルが関数呼び出し(function call)にどのように応答するかを制御。temperaturenumber/null1使用するサンプリング温度、0から2の間。top_pnumber/null1トークンの上位10%の確率質量のみを考慮することを意味する。ただし、temperatureと一緒に設定することは推奨されていない。通常、不要。ninteger/null1各入力メッセージに対して生成するチャット完了の選択肢の数。streamboolean/nullfalse部分的なメッセージの差分が送信されるかどうか。stopstring/array/nullnullAPIがこれ以上のトークンを生成しないようにするシーケンス。max_tokensintegerinfチャット完了で生成するトークンの最大数。presence_penaltynumber/null0-2.0から2.0の間の数字。新しいトピックについて話す可能性を高める。frequency_penaltynumber/null0-2.0から2.0の間の数字。モデルが同じ行を文字通りに繰り返す可能性を減少させる。logit_biasmapnull完了時に特定のトークンが表示される確率を変更する。userstring任意エンドユーザーを表す一意の識別子。OpenAIが不正使用を監視および検出するのに役立つ。ユーザーのIDのようなユニークなものを与える。
さらに詳細はドキュメントのこちらをご覧ください。
なお、messages -> role -> system に入力している内容(=システムメッセージ)はAIアシスタントの振る舞いを決めるものです。
例えば、AIアシスタントの性格を変更したり、会話全体での振る舞い方に関する具体的な指示を提供したりすることができます。
ただし、システムメッセージは任意です。システムメッセージがない場合、AIアシスタントの振る舞いは「You are a helpful assistant.」といった一般的なメッセージを使用する場合と類似します。
つまり、特定の性格や振る舞いを決める必要がない場合には、システムメッセージは不要です。
streamingすべきか
streaming出力はUXには良いですが、サーバーに負担をかけるという説があるっぽいので、そこの兼ね合いです。
ただ、最近はAPIの応答速度も向上してきているので、とくに長文の入出力を想定していなければ、streamingしなくても良い気がします。
Chat Completionsの価格
Chat Completionsの価格は、「入力トークン数」と「出力トークン数」の合計の費用がかかるようになっています。
「トークン」とは、文字数に似た概念で、日本語の場合は1文字につき1.2トークンほどが消費されるようになっています。
つまり、入力文字や出力文字が多ければ多いほど、費用が高くなります。
GPT-4の価格
モデル価格 / 入力トークン数価格 / 出力トークン数8K context$0.03 / 1K tokens$0.06 / 1K tokens32K context$0.06 / 1K tokens$0.12 / 1K tokens
GPT-3.5-TURBOの価格
モデル価格 / 入力トークン数価格 / 出力トークン数4K context$0.0015 / 1K tokens$0.002 / 1K tokens16K context$0.003 / 1K tokens$0.004 / 1K tokens
最新の価格はこちらで→https://openai.com/pricing
Embeddingsを使う
EmbeddingsをおこなえるAPIも提供されています。
Embeddings (エンべディング)とは
Embeddingsは、テキストの関連性を算出する技術です。
Embeddingsは、以下のような場面で一般的に使用されます。
- 検索(クエリ文字列との関連性に基づいて結果がランク付けされる場面)
- クラスタリング(テキスト文字列が類似性に基づいてグループ化される場面)
- レコメンド(関連するテキスト文字列を持つアイテムが推薦される場面)
- 異常検出(関連性が少ない外れ値が特定される場面)
- 多様性の測定(類似性の分布が分析される場面)
- 分類(テキスト文字列が最も類似したラベルによって分類される場面)
Embeddingsは、浮動小数点数のリストであるベクトルです。
2つのベクトル間の距離は、それらの関連性を測定します。距離が小さいほど高い関連性を示し、距離が大きいほど低い関連性を示します。
とくに、OpenAIのAPIを利用するユーザーは、
- ベクトルDBにドキュメントの情報を保存する
- ユーザーの入力テキストに基づいて関連情報をEmbeddings経由でベクトルDBから取得する
- 取得した2を元に、今度はChat Completionsを呼び出してチャットさせる
という使い方をすることが多いです。
これにより、まるでAIアシスタントが記憶を持っているかのように見せることが出来るので、非常に便利です。
また、AIアシスタントに常にドキュメントの情報(ベクトルDB)を引用するように指示することで、常に根拠に基づいた応答をさせることが出来ます。
さらに具体的に知りたい方は、公式のEmbeddingsガイドをご覧ください。EmbeddingsのAPIリファレンスはこちら です。
Embeddingsを作成する
まずはEmbeddingsを作成していく必要があります。以下のように書けば作成できます。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
# 指定したモデルと入力テキストを使用してEmbeddingを作成
response = openai.Embedding.create(
model="text-embedding-ada-002",
input
="The food was delicious and the waiter..."
)
# レスポンスからEmbeddingsだけを抽出
embeddings = response['data'][0]['embedding']
# "embeddings"を含めたデータをベクトルDBに格納する
なお、modelは他にもありますが、最も優秀で推奨されているモデルはtext-embedding-ada-002であり、これがスタンダードになっています。コストは非常に安いです。
また、コードの最後にコメントしましたが、多くの場合ベクトルDBを利用することになるので、抽出した”embeddings”をベクトルDBに格納するコードを途中に挿入する必要があります。
そして、レスポンスはこんな感じ。
{
"object": "list",
"data": [
{
"object": "embedding",
"embedding": [
0.0023064255,
-0.009327292,
.... (1536 floats total for ada-002)
-0.0028842222,
],
"index": 0
}
],
"model": "text-embedding-ada-002",
"usage": {
"prompt_tokens": 8,
"total_tokens": 8
}
}
Embeddingsの価格
最新の価格はこちらで→https://openai.com/pricing
モデル価格 / 利用量Ada v2$0.0001 / 1K tokens
推奨ベクトルデータベース
OpenAIは適したベクトルデータベースを利用することを推奨しており、以下を候補として挙げています。
OpenAIの公式ガイドには載っていませんでしたが、PostgresSQLのpgvectorも最近は人気です。Supabaseも対応しています。
Embeddingsにおける検索にはノウハウがいる?
作成したEmbeddingsをベクトルDBに格納したら、次は検索して取得してくるのが必要になります。ユーザーが入力したテキストと関連性の高いデータを検索するようなケースですね。
しかし、Embeddingsで良い検索結果を得るのはそう簡単ではないようです。色々と試行錯誤が必要になるようです。
この検索のことをRetrievalと言うのですが、Retrievalにはノウハウがあるようなのです。しかも日本語は特にそうで、英語だと精度が高くて心配不要なことが、日本語だと上手くやる必要があるという、よくある英語の壁です。
たとえば、100記事あるドキュメントを格納する場合、100個の文章をそのまま格納するのではなくではなく、良い感じに500文字ずつに分けて格納していくほうが関連性が上手く出やすいなどのノウハウがあるようです。
(Twitterで数名の方がそのようなことを言っているのを見ましたがソース見つからず。すみません🙇)
とにかく色々試しながら自分のニーズに合うものを追求するしかなさそうです。
Moderationsを使う
Moderationsは、与えられた入力テキストに対して、モデルがそれがOpenAIのコンテンツポリシーに違反すると判定するかどうかを出力します。
知らない間にユーザーがポリシー違反のリクエストを送りまくってしまいOpenAIにBANされることのないように、OpenAI の ChatやEmbeddingsを使うなら必ず使いたいAPIです。
そもそも自社のサービスとして暴力や性的な表現を規制したい場合にもこれは非常に便利なAPIですね。ただし、OpenAIの他のAPIを利用する場合にのみ利用を許可されているので、他の無関係なサービスでは使えませんので注意。
使い方
以下のように実行します。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Moderation.create(
input
="I want to kill them.",
)
返ってくるレスポンスはこんな感じ。
{
"id": "modr-XXXXX",
"model": "text-moderation-005",
"results": [
{
"flagged": true,
"categories": {
"sexual": false,
"hate": false,
"harassment": false,
"self-harm": false,
"sexual/minors": false,
"hate/threatening": false,
"violence/graphic": false,
"self-harm/intent": false,
"self-harm/instructions": false,
"harassment/threatening": true,
"violence": true,
},
"category_scores": {
"sexual": 1.2282071e-06,
"hate": 0.010696256,
"harassment": 0.29842457,
"self-harm": 1.5236925e-08,
"sexual/minors": 5.7246268e-08,
"hate/threatening": 0.0060676364,
"violence/graphic": 4.435014e-06,
"self-harm/intent": 8.098441e-10,
"self-harm/instructions": 2.8498655e-11,
"harassment/threatening": 0.63055265,
"violence": 0.99011886,
}
}
]
}
基本的にはflaggedがtrueかどうかを見極めればいいのですが、flaggedの判断に至った細かい要素も分類して一緒に返してくれます。
この例では、”I want to kill you”という極めて攻撃的な表現が含まれているので、「harassment/threatening」(ハラスメント / 脅迫)および「violence」(暴力)がtrueになっていますね。
Moderationsの価格
Moderations APIは完全無料です。
ただし、OpenAIの他のAPIを利用する場合にのみ利用を許可されているので、他の無関係なサービスでは使えませんので注意。
Images (DALL E) を使う
このセクションは執筆中です。お待ちください。
Audio (Whisper) を使う
このセクションは執筆中です。お待ちください。
セキュリティ面
OpenAI APIに送信したデータはどうなるのか?
OpenAIは、2023年3月にデータの利用ポリシーを変更し、以下のように公表しています。(太字は筆者によるもの)
OpenAIは、お客様がAPIを介して提出したデータを、明示的にその目的でデータを共有することを決定しない限り、モデルのトレーニングや改善には使用しません。データを共有するためには選択することができます。APIを通じて送信されたデータは、虐待や誤用の監視のために最大30日間保持され、その後削除されます(法律により別の期間が必要な場合を除く)。
海外に送信することなく日本国内のみでGPTを使うにはAzure OpenAI Service
OpenAIのAPIは学習には使われず、30日後に必ず削除すると言われていますが、そもそも海外にデータを送りたくない企業もあると思います。
その場合、MicrosoftのAzure OpenAI Serviceを利用しましょう。
Azure OpenAI Serviceを利用するメリット
・東京リージョン利用により、データを国内に閉じることが出来る
・安定している
・応答が速い
安定性や応答速度も本家OpenAIより良いらしいので、基本的にはAzure利用で良いでしょう。
その他、補足
- Chat Completionsではなく単にCompletionsというAPIが過去には文章生成APIとして利用されていましたが、ChatGPTリリース以降、利用が減り、すでにLegacyとされ、モデルも更新されなくなりました。今もAPIドキュメントには掲載されていますが、「ほとんどのケースでChatをオススメします」と記載されています。
- Fine-tuneに関しては、上記のCompletionsに対応しているのみですが、今年2023年中にはChatに対応したものが公開されるようです。
関連情報
OpenAIのAPIを利用する際には、利用制限に注意してください。早く申請しないと途中で止められます。参考記事:OpenAIのAPIを使うならUsage Limit(=使用制限)に注意。事前に申請しないと利用できるのは125ドルまで