はじめに
私は現在、Personal AI Agentを開発している。
Telegramや音声で日々の会話を記録し、必要に応じてRedmineにタスクを起票したり、ブログを自動生成したりするシステムだ。
ここで一つ疑問が生まれた。
LLMに個人の記憶を持たせるために、過去の文章をすべて検索する必要があるのだろうか。
一般的なRAGでは、文章をEmbeddingしてベクトルDBに保存する。
しかし、個人の記憶は必ずしも文章そのものではない。
例えば、登山日記がある。
ある日の登山について何千文字も書いたとしても、それが「登山」に関する経験だということは、もっと短い情報で表現できる。
そこで考えたのが、概念IDによる記憶の管理である。
1. 記憶を概念IDとして扱う
例えば、以下のような概念を登録する。
| ID | 概念 |
|---|---|
| ID1 | 登山・登山日記 |
| ID2 | 食事 |
| ID3 | 満腹感 |
| ID4 | 気分転換 |
日記や会話が発生したとき、LLMはその内容を解釈し、関連する概念IDに紐付ける。
例えば、次のような会話がある。
「今日はたくさん歩いたので、お腹がすいた。おいしいものを食べて気分転換したい」
この文章には複数の概念が存在する。
登山や運動、食事、満腹感、気分転換。
これらを別々の長い文章として保持するのではなく、概念ID同士の関連性として扱う。
もちろん、日記本文は必要に応じて参照できるよう保存しておく。
ただし、検索するたびに全文をLLMへ投入する必要はない。
2. 概念IDをベクトル空間で扱う
IDは単なる識別子だ。
ID1とID2という番号の差に、意味的な距離は存在しない。
そこで、概念IDに対応するベクトル表現を用意する。
例えば、
ID1 = 登山
ID2 = 食事
ID3 = 満腹感
ID4 = 気分転換
それぞれの概念は、意味的な関連性を持つ。
食事と満腹感は関連が強い。
登山と気分転換にも関連がある。
一方で、関連性は固定ではない。
ある人にとって登山は気分転換かもしれないし、別の人にとってはトレーニングかもしれない。
この個人差も、日々の会話や経験から更新していけばよい。
重要なのは、自然言語のあらゆる表現を個別に記憶するのではなく、概念単位で情報を整理することである。
3. 注目する概念はLLMが決める
では、どの概念を検索するのか。
ここにTransformerのAttentionから着想を得た考え方を導入する。
例えば、ユーザーが次のように発言したとする。
「最近、気分転換できていない」
LLMは、この発言から「気分転換」という概念に注目する。
すると、ID4に関連するID1の登山や、ID2の食事などが検索候補になる。
そして、関連する過去の経験を参照しながら、自然な回答を生成する。
ユーザーの発言
↓
LLMによる意味理解
↓
注目する概念IDを推論
↓
概念ベクトル空間から関連IDを取得
↓
必要な記憶をLLMに渡す
↓
回答
これだけである。
複雑な意思決定ルールを事前に定義する必要はない。
現在の話題と、個人の概念空間の関連性を使って、LLMが判断すればよい。
4. 人物や思い出も同じ仕組みで扱う
概念IDは、趣味や食事だけではない。
人、場所、イベント、思い出、感情なども対象になる。
例えば、ある人と登山した記録があれば、その人物と登山の概念が関連付く。
後日、その人物の話題が出たとき、登山の記憶も検索候補に上がる。
逆に、登山について話しているとき、その人物との経験が関連情報として現れることもある。
この関連性の形成を繰り返せば、単なる日記の検索ではなく、個人特有の連想記憶に近づいていく。
5. ファインチューニングは必要か
この構想では、必ずしもファインチューニングは必要ない。
LLMが持つ言語理解能力を利用し、個人固有の記憶や関連性は外部のデータモデルに保持する。
新しい経験が追加されたら、概念IDや関連性を更新する。
これなら、経験を記録するたびにLLMのパラメータを再学習する必要がない。
LLMは共通の知能として利用し、記憶の部分を個人に適応させていく。
6. 本当に軽量になるのか
概念IDを使えば、自然言語の文章を毎回検索する方式よりも、検索対象を整理できる可能性がある。
ただし、概念IDにしただけでEmbeddingの次元数が小さくなるわけではない。
また、文章が持つ細かな意味まで概念IDに圧縮できるとは限らない。
したがって、元の記録は残しつつ、概念IDを検索用の索引として利用するのが現実的だろう。
今回の仮説は、概念単位で記憶を整理することによって、検索効率と個人への適応性を改善できるのではないか、というものだ。
7. まとめ
今回考えた仕組みは単純である。
- 日々の会話や経験を概念IDに変換する。
- 概念IDをベクトル空間で扱う。
- 概念同士の関連性を経験によって更新する。
- 現在の会話からLLMが注目領域を推論する。
- 関連する記憶を取得して、LLMの回答に利用する。
目指しているのは、巨大な会話履歴を検索するシステムではない。
個人の経験によって育つ、小さな概念空間を持ったPersonal AIである。
次回は、この概念IDをどのように検索し、TransformerのAttentionに着想を得た仕組みとして利用するかを考える。
次回:第2部「概念IDにAttentionを向ける ― 軽量Personal RAGの設計」
タグ:LLM / RAG / Python / Transformer / PersonalAI
