1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

カップルカウンセリングサービスを作っていたら、AIと一緒に考えるMarkdownノートにたどり着いた話

1
Posted at

AIに簡単に適切なコンテキストを渡したい。

AIには、そのコンテキストを読むだけでなく、整理したり書き換えたりしてほしい。

でも、自分が積み上げた知識をAIに自由に編集させるほど壊されるのが怖くなる

この矛盾をどうにかしたくて、kakuというローカルファーストのMarkdownノートアプリを作りました。

kaku

kakuは、最初からノートアプリとして企画したものではありません。原型は、カップルで利用するAIカウンセリングのWebサービスでした。

この記事では、カウンセリングサービスから始まり、ネットワーク、Git worktree、CRDTを試しながら、なぜ現在のkakuにたどり着いたのかを書きます。

(この文章は自分が話した内容をkakuを使って、Fable5/Solと壁打ちしながらドラフトを作り、Solに書かせたものです)

AIカウンセリングには、過去の文脈が必要だった

最初に作っていたのは、カップルで利用できるWebサービスでした。AIカウンセラーと会話すると、診断や追加の質問が提示され、その結果を次回以降のカウンセリングに利用します。

一度きりの相談であれば、現在のチャットだけをAIに渡せば済みます。しかし、継続的なカウンセリングではそうはいきません。

  • 過去のカウンセリング
  • ユーザーとパートナーの基本情報
  • 診断や質問への回答
  • 日々のジャーナル
  • それぞれの情報の関係

こうした情報のうち、いまの相談に関係するものを選び、AIに渡す必要がありました。

会話を自動的に記憶する仕組みだけでは、何が次の回答に影響しているのかが分かりません。古くなった情報や、今回の相談とは関係のない情報まで混ざれば、むしろ回答を悪くすることもあります。

そこで、情報をノートとして保存し、関連するノート同士をリンクでつなぐネットワーク構造を作りました。現在の相談に近いノートをたどれば、AIに渡すコンテキストを明確にできると考えたからです。

ネットワークを眺めるのは楽しい。でも、育てるのは大変だった

ネットワーク上でノートを動かし、情報同士のつながりを眺める体験は気持ちのよいものでした。一方で、ネットワークを維持する作業は想像以上に面倒でした

ネットワーク画面

ジャーナルを書いた後に、「この内容は3週間前のカウンセリングと関係がある」「この診断結果にもつながっている」と考え、リンクを追加しなければなりません。

本来したかったのは内省です。 しかし実際には、AIのためにコンテキストを整備する作業が、人間の仕事になっていました。

AIにリンクを自動で追加させる方法も試しました。ただ、「関連している」とは何かが曖昧です。同じ出来事を扱っている、同じ人物が登場する、考え方が似ている、あるいは正反対の視点を持っている。どれも関連ではありますが、いつもコンテキストとして役立つとは限りません。

精度の問題というより、ネットワークを正しく保つこと自体を目的にしてしまったのが問題でした。ネットワークを操作する行為は、本来の思考や内省の直感とは少しずれていたのです。

「診断してもらう」から「一緒に考える」へ

もう一つ、サービスの目的そのものも変わっていきました。

カップルで一緒にサービスを継続して使うことには、個人向けとは異なる難しさがあります。自分で使い続けるうちに、カウンセリングや診断よりも、考えを掘り下げたり、別の視点から捉え直したりする用途が中心になっていきました。

AIに自分を診断してもらうのではなく、AIと一緒に自分の考えを探索する。

そのための道具として、左にネットワーク、中央にノート、右にAIチャットを置いたWebアプリを次に作りました。ノートを読み書きしながら、関連する情報をコンテキストにしてAIと会話できる形です。

AIには、過去の内容の要約、関連情報の抽出、ノートの作成や編集などを任せるようになりました。ここで初めて、AIは回答を返すだけでなく、知識ベースを育てる側に回りました

そして、次の問題が出てきました。

AIに既存のノートを直接変更させるのが怖い。

AIに整理してほしい。でも、直接触らせるのは怖い

新しいノートを作るだけなら、不要なものを消せば済みます。しかし既存のノートの要約、統合、分割、追記、リンクの追加まで任せると、AIは人間が書いた文章を直接変更します。

うまくいけば便利です。一方で、大事なニュアンスを削ったり、事実と推測を混ぜたり、まだ残しておきたい記述を「重複」と判断して消したりする可能性もあります。

チャットで修正案を出してもらい、人間がコピー&ペーストする方法なら安全です。しかし、変更するノートが増えるほど、その方法ではAIエージェントの能力を生かせません。AIが複数のファイルを読み、全体を整理できるのに、最後の反映だけを人間が一つずつ行うことになります

欲しかったのは、AI機能を持つエディタというより、人間とAIが同じ知識ベースを直接読み書きできる作業空間でした。

MarkdownとGit worktreeで、AIの編集を隔離してみた

そこで、ノートをMarkdownファイルとして管理し、AIには別のGit worktreeで編集させる仕組みを作りました

AIは隔離された環境で自由にファイルを変更する。人間は差分を確認し、必要な変更だけを取り込む。ソフトウェア開発のブランチとレビューを、ノートの共同編集に持ち込む発想です。

この方法なら、AIに直接ファイルを触らせても元の内容は守れます。しかし、日常的に使うと別の問題が起きました。

