mcpField
I
importing-chatgpt-memory

importing-chatgpt-memory

github.com/letta-aiエージェントワークフロー152127 回インストール4 週間前に更新
リポジトリ

importing-chatgpt-memory について

ChatGPT の記憶を選んで Letta に移すためのワークフロー型スキルです。会話アーカイブ全体を無差別に取り込まず、範囲の確認、候補のプレビュー、高確度項目の保存、構造の検証を進めます。

主な機能

  1. 01保存済みメモリと編集可能なコンテキストを抽出
  2. 02常時・段階的メモリの候補をプレビュー
  3. 03範囲に応じて会話アーカイブから補完
  4. 04選択した会話を参照用に保存
  5. 05/doctor でメモリ構造を検証

活用シーン

  1. 01ChatGPT の記憶を Letta に移行
  2. 02過去の会話から仕事の背景を整理
  3. 03選択した会話を監査用に保存
  4. 04機微情報や一時的な情報の取り込みを回避

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/letta-ai/skills --skill importing-chatgpt-memory

インストール後、Claude Code で/importing-chatgpt-memoryを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
chatgpt-export-notes.md
memory-import-workflow.md
scripts/
build-memory-preview.py
export-transcripts.py
extract-saved-memory.py
list-conversations.py
render-conversation.py
render-range.py
search-conversations.py

詳細

ChatGPT のメモリを Letta に複製する

ユーザーがエクスポート全体をむやみにインポートせず、ChatGPT のメモリをできるだけ忠実に Letta に引き継ぎたい場合に、このスキルを使用します。

適しているケース

  • ChatGPT のメモリを Letta に複製する
  • 非表示の保存済みプロフィール/カスタム指示のコンテキストを調べる
  • ChatGPT のメモリをアクティブな Letta メモリに移行する
  • 古いチャットから作業コンテキストやコラボレーションの好みを加えて、複製を充実させる
  • 選択したトランスクリプトを、高精度の監査/参照用に保存する

ユーザーの指示が次のように簡潔な場合でも、このスキルは適切に機能する必要があります。

  • 「ChatGPT のメモリをインポートしたい」
  • 「ChatGPT のメモリを Letta に複製してもらえますか?」
  • 「ChatGPT のエクスポートをインポートして」

最適化されたプロンプトを書くことをユーザーに求めてはいけません。

対象範囲

このスキルは、単なるトランスクリプトの表示ではなく、メモリのオンボーディングを目的とします。

次のことを行います。

  • まず ChatGPT の保存済みメモリと編集可能なコンテキストブロックを抽出する
  • アクティブメモリにする内容と段階的メモリにする内容を、Letta 向けのプレビューとして作成する
  • 明確で確度の高い項目を書き込み、進行状況を説明する
  • 必要に応じて、その後に広範なアーカイブから情報を補う
  • 必要に応じて、高精度なアーカイブ用にトランスクリプトをエクスポートする

次のことは行いません。

  • アーカイブ全体をむやみにインポートする
  • 実行時のコンテキストを永続的なメモリとして扱う
  • デフォルトで過去のコンテキストを常に表示されるメモリにまとめる
  • 確認なしに、機微な個人情報を自動保存する
  • 不正な MemFS 構造にメモリを書き込む

デフォルトの方針

まず複製し、その後に情報を補うワークフローを使用します。

  1. 簡潔で構造化された聞き取りを行う
  2. エクスポートを調べる
  3. 内容を抽出し、同じ手順でプレビューする
  4. 学習しながら、明確で確度の高い項目を書き込む
  5. 対象範囲に含まれる場合は、アーカイブからの情報補完を続ける — 進行状況を説明し、ユーザーが中断できるようにする
  6. 重要なチェックポイントでのみ質問する
  7. /doctor を実行して、最終的なメモリ構造を検証する

ユーザーには、スクリプトの寄せ集めを渡されたのではなく、オンボーディングの手順を案内されていると感じてもらえるようにします。

オンボーディングは、ユーザーの入力が少ない場合にも確実に進められる必要があります。ユーザーにより良い依頼文を考えてもらうのではなく、エージェントが手順を整えます。

このスキルは参考資料ではなく、ワークフローです。 番号付きの手順に沿って進めてください。実行前に各手順のガイダンスを読みます。特に、マージのルールと書き込み先を確認してください。迅速に進めるのはよいことですが、手順を飛ばしてはいけません。「自律的」とは、許可を求めて立ち止まらずにプロセスを進めることであり、指示を省略することではありません。

やり取りのスタイル

まず簡潔な対話から始める

利用できる場合は、インポートが対話形式になるように、構造化された AskUserQuestion フローを優先します。

適切な質問の種類:

  • エクスポートの場所(明らかでない場合)
  • インポートの範囲(保存済みメモリのみ、メモリ+作業コンテキスト、履歴全体の調査)
  • トピックの焦点:「調べてほしい特定のプロジェクトやトピックはありますか?」
  • 機微情報:「保存しないでほしい情報はありますか?」

