見出し画像

LLM を活用したチャット UI 風メモアプリの開発

#ただのアプリのコンセプトを記録するための記事です。配布は今のところ計画していません。作りたいものの規模的に自分の力だけではプロダクト化は厳しそうなので、興味を持ってもらえる会社を探しています。

LLM を搭載したメモアプリ(仮称: Ninetn、ナインティーン)を作っています。

今までいろいろなメモアプリを試してきましたが、イマイチ自分に合うアプリに出会えず、いっそのこと自分で作るかと思い開発を始めました。
ひとまず最低限の機能が動作するところまでは出来上がって、自分自身がユーザになって試用しているところです(この記事の執筆にも活用しました)。

ちなみに、今までで個人的に一番しっくりきたメモアプリは Slack なので(メモアプリでないというツッコミは置いておいて)、この自作メモアプリも Slack の影響を強く受けています。

自作メモアプリ Ninetn の画面

LLM 搭載メモアプリ Ninetn のできること

1. メモを残せる

(メモアプリなので当たり前の事ではあります)

Ninetn は Slack に影響を受けているので、チャット風のユーザーインターフェースを採用しています。特定のトピックごとに「チャンネル」を作成し、その中に複数の「メモ」を残していく構成になっています。
従来のメモアプリと比較して、より気軽かつ細かい単位でメモを残していけるように設計しています。

個人的に、メモを書く時に「ちゃんとしたことを書かないといけない」と身構えてしまうのが嫌で、そういった心理的な障壁をできる限り取り除いて、調べたことやアイデアなどをカジュアルかつスムーズに記録できるようにすることを Ninetn では目指しています。

2. ReMemo(リメモ)できる

先の説明の通り、Ninetn ではメモをどんどんカジュアルに蓄積させる設計にしていますが、一方でそれはメモが乱雑になってしまう危険を含んでいます。この問題を防ぐために、"ReMemo" 機能というものを導入しています。
ReMemo は、過去のメモをコピーして内容を書き直す機能で、メモの整理や精緻化を積極的に行えるようにするものです。

このようにラフに書いたメモを…
コピーしてアップデートすることができます。
ReMemo すると元のメモは非表示になります。
どのメモを参照したかも辿れるので、メモの変遷を確認することもできます。

また ReMemo は、後述する GPT を使うことで、その作業を支援をしてもらうこともできます(できるようになる予定です)。

ReMemo とは別に、一般的な「メモ編集」機能も実装済みですが、それぞれ異なる位置づけをしています:
メモ編集: 既存のメモに対して軽微な変更や誤字脱字を修正する。対象となるメモ自体が書き換わるだけなので、一連のタイムラインに影響はない。
ReMemo: 既存のメモの内容を更新する。新しい情報を追加したり、既存の情報を修正する。新たなメモがタイムラインの最新に追加され、元のメモは非表示になる。

3. GPT を呼び出せる

Ninetn では、必要に応じて GPT を呼び出してメモを代わりに書いてもらうことができます。目的に応じたテキストを生成する GPT のことを「エージェント」と呼んでいます。

ユーザーは特定のコマンドを入力することで、エージェントに命令を出し、OpenAI API からの応答をメモとして保存することができます。
コマンドは次のようなものです。

/<コマンド名> <入力テキスト1> <入力テキスト2> ...

例:
/ask "大規模言語とは何かを教えてください"
/ask @5 "以上のメモを要約してください"
/summarize_web https://example.com/article/1
/docqa #c6a7c336-70ec-45b1-97ac-0b2921986d79

<コマンド名> 以降の文字列が半角スペース区切りで分割されて、エージェントの実行側に渡ります。
エージェントごとにあらかじめ設定してあるプロンプトテンプレートに対し、コマンドから受け取った文字列を埋め込み、GPT にメッセージを送信します。そのメッセージに対する GPT からの応答がメモとして保存されます。

またコマンドでは、過去のメモを自由に参照できるようにいくつか特殊な記法を導入していて、@5 のように @<整数> と書くと最新の <整数> 個分のメモを渡すことができたり、#c6a7c336-70ec-45b1-97ac-0b2921986d79 のように #<メモ ID> と書いて特定のメモをピンポイントで渡すことができます。

エージェントをうまく活用して、効率よく有益なメモを残していくことがこのアプリの肝です。

エージェントの動作イメージ

エージェントの使用例

まだいろいろと試行錯誤している段階ですが、現時点で完成しているエージェントの使用例を紹介します。

例1: Web ページを要約してもらう
指定した URL から文書を取得し、その要約をエージェントが行います。

大規模言語モデル Swallow のページを要約した例です。

例2: ドキュメントに対する質問に答えてもらう
指定した文書に書かれてある内容に関する質問にエージェントが答えます。

例1で示した Swallow のページをさらに参照して、質問に答えてもらっています。

ReMemo 機能と組み合わせると、エージェントが生成したメモをさらに自分の目的に沿ったメモの形式に書き直すこともできます。

エージェントの出力を修正するために ReMemo しているところです。

例3: 任意のリクエストに従ってメモを書いてもらう
ChatGPT と同様に、テキストのやり取りでできることはほとんど何でも対応可能です。ChatGPT と異なるのは、GPT からの回答をトピックに応じてより適切な場所に保存できる点や、履歴(参照する過去のメモ)の範囲を細かく指定できる点にあります。

「深層学習モデルの開発の観点から Python と JavaScript を比較してください」というリクエストをエージェントに渡しています。

おわりに

(現状 Slack と大きく差別化できていない気もしますが)ここに書いた内容はまだやりたいことの 10% くらいなので、また進展があれば書いていこうと思っています。

研究・開発の資金として活用させていただきます。 Chord Worker https://chordworker.diatonic.codes Shikaki http://shikaki.diatonic.codes