あらすじ
※この商品はタブレットなど大きいディスプレイを備えた端末で読むことに適しています。また、文字だけを拡大することや、文字列のハイライト、検索、辞書の参照、引用などの機能が使用できません。
◆ベクト検索の基礎から実装までをこの1冊で学ぶ◆
本書はベクトル検索による検索エンジンの高速化を解説します。対象読者は検索サービスまたは検索機能を扱うエンジニア、手法の実装と評価が必要な研究者、およびそれらを志望する学生で、実用的なベクトル検索が実装できるようになることを目指します。
前半でデータの準備から検索結果の評価までを一通り解説し、後半では各ステップの高度化・高速化について解説します。また、付録として画像のベクトル化と検索についても解説します。
■目次
第1章 データの準備
・1.1 ベクトル検索の流れ
・1.2 最重要のステップ:ランキング
・1.3 ランキングの機械学習
・1.4 ランク学習データセットの現状
・1.5 Shopping Queries Datasetの紹介
・1.6 前処理
第2章 基本的なベクトル化
・2.1 ベクトル化モデルの選択
・2.2 ベクトル化モデルの例
・2.3 Sentence TransformersのMiniLM-L6の実行
第3章 専用エンジンの紹介
・3.1 ベクトルの最近傍探索
・3.2 ANN検索の基本
・3.3 ベクトル検索エンジンの選択
・3.4 専用エンジンの例:Faiss
・3.5 キーワード検索エンジンの例:OpenSearch
第4章 検索結果の評価
・4.1 ランキングの評価
・4.2 nDCG
・4.3 nDCGの計算
・4.4 ラベルがついていないドキュメントを含む場合
・4.5 レイテンシその他の評価尺度
第5章 高度なベクトル化
・5.1 ベクトル検索とLLMとの関係
・5.2 BERT
・5.3 BERTの実装の例:LINEのDistilBERT
・5.4 事前学習済みモデルのベクトル検索への応用
・5.5 ファインチューニング
・5.6 その他の有名な手法:SimCSE
第6章 高速なベクトル化
・6.1 BERTをGPUで動かす
・6.2 LLMの量子化
・6.3 半精度での推論
・6.4 さらなる低精度での推論
第7章 ベクトルの圧縮と高速な計算
・7.1 LLMの量子化とベクトルの圧縮の関係
・7.2 ベクトルの圧縮と高速な計算の関係
・7.3 スカラ量子化
・7.4 スカラ量子化を考慮したファインチューニング
第8章 次元削減やハッシュによる高速化
・8.1 次元削減
・8.2 次元削減の例:ランダム回転
・8.3 LSH
・8.4 FaissにおけるLSHの実装
・8.5 OpenSearchによるLSHの実装例
・8.6 Learning to Hash
第9章 クラスタによる高速化 251
・9.1 IVF
・9.2 クラスタリング
・9.3 FaissにおけるIVFの実装
・9.4 OpenSearchによるIVFの実装例
・9.5 直積量子化
第10章 グラフによる高速化
・10.1 グラフとANN検索との関係
・10.2 FaissにおけるHNSWの実装
・10.3 OpenSearchにおけるHNSWの実装
第11章 既存のモデルへのベクトル検索の統合
・11.1 特徴量の抽出
・11.2 既存のモデルの例:GBDT
・11.3 RRF
・11.4 ベクトル間の類似度や距離を特徴量とする
第12章 ベクトル検索への既存の特徴量の統合
・12.1 任意の特徴量をテキストにして入力する
・12.2 実装例
・12.3 TabTransformerの事例
付録A 画像のベクトル検索
・A.1 Fashion-MNIST:データセットの紹介
・A.2 CLIP:ベクトル化モデルの紹介
・A.3 実装と評価
・A.4 ファインチューニング
■著者プロフィール
真鍋知博LINEヤフー株式会社。京都大学大学院情報学研究科社会情報学専攻情報図書館学分野に配属。情報抽出と情報検索を自身のテーマとする。博士(情報学)。検索エンジンの高速化・高機能化のための研究・開発に一貫して従事している。著書『機械学習による検索ランキング改善ガイド―技術解説とハンズオンで学ぶ機械学習ランキングモデルの導入と改善』(共著, オライリ-・ジャパン, 2023)。
感情タグBEST3
Posted by ブクログ
ベクトル検索実践入門
著:真鍋 知博
出版社:技術評論社
LLMやRAGなどの内容から、ベクトル検索という言葉だけは知っていた。
「ベクトル検索」って何、の疑問に応えるために手に取ったのが本書です。
■ベクトル検索とはなにか
まず、キーワード検索と、ベクトル検索の違いはなに?
分かりやすいのは、「パソコン」をキーワードとして検索しても、「PC」は、ヒットしないのが、キーワード検索、「PC」が、ヒットするのが、ベクトル検索だ。ベクトル検索とは、意味を数値化してもっているので、その意味で、検索ができるのである。
次にベクトル。ベクトルとは、方向をもった大きさであるが、ここではそうではない。
言葉に割り当てられたいろいろな意味を数値に代えて、数字の列という形でもっているものをベクトルという。N行1列の行列のことをベクトルという
まず、言葉に、その特徴毎に、数値を振っていく。
入力する文章が長ければ長いほど、その個数は増えていく
あらかじめ言葉に、数値を振り分けたものを登録しておく。言葉1つにベクトルが1つになる。
そして、入力された言葉を解析して、それぞれの言葉を、ベクトルに置き換えている。
要素の数は、空間なら、x、y、zで3次元で、(0,0,0)のようなベクトルとなるが
言語モデル BERTは、384、である。つまり、384次元のベクトルを扱う
2つの言語の意味が近いかどうかは、2つのベクトルの距離できまる。
入力は1つだから、登録されている言語が、10個だったら、その距離をすべて総当たりで計算して、近いものを上から並べればいい。
原理は簡単だ。
■2つのベクトルの角度と距離を求める
2つのベクトルの評価をするには、同じ形をしていなければならない。そして計算としては、3つ
まず、
①ドット積=内積をもとめる
②コサイン類似度:内積が求まれば、2つのベクトルの角度が、コサインの形でもとまる。何度開いているかが分かるのだ。それに、コサイン類似度は、cosθだから、ー1~+1の間に収まる
③2つのベクトルの距離を、計算する.すべての要素の差分値を二乗して足し合わせ、平方根をとったものがユークリッド距離だ。
これによって、一番近いものから、順に検索結果として提示すればいい。
■コンピュータへの配慮
まず、扱っている数値は、ほぼ、浮動小数点になっているので、計算には時間がかかる、これを簡単な数値に直す 3.1415926… を、3.14 とする といった作業だ。これを 量子化という。
計算量を少なくするための工夫だ。
つぎに、似通っている言葉をクラスタというかたまりに集めて、その中の平均的なベクトルを計算して、そのクラスタの代表とする
これまでだと、20万語があったら、20万回計算しなければならなかった
クラスタを使えば、クラスタが100だったら、まず100回計算して、近いクラスタの中のものを、2000回計算すればいいので、飛躍的に計算回数が減る
(これを毎回やっているので、GPUはとてつもない性能が必要だ)
あらかじめ、クラスタ同志の代表ベクトルの距離は、計算できるので、それを、グラフという形で、もつことができる。さらに、計算がすくなくなる。
また、大数を扱わないように、標準化という手法を用いる。
・ベクトルの要素の平均が0、分散が1になるように、標準偏差を用いて計算をしておく。これによって巨大な数値を扱わなくて済むのである。
これによって、各ベクトルは、384次元の半径1の単一円の表面上にプロットされる。
まさに、線形代数、位相空間論、離散数学の組み合わせが、ベクトル検索なのである。
本書以外に参考になりそうな本をピックアップしてみました。これから読んでいく予定です。でも、ベクトル検索の専門書はあまりないです。
・VectorDB完全入門: Pythonで学ぶEmbedding・ベクトル検索・AI検索システム
・1時間でわかる LLMとRAGのしくみ: 非エンジニアでも読み切れる、ベクトル検索とLangChainの実践入門
・今日から始めるAI検索技術 Solrエンジニアのための最先端ガイド 技術の泉シリーズ
・ベクトルDB 実践設計・運用: RAGとハイブリッド検索からpgvector・評価・性能改善・セキュリティ・移行まで イラストで速攻理解IT上級
・実践!AI動画検索 RAGで実現する検索システム 技術の泉シリーズ
・LangChainとLangGraphによるRAG・AIエージェント[実践]入門
・AI・LLMの実務で使える ― RAG精度改善
・GitHub CI/CD実践ガイド――持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用
数学だと、線形代数学、ベクトル解析、位相空間 等が関連かと思います。
目次
はじめに
Ⅰ ベクトル検索の流れ
第1章 データの準備
1.1 ベクトル検索の流れ
1.2 最重要のステップ:ランキング
1.3 ランキングの機械学習
1.3.1 ベクトル検索のランキングモデル
1.3.2 キーワード検索のランキングモデル
1.3.3 両ランキングモデルの差分
1.4 ランク学習データセットの現状
1.4.1 特徴量ベクトルのデータセット
1.4.2 ドキュメントやクエリ自体のデータセット
1.5 Shopping Queries Datasetの紹介
1.5.1 製品のテーブルproducts
1.5.2 その他の情報のテーブル
1.6 前処理
1.6.1 事前知識
1.6.2 サンプルコードの入手
1.6.3 環境構築
1.6.4 前処理のサンプルコードの確認
1.6.5 read_jp_dataの解説
1.6.6 動作確認の解説
1.6.7 実行例
1.6.8 コードの実行
1.6.9 トラブルシューティング
第2章 基本的なベクトル化
2.1 ベクトル化モデルの選択
2.1.1 訓練データセットとその言語
2.1.2 推論速度
2.1.3 計算式
2.1.4 ベクトルの正規化と計算式間の関係
2.2 ベクトル化モデルの例
2.2.1 例のモデルの特徴
2.2.2 例のモデルの全体像
2.3 Sentence TransformersのMiniLM-L6の実行
2.3.1 例のモデルの読み込みとデフォルトの引数の定義
2.3.2 ベクトル化のコアな処理vectorize
2.3.3 ベクトル化したデータの保存と今後の読み込み
2.3.4 実行例
第3章 専用エンジンの紹介
3.1 ベクトルの最近傍探索
3.1.1 コサイン類似度の計算の定義
3.1.2 ランキング
3.1.3 実行例
3.1.4 ベクトルの最近傍探索
3.2 ANN検索の基本
3.2.1 スカラ量子化
3.2.2 次元削減
3.2.3 ハッシュベース
3.2.4 クラスタベース
3.2.5 グラフベース
3.3 ベクトル検索エンジンの選択
3.3.1 ANN-Benchmarks
3.3.2 Faiss
3.3.3 NGT・Vald
3.3.4 Lucene・Elasticsearch・OpenSearch・Solr
3.4 専用エンジンの例:Faiss
3.4.1 Faissインデックスの作成
3.4.2 実行例
3.4.3 トラブルシューティング:FaissのSegmentation Fault
3.5 キーワード検索エンジンの例:OpenSearch
3.5.1 サービスの起動
3.5.2 テスターの準備
3.5.3 インデックスの作成
3.5.4 ドキュメントの入力
3.5.5 クエリの入力
3.5.6 実行例
第4章 検索結果の評価
4.1 ランキングの評価
4.1.1 ソフトウェアテスト
4.1.2 オフラインテスト
4.1.3 負荷テスト
4.1.4 ライブテスト
4.2 nDCG
4.2.1 利得
4.2.2 累積
4.2.3 減損
4.2.4 正規化
4.3 nDCGの計算
4.3.1 ラベルがついたドキュメントのみの場合
4.3.2 ラベルからnDCGの利得への変換
4.3.3 nDCGの計算と表示
4.3.4 実行例
4.4 ラベルがついていないドキュメントを含む場合
4.4.1 Faissの出力の整形
4.4.2 ラベルを含むもとのデータとの結合
4.4.3 nDCGの計算と表示
4.4.4 Faissのインデックスの評価
4.4.5 実行例
4.5 レイテンシその他の評価尺度
4.5.1 レイテンシ
4.5.2 再現率
4.5.3 MRR
4.5.4 参考文献
Ⅱ 各ステップの高度化・高速化
第5章 高度なベクトル化
5.1 ベクトル検索とLLMとの関係
5.1.1 Transformer
5.1.2 GPT
5.2 BERT
5.2.1 トークナイザ
5.2.2 埋め込み
5.2.3 位置符号化
5.2.4 標準化
5.2.5 線形変換
5.2.6 注意とマルチヘッド注意
5.2.7 残差接続
5.2.8 全結合層
5.3 BERTの実装の例:LINEのDistilBERT
5.3.1 訓練データセットとその言語
5.3.2 例のモデルの全体像
5.3.3 事前学習
5.4 事前学習済みモデルのベクトル検索への応用
5.4.1 Two-Towerモデル
5.4.2 Single-Towerモデル
5.4.3 Two-Towerモデルの例:Sentence-BERT
5.4.4 LINEのDistilBERTでSentence-BERTを組む
5.5 ファインチューニング
5.5.1 パラメータ
5.5.2 訓練データとテストデータ
5.5.3 ファインチューニングの実行
5.5.4 損失関数
5.5.5 実行例
5.5.6 トラブルシューティング:Dockerのメモリ制限
5.5.7 評価
5.5.8 GPUの利用と訓練データの拡張
5.6 その他の有名な手法:SimCSE
5.6.1 教師ありSimCSE
5.6.2 教師なしSimCSE
第6章 高速なベクトル化
6.1 BERTをGPUで動かす
6.1.1 GPUの準備
6.1.2 NVIDIA製GPUとDocker Composeで動かす例
6.1.3 Apple Siliconで動かす例
6.1.4 トラブルシューティング:PyTorchのメモリ制限
6.2 LLMの量子化
6.2.1 NVIDIA A30 GPUの例
6.2.2 具体的な表現
6.2.3 浮動小数点数
6.3 半精度での推論
6.3.1 NVIDIA製GPUとDocker Composeで半精度推論する例
6.3.2 Apple Siliconで半精度推論する例
6.3.3 半精度での訓練
6.3.4 参考文献
6.4 さらなる低精度での推論
6.4.1 その他の表現
6.4.2 GPUによるサポート
6.4.3 ライブラリ
第7章 ベクトルの圧縮と高速な計算
7.1 LLMの量子化とベクトルの圧縮の関係
7.1.1 ベクトルとインデックスのサイズ
7.1.2 LLMの量子化によるベクトルの圧縮
7.1.3 実行例
7.2 ベクトルの圧縮と高速な計算の関係
7.2.1 ベクトルの読み込み
7.2.2 ベクトル間の計算
7.3 スカラ量子化
7.3.1 データの準備
7.3.2 Sentence Transformersにおける実装
7.3.3 Faissにおける実装
7.3.4 OpenSearchにおける実装
7.4 スカラ量子化を考慮したファインチューニング
第8章 次元削減やハッシュによる高速化
8.1 次元削減
8.1.1 特徴選択
8.1.2 主成分分析
8.1.3 ランダム写像
8.2 次元削減の例:ランダム回転
8.2.1 ランダム回転の定義
8.2.2 実行例
8.3 LSH
8.4 FaissにおけるLSHの実装
8.5 OpenSearchによるLSHの実装例
8.5.1 LSHの実装
8.5.2 OpenSearchの扱い
8.5.3 実行例
8.6 Learning to Hash
第9章 クラスタによる高速化 251
9.1 IVF
9.2 クラスタリング
9.3 FaissにおけるIVFの実装
9.3.1 IndexIVFFlatのインスタンス化
9.3.2 クラスタリングの実行
9.3.3 実行例
9.3.4 実行結果のまとめ
9.4 OpenSearchによるIVFの実装例
9.4.1 クラスタリングの実行
9.4.2 セントロイドの紐づけ
9.4.3 ドキュメントとクエリの整形と入力
9.4.4 実行例
9.5 直積量子化
第10章 グラフによる高速化
10.1 グラフとANN検索との関係
10.1.1 グラフ
10.1.2 HNSW
10.1.3 HNSWの実装
10.2 FaissにおけるHNSWの実装
10.2.1 HNSWの構築
10.2.2 実行例
10.2.3 実行結果のまとめ
10.3 OpenSearchにおけるHNSWの実装
10.3.1 HNSWの構築
10.3.2 クエリの整形と入力
10.3.3 実行例
Ⅲ 既存の検索にベクトル検索を統合するためのアイデア
第11章 既存のモデルへのベクトル検索の統合
11.1 特徴量の抽出
11.2 既存のモデルの例:GBDT
11.2.1 決定木
11.2.2 GBDT
11.2.3 GBDTの訓練
11.3 RRF
11.4 ベクトル間の類似度や距離を特徴量とする
第12章 ベクトル検索への既存の特徴量の統合
12.1 任意の特徴量をテキストにして入力する
12.1.1 Transformerへの複数のテキストの入力
12.1.2 Two-Towerモデルへのプレフィックスによる入力
12.1.3 単一のテキストへの整形
12.2 実装例
12.2.1 プレフィックスと単一のテキストへの整形の実装
12.2.2 ベクトル化と評価
12.2.3 最大シーケンス長
12.2.4 ファインチューニング
12.2.5 実行例
12.3 TabTransformerの事例
12.3.1 本書が想定するベクトル検索のモデルとの相違点
12.3.2 カテゴリカル特徴量と列埋め込み
12.3.3 ベクトルの結合
12.3.4 多層パーセプトロン
付録A 画像のベクトル検索
A.1 Fashion-MNIST:データセットの紹介
A.2 CLIP:ベクトル化モデルの紹介
A.2.1 訓練データセットとその言語
A.2.2 モデルの構造
A.2.3 Vision Transformer
A.2.4 ベクトル列からスコアへの変換
A.3 実装と評価
A.3.1 題材のデータセットの準備
A.3.2 例のモデルの準備
A.3.3 類似度の計算とランキング結果の評価
A.3.4 実際の処理と実行例
A.4 ファインチューニング
A.4.1 ファインチューニングの実行
A.4.2 実行例
あとがき
索引
著者プロファイル
ISBN:9784297153373
判型:B5変
ページ数:376ページ
定価:3200円(本体)
2026年01月20日 初版第1刷発行