しかし、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 化しておけば、チャットでも、フォームでも、スプレッドシートでも、何でもござれで使えます。(その場合、勝手に使われないように認証を付けておくことは必須です)
