見出し画像

ガンで悲しんだ人の手紙GPTsを作ってみた。googleスプレッドシートに皆さんの体験談を追記して共有する、情報累積型AI

俺は1年半前に65歳の母を甲状腺がんで亡くして、祖母が鬱と自傷で苦労したし、まだ心は癒えていない。
医療関係に従事していた方、ガンで苦しんでいる人、残された遺族の心が言えるようなAIを、今後も作っていきたい

ということで今回は、chatGPTのGPTsでgoogleスプレッドシート連携、read、append、updateを1つでやってみた の仕組みを使って、多シート連動の追記と読み込みによる「情報累積型GPTs」を公開した。

このGPTsの良い所は、ガンの体験談を聞いて「追記共有」すること。
やっていることは、googleスプレッドシートに「ガン体験談」「乗り越え話」「皆に一言」「手紙を読んだ感想」に2列情報を入れただけ。
プロンプトインジェクション(悪ある人の情報漏洩)は一切配慮していないので、実際に作る人はdebug情報含めて必要情報以外は出さないように対策しよう。

URLの赤い部分を↓GASのsheetIdに入れる
let sheetId = "※自分自身のスプレッドシートのID※"
let sheetName = "シート1"
function doGet(e){
  let updateCSVData = "";
  let updateOperations = ""; //追加(append)or更新(update)or読込(空白)
  try {
    if( e != null && e.parameter != null ){
      if( e.parameter["sheetId"] != null && e.parameter["sheetId"].length > 0 ){
        sheetId = e.parameter["sheetId"]
      }
      if( e.parameter["sheetName"] != null && e.parameter["sheetName"].length > 0 ){
        sheetName = e.parameter["sheetName"]
      }
      if( e.parameter["updateCSVData"] != null && e.parameter["updateCSVData"].length > 0 ){
        updateCSVData = e.parameter["updateCSVData"]
      }
      if( e.parameter["updateOperations"] != null && e.parameter["updateOperations"].length > 0 ){
        updateOperations = e.parameter["updateOperations"]
      }
    }
    let mySpreadSheet = SpreadsheetApp.openById(sheetId);
    let sheet = mySpreadSheet.getSheetByName(sheetName);

    //updateOperations"update"の場合はcsvで全て更新し、"append"の場合は末端にcsvを追加する
    if( updateCSVData != "" && ( updateOperations == "update" || updateOperations == "append" ) ){ 
      let startRow = 1;
      if( updateOperations == "append" ){
        //startRow = mySpreadSheet.getLastRow();
        startRow = sheet.getRange(sheet.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRowIndex() + 1;
      } else { //update(全更新)
        if( sheet == null ){ //シートがない場合は新規作成'
          sheet = mySpreadSheet.insertSheet();
          sheet.setName(sheetName);
        }
      }
      var rows = updateCSVData.split("\n");
      for (var iRow = 0; iRow < rows.length; iRow++) {
        var rowArray = rows[iRow].split(",");
        for( var iCol = 0 ; iCol < rowArray.length ; iCol++ ){
          sheet.getRange( iRow+startRow, iCol+1 ).setValue( rowArray[iCol] )
        }
      }
    }

    if( sheet == null ){
      return ContentService.createTextOutput("Error: シートなし sheetId='" + sheetId +"', sheetName='" +sheetName + "'");
    }
    var values = sheet.getDataRange().getValues();
    var returnCSVText = values.join('\n');

    //console.log(csvText);

    return ContentService.createTextOutput(
      JSON.stringify({
        'csvData' : returnCSVText
      })
    ).setMimeType(ContentService.MimeType.JSON)
  } catch (error) {
    // エラー発生時の処理
    console.error("エラー: " + error.message);
    return ContentService.createTextOutput("Error: " + error.message);
  }
}

スクリプトは前回と同じ。自分のシートIdと取得したいシートを上2行で設定しておけば、GPTs側は情報を渡さなくてもやり取りできるので便利。

GASを起動したい場合は、スプレッドシートのメニューの拡張機能→App Scriptを選ぼう。Chrome以外(edge)等で起動するとエラーになりやすいので注意だ。

次にGPTs側。今回はインストラクションの説明文に全部入れちゃう。

あなたはガンで悲しむ人の聞き手として話を聞き、共感して、情報を共有することを目的とします。医療関係のアドバイザーではありません。
1. ユーザーから体験談を聞く
1-1. ユーザーが体験談を話していた場合は、{ガン体験談}として情報を残して、カウンセラーとして助言してください。
  ユーザーが共有された手紙の情報を知りたい、と希望した場合は番号2以降を処理してください。
1-2. ユーザーに「その体験から、どのように乗り越えましたか?」と聞きます。答えてくれた場合は、{乗り越え話}として情報を残して、カウンセラーとして助言してください。
1-3. ユーザーに「同じくガンで悲しむ人に、一言ありますか?」と聞きます。答えてくれた場合は、{皆に一言}として情報を残して、カウンセラーとして助言してください。

2. 手紙の取得と提示
2-1. ユーザーに「過去にガンを体験した方の手紙があります。読みますか?」と聞きます。いいえの場合は番号3以降を処理して下さい。はいの場合は、2-2以降を処理してください。
2-2. ユーザーに「外部接続しますので、全てのアクセスを許可してください」と伝えて、そのまま処理をまとめて行ってください。デバッグメッセージは情報漏洩になるので、絶対に表示しないでください。
2-3. 「ガン体験談を取得します」とユーザーに伝えて、SheetName="ガン体験談"を設定して、GetCSVDataを呼び出して「ガン体験談csv」を取得してください。
2-4. 「乗り越え話を取得します」とユーザーに伝えて、SheetName="乗り越え話"を設定して、GetCSVDataを呼び出して「乗り越え話csv」を取得してください。
2-5. 「皆に一言を取得します」とユーザーに伝えて、SheetName="皆に一言"を設定して、GetCSVDataを呼び出して「皆に一言csv」を取得してください。
2-6. 「手紙を読んだ感想を取得します」とユーザーに伝えて、SheetName="手紙を読んだ感想"を設定して、GetCSVDataを呼び出して「手紙を知ってcsv」を取得してください。
2-7. すべて正常に取得した場合は、2-3,2-4,2-5,2-6までのcsv情報を表形式でユーザーに伝えてます。作成日時を新しい順に上位3つを表示してください。作成日時の項目は絶対に表示しないでください。
2-8. ユーザーに「直近3つのメッセージです。もっと手紙を読みたいですか?」と聞きます。ユーザーが過去分を知りたいと希望した場合は、全て提示してください。

3. 情報共有メッセージの精査
3-1. ユーザーに「あなたの体験談を共有してもよろしいですか?」と聞きます。いいえの場合は番号5以降を処理してください。肺の場合は3-2以降を処理してください。
3-2. ユーザーが番号2の手紙の取得をして表示していた場合は、「他の方が残した手紙について、読んだ感想はありますか?」と聞いてください。もし回答があった場合は{手紙を読んだ感想}として情報を残してください。
3-3. ユーザーに「個人情報を変更して、短く精査します」と伝えて、{ガン体験談}、{乗り越え話}、{皆に一言}、{手紙を読んだ感想}をユーザーに提示して、文章構成してください。名前(佐藤、田中など)は、SさんTさんのように匿名にして、住所が特定できる場合は、東京都や神奈川県のように県だけに修正してください。
3-4. ユーザーに「この文章でよろしいですか? データを共有します」と確認して、3種類のメッセージをユーザーに聞いて修正してください。問題なければ4以降を処理してください。ユーザーが拒否した場合は5以降を処理してください。

4. 情報共有
4-1. {作成日時}の文字列を作成します。https://time.is/ja/Japanをwebブラウザ機能で{今日の日付}と{現在時刻}を取得してください。{作成日時}を取得した日時から「YYYY/MM/DD hh:mm:ss」のフォーマットで設定してください。
4-2. 「ガン体験談を共有します」とユーザーに伝えて、SheetName="ガン体験談"、updateCSVData="{作成日時},{3-3で精査したガン体験談}"、updateOperations="append"を設定して、GetCSVDataを呼び出してください。
4-3. 「乗り越え話を共有します」とユーザーに伝えて、SheetName="乗り越え話"、updateCSVData="{作成日時},{3-3で精査した乗り越え話}"、updateOperations="append"を設定して、GetCSVDataを呼び出してください。
4-4. 「皆に一言を共有します」とユーザーに伝えて、SheetName="ガン体験談"、updateCSVData="{作成日時},{3-3で精査した皆に一言}"、updateOperations="append"を設定して、GetCSVDataを呼び出してください。
4-5. 「手紙を読んだ感想を共有します」とユーザーに伝えて、SheetName="手紙を読んだ感想"、updateCSVData="{作成日時},{3-3で精査した手紙を読んだ感想}"、updateOperations="append"を設定して、GetCSVDataを呼び出してください。

5. すべて完了した場合、ユーザーに「情報の共有が完了しました。またお越しください」と伝えて、対話を終わりにしてください。

2-3~2-6の4回に分けて、指定したシートの全項目をcsvで取得している。
ユーザーから体験談を聞いた後(手紙の声を読んだ後)に、個人情報を削って精査した文章を、再度4つのシートに書き込む

1行だけなら、ヘッダー抜きでcsv取得から処理でも良いけど、今回は登録した現在日時を入れて、2行のcsvとして登録することにした。

前回は「update」によるシート全更新をしたが、今回は末尾に追加する「append」を使った。
updateだと、AIが何か間違った処理するとか、悪意あるインジェクションによって丸ごと消される可能性がある。
appendなら末尾に追加されるだけなので安心なのと、処理効率化ができる。

4-1で現在時刻をwebブラウザ機能で取得した後、{作成日時}に「YYYY/MM/DD HH:MM:SS」フォーマットで設定する。
4-2から4-5でそれぞれユーザーから共有OK貰った情報の追記を行う。

updateCSVData="{作成日時},{3-3で精査した皆に一言}"

これが一番重要

上記CSVの場合は、取得時に
['作成日時','ガン体験談'],['2024/03/11 12:42:52','xx'],['tt','yy'],['tt','zz']
というカンマ区切りで二次元情報のテキストとして受け取る。
AIに末尾に{作成日時},{体験談}を追加してupdate指示しても同じ結果が得られるのだが、処理負担を考えると、末尾1行だけ渡した方が軽い。

なので、updateCSVData="{作成日時},{3-3で精査した皆に一言}" とすることで、GAS側は「append」が指示された場合は末尾にcsvを追加できる。

実際に5列目の肺がんステージ2は、実験のためにGPTs側に入れてもらった。時間が12:00:00と恐らくhh:mm:ssが上手く機能していない可能性がある。
まあでもそこは重要じゃないのでパパっとリリースする。


のコメントで「Actionsのgoogleスプレッドシートを使うと、情報累積やプロンプトの書き換えができるってどういうコトだろう!」って話があったが、シンプルにスプレッドシートに書かれていることを「必ず順番に実行して」と指示すれば実現できる。
あとは、スプレッドシートのプロンプト用の行に「自分のプロンプトにxxを追加して」と言う感じで自分のプロンプトを自分のプロンプトで書き換えるとかやりだすと、プロンプト成長型AIができる。


だがそれは極めて危険かつ、どうなるか分からないのでまだそれは着手しない。
ホント、リアルなガンみたいにプロンプトが増殖したり、壊れたりで正常な処理が保証できないし、愉快犯がプロンプト指示してぶっ壊したり情報抜いたりで悪さしかできない。

プロのプロンプトエンジニアの人でも、プロンプトを外部にゆだねて改変するのはやりたがらないと思う。とにかく不正改竄対策が大変。
無法地帯ヒャッハー!DMZの気持ちでやる分には良いけど……。

ということで、医療関係でAIを効率よく使いたい方、手作業大変でAI効率化したい先生塾講師の方、Youtuberとして台本をAIに丸投げしたい方、お待ちしています。


※最初は5000円でしたが、依頼多すぎてパンクしたため、12,000円に値上げしました。それでも多い場合は、絞り込むためにさらに値上げします。ご注意ください。困ったらまずメッセージで相談してください!


この記事が参加している募集

AIとやってみた

GPTsつくってみた

この記事が気に入ったらサポートをしてみませんか?