質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
phpPgAdmin

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

jQuery Mobile

jQuery Mobileとはスマートフォンとタブレット用に最適化されたフレームワークです。様々な携帯端末にjQueryで作られたユーザーインターフェイスシステムを提供します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

0回答

458閲覧

チャットGPTのオプション設定について、特にコンテキストとフィルタの動的生成について

phpsyoshinsya

総合スコア156

phpPgAdmin

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

jQuery Mobile

jQuery Mobileとはスマートフォンとタブレット用に最適化されたフレームワークです。様々な携帯端末にjQueryで作られたユーザーインターフェイスシステムを提供します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2023/04/16 15:37

実現したいこと

困っている人、特に社会保障サービスの適応となりそうな人に、それらを組み合わせて提案する相談場所を提供するサイトを運用しています。
もちろん、個別に相談員が対応できる体制にはなっていますが、チャットでも匿名で相談してもらえるように、チャットGPTのサービスを利用した、カウンセリングサービスを提供するために、リニューアルを進めています。
APIで自分のサイトデザインに合わせることができることや、日本語が流暢なことを高く評価してチャットGPTのサービスを利用した提供を試みています。
ただ、お金がないや病気で辛いなどの簡単な入力に、就職活動しろ・アルバイトを考えろ・派遣に登録しろ、病院を受診しろ・栄養価の高い食事をしろ・睡眠を十分に・適度な運動をなど、一般的で基本的な内容から始まり、そんなことは百も承知のユーザーには次の質問をする意欲を挫く可能性があることが問題になっています。
下のオプションも設定を色々と変えてみたり、キャラ設定も工夫しましたが、
-1.回答が長い
-2.的確にタイミングを見ながら質問してくれない
-3.自治体によって違う担当課名称や連絡先を提供できない
といったことをクリアしてサービス提供を開始したいと思っています。

前提

どうしても解決が難しいような案件は相談員が対応せざるを得ないですが、的確な連絡先を伝えてそこに電話してもらえるようにおぜん立てするなどして、解決能力のある人がヒントを得て次の一歩を踏み出せるように、そんなことを考えています。

発生している問題・エラーメッセージ

現在API関連のソースは、問題なく動いていますが、上に挙げた問題解決に繋がる対策を得られていません。
次の4つのファイルからなっています。
index.php

<? $fname=mt_rand(0,99999999); $fp=fopen("data/".$fname.".txt","w"); fwrite($fp,""); fclose($fp); print <<<output <!DOCTYPE html> <html> <head> <title>ChatGPT API</title> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="css/style.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script type="text/javascript" src="js/chatapi.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <header> <h1>チャットで相談</h1> </header> <section> <form autocomplete="off"> <label for="message">何でも話してみてね:</label><br> <input type="text" id="message" name="message" required> <input type="hidden" id="fname" name="fname" value="{$fname}"> <input type="submit" value="入力内容を送信" onclick="showLoadingAnimation()"><br> <a href="php/reset.php">会話をリセット</a> </form> <div id="loading"> <img src="img/loading.gif" alt="Loading..." /> 読み込み中... </div> <div id="chat-history"></div> </section> </body> </html> output; ?>

chatapi.js

