MENU

「今の話、保存しといて」。AIとの会話を残すアプリ『Odin』を作りました

「今の話、保存しといて」。AIとの会話を残すアプリ『Odin』を作りました

GPT Liveで話している途中に、「今の話、保存しといて」と言って、そのままメモを残したい。

調べたことだけでなく、話しながら決まったタスクや、買い物の予定も。会話が終わってから別のアプリを開き、もう一度書き直すのは面倒です。

そこで作ったのが、個人用の記録アプリ 『Odin(オーディン)』 です。接続したAIが会話を整理し、Odinを通じて自分のGoogle Driveへ保存。あとからPCやスマホで探したり、編集したり、やることを確認したりできます。

今回は、何ができるアプリなのかと、作ってみて大変だったところを書いてみます。

月夜の城と二羽の鴉。会話が紙の記録と星座へ変わっていくOdinのイメージ

記事用に生成したイメージ画像です。実際のアプリ画面は、このあと紹介します。

目次

会話の続きを、メモアプリへの転記で止めたくなかった

きっかけは、自分が普段使っているGPT Liveでした。

声で気軽に相談できるのに、そこからメモやタスクへ移すところは、もうひと手間かかる。ObsidianとのAI連携も、自分には分かりにくく感じていました。

記録のために新しいサブスクを増やすより、いつものAIと、すでに使っているGoogle Driveを組み合わせたい。画面も自分好みにしたい。Odinは、そのために作り始めました。

たとえば、こんな使い方です。

会話中に頼むこと あとでOdinから使う
「調べた内容をまとめて保存して」 要点と出典を探して読み返す
「今決めたことをタスクに入れて」 やることを確認し、終わったらチェックする
「牛乳と卵を買い物リストに入れて」 スマホで買うものを確認する

AIとDriveへの接続設定は必要です。また、音声でのツール利用はAI製品やアカウント、利用モードによって異なります。自分の出発点はGPT Liveでの利用ですが、どのAIでも同じように動くという意味ではありません。

記録は、自分のDriveにMarkdownで置く

Odinの役割は、整理された内容を保存して、あとから使えるようにすることです。分類や要約は接続先のAIが担当し、Odin自体には要約用のAI API呼び出しを内蔵していません。

保存形式には、文章として扱いやすいMarkdownを選びました。記録ごとにファイルを持ち、タイトル、種類、タグなどと一緒に保存します。変更履歴、ゴミ箱からの復元、ZIPでの書き出しも用意しています。

最初はPC内に保存する構成で試せて、Driveを接続したらそちらを保存先にする仕組みです。PCとDriveを自動で双方向同期するものではありません。

AIに話し、Odinから自分のGoogle Driveへ保存し、PCやスマホで活用する流れ

リポジトリの紹介用に制作した説明図です。図内の端末画面はイラストです。

画面から入力したときも、AIから保存したときも、同じ保存処理を通します。別々に作ってしまうと、「画面ではできるのにAIからはできない」「片方だけ履歴が残らない」といった違いが生まれやすいからです。

技術的にはNext.jsとReactで画面を作り、Google Drive APIでファイルを読み書きしています。AIとの接続にはMCPという仕組みを使っていますが、使うときに意識したいのは「話した内容を、あとで同じ場所から探せる」という部分です。

一番大変だったのは、サービス同士をつなぐこと

最初は「Astraなら、こういう個人用のナレッジ管理アプリも比較的簡単に作れるのでは」と思っていました。

ところが進めてみると、画面や保存機能を作るだけでは終わりません。ChatGPT側のプラグイン設定、本人確認を担当するAuth0、Odin本体、Google Drive、アプリの公開先。それぞれを正しくつなぐ必要がありました。

難しかったのは、「こちらにあちらのURLを登録して、あちらにはこちらの設定を入れる」という作業です。DriveのAPIを有効にし、接続に必要な認証情報を用意する。Auth0では誰からのアクセスを受け付けるか、ログイン後にどこへ戻すかを設定する。さらにChatGPT側と公開先にも、対応する設定をそろえる。

一つひとつに設定画面があり、似た名前の項目もある。自分用のメモアプリを作っていたつもりが、気づけばAIから認証を通り、Odinを経由してDriveへ保存する、小さなクラウドシステムを組んでいました。

AIのおかげでアプリ本体の実装が進んでも、外部サービスの認証や権限、公開先の設定まで簡単になるわけではない。この部分が、想像していた以上に大変でした。

「今の話、保存しといて」という短い一言を実現するために、裏側ではずいぶん多くのものをつなぐことになりました。

保存したあとに、表示が戻ってしまう

記録が保存できれば終わり、とはいきませんでした。

たとえばタスクを完了にした直後、少し前に始まった一覧の読み込みが遅れて返ってくる。その古い結果を画面に表示すると、チェックしたはずのタスクが未完了に戻ったように見えてしまいます。

保存そのものと、画面に届く順番は別の問題でした。

ここは、画面側で先行する読み込みを中断し、古い結果が返ってきても採用しないように修正しました。PCやスマホ幅のブラウザーで、わざと応答を遅らせた場合も確認しています。

