Python で ChatGPT を OpenAI API で接続する

Python OpenAI ChatGPT

🖥実施環境

種類バージョン
OSWindows 10 Home 22H2
64ビット メモリ16GB
Python 3.11.1
Flask2.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
ライブラリバージョンリリース日
openai0.27.22023 年 3 月 11 日
openai · PyPI
Python client library for the OpenAI API
https://pypi.org/project/openai/

インストール前状況

インストール後状況

いろいろな関連モジュールがインストールされました。(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キー
このシークレットキーを安全でアクセスしやすい場所に保存してください。セキュリティ上の理由から、OpenAIアカウントから再び閲覧することはできません。このシークレットキーを紛失した場合は、新しいキーを生成する必要があります。
訳:生成されたAPIキー このシークレットキーを安全でアクセスしやすい場所に保存してください。セキュリティ上の理由から、OpenAIアカウントから再び閲覧することはできません。このシークレットキーを紛失した場合は、新しいキーを生成する必要があります。
日本語翻訳
日本語翻訳

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

パラメータ必須デフォルト設定内容
modelstring必須使用するモデルの ID。Chat API で動作するモデルの詳細については、モデル エンドポイントの互換性テーブルを参照してください。gpt-3.5-turbo
messagesarray必須チャットの完了を生成するメッセージ (チャット形式)。
temperaturenumber1使用するサンプリングtemperatureは 0 から 2 の間です。0.8 のような高い値は出力をよりランダムにしますが、0.2 のような低い値はより集中的で確定的なものにします。
通常、これを変更することをお勧めしますが、top_p両方を変更することはお勧めしません。
top_pnumber1核サンプリングと呼ばれる、temperatureによるサンプリングの代替手段であり、モデルは top_p 確率質量を持つトークンの結果を考慮します。したがって、0.1 は、上位 10% の確率質量を構成するトークンのみが考慮されることを意味します。
通常、これを変更することをお勧めしますが、temperature両方を変更することはお勧めしません。
ninteger1入力メッセージごとに生成するチャット完了の選択肢の数。
streambooleanfalse設定すると、ChatGPT のように部分的なメッセージ デルタが送信されます。トークンは、利用可能になるとデータのみのサーバー送信イベントとして送信され、ストリームはdata: [DONE]メッセージで終了します。サンプル コードについては、OpenAI クックブックを参照してください。
stopstring or arraynullAPI がそれ以上のトークンの生成を停止する最大 4 つのシーケンス。
max_tokensintegerinfチャット完了で生成するトークンの最大数。
入力トークンと生成されたトークンの合計の長さは、モデルのコンテキストの長さによって制限されます。
presence_penaltynumber02.0 から 2.0 までの数値。正の値は、それまでのテキストに出現するかどうかに基づいて新しいトークンにペナルティを課し、モデルが新しいトピックについて話す可能性を高めます。
frequency_penaltynumber02.0 から 2.0 までの数値。正の値は、これまでのテキスト内の既存の頻度に基づいて新しいトークンにペナルティを課し、モデルが同じ行を逐語的に繰り返す可能性を減らします。
logit_biasmapnull指定したトークンが補完に表示される可能性を変更します。
トークン (トークナイザーのトークン ID で指定) を -100 から 100 の関連するバイアス値にマップする json オブジェクトを受け入れます。数学的には、サンプリングの前にモデルによって生成されたロジットにバイアスが追加されます。正確な効果はモデルごとに異なりますが、-1 から 1 の間の値では、選択の可能性が減少または増加します。-100 や 100 などの値を指定すると、関連するトークンが禁止または排他的に選択されます。
userstringエンドユーザーを表す一意の識別子。これは、OpenAI が不正行為を監視および検出するのに役立ちます。

model

モデルエンドポイントの互換性表

エンドポイントモデル
/v1/chat/completionsgpt-4
gpt-4-0314
gpt-4-32k
gpt-4-32k-0314
gpt-3.5-turbo
gpt-3.5-turbo-0301
/v1/completionstext-davinci-003
text-davinci-002
text-curie-001
text-babbage-001
text-ada-001
davinci, curie
babbage, ada
/v1/edits text-davinci-edit-001text-davinci-edit-001
code-davinci-edit-001
/v1/audio/transcriptionswhisper-1
/v1/audio/translationswhisper-1
/v1/fine-tunesdavinci
curie
babbage
ada
/v1/embeddingstext-embedding-ada-002
text-search-ada-doc-001
/v1/moderationstext-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'])

-- 結果 --
ピノキオとは、イタリアの作家カルロ・コッローディによって書かれた児童小説『ピノッキオの冒険』の主人公である人形の名前です。
物語は、悪戯好きのピノキオが魔法使いによって人間になるための冒険をする姿を描いています。
ピノキオは、ウソをつくと鼻が伸びる、火にかけられると足が燃える、猫やイタチに騙されるなど、様々なトラブルに巻き込まれますが、最後には誠実さと勇気を学び、人間になることができます。

結果はそれぞれ微妙に回答が違いました。

リファレンス記載のサンプルコード
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年のワールドシリーズは、中立地であるテキサス州アーリントンのグローブライフ・フィールドで行われました。

現時点での見解

日本語で送信した時は「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を始めました!