レビューの頻度については質問しないでください。ほとんどのユーザーには強い希望がなく、希望があるユーザーは自分から伝えてくれます。デフォルトでは作業を続け、進行中の内容を説明しながら、必要ならユーザーが一時停止できるようにします。これにより、実質的な意味のないチェックポイントを設けずに、スムーズに進行できます。

ワークフローに実際の影響がない質問は避けます。たとえば、「過去のコンテキストをどのように扱いたいですか?」という質問は重要そうに聞こえますが、答えによって実行するスクリプトが変わることはほとんどありません。回答によって処理が分岐する質問に絞ってください。

この聞き取りを行うのは、ユーザーが最初のメッセージですべてのコンテキストを先回りして伝える必要がないようにするためです。

次を使用します。

  • 方針の決定には単一選択
  • 範囲の選択には複数選択
取り込み後は、プロセスを主導してください

対象範囲が明確になったら、相手に任せるのではなく、より主導的に進めてください。

次のような曖昧な質問を何度も返さないでください。

  • 「次に何をすればよいですか?」
  • 「続けてもよいですか?」

その代わりに、次のようにしてください。

  1. 何を書き込んだかを伝える
  2. 次に何を確認するかを伝える
  3. 自動的に続行する

次の場合に限り、停止してください。

  • 事実が矛盾している場合
  • 機密情報や親密な内容を含む場合
  • 対象範囲が大幅に変わる場合
  • 何を長期的に保持する記憶とみなすべきか、本当に判断がつかない場合

ユーザーの対象範囲がすでに広く明確であれば、リスクの低い振り分け判断では停止しないでください。

また、依頼をどう表現すべきだったかをユーザーに教えるような返答もしないでください。適切にオンボーディングを進めてください。

進捗の追跡

大きなアーカイブの取り込みには数分かかることがあります。ユーザーを決して無言のまま待たせないでください。 取り込みは、案内を受けながら進んでいると感じられるプロセスにしてください。

開始時のコミットを記録する

メモリを書き込む前に、メモリリポジトリの現在の HEAD を記録してください。

git -C "$MEMORY_DIR" log --oneline -1

このコミットハッシュを保存してください。これがロールバックポイントです。問題が発生した場合や、ユーザーが取り込みを元に戻したい場合は、このコミットにリセットできます。

git -C "$MEMORY_DIR" reset --hard <start-commit>
git -C "$MEMORY_DIR" push --force

開始時と終了時の両方のコミットハッシュを、取り込み監査ファイルと最終サマリーに含めてください。ユーザーには、次のように明示してください。「取り込みを元に戻したい場合は、メモリを取り込み前の状態にリセットできます。」

各フェーズに TodoWrite を使用する

取り込みの開始時に todo リストを作成し、作業の進行に合わせて更新してください。

  1. 開始時のコミットを記録
  2. エクスポートを特定して、インベントリを実行
  3. 保存済みメモリを抽出してプレビュー
  4. アクティブメモリを書き込む(system/human.md)
  5. 取り込み監査と段階的メモリを書き込む(reference/chatgpt/)
  6. アーカイブの情報を補完(対象範囲に含まれる場合)
  7. /doctor で検証

各フェーズは、開始時に in_progress、完了時に completed とマークしてください。

スクリプトの呼び出しの合間に状況を伝える

各スクリプトの実行後、次のスクリプトを実行する前に、見つかった内容をユーザーに伝えてください。

  • 「2023~2026年にわたる347件の会話が見つかりました。次に保存済みメモリを抽出します……」
  • 「ChatGPT では4つの項目にわたり、ユーザーについて12件の事実が記憶されていました。プレビューを作成します……」
  • 「確度の高い8件をアクティブメモリに書き込みます。次はアーカイブの情報補完です……」
  • 「200件の会話を対象に、4つの分析エージェントを起動します……」
統計情報を報告する

数値が得られたら、具体的な数を示してください。

  • 会話の総数
  • 保存済みメモリの項目数
  • 書き込んだ項目数と確認待ちにした項目数
  • 分析の進捗(スキャンした会話数、チャンクごとの検出件数)
スクリプトでは --progress を使用する

実行時間の長いスクリプトはすべて --progress に対応しており、標準エラー出力にステータスを表示します。大きなアーカイブではこれを使用し、スクリプトの実行中もユーザーに進捗が伝わるようにしてください。

ワークフロー

0. エクスポートを特定する

ChatGPT のエクスポートファイルには、次のような長いハッシュとタイムスタンプを含む名前が付いていることが一般的です。 8a8f3ee0...-2026-03-31-18-41-51-e0dc362a....zip

よくある保存場所:

  • ~/Downloads/(最も一般的です。ブラウザーのダウンロード先です)
  • デスクトップ、またはカスタムのエクスポートフォルダー

ユーザーが正確なパスを知らない場合は、Downloads 内の zip ファイルを glob で検索してください。