同じ記録を画面とAIの両方から更新する場合にも、古い内容で上書きしない工夫が必要です。Odinでは記録の版を確認して更新し、食い違っていればいったん止めて読み直します。通信の再送で同じ記録が二重に作られないようにする仕組みも入れました。

こうした部分は見た目には出にくいのですが、日々使う道具としてはかなり大事でした。

Driveに置くと、読み込みの待ち時間とも向き合う

自分のDriveに記録を置けるのは便利ですが、ファイルを一つずつ読む通信には時間がかかります。

開発中には、8件ずつ読み込み、そのまとまりが全部終わってから次へ進む方法も試しました。ところが123件を読んだときに約32秒かかり、この方法は採用しませんでした。

そこで、最大16件まで同時に読み、空いたところから次のファイルを取りにいく方式へ変更。最終の計測では、実Driveの123件について、本文を含む一覧全体の読み込みが約8.3秒でした。ただし、通信条件をそろえた比較ではないので、「約4倍速くなった」とは言えません。8秒以上の待ち時間も、まだ改善したいところです。

さらに、別のタブから戻るたびに同じ読み込みを繰り返さないこと、すでに取得中なら重複させないこと、記録を表示するために接続診断まで待たせないことも調整しました。

本文のキャッシュや差分取得なども検討しましたが、今回は仕組みを大きく増やさず、まず無駄な待ちを減らすところまで。全件を読み込む構成は残っているので、記録が増えたときの速度は今後の課題です。

過去の会話は、要約をそのまま正解にしない

普段の会話から保存するだけでなく、過去のAIとの会話を取り込む入口も作りました。

ここで難しかったのは、会話の中にいろいろな種類の情報が混ざっていることです。AIが提案しただけの案、自分が採用した方針、実際に試して確認した結果。それらを全部まとめてしまうと、「提案されただけのこと」が「実施済みのこと」になりかねません。

そのため、取り込む期間や会話を選び、外部AIが作った保存候補を、根拠と一緒に確認してから反映する流れにしました。新しい記録にするか、既存の記録へ追記するか、今回は見送るかも選べます。

過去の会話に出てきた「明日やる」を、今のタスクとして勝手に登録しない。日時が分からないものを、都合よく補わない。既存の記録が変わっていたら、そのまま追記しない。

ただ短くまとめるだけでは足りず、あとから読み返したときに、何が本当に決まったことなのか分かる記録にする必要がありました。

会話の解析は合成データで検証していますが、各サービスの実際の書き出しファイルや接続環境は、個別の確認が必要です。全履歴を自動で同期する機能ではありません。

見た目は、厨二病全開です

名前は北欧神話のオーディンから取りました。「思考」の鴉Hugin(フギン)と、「記憶」の鴉Munin(ムニン)を従えているところが、このアプリに合っていると思ったからです。

毎日開くなら、開いて気分が上がる画面にしたい。ということで、月夜の城、二羽の鴉、光る星図と、かなり好みを入れています。

Odinのホーム。月夜の城と鴉を背景に、今日のタスクと最近の記録を表示

公開準備版で撮影した実画面。表示しているのは紹介用の架空データです。

ただ、画像を並べるだけで雰囲気がそろうわけではありませんでした。人物、鴉、背景の画風や光の当たり方がかみ合うよう、素材の生成と調整を繰り返しています。配布用の人物素材では、馬の足が岩の上にきちんと乗って見えるところまで直しました。

関連する記録をたどる「知識の星図」も、一度背景をきれいにしただけでは納得できず、星の配置そのものから作り直しています。

プロジェクトや共通のタグで記録をまとめ、実際のつながりを線で結ぶ。全体を見ているときは関係を絞り、星を選ぶとその記録のつながりを詳しく見せる。記録が増えても、一面の線になって読めなくならないように工夫しました。

プロジェクトごとに星座のようにまとまったOdinの知識の星図

紹介用のサンプル36件を表示した実画面。星を選び、関連する記録へ進めます。

途中では、線として描いたはずの曲線が黒く塗りつぶされる不具合もあり、スクリーンショットを見て修正しました。動くかどうかに加えて、実際にどう見えるかを確かめる作業も欠かせませんでした。

演出はオフにできます。雰囲気を楽しみたいときも、さっと用事を済ませたいときも使えるようにしています。

まずは、自分が毎日使える道具として

Odinは、自分で起動・設定して使う個人向けのアプリです。DriveやAIをつなぐ前でも、ローカルのサンプル記録で検索や編集、タスクの操作を試せます。

Driveや外部AIとの接続には準備が必要で、費用もAIの契約、保存容量、ホスティングなどの構成によります。共同編集や時刻指定の通知には対応していません。

今のところ、すべてを自動で片付けるアプリではありません。それでも、会話の途中で残したかったことを、そのまま記録や次の行動につなげる。作りたかったのは、そのための自分の道具でした。

壮大な城と鴉の画面で、牛乳と卵の買い忘れを防ぐ。そんな日常にも使えるOdinを、少しずつ育てていこうと思います。

ソースや導入手順は、GitHubのOdinリポジトリにまとめています。

目次