Python で ChatGPT を OpenAI API で接続する
目次
🖥実施環境
種類 | バージョン |
---|---|
OS | Windows 10 Home 22H2 64ビット メモリ16GB |
Python | 3.11.1 |
Flask | 2.2.3 |
ChatGPT | 無料会員 |
OpenAI API
API リファレンス

OpenAI API
An API for accessing new AI models developed by OpenAI
https://platform.openai.com/docs/api-reference
Chat API 使用料
https://openai.com/pricing#image-models

Python OpenAI ライブラリのインストール
pip install openai
ライブラリ | バージョン | リリース日 |
openai | 0.27.2 | 2023 年 3 月 11 日 |
インストール前状況

インストール後状況

いろいろな関連モジュールがインストールされました。(2023/03/18時点)
Package Version
------------------ ---------
aiohttp 3.8.4
aiosignal 1.3.1
async-timeout 4.0.2
attrs 22.2.0
certifi 2022.12.7
charset-normalizer 3.1.0
colorama 0.4.6
frozenlist 1.3.3
idna 3.4
multidict 6.0.4
openai 0.27.2
pip 23.0.1
requests 2.28.2
setuptools 67.6.0
tqdm 4.65.0
urllib3 1.26.15
wheel 0.40.0
yarl 1.8.2
APIキー の取得
OpenAI API 使用するにあたって、認証に必要なAPIキーを取得します。
下記API keysページにて + Create new secret key
ボタンを押すとAPIキーが表示されるので、それをコピーしておきます。
※忘れてしまうと再度表示確認する事は出来ません(新しいAPIキーを発行する)※

OpenAI API
An API for accessing new AI models developed by OpenAI
https://platform.openai.com/account/api-keys



APIキーの設定
直接記述するパターンや環境変数に入れるパターン等があるかと思います。
当環境ではFlaskの環境変数 → Configを利用しています。
※直接記述する場合は【OPENAI_API_KEY】部分をご自身のAPIキーに置き換えてください※
config.py
# OpenAI
OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')
チャット接続
※当環境はFlaskを使用して確認しています※

