『ベクトル検索入門:古くて新しいベクトル検索の世界』についてDevelopersIO 2024 FUKUOKAで登壇しました #devio2024 #クラスメソッド福岡
最近「ベクトル検索」や「ベクトルデータベース」というキーワードをよく耳にするようになりました。
「ベクトル検索」は生成AIのRAG(Retrieval-Augmented Generation)のコンテキストで使われることが多いですが、セマンティック検索や推薦システムなど、ベクトル検索は身近なところで以前から幅広く使われています。
2024/6/28(金)のDevelopersIO 2024 FUKUOKA Day1では、ベクトル検索はRAGだけでなく、広い意味の類似検索で応用されてきたこと、また、リレーショナルデータベースはSQLがインターフェースとなるように、ベクトル検索は埋め込みモデルがインターフェースとなることなどでについて15分で発表しました。
登壇内容を簡単に共有します。
登壇資料
実は身近なベクトル検索
ベクトル検索というと、最近では生成AIを拡張するRAGと一緒に耳にする機会が多いです。実はこのベクトル検索は、何年も前から使われており、意味や文脈を理解して検索するセマンティック検索やECサイトや動画サイトのおすすめなど、幅広く使われています。
一見すると、RAGとあいまい検索と推薦システムは違うもののように見えますが、どれも似ているものを検索するという点で同じです。
RAGにおけるベクトル検索の役割
大規模言語モデル(LLM)のような事前トレーニングされたモデルは、トレーニング済みの情報をもとに、テキストを生成することはできますが、知らないことについてはうまく回答できません。
モデル外のナレッジを活用してこの課題を解決する仕組みがRAGです。
RAGでは、埋め込みとテキストという2種類のモデルが使われています。
テキストモデル
1つ目に紹介するモデルはRAGが後工程で回答する際に現れるテキストモデルです。
質問文とその参考資料をコンテキストで渡して回答を作成します。
ChatGPTで要約を作成するのと同じような用途なので、イメージが湧きやすいかと思います。
埋め込みモデル
2つ目に紹介するモデルはRAGが前工程で利用する埋め込みモデルです。
埋め込みモデルは、入力データを数字の配列(ベクトル)に変換します。
参考資料に対して埋め込みモデルを介して登録し、質問文に対してモデルを介して関連しそうな文書を検索します。
推薦システムも仕組みは同じ
ベクトル検索のユースケースで登場した推薦システムも、仕組みはRAGの前工程(埋め込みモデル処理)と全く同じです。
あらかじめ動画をモデルを通して登録しておき、閲覧中の動画を入力に似たような動画を検索すると、おすすめ動画を得られます。
埋め込みについて
ベクトル検索でよく耳にする埋め込みは数字の配列(ベクトル)と思えば大丈夫です。
データの埋め込みを生成するのが埋め込みモデルです。 代表的な埋め込みモデルとして、テキストデータから埋め込みを生成するテキストモデルやテキストや画像など異なるモードのデータから埋め込みを生成するマルチモーダルモデルがあります。
埋め込みモデルは、そのままでは扱いにくいドキュメントや画像といった非構造化データをベクトルという扱いやすい構造化データへ橋渡しする特徴量抽出器として機能しています。
ベクトル検索について
ベクトル検索では、ベクトルをキーにベクトルの集合に対して検索します。そのためには、ベクトル同士のなんらかの比較方法が必要です。
ベクトル空間に距離を入れ、ベクトル空間内の2点間の距離が近いと似ているとみなして順序をつけます(コサイン類似度等)。このようにすることで、ベクトルの検索が可能になります。
うどんとラーメンと明太子を二次元のベクトル空間に埋め込むと、麺類は近くにあり、明太子は離れた場所にあります。
食べ物が登録されたデータベースに「うどんぽい食べ物は?」と検索したら、うどんと同じ麺類が近く(近傍)にいるはずで、「ラーメン」などがマッチするのがベクトル検索です。
実際のベクトルの次元数は1000を超えることもあり、 大量のレコードがあると、定義通りに類似度を求めたら計算量が爆発してしまいます(最近傍探索問題)。正確さを犠牲にして効率よく高速に近似(approximate)するアルゴリズムが近似最近傍探索(ANN; Approximate Nearest Neighbor)です。
効率的なデータアクセスにはインデックスが必要です。RDBではB-Treeインデックスがデファクトですが、ベクトルデータベースの場合、近似探索のANNに最適化されたB-treeとは異なるインデックスが利用され、グラフベースのHNSW(Hierarchical Navigable Small World)などが知られています。
ベクトルデータベースについて
よく耳にするベクトルデータベースとしてPinecone、Elasticsearch、PostgreSQLなどがあります。
どれもベクトルデータを扱えるという点では共通していますが、データベースの特性は大きく異なります。
データアクセスのインターフェースを考えても、Pineconeはベクトル、ElasticsearchはJSON、PostgreSQLはSQLとバラバラです。
新規にベクトル検索に特化したプロダクトを作りたいのならPineconeは有力です。Elasticsearchベースの全文検索システムがあるのなら、そこにベクトル検索も追加してハイブリッドを実現するのが素直です。蓄積されたデータを活かしてベクトル検索も試したいのなら、PostgreSQLにpgvectorエクステンションを有効にしてベクトル検索を組み込むとよいでしょう。
どういうデータをどのように活用したいのか、主な用途をもとにデータベースを選びましょう。
参考になった書籍/ブログ
今回は普段の業務と全く関係のない「ベクトル検索」を登壇テーマに選び、登壇ドリブンでベクトル検索について学びました。
参考になった書籍を紹介します。
『推薦システム実践入門 ―仕事で使える導入ガイド』 風間 正弘 (著), 飯塚 洸二郎 (著), 松村 優也 (著)
https://www.amazon.co.jp/dp/4873119669/
ベクトル、埋め込みモデル、最近傍探索などを利用した実践的な推薦システムが解説されています。
具体的には、以下の章・節を参考にしました。
- 5.9 : 自然言語処理手法の推薦システム応用
- 5.10 : 深層学習
- 6 : 実システムへの組み込み
RAGがブレイクする前の2022年に日本語でこのような技術書が出版されたということからも、ベクトル検索は枯れた応用技術であることが伺えます。
『IT Text 自然言語処理の基礎』 岡﨑 直観 (著), 荒瀬 由紀 (著), 鈴木 潤 (著), 鶴岡 慶雅 (著), 宮尾 祐介 (著)
https://www.amazon.co.jp/dp/4274229009/
2022年出版の本書では、深層学習も踏まえた自然言語処理技術が大学の教科書のような記述スタイルで網羅的に解説されています。
3章の「単語ベクトル表現」が今回の発表と直接的に関係します。
『自然言語処理の教科書』小町 守 (著)
https://www.amazon.co.jp/dp/4297138638/
ChatGPTや生成AIの急速な普及により、自然言語処理が非常に多くの人にとって身近なものになりました。
いざ自然言語のプロジェクトをやろうとするも、エンジニアが楽しいところだけをやればよいわけではなく、そもそも当てにしているはずの言語資源の所在や責任者がわからなかったり、PoCでも運用フェーズでもどのくらいうまく機能しているかといった品質評価が求められます。 あいまい検索を導入するからと言って、あいまい検索の評価をあいまいにして良いわけでは有りません。
2024年5月に出版されたばかりの本書では、自然言語処理の技術面だけでなく、言語資源の作り方など、NLPのプロジェクトのどこかで必要になるけれども、専門書ではあまり重きがおかれていないようなトピックまで具体的、かつ、平易に述べられています。やさしい文体や実践的なコラムは、著者が長年にわたってたくさんの学生を育ててきた証左でしょう。
生成AIや自然言語処理に携わる幅広いロールにおすすめ出来る一冊です。
ベクトル検索の導入(検討)ブログ
- 2022/04 BERTとベクトル検索を用いたYahoo!ショッピングの製品名寄せ作業の効率化検証 - Yahoo! JAPAN Tech Blog
- 2024/06 ElasticsearchによるZOZOTOWNへのベクトル検索の導入検討とその課題 - ZOZO TECH BLOG
- 2022/06 「メルカリShops」を支える Google のベクトル検索技術 | Google Cloud 公式ブログ
- 2023/09 マルチモーダル検索とは何か: 「視覚を持った LLM」でビジネスが変わる | Google Cloud 公式ブログ
- 2023/12 「ベクトル検索 vs 全文検索」〜Amazon Bedrockの埋め込みモデルを用いたプロトタイピング〜 - コネヒト開発者ブログ
最後に
RAGで注目を浴びる機会の増えた古くて新しいベクトル検索について、できるだけ古くならないような視点から発表しました。
移り変わりのはやいAI界隈ですが、廃れない技術が根幹を支えています。
ギリギリになってスライド作成を着手し、拙い状態でダメ出しレビューをしてくれた同僚の皆様(亀井さん、青柳さん、emiさん、とーちさん)、ありがとうございました。
それでは。