MENU

ChatGPTのAPIをカスタマイズしてチャットボットを作成【Python】

最近は、ChatGPT APIをいじりながら、出力をコントロールする方法や、簡単なチャットボットを作る方法を学んでいます。今回は、その過程で試したことや気づいた点をまとめました。

目次

ChatGPT APIのパラメータカスタマイズ方法

ChatGPT APIでは、さまざまなパラメータを設定することで、出力の挙動を調整できます。ここでは、特に重要な3つのパラメータについてカスタマイズを試してみました。

temperature(創造性の調整)

temperature パラメータは、出力のランダム性を制御し、回答の創造性を調整する役割を持ちます。

temperature 値特徴
低い値(0.0〜0.5)より一貫性があり、事実ベースの回答を出力
高い値(0.7〜1.0)より創造的で多様な回答を出力

例えば、同じプロンプトを使ってもtemperatureの値を変えることで、異なる雰囲気の回答が得られます。

def chat_with_gpt_custom(prompt, temp=0.7):
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=temp  # 温度パラメータを設定
    )
    return response.choices[0].message.content

# 低温度(事実ベース)
factual_response = chat_with_gpt_custom("冬の過ごし方について教えて", temp=0.2)

# 高温度(創造的)
creative_response = chat_with_gpt_custom("冬の過ごし方について教えて", temp=0.9)

実際に試してみると、temperature=0.2 だと事実ベースで端的な回答をし、temperature=0.9 にするとより自由な発想の回答が得られました。

max_tokens(回答の長さ制限)

max_tokens を設定すると、ChatGPTの出力の長さを制御できます。
ChataGPT APIは従量課金制なので、出費を抑えたかったり、短くまとめたい場合に便利ですね。

pythonCopydef chat_with_limited_length(prompt, max_len=100):
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=max_len  # 最大トークン数を制限
    )
    return response.choices[0].message.content

# 短い回答を要求
short_response = chat_with_limited_length("Pythonの主な特徴を教えて", max_len=50)
Show Image

システムメッセージの活用

システムメッセージを使用すると、AIの振る舞いをコントロールできます。例えば、「Python専門家」として回答させる場合は次のようにします。

def chat_with_system_role(prompt, system_instruction):
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": system_instruction},
            {"role": "user", "content": prompt}
        ]
    )
    return response.choices[0].message.content

# Python専門家として回答
print(chat_with_system_role(
    "Pythonのジェネレータとは何ですか?",
    "あなたはPythonの専門家で、技術的な内容をわかりやすく説明するのが得意です。"
))

例ではシステムメッセージを後から入力する形にしていますが、プログラム内であらかじめ決めてしまえば、プロンプトの入力時に毎回振る舞いを入力する手間が省けそうですね!
これを応用すれば、例えば「フレンドリーなAI」や「毒舌キャラのAI」なんていう設定もできそうですね。

APIカスタマイズのポイントを以下にまとめておきます。

  • temperature:AIの創造性をカスタマイズ
  • max_tokens:AIの回答の長さをカスタマイズ
  • システムメッセージ:AIの振る舞い(役割)をカスタマイズ

実践!簡単なチャットボットを作成しよう

ここまでの知識を活用して、簡単なターミナルベースのチャットボットを作ってみようと思います。作成するチャットボットは、学んだことを活かして以下の仕様にしてみました。

  • ターミナル上で動作する対話型インターフェース
  • 会話の履歴を維持しながら、文脈を理解した応答
  • システムメッセージによるAIの役割を定義(Pythonに詳しい親切なAI)
  • 例外処理を入れることでエラー時には停止処理

作成したPythonのコードは以下のとおりです。

import openai

# APIキーを設定(実際のキーに置き換えてください)
api_key = "YOUR_API_KEY_HERE"
client = openai.OpenAI(api_key=api_key)

