← 個人開発に戻る

作品

MaidAI

ローカル LLM で動く会話 AI「梨乃」を、デスクトップに常駐させるクライアントです。会話するだけでなく、頼まれた操作も実行します。実行の前に必ず人の承認を通し、記録を残すところが、いちばんのこだわりです。

使用技術:

  • Python
  • Electron
  • ローカル LLM
デスクトップのエディタの上に常駐し、吹き出しで話しかける梨乃(開発中の画面)
3D モデル: ショコラ -Chocolat-(制作: こまど/komado、販売: あまとうさぎ)を VRM 化して使用しています。モデルの権利は制作者に帰属します。 商品ページ(BOOTH)(新しいタブで開きます)

梨乃にできること

会話
ローカル LLM で応答します。クラウドの API に会話を預けず、手元の環境で動かすことを前提にしています。キャラクター設定を持たせ、画面の隅から話しかけてきます。
音声
音声での入力と読み上げに対応しています。読み上げは、音声と口の動きを合わせて表示します。
生活通知
予定や日々の通知を、梨乃が声をかける形で知らせます。
操作
配信ソフト、スマートホーム機器、カメラ、パソコンの操作を、ツールとして呼び出せます。

仕組み

デスクトップのクライアントが画面と入力を受け持ち、会話、エージェント、ツールは別の部分に分けています。部分どうしはイベントバスでつなぎ、機能を足しても他の部分を書き換えずに済むようにしています。

  1. 表示

    • デスクトップクライアント梨乃の表示、吹き出し、入力(Electron)
  2. 会話

    • 会話サービスローカル LLM、キャラクター設定
    • イベントバス各部分をつなぐ
  3. 判断と承認

    • エージェント頼まれた操作を計画
    • 承認実行の前に人が確認
    • 監査承認と結果を記録
  4. ツール

    • 配信
    • スマートホーム
    • カメラ
    • パソコン
MaidAI の構成(上から下へ、依頼が流れます)

技術スタック

デスクトップ
Electron で作っています。梨乃は three.js と @pixiv/three-vrm で VRM モデルを描画し、VRMA のアニメーションを再生します。ビルドは esbuild と electron-builder です。
バックエンド
Python です。FastAPI(uvicorn)と WebSocket で、クライアントと各サービスをつなぎます。
エージェント
Microsoft Agent Framework と MCP(Model Context Protocol)で、ツールの呼び出しを組み立てます。
イベントとデータ
イベントは NATS で流し、Python と TypeScript の両方から扱います。イベントの形は JSON Schema で定義しています。データは PostgreSQL に保存し、SQLAlchemy と Alembic(マイグレーション)で管理します。
音声
音声認識に faster-whisper、読み上げ音声の時刻合わせ(口の動き)に stable-ts を使っています。
機器との連携
配信ソフト、スマートホーム機器、カレンダー、カメラ映像につなぎ、パソコンの操作(音量など)も扱います。
起動と検証
起動の管理は PySide6 のランチャーで行い、WSL の開発環境とつなぎます。検証は pytest と Node のテストです。

安全の考え方

操作は、梨乃が提案する段階と、実行する段階を分けています。実行の前に、何をするのかを平易な文で示して承認を求め、承認と結果を監査の記録に残します。

開発の進め方

開発は WSL の dev 環境で行い、普段使いの環境とは分けています。仕様と手順は YouTrack に集めています。

実装やレビューは AI エージェントに役割を分けて任せ、要件の判断と受け入れは自分で行います。ローカル LLM の制約(コンテキストの長さや GPU への収まり)も見ながら、任せる範囲を絞っています。