GPTsに当時の自分を思い出して語らさせる
Chat GPTの有料契約(ChatGPT Plus)をして以来、改めてGPTsを活用している。いちいちプロンプトエンジニアリングをしなくても自分の欲しい回答の手癖を覚え込ませておくのが便利なのだけども、一番面白いのはテキストファイルを「知識」としてアップロードしてRAGさせるのが簡単にできること。
コンテンツの消費速度が上がり、「何か新しい」がもはや快楽になっていない。生成AIや評価経済の文脈で、「中身のなさ」への疲れが随所に見られる。
後述するようなスクリプトでXの過去ログを取り込みやすいように変換してアップロードすれば、その頃の自分の心情をありありと「思い出して」語ってくれる。「自費出版に向けたノンフィションを書いて」なんて言えば、よくあるベンチャー社長の自分語りのような文章が紡ぎ出される。
在宅ワークや副業ライターとして、文章での自己表現と収入の両立を模索する姿勢が強い。ただし「引きこもる」ことで生まれる孤独や煮詰まりも伴っていた。
この「2015年の生活感」は、後のコロナ禍における在宅ライフスタイルの予兆でもあった。
ちょうど仕事を辞めてフラフラとライター業をしていた時期。コロナ禍を受け入れやすかった素地はこの頃にできていた? 「あの頃から薄々と気づいて行動していた」なんて後から主張することを事後孔明と言うのだけれども、AIは的確に現代の状況から俯瞰して僕自身の認知を歪めていく。
ワンス・アポン・ア・タイム・イン・自分史
そもそも公開でツイートしていることなんて、個人的な事実をぼかしたり、大袈裟に表現していることがほとんどなんだが……と自嘲的に語ったところで、大規模言語モデルは、その記録を忠実に、時に解釈や心情の捏造を加えて“あらすじ”へと昇華する。それは必ずしも真実ではないどころか「新しい真実」になって生まれ変わる。
2012年の年末、LINE POPに熱狂した夜を思い出させれば、GPTsは「2012年、主人公はデジタルゲームに逃避しながらも自己肯定感を探していた」などとまとめてしまう。いや、単に暇だっただけだ。過去のツイートという断片をAIに読ませると、それはあたかも「ワンス・アポン・ア・タイム・イン・自分史」といった趣の脚本へと構成される。だがそこにあるのは、“整いすぎた”自己物語"だ。
最近、「偽ライフログ」に興味がある。Facebookなどにポジティブな活動を「盛って」記録し続けてる人々が不思議だったのだけど、後から読んだ時に「今の自分の気持ち」を高めるために使えるのかもしれないと気づいた。僕自身も仮想人格を憑依させて書く事が多々あるのだけど、それが「本当の気持ち」だったと後から思う事があるのかもしれない。記憶なんて放っておけば都合よく改竄されていくのだから、出来る限りの整合性を満たしながら偽の記録を続けていれば、現実認識の言語論的転回を起こす儀式となる。
2013年の自分はライフログをAに後解釈させる世界になるのだから、輝かしい偽ライフログを作って精神的勝利法を試みようとしていた。実際的には自虐癖や冷笑癖が抜けていないのだけれども。
GPTsへのX過去ログアーカイブ登録方法
そんな前置きはさておき、GPTsにXの過去ツイートを読ませる方法だ。XはAPI制限が厳しくなって過去ツイートをAPIでよしなに取り出すことが難しくなってしまったが、『全ツイート履歴をダウンロードする方法』で過去ログを取り出すことができる。
ここからダウンロードできるファイルは複数の巨大JSなファイル群であり、そのままGPTsに取り扱わせるのは難しいため以下の手順でファイルの変換処理を行う。
- 自分の過去ログが含まれている data/tweets.js を読み込み
- 不要なスクリプト構文を除去
- JSONとして読み込み
- 日付の逆順でソート
- ファイルトークン制限やRAGを効率化するため西暦ごとに分割
- フォーマット済みの日付文字列とツイート本文を取り出してTSV形式化
- TSVファイルにするとコードインタープリター用になるため .txt としてファイル出力
import csv import json import re from collections import defaultdict from datetime import datetime with open("./input/data/tweets.js", "r", encoding="utf-8") as f: content = f.read() json_str = re.sub(r"^window\.YTD\.tweets\.part0 = ", "", content) tweets_data = json.loads(json_str) for tweet in tweets_data: tweet["tweet"]["datetime"] = datetime.strptime( tweet["tweet"]["created_at"], "%a %b %d %H:%M:%S +0000 %Y" ) tweets_data.sort(key=lambda tweet: tweet["tweet"]["datetime"], reverse=True) tweets_by_year = defaultdict(list) for tweet in tweets_data: time: datetime = tweet["tweet"]["datetime"] tweets_by_year[time.year].append(tweet) for year, year_tweets in tweets_by_year.items(): FILE_NAME = f"./output/tweets_{year}.txt" with open(FILE_NAME, "w", encoding="utf-8", newline="") as f: writer = csv.writer(f, delimiter="\t") writer.writerow(["Timestamp", "Content"]) for i, tweet in enumerate(year_tweets): timestamp = tweet["tweet"]["created_at"] content = tweet["tweet"]["full_text"] content = content.replace("\n", "\\n").replace("\r", "\\r") dt = datetime.strptime(timestamp, "%a %b %d %H:%M:%S +0000 %Y") formatted_timestamp = dt.strftime("%Y-%m-%d %H:%M:%S") writer.writerow([formatted_timestamp, content]) print(f"{year}年のツイート{len(year_tweets)}件を{FILE_NAME}に出力しました。") print("すべてのファイルの変換が完了しました。")
こうして出力したファイルをGPTsの作成時の「知識」としてファイルアップロードすることで、GPTsは内容を読み込んで答えてくれる。そのまま全体的な話を聞いても最初に読み込んだファイルに影響しちゃうので、「2017年中旬の自分に向けて、手紙を書いてください」といった時間軸を指定して指示すると、その当時のログから文章を作ってくれる。興味関心ごとにファイルを分割したり、挨拶などのツイートをフィルタすることもできるだろう。
記憶を燃料にして生きていく
人間ゆうのは、記憶を燃料にして生きていくものなんやないのかな。その記憶が現実的に大事なものかどうかなんて、生命の維持にとってはべつにどうでもええことみたい。ただの燃料やねん。新聞の広告ちらしやろうが、哲学書やろうが、エッチなグラビアやろうが、一万円札の束やろうが、火にくべるときはみんなただの紙きれでしょ。火の方は『おお、これはカントや』とか『これは読売新聞の夕刊か』とか『ええおっぱいしとるな』とか考えながら燃えてるわけやないよね。火にしてみたら、どれもただの紙切れに過ぎへん。それとおなじなんや。大事な記憶も、それほど大事やない記憶も、ぜんぜん役に立たんような記憶も、みんな分け隔てなくただの燃料
「思い出資産」としてGPTに運用させると、自分の中に眠っていた“ワンス・アポン・ア・タイム”が起き上がる。GPTsが過去ログを読み返し、そこから物語を抽出し、笑ったり、泣いたりする。AIに喋らせることで、自分の記憶に“意味付け”という事後孔明が行われて生きる糧となる。何かしら物足りない毎日も前々から意図して選び取った輝かしい生活だった。計算通り。
しかしながら、もっとも単純な希望としては自分にとってのタイムカプセルとしての郵便的コミュニケーションがある。自分だけは自分が書いた文章を後から読み返すだろうし、後に考えが変わることによって、また違う味わいが出てくる。時間差のセルフエコーチェンバーをすることで、手紙が紛失せずに時間的経過と変容を享受できる確率を大幅に上げられる。
そんなことすら無意味なただの燃料なのかもしれないけれど、そもそも自分の記憶をアーカイブしてAIに食べさせて語らせたいから文章を書き続けるなんて、なんて自己肯定感が強くて自分大好きなのだろうかと思ったりもする