🧠

ChatGPTの会話をObsidianに取り込む

に公開

WEDの武者(@knu)です。

会社では誰でもClaudeやGeminiを使える環境が整い、エンジニアはClaude Code、Cursor、Copilot Chat/Agentなどから好きなツールを選んで開発を進めています。エンジニア以外の職種のメンバーも積極的にAIを活用しており、サービスやアプリ仕様の調査員としてDevinを使ったり、NotebookLMでナレッジベースを構築したり、GeminiでGASのコードやBigQueryのクエリを生成したりしています。つい昨年と比べても仕事の進め方は大きく様変わりし、自走力も創造性も高まっていると感じます。

さて、私は個人ではChatGPTを使っていて、アイデアを壁打ちしながら膨らませたり、調査を任せたり、コードや設定を書かせたりと、欠かせない相棒になっています。そうしたChatGPTの会話履歴は、個人向けプランでは簡単にエクスポートできるので、Obsidianなどに取り込んで二次利用・活用したいところです。

今回作ってみたのが、ChatGPTのエクスポートファイルを1会話1ファイルでObsidian用Markdownファイルに出力するツールです。

ChatGPTの会話のMarkdown表現を考える

ChatGPTでの会話は、ユーザからの入力もChatGPTからの応答も基本的にはMarkdownで表現できる範囲なので、ObsidianのMarkdownで表現することができそうです。実際、ChatGPTのエクスポートファイルの中身を見てみると、基本的にMarkdown形式になっていました。

一つ気になったのが、o3やo4-mini-highなどの高度なモデルを使ったときに出る思考過程です。模索や試行錯誤、情報の吟味の様子の詳細を覗けるようになっていますが、基本的には最終的な回答で十分なため、デフォルトでは隠されています。Web検索で最新の情報を取得して回答に用い、情報源として示したりもしますが、どのようなキーワードで検索したかもその中に含まれています。

チャットの内容を変換してObsidianで読む際に、こうした思考内容をどう表現するかを考えました。オプショナルな情報なので全部表示するとうるさいが、必要なときには見られるようにしたい。

HTMLを知っている方なら、まず <details>/<summary> タグを思いつくと思います。初期状態では閉じられていますし、スポイラー的な注記や長すぎる詳細などを隠すのに使われる要素なので、ぴったりに思えました。ところが、ObsidianのMarkdownパーサ仕様では隠した部分に空行を含めることができません。それどころか、中身はインライン要素になってしまうようです。ChatGPTの思考内容には複数段落や箇条書きなどが見られるため、そうした内容を隠すには不向きと分かりました。

