2023年8月10日木曜日

ChatGPT API を使うための簡単な Python コード

これまで、ChatGPT API を利用した LINE bot を GAS (Google Apps Script) で作ったりしました。

しかし、API と直接やり取りする部分は Python で作っておいた方がカスタマイズも簡単で、便利な気がしてきました。



そんなわけで、とりあえず動くシンプルなものを作ってみました。以下コードになります。

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


きくらげ