Laravel9 OpenAIのAPIを使用して独自質問に答えるチャットボットの作り方(プロンプト編)

自社や自店舗の独自情報についてのお問い合わせなどに回答するチャットボットの作り方。
独自情報の与え方は大きく分けて
・プロンプト
・ファインチューニング
・エンベッティング
があるかなと思うけど、今回はプロンプトで独自情報を与える方法。

プロンプトで与えるというと、学習させているわけではなくちょっとスマートじゃない感じがするけどお手軽なのはもちろん、なかなか回答精度は高いし良い感じで文章を作って答えてくれる。

デメリットは、APIコストがかかること。
質問されるたびに毎回独自情報をプロンプトに含め、さらに会話のキャッチボールをすれば過去の会話履歴も全てプロンプトに含める必要があるためどんどん膨らんでいく。
独自情報が数千トークンあれば、会話のたびに数円かかる。

サンプルコード

        // OpenAIのAPIキーを設定
        $api_key = "xxxxxxxxxxxxx";

        $url = 'https://api.openai.com/v1/chat/completions';

        $data = array(
            'model' => 'gpt-4-1106-preview',
            'max_tokens' => 200,
            "messages" => $prompts,     // ここにプロンプトをセット
        );

        $headers = array(
            'Content-Type: application/json',
            'Authorization: Bearer ' . $api_key
        );

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);

        $result = json_decode($response, true);
dd($result['choices'][0]['message']['content']);  // APIからの回答を表示

プロンプト部分

        $prompts = [];
        $prompts[] = ["role" => "system", "content" => "日本語で回答してください"];

        $content =
"
あなたはお客様からの質問に回答するチャットボットです。
お客様からの質問に対して店舗情報をもとにチャットボット風に短めに回答してください

#店舗情報
◯◯◯◯◯◯


◯◯◯◯◯◯
◯◯◯◯◯◯
◯◯◯◯◯◯

◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

◯◯◯◯◯◯
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

 ・
 ・
 ・

こんな感じで独自情報を記述していく

";
        $content .=
"
#お客様からの質問
$question
";

        $prompts[] = ["role" => "user", "content" => $content];

追加質問があった場合

APIは過去の会話を覚えていないので、以下のように過去の会話履歴を全てプロンプトに含めて新たに質問(APIをコール)する必要がある。

        $prompts[] = ["role" => "system", "content" => "日本語で回答してください"];
        $prompts[] = ["role" => "user", "content" => $content];     // ↑で作成した独自情報 + お客様からの質問プロンプト
        $prompts[] = ["role" => "assistant", "content" => "◯◯◯◯◯◯がオススメです"];     // APIからの回答
        $prompts[] = ["role" => "user", "content" => "料金を教えて下さい"];     // 追加質問

過去の会話履歴自体を要約してプロンプトを作る方法もあるけど、会話履歴全てを丸投げでも回答精度高いし楽なのでこれで良いかなと思う。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です