OpenAI platform : ガイド : GPT モデル (gpt-4 & gpt-3.5-turbo) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/28/2023
* 本ページは、以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
OpenAI platform : ガイド : GPT モデル (gpt-4 & gpt-3.5-turbo)
OpenAI の GPT (生成的事前訓練済み transformer) モデルは自然言語とコードを理解するために訓練されました。GPT は入力への応答としてテキスト出力を提供します。GPT への入力はまた「プロンプト」とも呼ばれます。プロンプトの設計は基本的には貴方が GPT モデルをどのように「プログラム」するかで、通常はタスクを成功的に完遂する方法のインストラクションか幾つかの例を提供することによります。
GPT を使用して、以下のためにアプリケーションを構築することができます :
- ドキュメントの下書きをする
- コンピュータのコードを書く
- 知識ベースについて質問に答える
- テキストの分析
- 会話エージェントの作成
- ソフトウェアに自然言語インターフェイスを与える
- 様々な科目の教師
- 言語の翻訳
- ゲームのキャラクターのシミュレート
…and much more!
OpenAI API 経由で GPT モデルを使用するためには、入力と API キーを含むリクエストを送り、モデルの出力を含むレスポンスを受け取ります。最新モデル gpt-4 と gpt-3.5-turbo はチャット補完 API エンドポイント経由でアクセスされます。現在、古いレガシーモデルだけが補完 API エンドポイント経由で利用可能です。
モデル・ファミリー | API エンドポイント | |
---|---|---|
Newer models (2023–) | gpt-4, gpt-3.5-turbo | https://api.openai.com/v1/chat/completions |
Legacy models (2020–2022) | text-davinci-003, text-davinci-002, davinci, curie, babbage, ada | https://api.openai.com/v1/completions |
プレイグラウンド で GPT を試すことができます。どのモデルを使用するべきか分からない場合は、gpt-3.5-turbo か gpt-4 を使用してください。
チャット補完 API
チャットモデルは入力としてメッセージのリストを受け取り、出力としてモデル生成メッセージを返します。チャット形式はマルチターンの会話を簡単にするように設計されていますが、会話なしに単一ターンのタスクに対しても同様に有用です。
サンプル API 呼び出しは以下のようなものです :
import openai
openai.ChatCompletion.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 リファレンス・ドキュメントは ここ でご覧ください。
主要な入力は messages パラメータです。messages はメッセージ・オブジェクトの配列である必要があり、各オブジェクトは role (“system”、”user” か “assistant”) と content を持ちます。会話は一つのメッセージほどに短かったり、多くのやりとりのターンであり得ます。
通常は、会話は最初にシステムメッセージ、そしてユーザとアシスタントの交互のメッセージが続くというフォーマットです。
システムメッセージはアシスタントの動作を設定するのに役立ちます。例えば、アシスタントの個性 (personality) を変更したり、会話を通してそれがどのように動作するべきか特定のインストラクションを提供することができます。ただし、システムメッセージはオプションで、システムメッセージなしのモデルの動作は “You are a helpful assistant.” のような一般的なメッセージの使用と類似している傾向にあることに注意してください。
ユーザメッセージはアシスタントが応答するためのリクエストかコメントを提供します。アシスタントメッセージは以前のアシスタントレスポンスをストアしますが、望まれる動作のサンプルを与えるために貴方により書かれることも可能です。
ユーザインストラクションが以前のメッセージを参照しているとき、会話履歴を含めることは重要です。上記のサンプルでは、”Where was it played?” というユーザの最後の質問は 2020 年のワールドシリーズについての前のメッセージのコンテキストでだけ意味があります。モデルは過去のリクエストの記憶を持ちませんので、すべての関連情報は各リクエストで会話履歴の一部として供給される必要があります。会話がモデルのトークン制限に収まらない場合には、何らかの方法で短縮される必要があります。
テキストが反復的に返される ChatGPT で見られる効果を模倣する (mimic) には、stream パラメータを True に設定します。
チャット補完レスポンス形式
サンプルのチャット補完 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
}
}
Python では、アシスタントの応答は response[‘choices’][0][‘message’][‘content’] で抽出できます。
すべてのレスポンスは finish_reason を含みます。finish_reason の取れる値は :
- stop: API が返した完全な (complete) メッセージ、または stop パラメータを介して提供された stop シークエンスの一つにより終了した (terminated) メッセージ
- length: max_tokens パラメータまたはトークン制限による不完全なモデル出力
- function_call: モデルは関数の呼び出しを決定。
- content_filter: コンテンツフィルタのフラグにより省略されたコンテンツ
- null: API レスポンスがまだ進行中か不完全である
(以下で示されるような関数の提供のような) 入力パラメータに依存して、モデル応答は異なる情報を含む場合があります。
関数呼び出し
API 呼び出しでは、gpt-3.5-turbo-0613 と gpt-4-0613 に対して関数を記述して、モデルにそれらの関数を呼び出す引数を含む JSON オブジェクトを出力することを知的に選択させることができます。チャット補完 API は関数を呼び出しません ; 代わりに、モデルは貴方のコード内の関数を呼び出すために使用できる JSON を生成します。
最新モデル (gpt-3.5-turbo-0613 と gpt-4-0613) は、(入力に応じて) 関数が呼び出される必要があるときを検出し、そして関数シグネチャに従った JSON で応答するように微調整されています。この機能はまた潜在的なリスクを生じます。ユーザの代理で (現実) 世界に影響を与えるアクション (電子メールの送信、オンラインで何かを投稿する、購入を実行する等) を取る前に、ユーザ確認フローを組み込むことを強く勧めます。
内部的には、モデルが訓練されたシンタクス内で関数はシステムメッセージに注入されます。これは、関数がモデルのコンテキスト制限に対して有効で、入力トークンとして課金されることを意味します。コンテキスト制限に遭遇した場合、関数の数を制限するか、関数パラメータに提供するドキュメントの長さを制限することを提案します。
関数呼び出しはモデルから構造化データをより信頼性高く取得することを可能にします。例えば、以下が可能です :
- (例えば ChatGPT プラグインのような) 外部 API を呼び出すことにより質問に答えるチャットボットを作成する
- e.g. send_email(to: string, body: string) や get_current_weather(location: string, unit: ‘celsius’ | ‘fahrenheit’) のような関数を定義する
- 自然言語を API 呼び出しに変換する
- e.g. “Who are my top customers?” を get_customers(min_revenue: int, created_before: string, limit: int) に変換して内部 API を呼び出す
- テキストから構造化データを抽出する
- e.g. extract_data(name: string, birthday: string), or sql_query(query: string) という名前の関数を定義する
..and much more!
関数呼び出しのための基本的なステップのシークエンスは以下のようなものです :
- ユーザのクエリーと functions パラメータで定義された関数のセットでモデルを呼び出します。
- モデルは関数を呼び出すことを選択できます ; その場合、コンテンツはカスタムスキーマに従って stringified JSON オブジェクトになります (note: モデルは不正な JSON を生成したりパラメータをハルシネイトする場合があります)。
- コードで文字列を JSON にパースして、(もしあれば) 提供された引数で関数を呼び出します。
- 関数のレスポンスを新しいメッセージとして追加することにより再度モデルを呼び出し、モデルに結果を要約してユーザに戻させます。
これらのステップを以下のサンプルを通して実際に見ることができます :
import openai
import json
# Example dummy function hard coded to return the same weather
# In production, this could be your backend API or an external API
def get_current_weather(location, unit="fahrenheit"):
"""Get the current weather in a given location"""
weather_info = {
"location": location,
"temperature": "72",
"unit": unit,
"forecast": ["sunny", "windy"],
}
return json.dumps(weather_info)
def run_conversation():
# Step 1: send the conversation and available functions to GPT
messages = [{"role": "user", "content": "What's the weather like in Boston?"}]
functions = [
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto", # auto is default, but we'll be explicit
)
response_message = response["choices"][0]["message"]
# Step 2: check if GPT wanted to call a function
if response_message.get("function_call"):
# Step 3: call the function
# Note: the JSON response may not always be valid; be sure to handle errors
available_functions = {
"get_current_weather": get_current_weather,
} # only one function in this example, but you can have multiple
function_name = response_message["function_call"]["name"]
fuction_to_call = available_functions[function_name]
function_args = json.loads(response_message["function_call"]["arguments"])
function_response = fuction_to_call(
location=function_args.get("location"),
unit=function_args.get("unit"),
)
# Step 4: send the info on the function call and function response to GPT
messages.append(response_message) # extend conversation with assistant's reply
messages.append(
{
"role": "function",
"name": function_name,
"content": function_response,
}
) # extend conversation with function response
second_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
) # get a new response from GPT where it can see the function response
return second_response
print(run_conversation())
関数呼び出しのハルシネイトされた出力はシステムメッセージで軽減できる場合が多いです。例えば、モデルがそれに供給されていない関数で関数呼び出しを生成しているのを見つけた場合、”Only use the functions you have been provided with.” というシステムメッセージを使用してみてください。
上の例では、関数の応答をモデルに送り返して、それに次のステップを決めさせています。ユーザにボストンの気温を知らせるユーザ向けメッセージで応答しましたが、クエリーに依存して、それは再度関数を呼び出すことを選択するかもしれません。
例えば、モデルに “Find the weather in Boston this weekend, book dinner for two on Saturday, and update my calendar” と頼んで、これらのクエリーのために対応する関数を提供する場合、モデルはそれらを繰り返し呼び返すことを選択して、ようやく最後にユーザ向けメッセージを作成するかもしれません。
モデルに特定の関数を呼び出すことを強制したい場合、function_call: {“name”: “<insert-function-name>”} を設定することでそれを行なうことができます。function_call: “none” を設定することでモデルにユーザ向けメッセージを生成することを強制することもできます。デフォルトの動作 (function_call: “auto”) は関数を呼び出すか否か、その場合どの関数を呼び出すかをモデルが自身で決定することに注意してください。
You can find more examples of function calling in the OpenAI cookbook:
- Function calling – Learn from more examples demonstrating function calling
補完 API (レガシー)
(訳注: 原文 参照)
チャット補完 vs 補完
チャット補完形式は単一のユーザメッセージを使用したリクエストを構築することで補完形式と同様にすることができます。例えば、次の補完プロンプトで英語からフランス語に翻訳することができます :
Translate the following English text to French: "{text}"
And an equivalent chat prompt would be:
[{"role": "user", "content": 'Translate the following English text to French: "{text}"'}]
同様に、入力を 適切に フォーマットすれば、補完 API はユーザとアシスタント間のチャットをシミュレートするために使用することができます。
これらの API 間の違いはそれぞれで利用可能な基礎的な GPT モデルに主として由来しています。チャット補完 API は最も高性能なモデル (gpt-4) と最もコスト効率的なモデル (gpt-3.5-turbo) へのインターフェイスです。参考まで、gpt-3.5-turbo は text-davinci-003 と同様の機能レベルで実行しますが、10% のトークン毎価格です!See pricing details here.
どのモデルを使用するべきでしょう?
一般には gpt-4 か gpt-3.5-turbo のいずれかを使用することを勧めます。これらのいずれを使用するべきかはそのためにモデルを使用しているタスクの複雑さに依存します。gpt-4 は一般的には広範囲の評価でより良く遂行します。特に、gpt-4 は複雑なインストラクションに注意深く従う点でより能力が高いです。対照的に、gpt-3.5-turbo は複雑なマルチパートのインストラクションの一つの部分だけに従う傾向が高いです。gpt-4 は「ハルシネーション (hallucination)」として知られる動作、情報をでっち上げる傾向が gpt-3.5-turbo よりも少ないです。gpt-3.5-turbo の 4,096 トークンと比較して、gpt-4 はまた 8,192 トークンの最大サイズを持つより大きなコンテキストウィンドウを持ちます。ただし、gpt-3.5-turbo はより低いレイテンシーで出力を返し、トークン毎のコストが遥かに低いです。
貴方の使用方法に対して最良の価格パフォーマンスのトレードオフをどちらのモデルが提供するかを調べるために プレイグラウンド で実験することを勧めます。一般的なデザインパターンは、幾つかの異なるクエリータイプを使用してそれらを処理するために適切なモデルにディスパッチすることです。
GPT ベストプラクティス
GPT を操作するためのベストプラクティスを知っているとアプリケーション性能に大きな違いを作ることができる可能性があります。GPT が示す障害 (failure) モードと、それらの障害モードを回避したり正す方法は必ずしも直観的ではありません。「プロンプトエンジニアリング」として知られるようになったGPT を操作するスキルがありますが、この分野が進歩するにつれて、そのスコープは単なるプロンプトのエンジニアリングをモデルクエリーをコンポーネントとして扱うエンジニアリングシステムへと脱却させました。更に学習するには、GPT ベストプラクティス に関するガイドを読んでください、これはモデル推論を改良し、モデルのハルシネーションの尤度を減じる等のための手法をカバーしています。OpenAI クックブック では、コードサンプルを含む多くの有用なリソースを見つけることもできます。
Managing tokens
(訳注: 原文 参照)
FAQ
モデル出力に一貫性がないのは何故ですか?
この API はデフォルトでは非決定論的です。これはつまり、プロンプトが同じままでさえも、API を呼び出すたびに僅かに異なる補完を得られるかもしれないということです。temperature を 0 に設定すると出力を殆ど決定論的にしますが、少量の変動は残ります。
temperature パラメータをどのように設定するべきでしょう?
temperature のより低い値はより一貫性のある出力という結果になり、一方でより高い値は多様で創造的な結果を生成します。貴方の特定のアプリケーションのために一貫性と創造性の間の望ましいトレードオフに基づいて temperature の値を選択してください。
微調整は最新モデルに対して利用可能ですか?
いいえ。現在、ベース GPT-3 モデル (davinci, curie, babbage, そして ada) を微調整できるだけです。See the fine-tuning guide for more details on how to use fine-tuned models.
API に渡されたデータをストアされますか?
2023年3月1日の時点で、API データを 30 日間保持しますが、モデルを改良するために API 経由で送られたデータはもはや使用しません。Learn more in our data usage policy. Some endpoints offer zero retention.
アプリケーションをより安全にどのように作成できるでしょう?
チャット API の出力にモデレーション層を追加したいのであれば、モデレーションガイド に従って、OpenAI の利用ポリシーに違反するコンテンツが表示されることを回避することができます。
ChatGPT か API を使用するべきでしょうか?
ChatGPT は OpenAI API のモデルへのチャットインターフェイスと統合ブラウジング, コード実行, プラグイン等のような広範囲の組み込み機能を提供します。対照的に、OpenAI の API の使用はより多くの柔軟性を提供します。
以上