白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

ベクトル検索に思う学びとの付き合い方

はじめに

キーワード検索に替わる、もしくは補うセマンティック検索としてベクトル検索が登場してしばらく経ちますが、最近の生成AIの盛り上がり、特にRAGパターンの流行によってその知名度は一気に上がったように思います。

あらゆる「モノ」「コト」が数値によって表すことができる(かもしれない)というのは、コンピュータにとって非常に大きな意味を持ちますが、コンピュータ以外の文脈で考えてみてもなかなかに興味深いものです。

ベクトル検索とは

この記事はベクトル検索についての技術的な解説を目的としているわけではないので、解説に関しては最小限に留めておきます。
誤解を恐れずにごくごく簡単に説明すると、

  • ベクトルは、例えば単語や文章を数値化したもの
  • ベクトル検索は、あるベクトルに近いベクトルを検索する技術

です。

ベクトルというと遠い昔の数学の記憶から「大きさと向きを持った量」のイメージが強いですが、コンピュータの世界ではそのような物理的な意味合いよりも、「データ(数値)の集合」としての意味合いが強いです。
ベクトル検索におけるベクトルも後者の意味で使われています。(3次元の座標を3次元のベクトルと呼んで、3次元の配列で表したら一緒だよねみたいな)


知識をベクトルで表現すると

ベクトル化の最大の特徴は、あらゆる「モノ」「コト」を数値化できるという点です。
ただ、その次元数はかなり高次元になることが一般的で、例えばOpenAIのembedding-ada-002は1,536次元です。
高次元を可視化するのはとても難しいので、ここでは物凄くシンプルに果物のベクトルを「酸味」「甘味」の2次元で表現してみます。

注意としては本来のベクトル化はもっと複雑な意味をベクトルとして表すので、単語単体ではなく文脈におけるベクトルを計算します。
例えば「スーパーに売っているリンゴ」と「ニュートンが落としたリンゴ」のベクトルは(もしかしたら近いかもしれませんが)別物になるはずです。

さて、まずは「レモン」と「バナナ」だけを知っている状態です。
この状態で酸味よりは甘味がちょっと強い果物ってなんだろうという疑問を持ったとすると、「どちらにもあまり近くはないけれど、どちらかというとバナナのほうが近いかな」という認識になります。


学びによる新たな知識の獲得

では、この状態で「リンゴ」について学んだとします。
もともとイメージしていたベクトルにかなり近いベクトルに「リンゴ」がインプットされました。
想像していた果物はどうやら「リンゴ」にかなり近そうです。

同様にもっとたくさんの果物について学んでいくと、様々なベクトルに近しい果物が見つかるようになります。
このように既知のベクトルを増やしていくことは「学び」の一つの代表的な形です。


学びによる既知の知識の更新

ある日、パイナップルにも甘いものとそうでもないものがあることを知りました。
新しい知識をインプットするだけでなく、既知の知識を更新することも「学び」の形です。

これによってパイナップルかもしれないと考えることができる範囲を広げることができました。
ベクトルをずらしたり、ひょっとしたら回転することもできるかもしれません。

概念とアナロジー

「モノ」だけではなく「コト」もベクトル化できると考えると、概念をベクトルで表現することも可能です。
例えば砂糖を入れて煮込むことを「ジャムを作る」という概念としてベクトル化すると、オレンジに加算すればオレンジジャムが作れます。

逆にリンゴジャムからリンゴを減算すると、「ジャムを作る」という「コト」のベクトルが作り出せます。(ここでは「大きさと向き」の概念のほうがわかりやすいかもしれません)

もちろん現実ではジャムにすることは固定量の甘味を足すだけではないですが、この概念を理解することでレモンをジャムにするとどんな味になるかを予測することができそうです。

ところで、一見異なるある概念と別の概念に類似性を見出すことをアナロジー(類推)といいます。
Wikipediaからもう少しちゃんとした定義を引用すると以下の通りです。

類推(るいすい)または類比(るいひ)、アナロジー(analogy)とは、特定の事物に基づく情報を、他の特定の事物へ、それらの間の何らかの類似に基づいて適用する認知過程である。

