第1章 「ChatGPT API」の概要
1-1 ChatGPT APIとは?
ChatGPT APIとは、開発者が自然言語処理を行う際に使用されるAIモデル「ChatGPT」を組み込むためのツールであり、OpenAIが開発した自然言語処理(NLP)モデルであるChatGPTを外部のシステムから利用できる仕組みです。
そもそもChatGPTとは?という方はこちらの記事も併せてお読みください。
APIは「Application(アプリケーション) Programming(プログラミング) Interface(インターフェース)」の略で、異なるソフトウェアやWebサービスでの情報のやり取りをつなぐインターフェースを指します。
ChatGPT APIの中核機能としてテキスト生成が挙げられます。OpenAIのテキスト生成モデルは言語、コード、画像を理解するように訓練されており、入力に応じてテキストを出力します。
例えば、タスクを完了する指示やいくつかの例を提供してくれます。具体的にテキスト生成モデルの例として、gpt-4 turbo、gpt-4、gpt-3.5-turboなどが挙げられます。
gpt-4 turboは、OpenAI社が2023年11月6日(現地時間)に開催した開発者向けカンファレンスの「OpenAI DevDay」にて、新たな大規模言語モデルとして発表されたものです。
1-2 テキスト生成モデルにできること
Open AIのテキスト生成モデルを使用すると、次のようなアプリケーションを構築できます。
・ドキュメントの下書き
・コンピュータコードを書く
・知識ベースに関する質問に回答する
・テキストを分析する
・ソフトウェアに言語インターフェースを与える
・様々な科目の教師
・言語を翻訳する
・ゲームのキャラクターをシミュレーションする
また、gpt-4-vision-previewのリリースにより、画像を処理し理解するシステムも構築できるようになりました。
これらのモデルを OpenAI API 経由で使用するには、入力と API キーを含むリクエストを送信し、モデルの出力を含むレスポンスを受け取ります。OpenAIの新モデルである gpt-4 と gpt-3.5-turbo は、Chat Completions API エンドポイントからアクセスできます。
モデル名 | APIエンドポイント | |
新モデル(2023年~) | gpt-4, gpt-4 turbo, gpt-3.5-turbo | https://api.openai.com/v1/chat/completions |
更新された旧型モデル(2023年~) | gpt-3.5-turbo-instruct, babbage-002, davinci-002 | https://api.openai.com/v1/completions |
旧型モデル(2020年~2022年) | text-davinci-003, text-davinci-002, davinci, curie, babbage, ada | https://api.openai.com/v1/completions |
ChatGPTのAPI機能を利用するにはまず、API キーと呼ばれるコードを入手する必要があります。
1-3 APIキーの取得方法
①OpenAIのウェブサイトにアクセスします。(リンク)
②OpenAIのアカウントを作成します。
右上の『Sign up』をクリックしてOpenAIのアカウントの作成を行いましょう。OpenAIのアカウントの作成には氏名・電話番号・メールアドレスが必要です。
③OpenAIのPlatformを開きましょう(リンク)
④右上の『Personal』をクリックし、『Manage account』を選択します。
⑤サイドバーから『Billing』をクリック
⑥『Set up paid account』をクリック
⑦クレジットカード情報を入力
⑧APIキーを取得
クレジットカード登録が完了したらいよいよAPIキーの取得です。先ほどのサイドバーから『API keys』を選択しましょう。下のような画面になりますので『+Create new secret key』をクリックしましょう。
これで取得は完了になります。
出力されるAPIキーは一度しか表示されないので確実にコピーやスクショで保存するようにして下さい。
また、他人に不正利用されると、利用料金を肩代わりさせられる危険性がありますので、他人にAPIキーを送信することは基本的には避けましょう。
第2章 ChatGPT APIのPythonを用いた使い方
2-1 APIの種類
入手したAPIキーを元に、実際にChatGPTのAPI機能を活用してみましょう。
OpenAIにはChat Completions APIとCompletions APIという2つの主要なタイプがあります。
Chat Completions APIとCompletions APIの違いはプロンプトの内容が構造化(テンプレート化)されているかどうかです。
2020年6月にリリースされたCompletions APIはLLMとやり取りするためのフリーフォームのテキストプロンプトを提供していました。この章では2つのタイプの機能、使い方に触れてみます。
ちなみに他にも画像生成が可能なモデルや画像認識が可能なモデルも存在します。
その前に、APIの重要な概念、専門用語に関して前提となる知識を共有します。
・エンドポイント(end point):APIが提供するサービスや機能へのアクセスポイントのこと。APIを利用する際、ユーザーまたはプログラムはエンドポイントにリクエストを送信し、必要なデータや機能を利用します。
・プロンプト(Prompts):APIへの入力テキスト
・コンプレッション(Completions):APIがプロンプトに対して生成する回答(出力)テキスト
・トークン(Tokens):文章で意味を持つ最小単位の要素(英語だと1単語で1トークン、日本語だと1文字で1~3トークン)
以上の用語はChat Completions APIとCompletions APIを理解するうえで必要なので覚えておきましょう。
それでは具体的にChat Completions APIとCompletions APIを見ていきます。
2-2 Chat Completions API
Chat Completions APIは入力としてメッセージを受け取り、出力としてモデルが生成したメッセージを返します。
Chat Completions APIの入力のフォーマット
実際にChat Completions APIを使うと以下のようになります。
import openai
openai.api_key = "YOUR_API_KEY"
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
詳しくはAPI reference documentation をご覧ください。
こちらのコードについて詳しく解説します。
openai.api_key = "YOUR_API_KEY"
の部分に先ほど発行したAPIキーを入力しましょう。
model="gpt-3.5-turbo"
の部分に使用するモデルを入力しましょう。利用可能なモデルとしてgpt-4、gpt-3.5-turbo-16k、gpt-3.5-turboが挙げられます。
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
Chat Completions APIへの主な入力はメッセージです。メッセージは構造化(テンプレート化)され、一連の会話、複数ターンの会話をメッセージのリストとして入力できます。
各メッセージにはrole(“system”、”user“、”assistant”のいずれか)とcontentを含みます。会話には1メッセージの短いものから何度も行き来する物まであります。
通常、会話は最初にsystemメッセージがあり、その後にuserとassistantのメッセージが交互に続く形式になっています。
systemメッセージはアシスタントの動作を設定するのに役立ちます。例えば、アシスタントの性格を変更したり、会話中どのように振る舞うべきかについて具体的な指示を与えることができます。(例:あなたは優秀な医師です。)
userメッセージは、アシスタントが応答するためのリクエストや質問を提供します。(例:インフルエンザになったらどうすれば良いですか?)
assistantメッセージはuserに対する回答を返します。望ましい動作の例を与えるために自分で書くこともできます。(例:病院に行きましょう)
userメッセージとassistantメッセージの形式で会話履歴を含めることは、ユーザーの指示が以前のメッセージを参照する内容である場合場合に重要です。
上の例では、“Where was it played? “というユーザーの最後の質問は、2020年のワールドシリーズに関する以前のメッセージの文脈でのみ意味をなします。モデルには過去のリクエストの記憶がないため、関連する情報はすべて、userメッセージとassistantメッセージの形式で提供しなければなりません。
Chat Completions APIの返答のフォーマット
入力メッセージに対する返答は通常以下のような形式となります。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "The 2020 World Series was played in Texas at Globe Life Field in Arlington.",
"role": "assistant"
}
}
],
"created": 1677664795,
"id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
"model": "gpt-3.5-turbo-0613",
"object": "chat.completion",
"usage": {
"completion_tokens": 17,
"prompt_tokens": 57,
"total_tokens": 74
}
}
そしてアシスタントの返事は次のようです。
response['choices'][0]['message']['content']
すべてのレスポンスには finish_reason が含まれます。finish_reasonはAPIの応答がどのような理由で終了したかを示しており、以下の値が指定され得ます:
・stop:この値は、APIがユーザーが指定したstop
パラメータに到達したか、もしくは完全なメッセージを返した場合に設定されます。
例: ユーザーが特定のキーワードや文の終了後に応答を停止するように指定した場合。
・length:この値は、応答がmax_tokens
パラメータや内部のトークン制限により、モデルの出力が最大長に達したことを意味します。
例: 長い応答が生成されたが、設定されたトークンの最大数に達したために途中で切り上げられた場合。
・function_call:モデルが関数の呼び出しを行い、それによって応答が終了した場合にこの値が設定されます。
例: 特定の条件下で特別な操作や計算を行うための内部関数が呼び出された場合。
・content_filter:応答がコンテンツフィルターによってフラグが立てられたため、一部または全部が省略されたことを示します。
例: 不適切または許可されていない内容が生成された場合に、その部分がフィルタリングされる。
・null:この値は、APIのレスポンスがまだ進行中であるか、何らかの理由で不完全であることを意味します。
例: ネットワークの問題やその他の技術的な問題により応答が完了していない場合。
JSONモードについて
JSONモードとは、モデルの出力が有効なJSONオブジェクトに分けられた文字列のみに制約されるモードのことを言います。
このモードを導入することで有効でないJSONオブジェクトの出力を抑え、トークン数を減らすことができます。トークンを減らすメリットとして以下の3点が挙げられます。
・料金がトークン数に比例するためAPIコールにかかるコストが減る
・トークンが多いほど時間がかかるため、APIコールにかかる時間が減る
・トークンの合計がモデルの最大制限値(gpt-3.5-turboでは4097トークン)以下でなければならないため、APIコールがまったく機能しないかどうか
JSONモードを使用する場合には、gpt-4-1106-previewやgpt-3.5-turbo-1106を呼び出す際に、response_formatを{“type”: “json_object” }と設定してください。
実際にJSONモードを導入すると以下のようになります。
import openai
openai.api_key = "YOUR_API_KEY"
response = openai.chat.completions.create(
model="gpt-3.5-turbo-1106",
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
)
print(response.choices[0].message.content)
そして、返答は次のようになります。
"content": "{\"winner\": \"Los Angeles Dodgers\"}"`
Reproducible Outputsについて
チャットからの返答は決まったものではなく、入力に応じて異なる可能性があります。しかし、以下のような手順を踏めば常に決まった返答を受け取ることができます。
・seedパラメーターを任意の整数に設定し、決まった出力を必要とするリクエストで同じ値を使用する
・他のすべてのパラメータ(promptやtemperatureなど)が、リクエスト間でまったく同じであることを確認する
詳しくはこちらを参照ください。
2-3 Completions API
Completions API エンドポイントは 2023 年 7 月にアップデートを受け、新しいChat completions エンドポイントとは異なるインターフェースを持っています。
入力はメッセージのリストではなく、プロンプトと呼ばれる自由形式のテキスト文字列です。
Completions APIのコールの例は以下のようになります。
import openai
openai.api_key = "YOUR_API_KEY"
response = client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Write a tagline for an ice cream shop."
)
詳しくは、API reference documentationを参照してください。
また、Completions APIにはLog Probabilitiesといったトークンの生成確率をさかのぼって確認できる機能が備わっており、これはモデルの出力に対する信頼度を評価する際に有効です。
Completions APIの返答のフォーマット
{
"choices": [
{
"finish_reason": "length",
"index": 0,
"logprobs": null,
"text": "\n\n\"Let Your Sweet Tooth Run Wild at Our Creamy Ice Cream Shack"
}
],
"created": 1683130927,
"id": "cmpl-7C9Wxi9Du4j1lQjdjhxBlO22M61LD",
"model": "gpt-3.5-turbo-instruct",
"object": "text_completion",
"usage": {
"completion_tokens": 16,
"prompt_tokens": 10,
"total_tokens": 26
}
}
Pythonでは、response[‘chations’][0][‘text’]で出力を抽出できます。回答のフォーマットは Chat Completions API の回答フォーマットに似ていますが、オプションフィールド であるlogprobs も含まれています。
第3章 ChatGPT APIの比較
Chat Completions APIとCompletions APIの違い
Chat Completions APIは、1つのユーザーメッセージを使ってリクエストを作成することで、Completions APIと同じようにプロンプトで入力することができます。
例えば、次のような入力で英語からフランス語に翻訳することができます:
Translate the following English text to French: "{text}"
それに相当するチャットの入力はこうなります:
[{"role": "user", "content": 'Translate the following English text to French: "{text}"'}]
これらのAPIの違いは、それぞれで利用可能な基礎モデルにもあります。
Chat Completions APIで利用可能なモデルとしてgpt-4、gpt-3.5-turbo-16k、gpt-3.5-turboが挙げられます。
そして、Completions APIでは、text-daVinci-003、text-curie-001、text-babbagre-001、text-ada-001が挙げられます。
Chat Completions APIを選択すると、最も高性能なモデル(gpt-4)と、最も費用対効果の高いモデル(gpt-3.5-turbo)のインターフェイスを指定できるのに対して、Completions APIでは、text-daVinci-003までしか選択することができません。
なお、gpt-3.5-turbo は text-davinci-003 と同様の機能レベルである一方で、 トークン単価は 10% と安価になっており、コスト面でも有利に設定されています。
ChatGPT APIの料金について詳しくはこちらの記事をご覧ください。
どのモデルを使うべきか?
一般的にはgpt-4かgpt-3.5-turboのどちらかを使用することをお勧めします。どちらを使うべきかは、そのモデルを使うタスクの複雑さによって決まります。
一般的に、gpt-4の方が幅広い評価で優れた性能を発揮します。特に、gpt-4は複雑な命令に注意深く従う能力が高く、gpt-4はgpt-3.5-turboよりも情報をでっち上げる可能性が低いです。(ハルシネーションの可能性が減少)
また、gpt-4はコンテキストウィンドウが大きく、最大サイズがgpt-3.5-turboの4,096トークンに対して8,192トークンである。しかし、gpt-3.5-turboはより短時間で出力を返し、トークンあたりのコストもはるかに低いです。
プレイグラウンドで実験し、どのモデルがあなたの使用方法にとって最良の価格性能トレードオフを提供するかを調査することをお勧めします。
第4章 まとめ
この記事ではChatGPT APIの概要と使い方を詳しく解説しました。
また、実際の作成例も紹介したので、参考にしてみてください。
エンジニアでなくてもChatGPT APIの概要を知り、Chat Completions APIとCompletions APIの違いを把握し使いこなすことができることは非常に大きい事だと思います。
今後GPT Storeが登場すれば収益化も見込めるので今のうちにとことん研究するのが良いかと思います!
執筆者:尾形悠太
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント