Reso に「未分類」がない理由

「その他」はノートの事実ではなく、システムが判断を放棄した印です。十の安定した扉、閉じたリストによる分類、ノイズの受け皿、そしてその下で自由に生まれるクラスタで置き換えた話。

Engineering

自動整理機能のあるノートツールは、いつか必ず「その他」「雑多」「未分類」という引き出しを生やす。私たちのも例外ではなかった。ある朝 Nebula を開くと、文字どおり「未分類」と名付けられたテーマに 36 件の記憶が置かれ、その隣には「その他」という受け皿まであった。ひとつの失敗に、ふたつの引き出し。

私たちはこれをデータの性質ではなくバグとして扱った。この記事は、そのバグの正体と、最終的に落ち着いた設計についての話だ。

「未分類」の中身は何だったのか

36 件を追跡すると、本当に分類不能なものは一件もなかった。原因は機械的な隙間がふたつ。低信頼の記録を受け止めるはずのフォールバックテーマが、誰にも届かないしきい値のせいで到達不能だったこと。そして大きなクラスタから分割された小さなクラスタが、途中で親のラベルを落とし、テーマなしで可視化に届いていたこと。

これが一般的なパターンだ。「未分類」は内容が曖昧だから生まれるのではない。パイプラインが判断をやめた場所であり、その「判断の不在」がカテゴリの顔をして表示されているだけだ。

安定のために選んだ十の扉

修正は、当たり前に聞こえて実はそうではない決定から始まった。分類の最上位を固定する。ひとりの人が何年もマイクに向かって話す内容を、漏れなく重なりなく受け止めるために手で書いた十の扉:

  • Building(つくる)
  • Work & People(仕事と人)
  • Business & Growth(事業と成長)
  • Money & Investing(お金と投資)
  • Learning & Ideas(学びと発想)
  • Creating & Expression(創作と表現)
  • People & Relationships(人間関係)
  • Body & Mind(心と体)
  • Life Admin(生活の実務)
  • Direction & Meaning(方向と意味)

創発的なトピックはデモでは魅力的でも、日常では疲れる。最上位が漂うことを許すと、「career」と「work」が今月は別々のノートで来月はひとつになり、その名前に依存するすべての画面が振り回される。上が安定しているからこそ、その下のすべてが動ける。

各扉の下には手書きの「スロット」が少数、合わせて四十ほどある。実際の割り当てはこの層で起きる。

選ばざるを得ない分類器

割り当ては小さなホスト型言語モデルが、閉じたリストに対してバッチで行う。モデルは扉、そのスロット、各スロットの一行説明、そして十数件のノートを受け取り、ノートごとにスロット id をひとつ、JSON で返す。それ以外は返せない。リストにない id は拒否され、その行だけ単独で再試行される。

モデルより重要な細部がふたつある。

  1. 「信頼度が低ければフォールバックへ」というしきい値は存在しない。すべての記録が、その時点で最善のスロットを得る。モデルが迷えば低信頼として印が付き、画面はそれを示せるが、記録には帰る場所がある。
  2. そもそも記憶ではないもののための受け皿が別にある。テスト発話、素っ気ない「はい」、音声エンジンが無音から幻聴した断片。これらは棚に置かれるのではなく隠される。隠すことは明確なルールを持つ明確な判断であり、「その他」という引き出しはそのどちらでもない。

ラベルは記録そのものに、それを生んだ分類テキストのハッシュと並べて保存される。スロットの説明を書き換えれば、古い版でラベル付けされた記録だけが再キューに入る。人が手で動かした記録に、機械は二度と触れない。

三層目は自然に生まれさせる

スロットの下では、構造が自分で育つことを許している。記録は埋め込みに変換され、各スロットの内部で埋め込みの幾何からクラスタが形成される。クラスタは大きくなったとき(およそ 150 件)にだけ分割され、しかも二つの半分が本当に異なるときにだけ分割される。分割を三回走らせ、候補が重複に見えれば拒否する。元のアンカーを保つ側が名前を保ち、もう一方は新しい名前を得る。

「音楽制作」と「音楽演奏」が、誰も事前定義せずに二つのクラスタとして現れ、それでも同じスロット・同じ扉の中に留まるのがこの層だ。間違いが安い場所では創発を、間違いが高くつく場所では安定を。

絵を生成しない理由

すべての扉とスロットにアートワークがあるが、画像モデルがその場で生成したものは一枚もない。扉ごと・スロットごとに一枚ずつ、同じ画風で描かれた、人が選んだライブラリだ。創発したクラスタは、自分が属するスロットの絵を継承する。

もう一方の道も試した。生成された表紙は一週間は見事で、その後は本棚が十人のイラストレーターの喧嘩の跡のようになる。何年も眺める記憶が、モデルの再学習のたびに顔を変えるべきではない。

まだ間違うところ

埋め込み空間は等方的ではない。ある実データでは、モデルが仕事関連のテキストをより密に表現するというだけの理由で、ひとつの扉が体積の大半を吸い込んだ。言語モデルに言葉を読ませて分類する方が、その空間で距離を測るよりはるかによい。扉の判断を最近傍セントロイドで行わないのはそのためだ。

そして分類器は判断であって測定ではない。副業の価格付けについてのメモを Business & Growth に入れるが、本人は Money だと思っている、ということは起きる。それでいい。人が動かし、機械は戻さないことを覚え、分類名は八言語に翻訳されているから、修正は本棚を整える感覚に近く、モデルと格闘する感覚にはならない。

システムがもうしないことはひとつ。肩をすくめることだ。決めるのが面倒だったものを入れる引き出しは、もう存在しない。

これは宣伝ではなく、作りながら実際にはまった落とし穴の記録です。

macOS 版 Reso をダウンロード

Reso 開発ログをもっと読む