たとえば料理を完成させるための詳細な手順という意味で料理のレシピと設計図とか、食材の新鮮さを保って後で使えるように保存するという意味での冷蔵庫とタイムカプセルとか、料理の味に深みと複雑さを加える意味での調味料と絵の具とか。
もしかしたらこれらをベクトルとして表現してみたら、意外と似ているのかもしれないですね。(全部ChatGPTさんに考えてもらいましたが、ちょっとわかりづらいですね…)

アナロジーを使いこなせるようになると、新しいアイデアを生み出すことができるかもしれません。これももちろん「学び」の一つです。
例えば料理のレシピを開発手法に見立ててアジャイルカレーとか…あれなんか最近どっかで見た覚えが…。

ネガティブケイパビリティ

学びを進めていくと既知のベクトルが増えていきます。
これによって完全に経験したことのない出来事でも、既知のベクトルに近しいものとして対応することができるようになります。

一方で、本当は別物なのに既存のベクトルに近いからという理由で同じものとして扱ってしまう可能性があります。
特に名前を知らない概念に名前があることを知ったとき、ついつい似たような自分独自の得も言われぬ感情や感性に一般的な名前を当てはめてしそうになります。

子供の頃の休日の夕方に車の後部座席からぼんやりと眺めた空を「チルい黄昏時」と呼んでしまったら、なんだか急にチープな気がしてしまいます。(例えがまったくもって分かりやすくないですね…)

「シラケつつノリ、ノリつつシラケること」で有名な「構造と力」では次のような言葉があります。
なかなかにややこしい文章ではありますが、名を与えられることで必然的にズラされずにはいないというのは実に本質的です。

卵の片割れとしての幼児が喪われた半身を求めて叫びをあげるとき、ドラマが始まる。それ自体としては無意味な、いやむしろ過剰なサンスを孕んだ、無志向的な叫びである。しかし、この叫びはただちにシニフィアンの鎖にすくい取られ、名を与えられる、と言うのは他でもない、おとなたちはこの叫びに「ミルクが欲しい」「暖かくしてほしい」等々といった意味を聞き取るのである。幼児が本当に欲しているのが完全な卵に戻ることであってみれば、それは名を与えられることで必然的にズラされずにはいない。

再度同じ画像を使いますが、このイメージしている果物がリンゴに近いからリンゴとして扱うか、 リンゴに近いけれど別の果物が存在する可能性を考え続けるかというのはとても大きな違いです。

このような答えの出ない課題に対して安易に答えを出さず、わからないものをわからない状態にキープすること、「しないでおく」能力をネガティブケイパビリティと呼びます。

ネガティブケイパビリティを発揮することでより近いベクトルを発見することができるかもしれませんし、そのベクトルに該当する概念が存在しないことがわかったなら、それをビジネスチャンスなどに繋げることもできるかもしれません。
この近しいベクトルに吸い込まれず、本来のベクトルを見失わずにいることは、「学び」において重要なポイントに思えます。

おわりに

仕事や、それ以外の人生においても手持ちの武器でなんとかしなければならないことは多々あると思います。
そんなときに知識の引き出しが多いことは、様々な場面で自身を助けることになります。
一方で知識を更新していかなければ、思い込みや間違った認識で誤った判断をしてしまうこともあるはずです。

構造を理解し、アナロジーを使うことで新しいアイデアに繋げることができますし、未知の領域の理解を大幅にショートカットすることができるかもしれません。
ただし、安易に近しいものを同じものとして扱ってしまうことには注意が必要です。
ネガティブケイパビリティを発揮して答えの見つからない状態をキープしながら、答えを探し続けることが重要な場面も多そうです。

それを勉強と呼ぶかは置いておくとして、学び続けることを大切にしたいものです。
自身の学びをベクトルデータベースにインデックスすることと考えると、またちょっと違った視点が見えてくるかもしれません。

最近なんとなく考えていたことを書いてみました。
ベクトル検索って人間の知識に当てはめてみてもそんなに違和感がないなと。
全部ちゃんと表現できたかというと怪しいのですが、アウトプットすることでまとまっていなかった考えが少し整理できたような気がします。

それでは。