ベクトル検索実践入門
- 真鍋知博 著
- 定価
- 3,520円(本体3,200円+税10%)
- 発売日
- 2026.1.7
- 判型
- B5変形
- 頁数
- 376ページ
- ISBN
- 978-4-297-15337-3
サポート情報
概要
ベクトル検索は従来の重要技術キーワード検索を補完する技術であり、かつWeb検索など、検索そのもののサービスにはもちろん、Eコマースなど各種サービスの検索機能にも採用されつつある注目度の高い技術です。従来のキーワード検索は、ユーザが入力したキーワードを含むドキュメントを抽出し、キーワードの出現頻度にもとづいてドキュメントをソート(ランキング)するというものでした。キーワード検索が表面的な情報を扱っていたのに対して、ベクトル検索はキーワードやドキュメントの「意味」を扱います。ベクトルの類似度によってキーワードとドキュメントそれぞれの意味の類似度を測れるよう、これらのテキストをベクトル化する技術です。
このように、ベクトル検索は抽象的な意味を扱える点で優れた技術ですが、一方でしくみがわかりにくいところがあります。また、新しい技術でもあるため、日本語の専門書や資料が少ない状況です。
本書はベクトル検索による検索エンジンの高速化を解説します。対象読者は検索サービスまたは検索機能を扱うエンジニア、手法の実装と評価が必要な研究者、およびそれらを志望する学生で、実用的なベクトル検索が実装できるようになることを目指します。
前半でデータの準備から検索結果の評価までを一通り解説し、後半では各ステップの高度化・高速化について解説します。また、付録として画像のベクトル化と検索についても解説します。
こんな方にオススメ
- ベクトル検索について知りたいエンジニア
目次
第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 実行例
プロフィール
真鍋知博
LINEヤフー株式会社。京都大学大学院情報学研究科社会情報学専攻情報図書館学分野に配属。情報抽出と情報検索を自身のテーマとする。博士(情報学)。検索エンジンの高速化・高機能化のための研究・開発に一貫して従事している。著書『機械学習による検索ランキング改善ガイド―技術解説とハンズオンで学ぶ機械学習ランキングモデルの導入と改善』(共著, オライリ-・ジャパン, 2023)。