OpenAI API
An API for accessing new AI models developed by OpenAI
https://platform.openai.com/docs/api-reference/chat
サンプルに記載あるものをまずはそのまま動かしてみます。
import openai
openai.api_key = current_app.config['OPENAI_API_KEY']
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello!"}
]
)
print(completion.choices[0].message)
-- 結果 --
{
"content": "\n\nHi there! How may I assist you today?",
"role": "assistant"
}
返答があったので、接続は無事成功です。
では中身を細かく見ていきます。
使用メソッド:openai.ChatCompletion.create
パラメータ | 型 | 必須 | デフォルト | 設定内容 | 例 |
model | string | 必須 | 使用するモデルの ID。Chat API で動作するモデルの詳細については、モデル エンドポイントの互換性テーブルを参照してください。 | gpt-3.5-turbo | |
messages | array | 必須 | チャットの完了を生成するメッセージ (チャット形式)。 | ||
temperature | number | 1 | 使用するサンプリングtemperatureは 0 から 2 の間です。0.8 のような高い値は出力をよりランダムにしますが、0.2 のような低い値はより集中的で確定的なものにします。 通常、これを変更することをお勧めしますが、top_p両方を変更することはお勧めしません。 | ||
top_p | number | 1 | 核サンプリングと呼ばれる、temperatureによるサンプリングの代替手段であり、モデルは top_p 確率質量を持つトークンの結果を考慮します。したがって、0.1 は、上位 10% の確率質量を構成するトークンのみが考慮されることを意味します。 通常、これを変更することをお勧めしますが、temperature両方を変更することはお勧めしません。 | ||
n | integer | 1 | 入力メッセージごとに生成するチャット完了の選択肢の数。 | ||
stream | boolean | false | 設定すると、ChatGPT のように部分的なメッセージ デルタが送信されます。トークンは、利用可能になるとデータのみのサーバー送信イベントとして送信され、ストリームはdata: [DONE]メッセージで終了します。サンプル コードについては、OpenAI クックブックを参照してください。 | ||
stop | string or array | null | API がそれ以上のトークンの生成を停止する最大 4 つのシーケンス。 | ||
max_tokens | integer | inf | チャット完了で生成するトークンの最大数。 入力トークンと生成されたトークンの合計の長さは、モデルのコンテキストの長さによって制限されます。 | ||
presence_penalty | number | 0 | 2.0 から 2.0 までの数値。正の値は、それまでのテキストに出現するかどうかに基づいて新しいトークンにペナルティを課し、モデルが新しいトピックについて話す可能性を高めます。 | ||
frequency_penalty | number | 0 | 2.0 から 2.0 までの数値。正の値は、これまでのテキスト内の既存の頻度に基づいて新しいトークンにペナルティを課し、モデルが同じ行を逐語的に繰り返す可能性を減らします。 | ||
logit_bias | map | null | 指定したトークンが補完に表示される可能性を変更します。 トークン (トークナイザーのトークン ID で指定) を -100 から 100 の関連するバイアス値にマップする json オブジェクトを受け入れます。数学的には、サンプリングの前にモデルによって生成されたロジットにバイアスが追加されます。正確な効果はモデルごとに異なりますが、-1 から 1 の間の値では、選択の可能性が減少または増加します。-100 や 100 などの値を指定すると、関連するトークンが禁止または排他的に選択されます。 | ||
user | string | エンドユーザーを表す一意の識別子。これは、OpenAI が不正行為を監視および検出するのに役立ちます。 |
model
モデルエンドポイントの互換性表
エンドポイント | モデル |
/v1/chat/completions | gpt-4 gpt-4-0314 gpt-4-32k gpt-4-32k-0314 gpt-3.5-turbo gpt-3.5-turbo-0301 |
/v1/completions | text-davinci-003 text-davinci-002 text-curie-001 text-babbage-001 text-ada-001 davinci, curie babbage, ada |
/v1/edits text-davinci-edit-001 | text-davinci-edit-001 code-davinci-edit-001 |
/v1/audio/transcriptions | whisper-1 |
/v1/audio/translations | whisper-1 |
/v1/fine-tunes | davinci curie babbage ada |
/v1/embeddings | text-embedding-ada-002 text-search-ada-doc-001 |
/v1/moderations | text-moderation-stable text-moderation-latest |
messages
メッセージ オブジェクトの配列である必要がある。
オブジェクトにはrole( system
user
assistant
) と content (メッセージのコンテンツ) がある。
roleとcontentを設定すれば良いようだ
messages=[
{"role": "system or user or assistant", "content": "内容"}
]
roleの各違いは何か?
system
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "ピノキオとは?"}
]
)
print(completion.choices[0].message['content'])
-- 結果 --
ピノキオは、イタリアの作家カルロ・コッローディによって書かれた児童文学作品『ピノッキオの冒険』に登場する架空の人物です。
物語の主人公であるピノキオは、木から作られた人形で、口を開けばうそをついてしまうという癖があります。
ストーリーでは、ピノキオが様々な冒険を経験し、うそをつくことの悪影響を理解して、最終的に本物の人間になるために頑張る姿が描かれています。
ピノキオは現代でも、子どもたちに人間の良心や品格を教えるための有名なキャラクターの一つとして親しまれています。
user
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "ピノキオとは?"}
]
)
print(completion.choices[0].message['content'])
-- 結果 --
ピノキオは、イタリアの作家、カルロ・コッローディによって創作された童話の主人公で、木製の人形が本体である。
物語では、尻尾が伸びる嘘をつく癖があるために、鼻が長く伸びてしまう。ピノキオは、彼の聡明さ、勇気、そして善良さを証明するために、多くの試練を克服しながら成長する。
ピノキオという名前は、イタリア語で「松の木」という意味がある。
assistant
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "assistant", "content": "ピノキオとは?"}
]
)
print(completion.choices[0].message['content'])
-- 結果 --
ピノキオとは、イタリアの作家カルロ・コッローディによって書かれた児童小説『ピノッキオの冒険』の主人公である人形の名前です。
物語は、悪戯好きのピノキオが魔法使いによって人間になるための冒険をする姿を描いています。
ピノキオは、ウソをつくと鼻が伸びる、火にかけられると足が燃える、猫やイタチに騙されるなど、様々なトラブルに巻き込まれますが、最後には誠実さと勇気を学び、人間になることができます。
結果はそれぞれ微妙に回答が違いました。
リファレンス記載内容(訳)
通常、会話は最初にシステム メッセージでフォーマットされ、その後にユーザー メッセージとアシスタント メッセージが交互に続きます。
システム メッセージは、アシスタントの動作を設定するのに役立ちます。上記の例では、アシスタントは「あなたは役に立つアシスタントです」と指示されました。
ユーザー メッセージは、アシスタントへの指示に役立ちます。これらは、アプリケーションのエンド ユーザーによって生成されるか、開発者によって指示として設定されます。
アシスタント メッセージは、以前の応答を保存するのに役立ちます。また、望ましい動作の例を示すのに役立つように、開発者が作成することもできます。
会話履歴を含めると、ユーザーの指示で以前のメッセージが参照される場合に役立ちます。上記の例では、「どこで再生されましたか?」というユーザーの最後の質問です。2020 年のワールド シリーズに関する以前のメッセージのコンテキストでのみ意味があります。モデルには過去のリクエストの記憶がないため、すべての関連情報は会話を介して提供する必要があります。会話がモデルのトークン制限内に収まらない場合は、何らかの方法で短くする必要があります。
通常、会話は最初にシステム メッセージでフォーマットされ、その後にユーザー メッセージとアシスタント メッセージが交互に続きます。
システム メッセージは、アシスタントの動作を設定するのに役立ちます。上記の例では、アシスタントは「あなたは役に立つアシスタントです」と指示されました。
ユーザー メッセージは、アシスタントへの指示に役立ちます。これらは、アプリケーションのエンド ユーザーによって生成されるか、開発者によって指示として設定されます。
アシスタント メッセージは、以前の応答を保存するのに役立ちます。また、望ましい動作の例を示すのに役立つように、開発者が作成することもできます。
会話履歴を含めると、ユーザーの指示で以前のメッセージが参照される場合に役立ちます。上記の例では、「どこで再生されましたか?」というユーザーの最後の質問です。2020 年のワールド シリーズに関する以前のメッセージのコンテキストでのみ意味があります。モデルには過去のリクエストの記憶がないため、すべての関連情報は会話を介して提供する必要があります。会話がモデルのトークン制限内に収まらない場合は、何らかの方法で短くする必要があります。
リファレンス記載のサンプルコード
completion = 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?"}, # 2020年のワールドシリーズを制したのは?
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, # 2020年、ロサンゼルス・ドジャースがワールドシリーズを制覇した。
{"role": "user", "content": "Where was it played?"} # どこで行われたのですか?
]
)
print(completion.choices[0].message['content'])
-- 結果 --
The 2020 World Series was played at a neutral location, Globe Life Field in Arlington, Texas.
# 2020年のワールドシリーズは、中立地であるテキサス州アーリントンのグローブライフ・フィールドで行われました。
現時点での見解
roleは個別というよりは、【流れ】で使用するイメージではないかと
system でスタート
↓
user 質問をする
↓
assistant 回答
↓
user 再度質問をする
↓
assistant 回答
まさしくチャットのように以前の質問、回答内容も次の送信時には含める事で "話が成り立つ” ようになるのかと。
に
system でスタート
↓
user 質問をする
↓
assistant 回答
↓
user 再度質問をする
↓
assistant 回答
まさしくチャットのように以前の質問、回答内容も次の送信時には含める事で "話が成り立つ” ようになるのかと。
に
日本語で送信した時は「completion.choices[0].message」で取得するとユニコードとなる
下記サンプルのようにユニコードで返却されます。
上記テストのように completion.choices[0].message['content']
で直接表示すると日本語で表示する事が可能です。
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "ピノキオとは?"}
]
)
print(completion.choices[0].message)
-- 結果 --
{
"content": "\n\n\u30d4\u30ce\u30ad\u30aa\uff08Pinocchio\uff09\u306f\u3001\u30a4\u30bf\u30ea\u30a2\u306e\u4f5c\u5bb6\u30ab\u30eb\u30ed\u30fb\u30b3\u30c3\u30ed\u30fc\u30c7\u30a3\u304c1883\u5e74\u306b\u767a\u8868\u3057\u305f\u5150\u7ae5\u5c0f\u8aac\u3067\u3042\u308b\u3002\u4e3b\u4eba\u516c\u306e\u30d4\u30ce\u30ad\u30aa\u306f\u3001\u6728\u304b\u3089\u4f5c\u3089\u308c\u305f\u4eba\u5f62\u3067\u3001\u9f3b\u304c\u5618\u3092\u3064\u304f\u5ea6\u306b\u9577\u304f\u4f38\u3073\u308b\u3068\u3044\u3046\u7279\u5fb4\u304c\u3042\u308b\u3002\u30d4\u30ce\u30ad\u30aa\u306f\u3001\u4eba\u9593\u306b\u306a\u308b\u305f\u3081\u306b\u5192\u967a\u3092\u7e70\u308a\u8fd4\u3057\u3001\u3055\u307e\u3056\u307e\u306a\u8a66\u7df4\u3092\u4e57\u308a\u8d8a\u3048\u306a\u304c\u3089\u6210\u9577\u3057\u3066\u3044\u304f\u7269\u8a9e\u3067\u3042\u308b\u3002\u3053\u306e\u7269\u8a9e\u306f\u4e16\u754c\u4e2d\u3067\u611b\u3055\u308c\u3001\u30a2\u30cb\u30e1\u3084\u6620\u753b\u5316\u3055\u308c\u305f\u308a\u3001\u5e7e\u5ea6\u3082\u821e\u53f0\u5316\u3055\u308c\u305f\u308a\u3057\u3066\u3044\u308b\u3002",
"role": "assistant"
}


名前:田中寛之
今まで約20年間、出版社、マスコミ、化粧品会社、システム会社・病院・クリニックにてシステムエンジニアとして勤務。現在、個人事業主「ONLINE-WORLD」として活動し、42歳からPythonを始めました!


名前:田中寛之
今まで約20年間、出版社、マスコミ、化粧品会社、システム会社・病院・クリニックにてシステムエンジニアとして勤務。現在、個人事業主「ONLINE-WORLD」として活動し、42歳からPythonを始めました!