また、見出し(# ...など)には折りたたみボタンが付いていて、それ以下の階層を畳めるようになっていることに気づきましたが、これも最初から畳んでおけるような記法は見当たりませんでした。

ChatGPTの会話例

ということで、ChatGPTに聞いてみました。

ChatGPT チャットの冒頭部
ChatGPT チャットの中身

o3に聞いてみたので、思考や検索の過程を含んでいます。

ChatGPT 思考過程

なるほど、Calloutsはぴったりの機能のようです。

Calloutsの記法をうまく使うと、ネストもサポートされているので思考中のWeb検索の結果も埋め込み、畳んでおくことができます。

Markdownに変換してみる

Claude Codeの助けも借りながらささっと変換プログラムを書いて、こんな感じのObsidian Flavored Markdownを出力させてみると、思った通りの表現ができました。

---
title: Obsidian 畳み機能 プラグイン
created: 2025-07-02T22:49:35+09:00
updated: 2025-07-02T22:51:59+09:00
conversation_id: 686538ee-cbd0-8007-8989-344389875c11
conversation_url: https://chat.openai.com/c/686538ee-cbd0-8007-8989-344389875c11
models:
- o3
---
# User
Obsidianの文書で、最初から畳まれていてクリックで開くようなセクションを作れますか?
コードスニペットなども中に入れたいが、 `<details>`/`<summary>` だと中に空行を入れられないしネストも不可能なようです。

たとえば、見出し行にはそのセクションを畳むトグルボタンがありますが、デフォルトで畳んでおく指定はありますか?

あまり好ましくはないけど、コミュニティープラグインでもOKなので、そうした機能を提供するものがあるか調べてほしい。

# ChatGPT

> [!abstract]- Thoughts
> ユーザーは、Obsidianでデフォルトで畳まれたセクションを作りたいとのことですが、HTMLの詳細/概要タグにはいくつかの制限があります。また、Obsidianの見出しは通常、読み取りビューで折りたたむトグルがあるが、デフォルトで折りたたまれる状態にしたいと言っています。現在の2024-2025年の機能について調べ、そのような機能を提供するプラグインもあるか確認します。
> 
> ユーザーが求める機能は、デフォルトで畳まれたセクションを作成することで、Obsidianにはコールアウトという機能があり、コールアウトタグ後にハイフンを付けることで、セクションをデフォルトで畳んだ状態にできることがわかりました。また、この機能にはコードブロックも含めることができるので、ユーザーの要求に合致しそうです。さらに、ネストもサポートされているので、もう少し調べてみます。
> 
> > [!info]- Web Search: [Obsidian callout collapsed by default minus] [Obsidian default folded heading] [Obsidian plugin default fold sections]
> > 
> 
> > [!abstract]- Search Results: [www.reddit.com] [forum.obsidian.md] [obsidian.rocks]
> > > [!info] www.reddit.com
> > > - [Callouts → automatically folded? : r/ObsidianMD - Reddit](https://www.reddit.com/r/ObsidianMD/comments/yesf0l/callouts_automatically_folded/ "Hi, I'm using callouts in my daily note and I wish I could have them be automatically folded (\"closed\") and I would toggle them open at will ...")
> > > - [Is there a way to have certain headings on a document be collapsed ...](https://www.reddit.com/r/ObsidianMD/comments/xf4r4e/is_there_a_way_to_have_certain_headings_on_a/ "In a foldable callout, the contents are hidden until it is expanded. See: https://help.obsidian.md/How+to/Use+callouts#Folding You could also use Admonitions.")
> > 

こんな感じでfrontmatterに情報が入ります。

ChatGPT チャットの冒頭部

畳まれた思考過程を開くとその中身が見られます。

ChatGPT 思考過程

さらに検索結果の詳細を開くことができます。

ChatGPT 検索結果

チャットの中身はChatGPTで読むよりきれいですね。出典の注釈も置換されきれいにレンダリングされています。

ChatGPT チャットの中身

工夫ポイント

  • ChatGPTのエクスポートファイル(zip形式)とObsidian Vault内のフォルダを指定するだけで、全会話が1会話1ファイルで出力されます。
  • frontmatterに埋め込んである conversation_id を認識し、タイトルが変更された場合も自動でファイルをリネームして追随します。複数チャットでタイトルが重複した場合は連番を付けてユニークな名前を振ります。
  • Obsidian側でfrontmatterに属性を足した場合、それは維持されます。
  • 送信済みメッセージを編集したりモデルを変更して再送信した場合、新旧のメッセージがすべて含まれていますが、枝分かれ時は日時ベースで新しい枝のみ採用することで古いメッセージの出力を抑制しています。
  • 思考の連鎖はベタで並べられていますが、まとめて開閉できるようにマージしています。
  • 出典リンクは特殊文字で埋め込まれていますが、Web検索結果で置換して自然な注釈表記にしています。マウスをホバーすると、リンク先ページの注目部分がツールチップ内に引用表示されます。

今回は複雑な構造のJSONファイルを処理する必要があったので、特に考えなしにRubyで実装しました。あとから考えると、Obsidianのプラグインとして実装して、Obsidianのコマンドで変換できるようにした方が便利だったかもしれません。

とはいえ、パターンマッチStringIOを駆使して、複雑な処理をかなり簡潔に書けたと思います。

まとめ

ChatGPTの設定からエクスポート依頼→メール受信→リンクからダウンロード、の3ステップは必須ですが、私の手元では、ダウンロードディレクトリを監視し、ChatGPTのエクスポートファイルが落ちてきたら自動でインポートするワークフローを作って運用しています。

これでいつでもChatGPTの会話をObsidianに取り込めるようになりますので、みなさんのチャット資産の二次・三次利活用の一助になれば幸いです。

WED Engineering Blog

Discussion