【Python×ChatGPT】チャットボット作成入門|OpenAI APIの利用申請手順も解説

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • ChatGPT APIの利用手順が知りたい。
  • PythonをもとにChatGPT APIを呼び出し、チャットボットを作成する方法が知りたい。
目次

【OpenAI】ChatGPTとは?

ChatGPTとは、OpenAIが開発した対話型チャットボットのモデルです。ChatGPTの名前は、GPT-3という第3世代の生成言語モデルに由来しています。

ChatGPTのモデルには、人工知能(AI)が搭載されており、人間の発話に対して自然なやり取りを可能にしています。また、英語をはじめ、中国語、日本語、フランス語など複数言語を認識し、人間らしく応答できるのも特徴的です。

さらに、ChatGPTではチャットの他に、画像生成など近年多様な機能がリリースされてます。以下、ChatGPTで代表するGPTモデルおよびOpenAIが提供するAPI機能一覧を示します。

  • チャット機能
  • テキストから画像を生成
  • オーディオを文字起こし
  • Python、SQL、JavaScript等のコードを理解
  • 問題あるネガティブ発言検出
  • テキスト文章のベクトル変換

Pythonを用いたChatGPT利用概要

Pythonを用いたAPI通信のもとChatGPTを起動し、チャットボットを作成する方法について解説します。

これら実現に際して、本記事では次の内容を詳しく言及します。

  • OpenAIが提供するChatGPTのAPI利用手順
  • PythonでChatGPTを実行するプログラム構築方法

【OpenAI】ChatGPTのAPI取得手順

Pythonを用いてChatGPTを実行する場合、OpenAIが提供するAPIを取得する必要があります。

次の手順に従いAPIの取得方法を解説します。尚、2023年3/1時点でAPIは一定回数の呼出まで無料でできるようになっています。

  1. OpenAIのアカウント登録
  2. 組織情報(Organization)の取得
  3. APIシークレットキーの発行

OpenAIのアカウント登録

はじめに、OpenAIの公式ホームページに移動し、アカウントを作成しましょう。

(1)OpenAIの公式ページにアクセス

