開発情報・ナレッジ

投稿者: ShiningStar株式会社 2023年10月5日 (木)

SPIRALに格納されているお問い合わせデータからopenAIのAPI(GPT)を利用して自動でFAQを生成する方法

背景として、多くの企業様にSPIRALをご利用頂き、
SPIRAL内にてお問い合わせ対応アプリケーションを構築し
毎日、大量の顧客からの問い合わせやフィードバックを受け取られて居ると存じます。

問い合わせに効率的かつ迅速に対応するために、企業は顧客サポートチームを設置していますが、
問い合わせのボリュームが多いと、これに対応するのは非常に時間がかかり、リソースを多く消費します。

問い合わせの中には、同じような質問や問題が繰り返し寄せられることがよくあります。
例えば、製品の使い方に関する基本的な質問、配送に関する問い合わせ、アカウント管理に関する問題などです。
これらの繰り返される質問に対して、都度対応するのは効率が悪く、コストもかさみます。


本記事の目的

PHPとOpenAI APIを使用した自動FAQ生成プロセスの紹介

この問題を解決するために、
企業は過去の対応履歴から頻繁に発生する問い合わせを分析し、
これらの問い合わせに対する標準的な回答をFAQ形式でウェブサイトやアプリケーション上で提供することで、
顧客が自分で簡単に解決策を見つけられるよう支援します。
このような自動FAQ生成システムによって、顧客は迅速に情報を得ることができ、企業もリソースを節約することができます。

しかし、手動でFAQを作成するのは時間がかかる作業であり、定期的な更新が必要です。
自動FAQ生成システムは、このプロセスを自動化し、
最新かつ関連性の高いFAQを継続的に提供することができます。
これにより、顧客の満足度が向上し、企業の運用効率も大幅に改善されます。
現代のビジネス環境では、迅速で効率的な顧客サポートが不可欠です。
一方で、繰り返しの質問や問題に対応するために多くのリソースを投入することは、多くの企業にとって大きな負担です。
この問題を軽減する助けになるのが、FAQ(よくある質問)のセクションです。
しかし、適切なFAQを手動で作成し、定期的に更新するのは、その自体が大変な作業です。

この記事では、PHPとOpenAI APIを使用して、実際の会話履歴から自動的にFAQを生成するプロセスを紹介します。
この自動生成プロセスにより、企業は効率的に、かつ継続的にFAQセクションを最新の情報で更新することができ、
顧客サポートの質と効率を向上させることができます。

開発環境のセットアップ

開発タブよりカスタムプログラムにFAQ自動生成プログラムを設置し、
プロセスを自動で実行したい場合は定期実行を利用し、任意の日時を設定して頂き自動でFAQが生成されるよう設定してください。

FAQDB構成

DBタイトル:faqDB

項目名 フィールドタイプ 差し替えキーワード
FAQID 数字・記号・アルファベット(32 bytes) faqId
FAQタイトル テキストエリア(256 bytes) faqTitle
FAQ内容 テキストエリア(2048 bytes) faqNote

お問い合わせ内容が蓄積されているDBについてはご利用の環境をお確かめください。
本サンプルプログラムでは1レコードに全て蓄積されている前提ですが、
お問い合わせマスタDBのお問い合わせIDに紐づいてお問い合わせ内容DBの複数レコードが存在している様な場合はお問い合わせ内容を取得するコードを変更してください。
変更箇所はサンプルプログラム内「//お問い合わせDBを参照」以下のSPIRAL関数となります。

サンプルプログラム

