RAG を見て attention を思い出した — 同じ骨格が、硬さを変えて二段に積まれている

要約

RAG はベクトル DB に内積のクエリをかけて一致度の高い情報を拾う技術だと聞いて、attention の仕組みを 思い出した——という思いつきをぶつけた対話。

返ってきたのは「なんとなく似ている、というレベルではなく、両者の骨格が本当に同じところを突いている」 だった。共通の骨格には名前がある。**content-based addressing(内容によるアドレス指定)**。 普通のメモリが「番地」でアクセスするのに対し、「中身の近さ」でアクセスする、という同じパラダイム。 RAG のクエリ埋め込みが attention の Query、文書の埋め込みが Key、文書の本文が Value にあたる。

ただし決定的な違いがあった。**attention は soft retrieval**(softmax で全 Key に重みを配り、 Value の加重和をとる。連続的で微分可能だから、端から端まで勾配が流れて学習できる)。 **RAG は hard retrieval**(top-k を離散的に選ぶ。選ぶ/選ばないの二値で、その選択は微分不可能。 だから RAG のエンドツーエンド学習は難しい)。

そして一番きれいな見方は、**この二つは競合ではなく積み重なっている**というものだった。 RAG が「硬い事前フィルタ」で数百万文書から数個に絞り、そこで拾った文書をコンテキストに載せると、 今度は LLM 内部の attention が「柔らかい統合」でそのトークン群を加重参照する。 **hard retrieval → soft retrieval の二段構え**。粒度の違う同じ操作が、階層的にスタックされている。

最後に系譜の話が出てきて、この直感が歴史的にも正しい筋だと分かった。もともと Neural Turing Machine や Memory Networks が「attention =微分可能な外部メモリのアドレッシング」として定式化していて、 **attention は最初から retrieval として生まれていた**。RAG はそこで一度手放した明示的な外部メモリへの 回帰だった。つまり「RAG を見て attention を思い出す」のは、**開発史を逆再生している**ことになる。

要点

共通の骨格:content-based addressing(内容によるアドレス指定)

普通のメモリは番地でアクセスする。RAG も attention も中身の近さでアクセスする。 これが同じパラダイムだという一点で、両者は繋がっている。

RAG attention
Query クエリの埋め込み Q
Key ベクトルDB内の各文書の埋め込み K
Value 文書の本文(実際に持ってくる中身) V
操作 クエリと文書埋め込みの内積で top-k を拾う QKᵀ の内積でスコアを作る

決定的な違い:hard か soft か

attention RAG
参照の仕方 soft retrieval — softmax で全 Key に重みを配り、Value の加重和をとる hard retrieval — top-k を離散的に選び、選ばれた文書だけを渡す
連続性 連続的で微分可能 選ぶ/選ばないの二値で微分不可能
帰結 端から端まで勾配が流れ、Q/K/V の射影行列を学習で獲得できる エンドツーエンド学習が難しい。埋め込みエンコーダも固定で使うことが多い

一番きれいな見方:競合ではなく、二段に積まれている

  • RAG が硬い事前フィルタ — 数百万文書から数個に絞り込む
  • 拾った文書をコンテキストに載せると、LLM 内部の attention が柔らかい統合 — トークン群を加重参照する
  • つまり hard retrieval → soft retrieval の二段構え粒度の違う同じ操作が、階層的にスタックされている

系譜 — この直感は開発史を逆再生していた

  • Neural Turing Machine(Graves et al.)や Memory Networks(Weston et al.)は、 attention を「微分可能な外部メモリのアドレッシング」として明示的に定式化していた。 つまり attention は最初から retrieval として生まれた
  • RAG(2020, Lewis et al.)は、そこで一度手放した明示的な外部メモリへの回帰。 ただし retrieval を非微分な離散操作に戻した
  • だから「RAG を見て attention を思い出す」のは、歴史を逆に辿っていることになる

ついでに直された誤解

KV キャッシュは「類似度を測って保存する」ものではない。推論の最適化の話。 自己回帰生成で毎トークン過去の K と V を再計算するのは無駄なので、射影ベクトルそのものを保存して 使い回す。QKᵀ の類似度は毎ステップ計算し直している。 RAG の類推に乗せるなら「参照先を事前にインデックスしておく」に近い。

軌跡(対話そのまま)

思いつき — RAG を見て attention を思い出した

