しかし、API と直接やり取りする部分は Python で作っておいた方がカスタマイズも簡単で、便利な気がしてきました。
独習Python
by SimpleImageLink
そんなわけで、とりあえず動くシンプルなものを作ってみました。以下コードになります。
尚、OpenAI の API キー取得は済んでる想定です。環境変数の読み込みには dotenv モジュールを使っています。
from dotenv import load_dotenv ### 環境変数の読み込み load_dotenv() import openai import sqlite3 def conversation(new, mdl, tmp, sys, que): new = int(new) # 整数に変換 tmp = float(tmp) # 浮動小数点に変換 ### データベースに接続 dbpath = 'データベースのパス' conn = sqlite3.connect(dbpath) cursor = conn.cursor() ### 設定テーブルの作成 sql = ''' CREATE TABLE IF NOT EXISTS t_setting( t_setting_model, t_setting_temperature) ''' cursor.execute(sql) ### 会話テーブルの作成 sql = ''' CREATE TABLE IF NOT EXISTS t_conversation( t_conversation_role, t_conversation_prompt) ''' cursor.execute(sql) if new == 0 or None: # 会話継続 ### 前回までの会話を取得 sql = """ SELECT * FROM t_conversation """ cursor.execute(sql) conv = cursor.fetchall() msgs = [] for i in range(len(conv)): msgs.append({"role": conv[i][0], "content": conv[i][1]}) msgs.append({"role": "user", "content": que }) messages = msgs ### 会話の設定を取得 sql = """ SELECT * FROM t_setting """ cursor.execute(sql) set = cursor.fetchall() mdl = set[0][0] tmp = set[0][1] elif new == 1: # 新しい会話 ### 設定テーブルのデータ削除 sql = """ DELETE FROM t_setting """ cursor.execute(sql) ### 会話テーブルのデータ削除 sql = """ DELETE FROM t_conversation """ cursor.execute(sql) ### 設定をテーブルに保存 sql = ''' INSERT INTO t_setting( t_setting_model, t_setting_temperature) VALUES(?, ?) ''' cursor.execute(sql, (mdl, tmp)) conn.commit() ### 会話をテーブルに保存 sql = ''' INSERT INTO t_conversation( t_conversation_role, t_conversation_prompt) VALUES(?, ?) ''' cursor.executemany(sql, [("system", sys), ("user", que)]) messages = [ {"role": "system", "content": sys}, {"role": "user", "content": que} ] try: res = openai.ChatCompletion.create( model = mdl, messages = messages, temperature = tmp, ) res = res.choices[0].message["content"] json = {"question": que, "response": res, "status": "ok"} ### AI からの返答を保存 sql = ''' INSERT INTO t_conversation( t_conversation_role, t_conversation_prompt) VALUES(?, ?) ''' cursor.execute(sql, ("assistant", res)) conn.commit() cursor.close() conn.close() except: json = {"question": "", "response": "エラーが発生しました。返答を得られませんでした。", "status": "error"} cursor.close() conn.close() return json
※コードを一部修正しました(2023-8-14)
14行目のデータベースのパスは書き換えてください。
conversation 関数に、
① new:新規(1) or 継続(0) ※必須
② mdl:使用モデル ※新規時は必須、継続時は不要
③ tmp:ランダムさ(0〜2) ※新規時は必須、継続時は不要
④ sys:システムロールのプロンプト ※任意、継続時は不要
⑤ que:ユーザーロールのプロンプト ※必須
を渡すと、JSON 形式で回答が得られます。複数回のやりとりも可能です。
さらに、これを Web API 化しておけば、チャットでも、フォームでも、スプレッドシートでも、何でもござれで使えます。(その場合、勝手に使われないように認証を付けておくことは必須です)