$(document).ready(function() { // アクセス時にチャットを読み込む $.ajax({ url: "./php/get-history.php?fn="+$("#fname").val(), type: "GET", dataType: "html", success: function(data) { $("#chat-history").html(data); }, error: function(jqXHR, textStatus, errorThrown) { console.log(textStatus, errorThrown); } }); // 以降1秒おきにチャットを読み込む setInterval(function() { $.get("./php/get-history.php?fn="+$("#fname").val(), function(data) { $("#chat-history").html(data); }); }, 1000); // フォームが送信されたときの処理 $("form").submit(function(event) { event.preventDefault(); // フォームの通常の動作をキャンセル // Ajaxでchatapi.phpにフォームデータを送信 $.ajax({ url: "./php/chatapi.php", type: "POST", data: {message:$(this).serialize(),fname:$("#fname").val()}, success: function(response) { hideLoadingAnimation(); // フォームの入力内容を取得 var message = $("#message").val(); // フォームをクリア $("#message").val(""); // サーバーからのレスポンスを表示 $("#output").html(response); // チャット履歴を更新 var history = "" + message + "|" + response.trim(); $.post("./php/save.php", {data: history,fname:$("#fname").val()}); // サーバーに履歴を保存 } }); }); }); // ローディングアニメーションの表示・非表示 function showLoadingAnimation() { var loading = document.getElementById("loading"); loading.style.display = "block"; } function hideLoadingAnimation() { var loading = document.getElementById("loading"); loading.style.display = "none"; }

get-history.php

<?php // チャット履歴表示 $history = array(); $file = fopen("../data/".$_GET["fn"].".txt", "r"); if ($file) { while (($line = fgets($file)) !== false) { $data = explode("|", $line); $history[] = array( '<div class="question">入力: ' . $data[0] . '</div>', '<div class="answer">提案: ' . $data[1] . '</div>' ); } fclose($file); } // 配列の順序を新しい順にする。したくない場合はコメントアウト $history = array_reverse($history); $output = ""; foreach ($history as $item) { $item = highlight_code_blocks($item); $output .= implode("", $item)."<div class=\"spacer\"></div>"; } echo $output; // コードが含まれる場合はタグ function highlight_code_blocks($string) { return preg_replace_callback('/```([^`]*)```/s', function($matches) { return '<pre><code>' . htmlentities(str_replace('<br>', "\n", $matches[1]), ENT_QUOTES) . '</code></pre>'; }, $string); } ?>

save.php

<?php // チャット記録 // POSTをdata.txtに書き込む if ($_SERVER["REQUEST_METHOD"] == "POST") { $data = $_POST["data"]; $fname=$_POST["fname"]; $file = fopen("../data/".$fname.".txt", "a"); fwrite($file, $data . "\n"); fclose($file); } ?>

chatapi.php

<?php date_default_timezone_set('Asia/Tokyo'); // ChatGPT APIレスポンス処理 // API_KEYをセット define(API_KEY, 'my_api_key'); // ---------------------------------------------------------------------------------------------- // data.txtから履歴を取り出す $previous_messages = array(); $file = fopen("../data/".$_POST["fname"].".txt", "r"); if ($file) { while (($line = fgets($file)) !== false) { $data = explode("|", $line); $previous_messages[] = array( array('role' => 'user', 'content' => $data[0]), array('role' => 'assistant', 'content' => $data[1]) ); } fclose($file); } // ここにChatGPTに送信するオプションを設定 $character=" 年齢:45 居住地:日本 職業:ソーシャルワーカー・カウンセラー 特徴: 的確な質問で問題点を把握し、様々な背景やニーズに対応し、簡潔かつ正確な情報を伝え、適切なアドバイスを提供する聞き上手である。 温和で優しく思いやりがあり、冷静で客観的であり、判断力があり、柔軟性があり、変化に対応できる性格である。 多岐にわたる資格を持っているため、幅広い問題に対応することができる。また、ユーザーの自治体を適切に特定し、適切な連絡先を伝えることができる。 行動指針: 1.日本の法令を遵守し、国内の情報を提供する。 2.高い共感力と寄り添いを発揮し、明瞭で簡潔な回答を提供し、取るべき行動の順序を明確に示す。 3.ユーザーの希望を尊重して、社会参加を支援する。 4.ユーザーは既に追い込まれた状況であることを想像し一般的な基本的な回答は除外する。 "; $tokens = array_sum(array( count(preg_split('/\p{Z}+/u', $_POST["message"], -1, PREG_SPLIT_NO_EMPTY)), count(preg_split('/\p{Z}+/u', $character, -1, PREG_SPLIT_NO_EMPTY)), 150, 50 )); $data = array( 'model' => 'gpt-3.5-turbo', 'temperature' => 1, 'n' => 1, 'max_tokens' => $tokens, 'stream' => false, 'stop' => ['?', '\n'], 'frequency_penalty' => 0.5, 'presence_penalty' => 0.3 ); $data["messages"] = array(); // キャラクター設定を修正 $data["messages"][] = array( 'role' => 'system', 'content' => $character); // 履歴を登録 foreach ($previous_messages as $message) { $data["messages"][] = $message[0]; $data["messages"][] = $message[1]; } // $_POST["message"]を処理 $message = htmlspecialchars($_POST["message"], ENT_QUOTES); $data["messages"][] = array('role' => 'user', 'content' => $_POST["message"]); $count = 0; $res = ''; while ($count <= 5 && empty($res)) { // ChatGPT APIへのリクエスト構築 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/chat/completions"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Bearer '. API_KEY)); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $result = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($result === false) { print 'Curl error: ' . curl_error($ch).' Curl error code: ' . curl_errno($ch); curl_close($ch); exit(); } elseif($http_code!=200){ print "恐れ入りますが、現在ご利用いただけません。またのご利用をお待ちしています。<br>繰り返しこのメッセージが表示される場合は、サイト管理者にご連絡ください。<br>"; } else { $response = json_decode($result, true); curl_close($ch); if(isset($response['error'])){ print "API Error: " . $response['error']['code'] . " - " . $response['error']['message']; exit(); } else { if($response["choices"][0]["message"]["content"]===""){ print "返信を受け取れませんでした。時間を空けてから再度質問してみてください。<br>"; exit(); }else{ $res = str_replace("\n","<br>",$response["choices"][0]["message"]["content"]); $res = preg_replace('/(おはようございます|こんにちは|こんばんは)(、|。|!|?|・|,|\.)+/u', '', $res); $res = preg_replace('/\d{8}さん(、|。|!|?|・|,|\.)*/u', '', $res); } } } $count++; } if (empty($res)) { print "処理が中断しました。メッセージを変えてもう一度送ってください。retry:".$count; } else { print $res; } ?>

試したこと

マックストークンズの値もユーザー入力とキャラクタ設定の分は加味することができましたが、履歴の分をどうやって加算すればいいかわからずにいますし、contextオプションやfilterオプションも使うといいとチャットGPTが提案してくれているのですが、これらをどのように動的にしかも、大量のデータをネット上から拾ってきて生成すればいいのかがよく理解できません。
現在のソースを活かすとして、マックストークンズの値をどこで計算すれば、どのように配列に追加すればいいのか、PHPの知識が足りないせいだとおもいますが、適切なコードをどう、どこに書けばいいのかがわからずにいます。

補足情報(FW/ツールの

そもそも、ソーシャルワーカーやカウンセラーといった職種の代替が現状ではとても難しいとか、AIに求めすぎだとかいうご意見もあろうかと思いますが、何卒前向きな回答をいただけますよう、ご理解ご協力たまわりますようお願いします。
ただ、相談員の負担軽減とかコストカットという意味合いではないこともご理解いただき、建設的な提案をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phpsyoshinsya

2023/04/16 23:30

問題や課題はしっかり明らかにしているつもりですが、どこがよくないのでしょうか。
m.ts10806

2023/04/17 01:20

関係ないタグが混じってるように見えます。 jQuery Mobile phpPgAdmin ただ本質的な問題はChatGPTにのみありそうなので、その他のタグはむしろ不要に思います。 PHPやJavaScript、HTML5における手段についての質問ではなく、もっと概念や設計、設定の話ではないでしょうか。 ただ、ここで赤の他人や個人レベルに聞いて解決できる問題でもないかもしれません。
phpsyoshinsya

2023/04/17 02:25

なるほど、タグが適切ではなかった。 チャットGPTの問題で、やろうとしていることに限界が見えているということですか? 私がクリアしたいと考えている問題はチャットGPTの限界や仕組みを理解していないということでしょうか?
m.ts10806

2023/04/17 02:33 編集

そういう問題ではなく、そもそも「質問と回答」という形で片付けるには無理がある問題という意味です。実際にコンサルなどを入れるか、難しいなら外注に依頼するレベルの内容。単なる興味本位や暇つぶしでは関わりたい内容ではないという意味です。 (ちなみに私の質問タグの指摘と最初の質問者さんのコメントとの関連性はありません)
phpsyoshinsya

2023/04/17 04:35

なるほど、外注に出せば、解決できそうな事柄なのですか? contextオプションもfilterも動的生成が可能だということですか? いくつもの想定ワードを作って、それに対するフィルタを用意するというような、古典的な方法を利用しなくても、可能ではあるということですか?
m.ts10806

2023/04/17 04:56

「要件の完成」が「外注に出す」ということなので考え方が違います。「完成してくれる外注先を探す」です。 そもそも先に書いた「質問と回答という形で解決するのは無理がある」というのは読まれてますか? 読まれてるなら追加質問を続ける意味がわかりません。ここで追及したところで時間の無駄です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問