😇

APIを使ってChatGPTと会話してみよう!

2023/08/14に公開

2023年10月追記、記事で使用していたopenai.ChatCompletion.createがサポートされなくなってしまったので、現在の会話呼び出し関数にアップデートしました。

皆さん、ChatGPTを使っていますか?
ChatGPTはPCのブラウザ、スマホのアプリから使用することが出来ますが、APIを使ってもChatGPTを使用することが出来るんです!

APIとは?

APIとは、Application Programming Interfaceの略称です。あるプログラムが他のプログラムの特定の部分を利用するための「手引き」のようなものです。
OpenAIのAPIを使うと、自分のウェブサイトやアプリにChatGPTの機能を追加できます。今回はVisual Studio CodeでChatGPTを実行してみましょう!

OpenAIのAPI keyについて

OpenAIのAPI Keyを取得するには、OpenAIのサイトに登録する必要があります。詳細については、他の方の記事を参考に取得してみてください。

APIを使うことのメリット

APIを使うことでどんなメリットがあるのでしょうか?
個人的に一番大きいと思うのは入力したデータが学習用データとして使用されないことです。
プライベートな内容ならともかく会社の機密情報等が学習データとして使用されるのは避けたいですよね?
以下はOpenAIのAPI使用に関するポリシーです。OpenAIはAPI経由のデータは学習用データに使用しないとしています。
https://openai.com/api-data-privacy
他に言えば、APIを使えば様々なChatGPTのparameterを設定出来ます。parameterはブラウザ、アプリだと操作出来ないです。あとはsystem promptの設定など、APIを使用すれば柔軟にChatGPTを使用することが出来るんです!

動かしみよう!

必要なライブラリをインストールしましょう。

pip install openai

ChatGPTと会話するのに一番シンプルなコードは下記です。

import openai
from openai import OpenAI
client = OpenAI(api_key = 'your-api-key-here')

# 初期メッセージの設定
messages = [
    {"role": "system", "content": "あなたは優秀なAIアシスタントです。"},
    {"role": "user", "content": "こんにちは。"}
]

def main(messages):
    # OpenAIのAPIを呼び出し、与えられたメッセージに対する応答を取得
    completion = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        temperature=0.7
    )
    response = completion.choices[0].message.content
    return response

if __name__ == "__main__":
    # メイン関数を呼び出し、応答を出力
    response = main(messages)
    print(response)

大事なとこは説明しますね!

completion = client.chat.completions.create(
   model="gpt-3.5-turbo",
     messages=messages,
   temperature=0.7
)

上記がChatGPT APIを呼び出すコードになります。
modelでどのchatモデルを使うか指定出来ます。gpt-3.5-turbo以外にはgpt-4やgpt-3.5-turbo-16kなどがありますよね。使用用途、文章量、コストに応じて最適なmodelを設定して下さい。
temperatureは生成される文章の多様性をコントロールするparameterです。個人的にこのparameterは状況によってよく値を変えています。文章要約や調べ物の際には低い値、広告文章作成やキャチコピー作成等クリエイティブな文章を作成したい際は高い値にしています!デフォルトは0.7となっています。
parameterはこれ以外にも沢山あって気になる方は是非調べてみてください!

messages=[
   {"role": "system", "content": "あなたは優秀なAIアシスタントです。"},
   {"role": "user", "content": "こんにちは。"}
]

上記は、メッセージの構造を示しています。roleには、system、user、assistantの中から選択します。contentはそれぞれのpromptを入力します。
簡単に説明すると、user promptはユーザーの入力、assistant promptはAIの応答、system promptは会話の方向性やAIの応答の傾向を指示するためのものです。
例として上記の構造を見ると、次のようになります:

システムプロンプト:あなたは優秀なAIアシスタントです。
あなた;こんにちは。
AI:XXXXX

このXXXXXに相当する部分をAIに考えてもらうわけですね!
上記のコードを実行したところ下記のように返ってきました。

AI;こんにちは!どのようにお手伝いできますか?

ChatGPTを実行出来ましたね!
実は上記のコードは一度の会話のみを取り扱っており、過去の会話を記憶する機能はありません。前回の会話を続けてAIに何かを伝えたい場合は、messagesを更新する必要があります。
例えば先程の会話に続けてAIに自己紹介してもらいたい場合を考えます。