OpenAIの公式ページ(https://platform.openai.com)に遷移します。

続いて、右上の「Sign Up」をクリックしましょう。

(2)アカウント情報を入力

アカウント作成画面に移動します。お手元のメールアドレスを入力し、アカウント作成します。

(3)アカウント名を登録

名前と組織名(Organization Name)を入力し、Continueをクリックします。

(4)電話番号認証

最後に、電話番号を認証します。認証後、アカウント登録完了です。

APIシークレットキーの発行

OpenAI公式:https://platform.openai.com/account/api-keys

後続で示すChatGPT API利用に際して、APIシークレットキーをホームページから発行する必要があります。

シークレットキーは「User > API Keys」から取得できます。シークレットキーは後続のPythonプログラムで利用するため、お手元にメモとして残しておきましょう。

【事前準備】OpenAIのPythonライブラリをインストール

ChatGPT APIをPythonで利用する場合、openaiライブラリを活用します。

コマンドプロンプト(WIndows)またはターミナル(Mac)を開き、以下を実行し、ライブラリをインストールしましょう。

pip install openai

【実践】PythonでChatGPT APIを呼び出しチャットボット構築

実際にPythonプログラムを記述し、ChatGPT APIを活用したチャットボットを作成していきます。

PythonライブラリとAPI情報の読込

はじめに、Pythonプログラムの先頭にライブラリとAPI認証情報を記述します。

前述で取得したシークレットキーを入力しましょう。

from openai import OpenAI
API_Key = "<APIシークレットキーをここに入力>"

チャットボット関数作成

続いて、ChatGPT APIを呼び出すためのチャットボット関数を作成します。次のコードを記述しましょう。

ChatGPTの言語モデル開発において、定期的に新しいモデルがリリースされています。以下、現時点で無料で利用可能な最新モデルを用います。

コード

def Ask_ChatGPT(message):
    
    # クライアント
    client = OpenAI(api_key=API_Key)
    
    # ユーザーの質問に対して回答生成
    completion = client.chat.completions.create(
                     model    = "gpt-3.5-turbo",     # モデルを選択
                     messages = [{
                                "role":"user",       # ロール
                                "content":message,   # メッセージ 
                                }],

                     max_tokens  = 1024,             # 生成する文章の最大単語数
                     n           = 1,                # いくつの返答を生成するか
                     stop        = None,             # 指定した単語が出現した場合、文章生成を打ち切る
                     temperature = 0,                # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
                     stream      = False,            # 生成した回答を段階的に出力するか否か
        )
    
    # 回答部分抽出
    response = completion.choices[0].message.content
    
    return response

【参考】引数情報|client.chat.completions.create

ChatGPTの対話メソッドで活用する引数情報を以下に示します。

スクロールできます
引数名概要
modelChatGPTに利用する対話モデル
messages入力文章の設定値
max_tokens生成する文章の最大単語数
nいくつの返答を生成するか。
例えば、2を選択した場合、2つの返答を返す。
stop指定した単語が出現した場合、文章生成を打ち切る。
temperature0から2の範囲の範囲で出力する単語のランダム性を設定。値が低けほど最も確率が高い回答が常に選択されるため、結果はより決定論的になる。値が大きいほど、ランダム性が増し、多様で創造的な出力を得る。事実に基づくQAモデル作成の場合、この値を低くし、詩や創造的なタスクの場合、高い値の設定を推奨。
top_p核サンプリングと呼ばれるサンプリング手法。モデルの応答生成際して決定性を制御できる。値が低いほど正確で事実に基づいた回答が得やすく、値が高いほど多様な回答を得やすい。
presence_penalty同じ単語の繰り返し頻度。[-2:2]の範囲で値を設定。値が大きいほど繰り返しにおけるペナルティが増加するため、単語の繰り返し回数は低下。一方、値が小さいほどペナルティも小さくなるため、同じ単語を繰り返し利用する回数が増加傾向にある。
frequency_penalty単語をもう一度使うかどうか。[-2:2]の範囲で値を設定。値が大きいほど、2回目以降の単語の再出現率が低下。一方、値が小さいほどペナルティも小さくなるため、単語の再出現率は増加傾向にある。
streamTrueに設定すると、ChatGPTと同様に、部分的な回答結果を段階的に出力するようになる。
function_callモデルが関数呼び出しにどのように応答するか。 {“name”:\ “my_function”}のように、特定の関数を指定すると、モデルはその関数を強制的に呼び出す。

【参考】MESSAGEのROLE

messagesにはrole(役割)を指定でき、こちらをもとにChatGPTから正確な返答を受け取れるようにしています。前述の例では1つのuserのみ指定していますが、例えばassistantや複数のuserを追加することで、より高度な対話型のチャットボットを作成することも可能です。

ROLE概要
system「system」は、ChatGPTのシステム自体を表します。ChatGPTの動作を制御するプログラムやデータベースを担当する役割です。一般的に、ユーザーがChatGPTを利用する際に「system」が自動的に動作して、応答や情報の提供を行います。
user「user」は、ChatGPTを利用するユーザーを表します。ChatGPTを使って質問をしたり、回答を受け取ったりする役割を持ちます。ユーザーはChatGPTに対して、自分の質問や疑問を投げかけることができます。
assistant「assistant」は、ChatGPTのアシスタント役を担当します。ユーザーがChatGPTに対して質問を投げかけた場合に、より詳細な回答を提供するために活躍します。「assistant」は、ChatGPTの知識や情報を持ち、ユーザーにとって有益な情報を提供することができます。

チャットボット実行

前述のチャットボット関数に入力文章(message)を渡し、ChatGPTを起動します。

コード

# 質問内容
message = "DXCEL WAVEってどんなサイトですか?"

# ChatGPT起動
res = Ask_ChatGPT(message)

# 出力
print(res)

出力イメージ

上記のコードを実行すると、次のような出力結果が得られました。非常に自然な文章になっていますね。

# DXCEL WAVEは、プログラミング初心者や中級者向けのオンラインプログラミング学習サイトです。
# プログラミング言語を学習したり、技術を磨くための情報を提供しています。
# また、技術情報やプログラミングに関する記事を掲載しているので、プログラミングに関する最新情報を知ることもできます。

【参考】利用可能なモデルエンジンの確認

チャットボット関数ではopenai.Completion.create()メソッドを活用しました。このメソッドに渡した引数engineには様々なモデルが指定できます。以下、指定可能なモデルの確認方法も併せて解説します。

コード

指定可能なモデルの確認には、次のコードを実行します。

from openai import OpenAI
import pandas as pd

API_Key = "<APIシークレットキーをここに入力>"

# モデルリスト取得
client     = OpenAI(api_key=API_Key)
model_list = client.models.list()

# 出力
print(model_list.data)

出力イメージ

出力結果を見ると、idの部分にgpt-3.5-turbogpt-4など様々なモデルIDが一覧表示されます。この文字列で示されたモデルIDを前述の引数に指定することで、お好みのモデルが利用できます。

# [Model(id='text-search-babbage-doc-001', created=1651172509, object='model', owned_by='openai-dev'),
#  Model(id='gpt-4', created=1687882411, object='model', owned_by='openai'),
#  Model(id='curie-search-query', created=1651172509, object='model', owned_by='openai-dev'),
#  Model(id='text-davinci-003', created=1669599635, object='model', owned_by='openai-internal'),
#  Model(id='gpt-3.5-turbo', created=1677610602, object='model', owned_by='openai'),
#  Model(id='text-search-babbage-query-001', created=1651172509, object='model', owned_by='openai-dev'),
#  Model(id='babbage', created=1649358449, object='model', owned_by='openai'),
#  Model(id='babbage-search-query', created=1651172509, object='model', owned_by='openai-dev'),
#  Model(id='text-babbage-001', created=1649364043, object='model', owned_by='openai'),
#  Model(id='text-similarity-davinci-001', created=1651172505, object='model', owned_by='openai-dev'),
#  Model(id='davinci-similarity', created=1651172509, object='model', owned_by='openai-dev'),
#  Model(id='code-davinci-edit-001', created=1649880484, object='model', owned_by='openai'),
#  Model(id='curie-similarity', created=1651172510, object='model', owned_by='openai-dev'),
#  Model(id='babbage-search-document', created=1651172510, object='model', owned_by='openai-dev'),
#  Model(id='curie-instruct-beta', created=1649364042, object='model', owned_by='openai'),
#  Model(id='text-search-ada-doc-001', created=1651172507, object='model', owned_by='openai-dev'),

【まとめ】OpenAI ChatGPT APIを利用したPythonコード全量

最後に、本日ご紹介したPythonコードを全量示します。

# =============================================================
# ライブラリ&API認証情報
# =============================================================

from openai import OpenAI

API_Key = "<APIシークレットキーをここに入力>"

# =============================================================
# チャットボット関数
# =============================================================

def Ask_ChatGPT(message):
    
    # クライアント
    client = OpenAI(api_key=API_Key)
    
    # ユーザーの質問に対して回答生成
    completion = client.chat.completions.create(
                     model    = "gpt-3.5-turbo",     # モデルを選択
                     messages = [{
                                "role":"user",       # ロール
                                "content":message,   # メッセージ 
                                }],

                     max_tokens  = 1024,             # 生成する文章の最大単語数
                     n           = 1,                # いくつの返答を生成するか
                     stop        = None,             # 指定した単語が出現した場合、文章生成を打ち切る
                     temperature = 0,                # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
                     stream      = False,            # 生成した回答を段階的に出力するか否か
        )
    
    # 回答部分抽出
    response = completion.choices[0].message.content
    
    return response

# =============================================================
# チャットボット実行
# =============================================================

# 質問内容
message = "DXCEL WAVEってどんなサイトですか?"

# ChatGPT起動
res = Ask_ChatGPT(message)

# 出力
print(res)

【参考】AI・機械学習における配信情報まとめ

当サイトではAI・機械学習における「基礎」から「最新のプログラミング手法」に至るまで幅広く解説しております。また「おすすめの勉強方法」をはじめ、副業・転職・フリーランスとして始める「AI・機械学習案件の探し方」についても詳しく言及しています。

【仕事探し】副業・転職・フリーランス

【教育】おすすめ勉強法

【参考】記事一覧

最後に

この記事が気に入ったら
フォローしてね!

目次