def simple_chatbot():
    print("🤖 PythonGPT - 簡易チャットボット")
    print("「終了」と入力すると会話を終了します。\n")
    
    # 会話履歴の初期化
    conversation = [
        {"role": "system", "content": "あなたは親切で役立つAIアシスタントです。Pythonに関する質問に詳しく答えられます。"}
    ]
    
    while True:
        # ユーザー入力を取得
        user_input = input("あなた: ")
        
        # 終了条件
        if user_input.lower() == "終了":
            print("🤖 会話を終了します。お役に立てて嬉しかったです!")
            break
        
        # ユーザー入力を会話履歴に追加
        conversation.append({"role": "user", "content": user_input})
        
        try:
            # APIリクエスト
            response = client.chat.completions.create(
                model="gpt-4",
                messages=conversation
            )
            
            # AIの回答を取得
            ai_message = response.choices[0].message.content
            print("\n🤖 AI:", ai_message, "\n")
            
            # AIの回答を会話履歴に追加
            conversation.append({"role": "assistant", "content": ai_message})
            
        except Exception as e:
            print(f"❌ エラーが発生しました: {e}")

# チャットボットを実行
if __name__ == "__main__":
    simple_chatbot()

実際に使ってみると、Pythonに関する質問をすると適切に答えてくれて、会話の流れも維持できていることが確認できました!

ChatGPT APIを使う際の注意点

APIを利用する際には、いくつか注意点がありましたので共有しておきます。

コスト管理

まずはコスト面の注意点です。主に以下の点に注意すれば良さそうです。

コスト管理の注意点
  • OpenAIのAPIは従量課金制のため使えば使うほどコストがかかる
  • 料金はモデルと使用トークン数によって異なる
  • 予算上限(Usage Limits)を設定して、意図しない過剰請求を防ぐ
  • 開発中は安価なモデル(GPT-3.5など)を使用することも検討する

セキュリティ対策

セキュリティ面については、以下の点に注意するのが良さそうです。

セキュリティ面の注意点
  • APIキーは絶対に公開しない
  • 環境変数や.envファイルを使用してキーを管理する
  • 本番環境では適切なアクセス制御を実装する

以下のようにすることで、.envファイルからAPIキーを取得出来るようになります。

# 環境変数からAPIキーを読み込む例
import os
from dotenv import load_dotenv

# .envファイルから環境変数を読み込む
load_dotenv()

# 環境変数からAPIキーを取得
api_key = os.getenv("OPENAI_API_KEY")

ちなみに、.envからAPIキーを取得するためには、dotenvのライブラリが必要でした。私はインストールされていなかったので、以下のコマンドでライブラリをインストールしてから実行しました。
dotenvは、python-dotenvという名前でインストールできます)

pip install python-dotenv

以下のように、拡張子前に名前をつけずに「.env」とすることで読み込むことが出来ます。
私は、最初に「test.env」のように名前をつけてしまい、失敗しました。

レート制限への対応

OpenAI APIにはリクエスト数制限があります。そのため、もし大量のリクエストを送る可能性がある場合は、以下のように制限を設ける必要があるようです。

レート制限への注意点
  • 待機時間を設定し、制限に引っかかった場合に再度リクエストする
  • 待機時間は、指数バックオフと呼ばれるもので設定(待機時間が指数関数的に増加する)
import time
import openai

def chat_with_retry(prompt, max_retries=3):
    retries = 0
    while retries < max_retries:
        try:
            return chat_with_gpt(prompt)
        except openai.RateLimitError:
            wait_time = (2 ** retries) * 1  # 指数バックオフ
            print(f"レート制限に達しました。{wait_time}秒待機します...")
            time.sleep(wait_time)
            retries += 1
    
    raise Exception("最大再試行回数に達しました")

このように設定することで、仮に制限に引っかかった際にも、時間を空けて再トライし、回答を得られるようにしています。

まとめ

今回は、ChatGPT APIのパラメータ調整のテストと、それを活かした簡単なチャットボットの作成に挑戦してみました。
少しずつ応用していけば、もっと便利なツールが作れそうです!

学んだこと
  • APIのパラメータを調整することで、自分好みのAIを作れる
  • コスト管理やセキュリティ面にも注意が必要

次は、今回学んだ内容からより発展させていきたいと思います。

次に試してみたいこと
  • 業務効率化ツールの作成(自動メール返信など)
  • FlaskやDjangoでWebチャットボットの作成
  • ChatGPTと他のAI(Claude, Gemini)を比較

では、また学習した内容を随時紹介していきますので、良ければ他の記事もご覧ください!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

非IT職のデスクワーカーです。
簡単な業務効率化やデータ分析にPythonをよく活用しています。
このブログを通してAI技術を身に着け、より業務効率化や新しいものを作りたいと考えています。

目次