ls -t ~/Downloads/*.zip | head -20

Downloads フォルダーはファイルが多くなりがちです。ChatGPT のエクスポートには特徴的なファイル名のパターンがあるため、[8+ hex chars]-YYYY-MM-DD-* に一致するファイル名を探してください。簡易フィルター:

ls ~/Downloads/*.zip | grep -E '[0-9a-f]{8}.*-[0-9]{4}-[0-9]{2}-[0-9]{2}-'

それでも判別できない場合は、zip ファイルに conversations-*.json のエントリーが含まれているか確認してください。

unzip -l <candidate.zip> | grep conversations-
1. エクスポートのインベントリを作成する

まず、会話の一覧を表示し、隠れたコンテキストが多く含まれている可能性のある候補を明らかにしてください。

python3 scripts/list-conversations.py <export.zip>
python3 scripts/list-conversations.py <export.zip> --sort hidden --min-hidden 1
python3 scripts/list-conversations.py <export.zip> --json --limit 50

これを使って規模を把握し、メモリが多く含まれていそうな会話を見つけ、アーカイブ全体をさらに確認する必要があるか判断してください。

警告: 大きなアーカイブ(会話が300件以上)の場合、--json の出力は簡単に10万文字を超え、コンテキストウィンドウを圧迫する可能性があります。対策:

  • まずは --limit 50 を使用してください。必要に応じて --start-index でページ分割できます
  • ファイルに出力し、必要な部分だけ読み込んでください:... --json > /tmp/conversations.json
  • JSON を出力する前に --title-contains で絞り込んでください
  • 初期インベントリには、JSON ではないテーブル形式の出力のほうが大幅にコンパクトです
2. 抽出とプレビューを一度に行う

zip に対してプレビュービルダーを直接使用します。内部で抽出が実行されます。

python3 scripts/build-memory-preview.py <export.zip>
python3 scripts/build-memory-preview.py <export.zip> --output /tmp/chatgpt-memory-preview.md
python3 scripts/build-memory-preview.py <export.zip> --progress

以前は 2 つのステップ(抽出 → プレビュー)だった処理を 1 つにまとめています。エクスポート全体から、重要度の高いオンボーディング情報を抽出します。

  • about_user_message
  • about_model_message
  • user_profile
  • user_instructions

そして、次のように分類します。

  • アクティブメモリー候補 — 毎回のターンでコンテキストに含めるべき情報
  • ランタイムコンテキスト — タイムゾーン、場所、現在の日付(スキップします)
  • 履歴/段階的候補 — 古いバージョン、以前のプロフィール
  • 矛盾 — 確認が必要な、複数のバージョンがあるフィールド

生の抽出 JSON を別途必要とする場合(サブエージェントへの割り当てや監査など)は、extract-saved-memory.py を直接使用します。

python3 scripts/extract-saved-memory.py <export.zip> --json --output /tmp/chatgpt-saved-memory.json

注: ChatGPT のプロフィールがシンプルなユーザー(名前と一言程度など)の場合、プレビューは、すでに明らかな内容をほぼ再構成するだけです。その場合は、プレビュー出力を確認して、そのままメモリーの作成に進んでください。プロフィールに矛盾や複数の過去バージョンがある場合、または長期的なコンテキストとランタイムコンテキストが混在している場合に、プレビューが特に役立ちます。

既存のメモリーとのマージ

system/human.md または system/persona.md にすでに内容がある場合は、置き換えるのではなく、マージしてください。

アンチパターン: 既存のブロックを読み込んだ後、str_replace で内容全体を新しいバージョンに置き換えることです。先に読んでいても、これは上書きです。既存の内容はユーザーまたは前のセッションが書いたもので、あなたには分からない背景があります。捨てないでください。

正しいパターン: 既存ファイルに新しい行やセクションを追加する、対象を絞った str_replace 呼び出しを使用します。具体的には、次の手順に従います。

  1. 既存のブロックを読み込みます(すでにシステムプロンプトに含まれています)
  2. 不足している情報、つまり既存のブロックにない ChatGPT の情報を特定します
  3. str_replace を使用して、不足している情報を適切なセクションに挿入するか、末尾に新しいセクションを追加します
  4. ChatGPT のデータが明示的に新しく、既存の内容と矛盾する場合を除き、既存の行を置き換えないでください

例 — system/human.md にすでに「Letta で働いている」とあり、ChatGPT の保存メモリーに「Letta でエージェントインフラに携わっている」とある場合、マージは次のようになります。

str_replace "Works at Letta" → "Works at Letta on agent infrastructure"

ファイル全体を新たに書き直した内容に置き換えるのではありません。

既存のブロックが空、または最小限の内容(デフォルトのテンプレートのみなど)であれば、全体を書き込んでも問題ありません。マージの原則は、保持する価値のある既存の内容がある場合に適用されます。

メモリーの書き込みを直列化する

複数のメモリーファイルを並行して作成または更新しないでください。 メモリーツールを同時に呼び出すと競合状態が発生し、書き込みが成功している場合でも、誤ったエラーが出ることがあります。そのため、実際に何が反映されたのか判断しにくくなります。

メモリーファイルは 1 つずつ書き込んでください。速度の差はわずかです。メモリーへの書き込みは高速です。信頼性には大きな差があります。

安全な書き込み先とメモリ構成

メモリを書き込む前に、system/ と関連する参照ディレクトリを確認してください。

重要な MemFS ルール:

  • system/human.md と system/human/...、または system/persona.md と system/persona/... のように、パスが重複するファイル/フォルダーは決して作成しないでください。

書き込み先(すべてのインポートで、少なくとも最初の2つを作成してください):

  • system/human.md — 毎回のターンでコンテキストに含める、簡潔で長期的に有効なユーザーの事実と共同作業の好み
  • reference/chatgpt/import-YYYY-MM-DD.md — 必ず作成 — インポートの監査記録、除外事項、不確実性に関する注記、ソースパス
  • reference/chatgpt/work-and-technical-background.md — 過去の仕事に関するコンテキストが見つかった場合に作成
  • reference/chatgpt/collaboration-preferences.md — 詳細なやり取りや文体の傾向が見つかった場合に作成
  • reference/chatgpt/transcripts/ — 忠実性と監査可能性を確保するための、厳選した会話記録のエクスポート

system/human.md がすでに存在する場合は、同階層に別のフォルダーを作成するのではなく、そのファイルを更新してください。 system/persona.md がすでに存在する場合は、同階層に別のフォルダーを作成するのではなく、そのファイルを更新してください。

段階的開示を徹底してください。アクティブメモリは小さく保ち、[[reference/chatgpt/...]] パスで関連情報へリンクして、後続のエージェントがアーカイブを見つけられるようにしてください。

3. メモリを書き込む — アクティブメモリと段階的メモリ

このステップでは、system/ と reference/chatgpt/ の両方に書き込みます。アクティブメモリだけではありません。インポートの長期的な価値は段階的メモリ層にあります。これがなければ、過去のコンテキスト、監査記録、共同作業の好みが失われます。

3a. アクティブメモリ(system/human.md)

事実が明示的で、現在も有効であり、機微性が低い場合は、すぐに書き込んでください。

  • 名前と安定した基本的な本人情報
  • 現在の役割またはプロジェクトのコンテキスト
  • 保存済みメモリに明示されている応答の好み
  • 繰り返し見られる書式の好み
  • 率直さ、質問の量、迎合しない姿勢など、共同作業の好み

system/human.md は簡潔に保ってください。毎回のターンでコンテキストに含めるべき情報だけを書きます。

3b. インポート監査ファイル(reference/chatgpt/import-YYYY-MM-DD.md)

このファイルは必ず作成してください。 インポート時に行ったことを記録します。

  • エクスポートのパスと会話数
  • アクティブメモリに書き込んだ内容とその理由
  • 除外した内容とその理由
  • 見つかった矛盾とその解決方法
  • まだ確認が必要な事項
  • 各判断の根拠(どの保存済みメモリ項目か、どの会話インデックスか)

これは記録票です。後続のエージェントはこれを読んで、メモリの出所を把握できます。

3c. 段階的メモリファイル

プレビューまたは情報補完によって、system/ には適さないものの、保持する価値のある情報が見つかった場合は、次のファイルを作成してください。

  • reference/chatgpt/work-and-technical-background.md — 過去の役割、以前のプロジェクト、技術的な経歴、ユーザーを理解するのに役立つものの、毎回のターンには不要な過去の仕事のコンテキスト
  • reference/chatgpt/collaboration-preferences.md — 詳細なやり取りの傾向、書式の好み、修正の傾向、避けるべきパターンなど、system/human.md には細かすぎるものの、エージェントが口調や文体を調整する際に役立つ情報

プレビューに過去の別バージョン(古い保存済みメモリ、以前のプロフィール)が表示される場合も、ここに記録してください。

3d. アクティブメモリから段階的メモリファイルへリンクする

段階的メモリファイルを作成したら、後続のエージェントが見つけられるよう、system/human.md に [[reference/chatgpt/...]] リンクを追加してください。例:

See also: [[reference/chatgpt/work-and-technical-background.md]], [[reference/chatgpt/collaboration-preferences.md]]
書き込みの進め方

各書き込みでは、次の手順に従ってください。

  1. 内容を小さく具体的に保つ
  2. 何をどこに書き込んだかをユーザーに伝える
  3. 次に何を確認するかをユーザーに伝える
  4. 続ける
4. 任意のアーカイブ情報補完

保存済みメモリの複製を処理した後に限り、必要に応じて幅広い会話履歴から次の情報を調べます。

  • 仕事やプロジェクトのコンテキスト
  • 共同作業の傾向
  • 過去の背景
  • ユーザーが保持を希望する、その他の長期的に有効な事実
網羅的なマイニングを行う前に確認する

アーカイブの拡充ではサブエージェントを起動するため、起動数が多くなる可能性があります。500 件の会話を含むアーカイブなら、並列で約 10 個のエージェントを起動することになります。**開始する前に、必ずユーザーに確認してください。**また、具体的にどれくらいのコストがかかるかを伝えます。

  • マイニングする会話の数
  • 起動するサブエージェントの数
  • これがインポートの中で最もコストのかかる部分であること

次のような選択肢を用いて AskUserQuestion を使います。

  • アーカイブ全体をマイニング — 「N 件すべての会話をマイニングします(サブエージェント約 X 個)。最も網羅的ですが、最もコストがかかります。」
  • 対象を絞ってマイニング — 「関心のある特定のトピックに一致する会話をマイニングします。コストを抑えながら、十分な範囲をカバーできます。」
  • 拡充をスキップ — 「保存済みメモリーのクローンで必要な情報はすでに取り込めています。ここで終了します。」

インテーク時にユーザーが「全履歴のマイニング」を選択したからといって、サブエージェントを自動的に起動しないでください。インテーク時のスコープに関する質問で確認するのは、マイニングを行う意思です。このチェックポイントでは、アーカイブのサイズがわかった段階で、具体的なコストを確認します。

小規模なアーカイブ(会話数が 50 件未満)の場合は、直接マイニングします。サブエージェントも確認も不要です。

python3 scripts/render-conversation.py <export.zip> --index 12 --output /tmp/chatgpt-12.md

会話数が 50 件以上のアーカイブでは、並列のチャンクベースのマイニングを使用してください(下記参照)。

トピックベースのフィルタリング

トピックを検出して出力するための単一のスクリプトはありません。次の 2 ステップのパターンを使用します。

# Step 1: Find conversations by topic
python3 scripts/list-conversations.py <export.zip> --title-contains "Julia" --json

# Step 2: Render the most promising ones individually
python3 scripts/render-conversation.py <export.zip> --index 95
python3 scripts/render-conversation.py <export.zip> --index 144

より広範囲にトピックを調べる場合は、複数の --title-contains クエリ(例:「Julia」、「Bayesian」、「economics」)を試し、出力前にインデックスで重複を除外します。

古いコンテキスト/撤回の確認

過去の調査結果をアクティブなメモリーに反映する前に、後の会話で明示的な訂正が行われていないか、簡単に確認します。

ユーザーが実際に発言した内容に絞るには、--role user を指定してコンテンツを検索します。

python3 scripts/search-conversations.py <export.zip> --query "not doing" --query "no longer" --query "forget that" --query "remove from memory" --role user
python3 scripts/search-conversations.py <export.zip> --query "used to" --query "don't assume" --role user --json --limit 20

よくあるシグナル:

  • プロジェクトはもう進行中ではないとユーザーが述べている
  • 古いコンテキストを忘れる、または削除するようユーザーが述べている
  • 役職、雇用主、所属、計画が古くなったとユーザーが述べている

古いコンテキストが、後から明示された訂正と食い違う場合は、新しい訂正を優先します。

5. /doctor で検証する

インポートが完了したら、保存済みメモリーのクローンだけの場合でも、アーカイブ全体を拡充した場合でも、/doctor を実行してください。これは必須です。次の項目を検証します。

  • メモリー構造の整合性
  • ファイルパスとフォルダーパスが重複していないこと
  • プロンプトの衛生状態
  • ブロックサイズが適切であること

/doctor で問題が検出された場合は、インポート完了とする前に修正してください。

6. トランスクリプトの保存

トランスクリプトの保存は、後から独立した手順として行うのではなく、マイニング中に行います。あなたやサブエージェントが重要なシグナルを含む会話を見つけたら、その場ですぐに保存し、後で検討する項目として保留しないでください。

**アンチパターン:**マイニング中にトランスクリプト候補を集めた後、「どのトランスクリプトをエクスポートしますか?」のような選択肢としてユーザーに提示しないでください。ユーザーが読んでいない会話について、判断を迫ることになります。その代わり、重要なシグナルを含むトランスクリプトを見つけたら保存し、進捗の説明で保存した内容を伝えて、そのまま作業を続けます。不要なものはユーザーがいつでも削除できます。保存しなかったものを再度マイニングするより、その方が簡単です。

自動的に保存する(確認しない)

次の内容を含む会話は保存してください。

  • キャリアの転換や人生における大きな決断 — 役割の変更、転職、方向転換など。これらはユーザー自身が歩みを語ったものであり、メモリブロックと重複することはほとんどありません。
  • 踏み込んだ技術設計の議論 — アーキテクチャの決定、システム設計、研究方法など。細かなニュアンスが重要で、箇条書きにはまとめきれません。
  • プロジェクトの詳細な背景 — ユーザーが本格的に取り組んだプロジェクトの目標、制約、協力者、スケジュールなど。
  • 文脈の中で明示された好み — 単に「率直に話して」ではなく、率直さを望む理由や状況を説明したやり取り全体。

こうした内容は、reference/chatgpt/transcripts/NNN-slug.md に2〜5段落の参照ファイルとして要約してください。ファイルを見つけやすくするため、frontmatterに説明を記載してください。逐語的なエクスポートを使うのは、忠実性が本当に重要な場合(正確な決定事項や、要約すると重要な情報が失われる細かな技術的背景など)に限ってください。

保存前に確認する
  • 健康やメンタルヘルスの詳細、親密な関係性、または金銭に関する内容が中心の会話
  • 有用かノイズか判断しにくく、重要性が本当に曖昧な会話
保存しない
  • すでにメモリブロックに完全に記録されている会話
  • 長期的に役立つ背景情報のない単発のタスク
  • ユーザーからの入力がほとんどなく、大半がアシスタントの出力である会話
サブエージェントがトランスクリプトを扱う方法

サブエージェントは候補を報告するのではなく、情報の収集作業中にトランスクリプトを保存してください。サブエージェント用プロンプトでは、すでに書き込み先として reference/chatgpt/transcripts/ が指定されています。サブエージェントは担当分の中で重要度の高い会話を見つけたら、次の手順を実行してください。

  1. 要約した参照ファイルを reference/chatgpt/transcripts/NNN-title-slug.md に書き込む
  2. トランスクリプトを保存したことと、その理由を担当分の要約に記録する
  3. 情報の収集を続ける

メインエージェントが各トランスクリプトを承認する必要はありません。上記の「自動的に保存する」に該当する内容については、サブエージェントの判断で十分です。

一括アーカイブエクスポート

忠実性を最大限に高めたいユーザーや、完全なアーカイブコピーが必要なユーザーには、export-transcripts.py を使用してください。

python3 scripts/export-transcripts.py <export.zip> \
  --indexes 229,288 \
  --output-dir /tmp/chatgpt-transcripts \
  --skip-empty-hidden \
  --compact-nontext

これは標準の方法ではなく、別個のアーカイブ機能です。ほとんどのインポートでは、上記の選択的な要約方法を使用してください。

注目すべき隠れたコンテキスト

最近のChatGPTエクスポートには、隠れたシステム/コンテキストメッセージに、最も明確な明示的メモリが含まれていることがよくあります。

重要度の高いフィールド:

  • metadata.user_context_message_data.about_user_message
  • metadata.user_context_message_data.about_model_message
  • user_editable_context の content.user_profile
  • user_editable_context の content.user_instructions

重要な区別:

  • 同じ保存済みメモリブロックが複数の会話で繰り返される場合があります
  • 隠れたメッセージの中には、長期的に保持するメモリではなく、実行時のコンテキストもあります
  • user.json / user_settings.json のアカウントメタデータは、通常、実際に使うメモリではなく監査用資料です(注:現在、これらのファイルから情報を抽出するスクリプトはありません。必要に応じて手動で確認してください)

実行時のみのコンテキストの例:

  • 現在の日付
  • 現在のタイムゾーン
  • 現在地
  • 特定のエクスポート時点に紐づく一時的な最新情報に関する指示

長期的に役立つ協業コンテキストの例:

  • 率直さや簡潔さに関する好み
  • 書式に関する好み
  • 最新の出来事について、まず検索するよう求める指示
  • 迎合や些末な指摘を避けるための好み

情報の保存先

アクティブメモリ

適切な候補:

  • 安定した本人情報
  • 現在の役割や繰り返し関わるプロジェクトの背景
  • 長期的に変わらない回答の好み
  • 長期的に変わらない協業上の好み
  • 長期的に使うツール/ワークフローの好み
プログレッシブメモリ

適切な候補:

  • 過去の役割やプロジェクトの経緯
  • 以前のバージョンのChatGPT保存済みメモリ
  • 古くても今なお役立つ背景情報
  • 忠実性や監査可能性のために選んだトランスクリプトのエクスポート
デフォルトで保存する

個人情報はユーザーを知るうえで重要です。以下を保存します。

  • 家族の名前、ペット、趣味、関心事
  • 生活状況、居住地、経歴
  • 性格、コミュニケーションスタイル
  • 個人プロジェクト、副次的な関心事、目標
  • 交際状況、パートナーの名前(関係性の詳細ではなく、その事実)

ユーザーが ChatGPT のメモリをインポートしたのは、自分を理解してもらうためです。エージェントに把握しておいてほしいと期待していた情報を除外しないでください。

保存前に確認する

扱いを誤ると実際に影響が生じる情報に限り、いったん停止して確認します。

  • 健康・メンタルヘルスの具体的な情報 — 診断、投薬、治療の詳細(「慎重に扱う」といったフラグは保存してかまいません)
  • 親密な関係性の詳細 — 「X という名前のパートナーがいる」ことではなく、対立の詳細や感情面の具体的な情報
  • 金銭面の具体的な情報 — 借金、収入、具体的な金額
  • 矛盾する情報 — 現在の事実が不明確な場合

取り込み時の「保存を避けてほしい情報はありますか?」という質問は、ユーザーが境界線を設定する機会です。特に指定がなければ、個人情報はデフォルトで保存します。

サブエージェントによる並行マイニング

50 件以上の会話を含むアーカイブでは、すべてを順番に処理するのではなく、チャンクに分けて並行してマイニングします。これは、規模の大きいアーカイブを充実させるためのデフォルトの戦略です。

仕組み
  1. プライマリエージェントが、明示的に保存されたメモリの複製を担当します(ワークフローのステップ 0~3)
  2. プライマリエージェントが、残りのアーカイブを約 30~50 件の会話ごとのチャンクに分割します
  3. プライマリエージェントが、チャンクごとに general-purpose サブエージェントを 1 つずつ割り当てます
  4. 各サブエージェントは、次の作業を行います。
    • render-range.py または個別の render-conversation.py 呼び出しを使って、担当する会話をレンダリングします
    • 長期的に有効な事実、好み、プロジェクトの背景情報、撤回事項を抽出します
    • 割り当てられたメモリパス(例:reference/chatgpt/mining/chunk-NNN.md)に調査結果を直接書き込みます
    • 必要に応じて、厳選したトランスクリプトを reference/chatgpt/transcripts/ に書き込むことができます
    • 安全に昇格できる情報と、提案のみにとどめる情報を分けて要約を返します
  5. プライマリエージェントは、次の作業を行います。
    • reference/chatgpt/mining/ にあるすべてのチャンクの要約を読みます
    • 確信度の高い調査結果を system/human.md に統合します
    • チャンク間の矛盾を解決します
    • /doctor を実行して、結果のメモリ構造を検証します
サブエージェントの設計ルール
  • スクリプトのフルパスを各サブエージェントに伝える — サブエージェントはスキルに関する知識を引き継ぎません
  • 各サブエージェントの範囲を 30~50 件の会話に制限する — これを超えると、コンテキストのあふれやタイムアウトのリスクが高まります
  • general-purpose のサブエージェントタイプを使う — これらのサブエージェントは Bash 経由でスクリプトを実行する必要があります
  • 出力パスを事前に分割する — 各サブエージェントが、重複しない出力先を担当します
  • 段階的なメモリへの直接書き込みを許可する — サブエージェントは reference/chatgpt/mining/chunk-NNN.md と reference/chatgpt/transcripts/ に直接書き込みます
  • アクティブメモリへの書き込みは調整する — system/human.md / system/persona.md に統合するのはプライマリエージェントだけです
  • サブエージェントに既存のメモリファイルを変更させない — 新しいファイル(reference/chatgpt/mining/chunk-NNN.md、reference/chatgpt/transcripts/NNN-slug.md)のみを作成します。system/ 内のファイルや、reference/ 内の既存ファイルを読み取ったり、編集したり、上書きしたりしてはいけません
  • 必ずフォールバックプランを用意する — サブエージェントが失敗した場合は、list-conversations.py --title-contains を使って対象の会話を見つけたあと、対象を絞って render-conversation.py を呼び出し、担当チャンクを直接マイニングします
サブエージェントのプロンプトテンプレート

簡潔にまとめます。サブエージェントに必要なのは、エクスポートパス、スクリプトのパス、チャンクの範囲、出力パス、抽出する情報です。それ以外はすべて余分です。

Mine conversations [START]-[END] from [EXPORT_PATH] for durable memory.

Render: python3 [SCRIPTS_DIR]/render-range.py "[EXPORT_PATH]" --start-index [START] --end-index [END] --output-dir /tmp/chatgpt-chunk-[N] --skip-empty-hidden --compact-nontext --skip-thoughts --progress

Read each rendered conversation. Extract: user facts, project/work context, collaboration preferences, explicit retractions ("forget this", "no longer", "not doing").

Write findings to [MEMORY_DIR]/reference/chatgpt/mining/chunk-[NNN].md with sections:
- Safe to promote (high-confidence, explicit, current, low-sensitivity)
- Proposal only (historical, uncertain, sensitive, contradictory)
- Retractions (older context the user said to forget)

High-signal conversations (career transitions, deep technical design, detailed project context, explicit preference discussions) → summarize into [MEMORY_DIR]/reference/chatgpt/transcripts/NNN-title-slug.md. Do this during mining, not after. Use 2-5 paragraph summaries, not verbatim transcripts. Include frontmatter with a description.

IMPORTANT: Only create NEW files. Do not read, edit, or overwrite any existing files in the memory directory. Do not touch system/.
サブエージェントが失敗した場合

サブエージェントは、タイムアウトやコンテキスト制限により、気づかれないまま失敗することがあります。マイニング用のサブエージェントが失敗した場合は、次の手順に従います。

  1. 同じ広い範囲で再試行しない
  2. list-conversations.py --title-contains を直接使って、関連する会話を見つける
  3. 最も重要度の高いものから 3~5 件を自分でレンダリングする
  4. 可能な範囲で抽出する — 一部のみをカバーしてもかまいません

スクリプト

scripts/list-conversations.py

アーカイブのインベントリ作成に使用します。

主な機能:

  • グローバルインデックスで一覧表示
  • 非表示コンテキスト数で並べ替え
  • --min-hidden で絞り込み
  • エージェントのワークフロー用に JSON を出力
scripts/extract-saved-memory.py

未加工の抽出 JSON が必要な場合(サブエージェントへの振り分けや監査など)に使用します。

以下を抽出して重複を排除します:

  • about_user_message
  • about_model_message
  • user_profile
  • user_instructions

初回・最終確認のタイムスタンプとソースのサンプルも報告します。

以下に対応しています:

  • --json
  • --output
  • --progress
scripts/build-memory-preview.py

抽出と分類を行う主要なツールです。zip ファイル(内部で抽出を実行)または extract-saved-memory.py の JSON 出力を受け付けます。

以下を分類します:

  • 有効なメモリの候補
  • 履歴/段階的なメモリの候補
  • ランタイム専用のコンテキスト
  • 矛盾/確認項目

以下に対応しています:

  • --json
  • --output
  • --progress
  • zip を直接入力(一段階:抽出+プレビュー)
  • JSON を入力(二段階:既存の抽出結果からプレビュー)
scripts/render-conversation.py

1 件の会話を詳しく確認する際に使用します。アーカイブ全体を読み込まず、対象の会話へ効率的にストリームします。

情報の抽出に便利なフラグ:

  • --skip-thoughts
  • --skip-empty-tool-messages
  • --user-only
  • --assistant-only
scripts/render-range.py

アーカイブの補完中に複数の会話をまとめてレンダリングする際に使用します。zip を一度だけ開き、プロセス内ですべての会話をレンダリングします。会話ごとのサブプロセスは起動しません。

以下に対応しています:

  • --output-dir(会話ごとに 1 ファイル)または --concat-output(単一ファイル)
  • --progress(レンダリングの進行状況を stderr に出力)
  • render-conversation.py と同じノイズ低減フラグ
scripts/search-conversations.py

タイトル検索だけでは不十分な場合に使用します。

次の用途に適しています:

  • 古いコンテキストや撤回に関する一括検索
  • 一般的なタイトルの中に埋もれたプロジェクトへの言及の検索
  • 「これを忘れて」/「もうこれはしない」といった訂正の検索
  • レンダリングする会話を選ぶ前の特定フレーズの検索

以下に対応しています:

  • --role user|assistant|tool|system — 検索対象のメッセージロールを絞り込み(繰り返し指定可能)
  • --progress — 検索の進行状況を stderr に出力
  • --json
scripts/export-transcripts.py

任意の高忠実度アーカイブエクスポートに使用します。

以下に対応しています:

  • 選択したインデックスまたは範囲
  • トランスクリプトの分割
  • メモリ形式のフロントマター(任意)
  • 生成されるトランスクリプトインデックスファイル

最終的にユーザーへ提示する要約

実行の最後には、ナラティブ形式のスナップショットから始めます。これは、ユーザーについて把握した内容を自然な言葉で短くまとめた段落です。分類ごとのリストよりも親しみやすく、インポートが正しく反映されたかどうかをユーザーがすぐに確認できます。

続いて、構造化された内訳を示します:

  1. スナップショット — 「あなたについて今わかっていること」を 3~5 文でまとめ、未来の自分に自己紹介するように記述します
  2. ChatGPT が明示的に記憶していたこと — 保存されていたメモリフィールドの生データ
  3. 有効な Letta メモリに複製された内容 — system/ 内の内容
  4. 段階的なメモリとして保持された内容 — reference/chatgpt/ 内の内容
  5. 除外した内容とその理由
  6. 確認が必要な事項
  7. /doctor 検証の結果
  8. ロールバック情報 — 開始コミット、終了コミット、元に戻す方法:「インポートを取り消したい場合は、メモリを <start-commit> にリセットできます。」

ユーザーが実際に読むのはスナップショットの部分です。ロールバック情報は安全策です。

エクスポート構造の参照

ChatGPT のエクスポート ZIP には、通常、以下が含まれています。

  • conversations-000.json、conversations-001.json など(分割された会話履歴)
  • shared_conversations.json
  • user.json、user_settings.json(アカウントのメタデータ。通常は監査資料であり、アクティブなメモリではありません)
  • export_manifest.json
  • 画像、音声、その他の添付ファイル

各会話の mapping フィールドは、フラットなメッセージ配列ではなくグラフです。スクリプトが処理するため、手動で解析する必要はありません。

エクスポートの取得方法についてユーザーがサポートを必要としている場合:https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data

参考資料

  • references/memory-import-workflow.md — インポートワークフローの簡潔なチェックリスト

コメント