前提事項 (Difyの短期メモリと長期メモリ)
まずDifyにはデフォルトで短期メモリの機能があり、ユーザinputに対して指定した回数分のuser inputを保存して、それを踏まえてLLM(gptモデル)が回答する仕組みになっている。下の画像のように、メモリ 10と設定したら、直近の10の入力を覚えて、それを踏まえて回答してくれる。

これは短期メモリと呼ばれるもので、長期的に保存するには適していない。そこで長期でメモリとして利用するのが長期メモリのmem0プラグインである。
mem0プラグインの Add Memoryで保存、Retrieve Memoryで長期メモリを呼び出すことができる。mem0がどのように保存しているかは、mem0のprompts.pyを参照すると、中の仕組みがよく理解できる。
Difyの中で、長期メモリをキャッシュとして保存するか?
Difyのフローの中で、例えば以下のようにRedisを使用すれば、長期メモリの値をキャッシュして、保存することができる。例えば、Retrieve Memoryで取得したmemoryをREDIS SETとしてキャッシュ化し、REDIS GETで呼び出せる。

短期メモリは「メモリ 10」と設定したら、直近の10の入力を覚えて、それを踏まえて回答してくれるので、それに合わせてキャッシュを更新するフローにすれば、長期メモリをキャッシュするフローを作ることができる。
difyでmem0の長期メモリをキャッシュすべきか?
これを考えるには、トランスフォーマの仕組みを考える必要がある。
1. トランスフォーマーとは?
トランスフォーマーは2017年に登場した自然言語処理のニューラルネットワーク構造
RNNやCNNと違って系列データの処理を並列化できるのが最大の特徴
- 入力: 文章(単語やトークンに分けたもの)
- 出力: 文章の予測や分類など
- 主な構成:
- エンコーダ: 入力を内部表現に変換
- デコーダ: 内部表現から出力を生成
LLM(ChatGPTなど)は、基本的にデコーダ中心のトランスフォーマを使っている
2.Attentionの考え方
Attentionは「文章の中でどの単語に注目すべきかを学習する仕組み」
文章: 「猫がネズミを追いかける」
「追いかける」を予測するとき、
「猫」が主語だから重要
「ネズミ」も目的語として重要
他の単語(「が」や「を」)はそれほど重要ではない
これを 数値化して重み付け するのが Attention の仕組み
3.Self-Attentionの仕組み
トランスフォーマーでは 各単語が文章の他の単語を参照して特徴を作る
これを Self-Attention と呼ぶ
Query (Q):注目するための質問
Key (K):候補の特徴
Value (V):候補の情報
Query と Key の内積 → 「どれくらい注目すべきか」を示すスコア
Softmax で正規化 → 重みを 0〜1 に
Value に重みをかけて足し合わせ → 注目した情報の合成
4. Multi-Head Attention
Attention は 1種類の見方だけでなく、複数の異なる視点で注目することができます。
これを Multi-Head Attention と呼ぶ
例:
1つ目のヘッド:主語と動詞の関係に注目
2つ目のヘッド:目的語と動詞の関係に注目
これにより、文脈を多面的に理解できる
これらを踏まえると、Mem0 は 長期メモリを「Key-Value ストア」として扱い」、Query に対して Attention してRelevance Scoreなどを出していると考えられる。つまり、mem0のRetrieve Memory各Queryに対してAttentionをするので、QueryごとにRetrieve Memoryしたほうが、LLMの精度が向上するのではないかと思われる。
結論
mem0の長期メモリは、Redisでキャッシュしない方がLLMの精度が向上するのではないか? というのが私の意見。まぁ、キャッシュした方がレスポンスタイムが大きく変わるのであれば、キャッシュというのも一つの手かもしれないが...