人間と複数のAIがそれぞれのworktreeで同じノートを変更すると、当然コンフリクトします。AIを並列に動かすほど、人間が最後にマージとコンフリクト解消を引き受けることになります

差分の見せ方も簡単ではありませんでした。変更前を基準にした3-way diffを見せるのか、現在のノートとの2-way diffを見せるのか。複数のworktreeをどのように扱うのか。変更を提案として管理するのか。

どの方式も説明はできます。しかし、自分が欲しい体験からは遠ざかっていきました。

欲しかったのは、レビュー工程を精巧にすることではありません。

AIにどんどん編集させ、その間は放置しても大丈夫な状態でした。

**AIの仕事が速くなるほど、人間の後処理が増える仕組みでは意味がありません。**提案の作成、レビュー、マージという手順を毎回踏むのではなく、普段はそのまま仕事を任せ、必要なときだけ変更を選んだり元に戻したりしたい。

Gitは変更を厳密に管理する優れた道具ですが、人間とAIが一つのノートを日常的に触り続けるための操作モデルとしては重すぎました

そこから現在のkakuが生まれた

試行錯誤の末に残った要件は、次のようなものでした。

  1. ノートはローカルのMarkdownファイルとして持つ
  2. 人間とAIが同じファイルを直接読み書きできる
  3. AIの変更は、人間の変更と区別して確認できる
  4. AIの変更は、必要な部分だけ採用・破棄できる
  5. 人間とAIの編集が重なっても、知識ベースを壊しにくい
  6. ノートのつながりから、チャットに必要なコンテキストを集められる
  7. 会話を分岐し、複数の方向を並列に掘り下げられる

この要件から、現在のkakuの形ができました。

kakuでは、ワークスペース直下のMarkdownファイルを、人間とAIが共に触るノートにしています。Claude CodeやCodexのような外部AIエージェントは、kaku専用のAPIや編集UIに閉じ込められることなく、普段どおりファイルを読み書きできます。

一方で、採用済みの内容は別に保持します。人間の通常編集は自動的に反映しつつ、AIや外部エディタによる変更は差分として残し、後から採用または破棄できます。人間とAIの編集が重なった部分も区別し、単純な上書きで内容を失わないようにしています。

エディタ内部の同期にはCRDTを使っています。ただし、CRDTを使うこと自体が目的ではありません。重要なのは、コンフリクト解消を人間の日常業務にせず、AIに自由に仕事を任せられることです。

Markdownは保存形式ではなく、人間とAIの共通インターフェース

Markdownを選んだ理由は、可搬性だけではありません。

Markdownファイルなら、人間は好きなエディタで編集できます。AIエージェントも、ファイルを読む、検索する、複数ノートをまとめて変更する、リンクを追加するといった操作を、特別な統合なしに実行できます。

kaku内蔵のAIだけに編集を許す設計にすると、AIの能力はアプリが用意した機能の範囲に閉じます。MCPや専用APIで一つずつ操作を定義することもできますが、ファイルを直接扱えるエージェントにとっては、それ自体が制約になります。

ローカルのMarkdownを共通インターフェースにすれば、Claude Code、Codex、Cursorなど、使い慣れたエージェントをそのまま持ち込めます。 将来より良いエージェントが登場しても、知識ベースを移行する必要はありません。

アプリやAIを交換しても、自分の知識は手元に残る。 この点は、長く使う知識管理ツールでは特に重要だと考えています。

チャットも一本道ではなくしたかった

個人の内省へ用途が変わったとき、チャットの形にも違和感がありました。

考えを掘り下げるときは、一つの問いに一つの結論を出して終わるとは限りません。同じノートについて、「反対意見を聞く」「具体例を考える」「別の理論から見る」といった問いを同時に試したくなります。

そこでkakuでは、1つのノートを起点に会話し、途中からチャットを分岐できるようにしています。ノートのリンクや被リンクなどから関連するコンテキストを集めつつ、会話は複数の方向へ並列に伸ばせます。

最初のカウンセリングサービスでは、ネットワークは人間がAIのために管理するものでした。現在のkakuでは、リンクは人間にとって自然なノートのつながりであり、同時にAIがコンテキストを集める手がかりでもあります。

ネットワークを育てることを独立した仕事にせず、普段の読み書きの結果として構造が残る形を目指しています。

kakuが目指しているもの

kakuを一言で表すなら、AIと共同編集できるローカルファーストのKnowledge Management Systemです。

ただし、「AI機能が付いたノートアプリ」を作りたいわけではありません。

AIが回答を返す場所と、人間が知識を書く場所が分かれていると、コピペや整理や反映が人間の仕事として残ります。反対に、AIだけが知識ベースを更新すると、人間は内容を理解できなくなり、安心して任せられません。

だから、人間とAIが読み書きする場所を一つにする。

人間が書き、AIが整理・分析し、その結果を人間が選びながら知識を育てる。AIエージェントにはファイルを直接扱える能力をそのまま使わせながら、人間は自分の知識を手元に保ち、必要なら簡単に戻せる。

カップルカウンセリングから始まり、ネットワーク、Git worktree、CRDTを試した先で、最後まで残ったのはこの問題でした。

AIに仕事を任せながら、自分の知識を安全に保つ。

kakuは、そのための道具として開発しています。

良かったらダウンロードして使ってみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?