rag技術とattentionの関係について。ragはベクトルDBに対して内積のクエリをかけて一致度の高い情報をピックアップする技術だと聞きました。これを聞いて、attentionの仕組みを思い出したんですよね。attentionって、自身の文章との類似度を単語単位で測ってKVキャッシュとするじゃないですか。あんまりよく分かってないんですけど。この思いつきについてどう思いますか?

いい直感だと思います。しかも「なんとなく似てる」というレベルじゃなくて、両者の骨格が本当に同じところを突いています。ただ一箇所、KVキャッシュのところに小さな誤解があるので、そこを直しつつ整理させてください。

共通の骨格:content-based addressing

RAGもattentionも、根っこは「ベクトル空間での内積類似度によるメモリ参照」です。計算機科学の言葉でいうと content-based addressing(内容によるアドレス指定)。普通のメモリが「番地」でアクセスするのに対して、「中身の近さ」でアクセスする、という同じパラダイムです。あなたが「思い出した」のは、この抽象レベルで両者が一致しているからで、その気づき自体は完全に正しいです。

対応を綺麗に書くとこうなります:

  • RAGのクエリ埋め込み ↔ attentionの Query
  • ベクトルDB内の各文書の埋め込み ↔ Key
  • 文書の本文(実際に持ってくる中身) ↔ Value

RAGで「クエリと文書埋め込みの内積をとってtop-kを拾う」のは、attentionで「QとKの内積をとってスコアにする」のと同じ操作です。ここは自信を持ってつなげて大丈夫です。

直すべき点:KVキャッシュは「類似度」ではない

「類似度を測ってKVキャッシュとする」という部分だけ、概念がずれています。

KVキャッシュは 推論の最適化 の話であって、類似度の話ではありません。自己回帰生成では、トークンを1個ずつ吐くたびに過去の全トークンのKとVを再計算するのは無駄なので、過去トークンのKとVをそのまま保存して使い回す——これがKVキャッシュです。つまりキャッシュされているのは K と V という射影ベクトルそのものであって、QKᵀ の類似度は毎ステップ計算し直しています。

RAGの類推に乗せるなら、KVキャッシュは「ベクトルDBに文書の埋め込み(K)と本文(V)をあらかじめインデックスして保存してある」状態に近い。似ているのは「類似度計算」ではなく「参照先を事前に用意しておく」ところです。

決定的な違い:hard か soft か

ここが一番面白いところで、同じ骨格なのに動作が対照的です。

attention は soft retrieval です。softmaxで全Keyに重みを配って、Valueの加重和をとる。どのトークンも「少しずつ」寄与する、連続的で微分可能な参照。だから端から端まで勾配が流れて、Q/K/Vの射影行列を学習で獲得できます。

RAG は hard retrieval です。top-kを離散的に選んで、選ばれた文書だけをコンテキストに放り込む。選ぶ/選ばないの二値で、しかもその選択操作は基本的に微分不可能。だからRAGをエンドツーエンドで学習させるのが難しい、という有名な課題につながります。埋め込みエンコーダも多くの場合は別途学習済みのものを固定で使う。

個人的に一番きれいだと思う見方

RAGとattentionは競合じゃなくて 積み重なっている、と捉えると腑に落ちると思います。

RAGが「硬い事前フィルタ」で数百万文書から数個に絞り込み、そこで拾ってきた文書をコンテキストに載せると、今度はLLM内部のattentionが「柔らかい統合」でそのトークン群を加重参照する。つまり hard retrieval → soft retrieval の二段構え。あなたの bottleneck migration 的な、あるいは converging-stacks 的な見方でいうと、粒度の違う同じ操作が階層的にスタックされている構造です。

系譜の話

蛇足ですが、あなたの直感は歴史的にも正しい筋をなぞっています。もともと Memory Networks(Weston et al.)や Neural Turing Machine(Graves et al.)が「attention=微分可能な外部メモリのアドレッシング」として明示的に定式化していて、attentionは最初から「retrieval」として生まれた側面があります。RAG(2020, Lewis et al.)はある意味そこで一度手放した「明示的な外部メモリ」への回帰で、ただし retrieval を非微分な離散操作に戻した、という位置づけです。

なので「RAGを見てattentionを思い出す」のは、実は開発史を逆再生しているようなもので、直感としてかなり本質的です。

← 一覧へ