「今日、何してた?」を可視化して、目標に近づくためのRust製アプリ「Internalium」を開発しています。
ちなみに「Internalium」という名前は、「自身の内面(Internal)を、プラネタリウムやアクアリウムのように静かに観察する」というイメージから生まれた造語です(※名称は今後変更する可能性もあります)。
🎯 なぜ作ったのか?
きっかけは、自分の相談役としてAIエージェントを試作したのですが、コンテキスト不足で会話がつまらなく思えたことでした。どんなに優秀なAIでも、その場のコンテキストを知らなければグッと来る応答は得られません。逆に言えば、コンテキストを適切に与えることができれば、より的確なフィードバックをもらうことが期待できます。
言語化の省略と記録の自動化
しかし、人間が十分なコンテキストを言語化して与えるのは非常に面倒です。過去の会話履歴を検索し、RAGでコンテキストを補強することも可能ですが、手間はかかります。そもそも、自分の思考と行動を適切に言語化するのは難しく面倒なものです。
「言語化が難しいなら、システムには自分が何をしているのかを勝手に観察して欲しい」
このように考えて開発を始めました。Macの活動履歴を参考にデータを自動記録させれば良いというシンプルな考えです。
データからのメタ認知
実際にプロトタイプを作成し、Macの活動履歴を参考にデータを検証していると、自分が思っていた通り、定期的に動画に集中力を持っていかれている事実を確認することができました。一方では、ダラダラと過ごしている様に見えても、思いのほか集中して作業を継続している時もありました。
これらの経験を経て、自身の活動をデータ化し、メタ認知を深めることは、自分では分かっているつもりの時間の使い方や興味の対象をより客観的に見つめ直すことができ、目標達成に向けた課題や改善点を見つけるヒントを与えてくれるのではないかと考えました。
🧠 これができるとどうなるの?
Internalium が提供する価値は大きく2つです。
その1「自分の時間の使い方がわかる」
まずは、単純に1日の作業を振り返ることができます。この時間の使い方は生のログを元に個別に確認することもできますが、Internaliumの認知はもっと目的志向です。すなわち、ユーザーが掲げた目標との整合性を数値化して提示します。
何らかの目標に沿った行動であれば 100%。どの目標にもそぐわない行動であれば 0% といった具合です。これにより、自分は目標達成にどれくらい貢献できているかを視覚的に把握できます。
その2「ズレをAIが指摘してくれる」
実際に提示されたデータだけでもある程度客観視できますが、より深い解釈はAIが与えてくれます。例えば、1日を通して動画を見る頻度は多いものの、意外にも集中力は乱されていなかったり、逆に、目標達成に時間を使っていても、特定の目標に偏っていて一部の目標はなおざりだったりといった形です。
活動ログと聞くと、監視されていると感じてプレッシャーに感じてしまう部分があります。しかし、自身で使っていて感じるのは別の結果でした。例えば、思いの外頑張れている部分をデータとして確認することで、無駄な焦燥感は取れました。
また、一度集中力が途切れた場合にどの程度ダラダラ過ごしているのかも認識でき、無駄に動画でも見るくらいなら散歩でもしてこよう…といった別の時間の使い方も数値ベースで考えられるようになりました。
そして何よりも、活動データが外部に漏れないという安心感があるからこそ、個人のジャーナルやモーニングノートのように素直で気兼ねのない振り返りが可能になりました。
とはいえ、ここで大きな課題となるのが「データの秘匿性とAIの助言精度の両立」です。完全にデータを閉ざせばLLMは的確な助言ができず、かといってすべてをクラウドのLLMに渡してしまっては、ユーザーのプライバシーと安心感が損なわれてしまいます。
🔐 プライバシーはローカルに閉じる
この点が Internalium の大きな特徴で、プライベートな生の活動情報はローカルに閉じます。つまりクラウドのLLMには渡しません。では、LLMはどの様に活動情報を把握するのかという点ですが、ここでは2種類の技術で抽象化しています。1つはルールベースのタグによる抽象化されたヒント、そしてもう1つがベクトル検索による活動全体的な意味付けです。
これらの仕組みにより、プライバシーを保ちつつ、LLMに意味のある情報を渡すことができています。LLMはこれらの情報を元に「確証は無いが概ねこんな活動をしている」という推察を元に、より踏み込んだ提案を返してくれます。ユーザーから見ると、自分の事を概ね理解してくれるものの、何でも知っている訳ではないという、ほどよい距離感のAIアシスタントが存在するわけです。
ただ繰り返しになりますが、プライバシーの担保と機能性の追求は常にトレードオフの関係にあります。このバランスは現在も調整中ですが、『不要なデータは極力連携しない』『データのガバナンスは可能な限りユーザー自身が管理できるようにする』という方針を、現時点の開発目標としています。自分がユーザーなら、不用意に情報を抜かれるのは気持ち悪いですからね。
技術要素
Internalium は Rust言語 をベースとし、情報の分析や意味付けには複数の技術を利用しています。
Rust を採用したのは、Internalium がローカルに常駐するエージェントであるからです。そのため PCへの負荷を減らし極力安定した稼働を目指す必要があります。個人的に、ここ数年は Go言語を愛用しており、Go言語でも十分低負荷で安定している気はします。しかし、新たな言語に挑戦する良い機会でもあり、またコーディング自体は 主にAIに任せるため習熟度不足はある程度補えるという算段がありました。
情報の分析や意味付けには複数の技術と書きましたが、具体的にはルールエンジン、ベクトル検索、そしてLLMを併用しています。元々のデザインとしてはベクトル検索一択でしたが、紆余曲折の末このデザインに至りました。このデザインの面白いところは、価値を追求した結果、古典的なルールエンジンを活用する必要が生じたという点です。
もちろん、単なるルールエンジンでは意味付けまですることは困難なので、そこでは補完的にベクトル検索や LLMの能力を併用します。しかし、初期のトリアージを大胆にルールエンジンに任せることで、このエージェントに不可欠な3つの価値がでてきたのです。
<<3つの価値>>
- 低い負荷と高速な処理
- 再現性のある大分類
- データの抽象化とプライバシー保護
このあたりは次回以降の記事として説明していきたいと思います。
まとめ
今回は Internalium の発想と基本機能に関して記載してみました。次回はこれらを実現する技術スタックを含めたお話をしたいと考えています。
なぜ高難易度で、個人的な知見も薄いRustを選んだのか、なぜクラウド型のトラッカーを避けたのか、というテーマを盛り込む予定です。
現在、クローズドβ版の公開に向けて開発を進めています。興味を持っていただけた方は、ウェイティングリストに登録していただけると嬉しいです。
👉 Internalium.io(ウェイティングリスト登録)
本記事は「技術要素」部分を除き、Zenn からの転載となります。