messages=[
{"role": "system", "content": "あなたは優秀なAIアシスタントです。"},
{"role": "user", "content": "こんにちは。"},
{"role": "assistant", "content": "こんにちは!どのようにお手伝いできますか?"},
{"role": "user", "content": "自己紹介して下さい"}
]

上記のようにassistant promptに先程のAIの応答、更に自身のuser promptを追加してあげるんですね!messagesは下記のような構造になりました。

システムプロンプト:あなたは優秀なAIアシスタントです。
あなた;こんにちは。
AI:こんにちは!どのようにお手伝いできますか?
あなた:自己紹介して下さい
AI:XXXXX

このようにAPIで会話履歴を含めてChatGPTと会話したいのであれば、会話履歴を含めてAPIを呼び出す必要があります!でもいちいち会話履歴をコードに反映させるのは手間ですよね?

会話履歴を保存しよう!

そんな時は会話履歴をファイルに保存してそれを呼び出しましょう!
以下のようにmessagesをoutputsディレクトリのpickleファイルに保存します。

import pickle
def save_chat(messages,response):
    messages.append(response)
    with open(f"./outputs/chat_history.pickle","wb") as f:
        pickle.dump(messages,f)

pickleは、Pythonで書かれたプログラムの中のデータを、ファイルとして保存したり読み込んだりするためのツールです。これによって、プログラムを閉じてもデータを失わずに次回に引き続き使用することができます。
messagesを読み込む際は下記のようにします。

with open(f"./outputs/{chat_file}.pickle", 'rb') as f:
    messages = pickle.load(f)

以下が会話履歴を保持できるコードです!
ユーザーにまず以前の会話履歴を読み込むかどうかを尋ねるようにしています。

import openai
import pickle
from openai import OpenAI
client = OpenAI(api_key = 'your-api-key-here')

def main(messages):
    # OpenAIのAPIを呼び出し、与えられたメッセージに対する応答を取得
    completion = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        temperature=0.7
    )
    response = completion.choices[0].message.content
    # 応答を保存
    save_chat(messages=messages, new_message={'role':'assistant', 'content':response})
    return response

def save_chat(messages, new_message):
    # 新しいメッセージを追加し、チャット履歴をファイルに保存
    messages.append(new_message)
    with open(f"./outputs/chat_history.pickle", "wb") as f:
        pickle.dump(messages, f)

# ユーザーに以前の会話履歴を使用するかどうかを尋ねる
answer = input("これまでの会話履歴を引き継ぎますか? (y/n)")
if not answer.lower() == "y" and not answer.lower() == "n":
    print("Invalid input. Please enter either 'y' or 'n'.")
    exit()

# ユーザーからのプロンプトを取得
prompt = input("会話や質問を入力してください\nuser: ")

if answer.lower() == "y":
    # 会話履歴を読み込み、ユーザーのプロンプトを追加
    with open(f"./outputs/chat_history.pickle", 'rb') as f:
        messages = pickle.load(f)
    messages.append({"role": "user", "content": prompt})
elif answer.lower() == "n":
    # 新しい会話を開始
    messages = [{"role": "system", "content": "あなたは優秀なAIアシスタントです。"},
                {"role": "user", "content": prompt}
    ]

# メイン関数を呼び出し、AIの応答を取得
response = main(messages)
print("AI:", response)

 
以上がAPIでChatGPTを使用する方法でした!
APIの基本的な使用法、会話履歴の取り扱い、そしてメッセージのカスタマイズなど、APIを効果的に使用するための要点をお伝えしました。

APIを使用することで、WebサイトやアプリケーションにChatGPTを組み込んで、ユーザーに対して対話型の体験を提供することができます。プライバシーや柔軟性の点からもAPI利用は多くのメリットがありますので、ぜひ挑戦してみてください!

コードには様々なパラメーターとオプションがありますが、それらを変更して、自分のプロジェクトや目的に合った最適な結果を得ることが可能です。

OpenAIのAPIは非常に強力で多様なツールです。この記事が、その力を最大限に引き出すための第一歩となることを願っています。何か質問や困ったことがあれば、コミュニティやドキュメントを活用してくださいね!Happy coding!

Discussion