function doPost($e) {

        $payload[] = [
            'role' => 'system',
            'content' => '
            あなたは会話履歴のJSONからFAQを生成するAIです。
            以下の手順にそってFAQを生成してください。
            
            工程1.この会話履歴から得られる質問数はいくつあるか算出してください。算出された回数を$countに代入してください。
            工程2. 工程1で得られた回数分、工程3を実行してください。
            工程3. 概要をFAQタイトルとして$faqTitleに代入しそのFAQの解決方法をFAQ内容として$faqNoteに代入してください。
また$faqNoteの内容は口語を禁止し、全てですます調で記載してください。 工程4. 返答書式を返答JSONの書式で出力してください。返答内容はこの書式のみでその他の工程順等の記載を禁止します。 工程5. 工程4で行った出力回数が工程1で得られた質問数と一致しない場合すべての工程を一致するまでやり直してください。
その再要約の回数は無限回とします。 以下返答JSON { "count": $count, "faqs": [ { "title": $faqTitle, "note": $faqNote }, { "title": $faqTitle, "note": $faqNote }, { "title": $faqTitle, "note": $faqNote } // 更に多くのFAQを追加することが可能です ] } ' ]; $payload[] = [ 'role' => 'user', 'content' => $e ]; $url = 'https://api.openai.com/v1/chat/completions'; $data = [ 'model' => 'gpt-3.5-turbo-16k', 'max_tokens' => 2000, 'messages' => $payload, ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer openAI-APIKEY", "Content-Type: application/json" ]); $response = curl_ex_ec($ch); $response = json_decode($response, true); if(curl_error($ch)){ echo $ch; } return $response["choices"][0]["message"]["content"]; curl_close($ch); } //お問い合わせDBを参照 $db = $SPIRAL->getDataBase("contactDB"); $db->addSelectFields("note"); $db->setLinesPerPage(500); $result = $db->doSelect(); //GPTへリクエスト foreach ($result["data"] as $post){ $post = json_encode($post["note"]); $gptResponse = doPost($post); $array = json_decode($gptResponse, true); //FAQDBへinsert foreach ($array["faqs"] as $insert){ $db = $SPIRAL->getDataBase("faqDB"); $db->doInsert(array("faqTitle" => $insert["title"], "faqNote" => $insert["note"])); } }

プログラム解説

※APIキー等の情報のお取り扱いにはご注意ください。
DBの中身をループして多重にopenAIのAPIを実行していますので、従量課金についてお気をつけください。

DBタイトルやDBの構成は動作環境によって異なりますのであくまでもサンプルとなります。

このプログラムはDBに記録されているお問い合わせ内容の履歴を、
OpenAIのAPIに送信し、その返答をFAQタイトルと、FAQ内容に分けてDBに登録するプログラムです。
一件のお問い合わせ内に複数の質問がある場合にも自動検知し、
複数レコードに分けてFAQタイトルとFAQ内容をDBに登録します。
openAIからのレスポンスはfaqsのJSON配列となっている為、その配列をdoinsertで処理してあげれば複数レコードの挿入が可能になっています。

プロンプト解説

あなたは会話履歴のJSONからFAQを生成するAIです。
以下の手順にそってFAQを生成してください。

工程1.この会話履歴から得られる質問数はいくつあるか算出してください。算出された回数を$countに代入してください。
工程2. 工程1で得られた回数分、工程3を実行してください。
工程3. 概要をFAQタイトルとして$faqTitleに代入しそのFAQの解決方法をFAQ内容として$faqNoteに代入してください。
また$faqNoteの内容は口語を禁止し、全てですます調で記載してください。
工程4. 返答書式を返答JSONの書式で出力してください。返答内容はこの書式のみでその他の工程順等の記載を禁止します。
工程5. 工程4で行った出力回数が工程1で得られた質問数と一致しない場合すべての工程を一致するまでやり直してください。
その再要約の回数は無限回とします。

以下返答JSON
{
"count": $count,
"faqs": [
{
"title": $faqTitle,
"note": $faqNote
},
{
"title": $faqTitle,
"note": $faqNote
},
{
"title": $faqTitle,
"note": $faqNote
}
// 更に多くのFAQを追加することが可能です
]
}

工程としてまず、何回処理を行わさせるかを定義して$countに代入しています。
最終的に$countの数と処理した回数が一致するか確認をさせる事で、
複数の話題を検知した上で、しっかりその数分のfaqsを生成させるようにしています。
今回はお問い合わせ内容の文字数が多い場合を考慮してモデルはgpt-3.5-turbo-16kを使用している為、
「$faqNoteの内容は口語を禁止し、全てですます調で記載してください。」や、
「返答内容はこの書式のみでその他の工程順等の記載を禁止します。」等、
余計な内容を返答させないように抑止しています。 ですが、gpt-3.5-turbo-instructやgpt-4を使えばこのあたりは不要でsystemプロンプトを圧縮出来るかも知れません。
このあたりの抑止プロンプトが無いと、FAQ内容にチャット特有の「私はchatGPTです、よろしくお願いします。」の様な挨拶文章や、
返答にJSONのみではなく「工程1の$countは3です。」の様な返答も含まれてしまいます。
また、最終的に工程5でGPTに再検証を行わさせて、内容がチグハグになっていた場合は再要約を行わせておりますが、「その回数は無限回とします」というプロンプトは非常に強力で、
得たい内容が確実に返ってきます。

FAQDBの利用方法

サンプルプログラムではFAQタイトルとFAQ内容のみ記録している為、
DBに公開フラグ等を用いてFAQDBを元に一覧表を作成し、FAQ一覧表を公開する事でFAQページを作成する事が可能です。
また、蓄積されるお問い合わせ内容に関しては
チャットボットにGPT連携をしてDBの情報を取り込み、自社製品の内容を回答させる方法
上記記事で作成したチャットボットの応答履歴や、他社と連携したチャットボットの応答履歴を利用する事で、完全自動でFAQや顧客対応が行える展望があります。

解決しない場合はこちら コンテンツに関しての
要望はこちら