ChatGPTあれこれ
世間を何かと騒がせている大規模自然言語モデルですが,データサイエンスにおいてもChatGPTを有効活用する機会が増えました.特に大規模自然言語モデルの自然言語処理タスクを解く能力は凄まじく訓練時には明示的に与えられていなかったタスクに対してもファインチューニングをせずとも,かなりの精度を出すことがよくあります.これは特に定量データとしてテキスト情報を分析する社会系・工学系の学者やビジネス応用において非常に有用で,より痒い所に手が届いたテキストデータ分析ができる可能性が広がっています.
そこで本記事ではPythonコードを用い自動でウェブブラウザからタスクを投げる方法とAPIを用いてChatGPTにタスクを投げる方法との二つを簡単に紹介します.
1.ウェブブラウザ利用
ウェブブラウザ利用はchatgpt_automationライブラリ[1]を使えば簡単に実装することができます.ウェブブラウザ版は定額の範囲内ですが,温度パラメータを設定できないため,毎回同じ回答を求めているケースには不向きです.
仕組みとしては,PythonからWebブラウザを操作するSeleniumというライブラリを用います.SeleniumはChromeDriverというソフトウェアを介して自分のコンピュータにインストールされているChromeブラウザを操作してOpenAIのウェブサイトへのアクセスを可能とします.chatgpt_automationは,具体的なウェブサイト上の操作であるログインや,プロンプト(質問)の入力,回答の取得,新しい会話のスタートなどSelenium用いた挙動をWrapしているライブラリです.インストールは,
pip install git+https://github.com/ugorsahin/ChatGPT_Automation |
ライブラリをインストールしたらpythonコード内でimportしましょう.
from chatgpt_automation import ChatGPT_Client |
次にChatGPTウィンドウを開くためにChatGPT_Clientのインスタンスを作ります.
chatgpt = ChatGPT_Client(“TEST@MAIL.u-tokyo.ac.jp”, “PASSWORD”, headless=False) |
これを実行するとウィンドウが立ち上がり自動でログインまでしてくれます.
TEST@MAIL.u-tokyo.ac.jpの部分はOpenAIのログイン画面で使っているアカウントIDに,PASSWORDの部分はログイン画面で使っているパスワードに置き換えてください.
headlessをTrueにするとウィンドウを非表示で操作することができます.
プロンプトを投げるには,以下のようにしてみてください.
prompt = “…”
answer = chatgpt.interact(prompt)
|
answerでテキスト型の回答を得ることができます,
また,新しい会話を始めるには以下のメソッドが用意されています.
chatgpt.reset_thread() |
ブラウザ版のChatGPTは叩きすぎると,エラーメッセージが返ってきます.
適宜スリープを入れることも重要ですが,エラーメッセージを把握しておくことも,安定的なプログラムを書くために重要です.以下が既知のエラーメッセージです.
“!\nYou’ve reached our limit of messages per 24 hours. Please try again later.”,
“!\nYou’ve reached our limit of messages per hour. Please try again later.”,
“!\nOnly one message at a time. Please allow any other responses to complete before sending another message, or wait one minute.”,
“!\nSomething went wrong. If this issue persists please contact us through our help center at help.openai.com.”,
“!\nnetwork error”
|
ChatGPT_Automationのページ:
2.API利用
APIを利用することで,ブラウザを介さずに,より自由にChatGPTを利用できるようになります.ただし,トークン(文字のまとまりで例えばpre等)の数にお金がかかるので投げすぎには注意しましょう.
ライブラリのインストールは以下のようにします.
pip install openai |
コードでライブラリをimportします.
import openai |
以下のようにプロンプトを投げるメソッドを用意すると便利です.
def get_completion(messages, model=”gpt-3.5-turbo”):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # 0にすると同じ質問には同じ回答になります
)
return response.choices[0].message[“content”]
|
messagesには辞書のリストが入ります.辞書には,roleとcontentを記述します.
具体例は以下です.
[
{“role”:”system”, “content”:”あなたはデータサイエンティストです.” },
{“role”:”user”, “content”:”XXXのデータが与えられました.YYYを答えてください.” }
]
|
ブラウザ版では会話を仕切り直す時に特別なメソッドを使っていましたが,API版では会話を続ける時に特別なメッセージ追加を行います.下記のようにmessagesに前回のanswerを追記して投げます.
[
{“role”:”system”, “content”:”あなたはデータサイエンティストです.” },
{“role”:”user”, “content”:”XXXのデータが与えられました.YYYを答えてください.” },
{“role”:”assistant”, “content”:answer },
{“role”:”user”, “content”:”回答をZZZのように整形してください.” }
]
|
コストの計算には以下の関数を作ると便利です.
DOLLAR_PER_TOKEN = 0.002/1000
YEN_PER_DOLLAR= 139.69
# トークン数とコストを計算
def check_tokens(prompt, model):
tokens = model.encode(prompt)
num_tokens = len(tokens)
cost_dollar = len(tokens)*DOLLAR_PER_TOKEN
cost_yen = len(tokens)*DOLLAR_PER_TOKEN*YEN_PER_DOLLAR
return num_tokens, cost_dollar, cost_yen
|
(余談)
簡単にIoT開発ができるArduinoというマイコンシリーズがあります.
このArduinoのライブラリにもChatGPTClientがあるようです.
こちらはAPI利用をArduino用にWrapしたもののようですね.
2023/07/31