BLOG

書評「今日から始めるSolrベクトル検索」

著者: 関口宏司

  

投稿日: 2024年03月14日

    
  • Semantic

技術書典オンラインマーケットで販売されている今日から始めるSolrベクトル検索を読んだので紹介しよう。

読みやすい

この本の特徴は何といってもまず読みやすいことである。難しいことを易しく(少なくとも易しく聞こえるように)説明するには、説明対象の技術を十分理解した上でコミュニケーション能力が備わっていなければならない(書籍執筆の場合は、ここに筆力も含まれる)。著者のさしみもち氏はその両方を備えているので本書はスラスラ読めてしまう。300ページオーバーの本を、途中でやめられず止められず、2時間で読了してしまった、私にとってはかっぱえびせんのような本といえるだろう。

本書には今日から始めるSolrベクトル検索~Supplemental Book~という続編もある。昨年5月に出版された本編の、6月以降のアップデート部分をカバーしたものである。Webサイトの紹介文の追記によれば、続編出版後に読者の要望を受けて加筆修正したとある。内容も検索エンジンにとどまらず、その周辺の関連技術にまで広げ、読者の興味を惹きつけてやまない。

これら本編、続編がそれぞれ1,000円、500円で購入できてしまう。すごい時代になったものだ。

本編

本書の読みやすさは伝わったと思うので、早速内容の方に触れていこう。本編の章立ては以下のようになっている。

  • 第1章 全文検索エンジン Apache Solr
  • 第2章 全文検索エンジンとして動かしてみる
  • 第3章 ベクトル検索の理論とその要素技術
  • 第4章 Solr 上でベクトル検索を動かす
  • 第5章 実データを使ってベクトル検索をする
  • 付録

本書は「今日から始めるSolrベクトル検索」というタイトルであるが、第1章と第2章ではあえて「キーワード検索(転置インデックスを用いる従来型の全文検索を本稿ではこのように呼ぶこととする)」エンジンとしてのApache Solrの紹介を行うところから本書をスタートしており、Apache Solrや検索ンジンの初心者をおいてきぼりにしない。そして本編執筆時点でおそらく著者も予定していなかったであろう、続編でのベクトル専用検索エンジンとApache Solrの比較論も、この章があることで簡潔かつ説得力を持って説明できてしまっている。著者によれば、第1章と第2章はApache Solrの初心者や、昔はSolrを使っていたが忘れてしまった方向けとなっている。が、非常に簡潔にポイントを押さえてキーワード検索エンジンとしてのApache Solrの紹介がされているので、知っている人も読んでおいて損はない(私も読んだ)。知っていることでもあえて読むことで、「オレこれ知ってる」「この部分あやふやだったけど確認できた」と安心感や自信につながることも多いではないか。

第3章以降は本書の主題であるベクトル検索について、その理論からApache Solrを使って実際にベクトル検索を実行するところまで説明されている。なお第3章の冒頭に触れられている通り、本書では「ベクトル検索」という用語を用いているが、マーケットでは次のような様々な用語が用いられている。

  • 密ベクトル検索
  • ニューラル検索
  • セマンティック検索
  • ...

日本語の場合、「検索」を「サーチ」、「セマンティック」を「意味」やときには「概念」と書くこともままあるので、組み合わせがどんどん増えていってしまう。切りがないので上記にとどめておくが、原理を押さえておけばこれらが同じ意味を持ち、文脈や好みで使い分けられていることがわかるだろう。弊社ロンウイットでは、マーケティング視点を入れて「セマンティック検索」と呼ぶことが多いが、本稿は書評なので、対象書籍で用いられている用語に合わせて「ベクトル検索」と呼ぶことにする。

第3章では、ベクトル検索とはなにかということが、平易な言葉で説明されている。たとえば、キーワード検索と比較した場合の優位性やベクトル検索における「ベクトル」の簡単な説明、クエリと文書の両ベクトル間の距離計算、そしてクエリに近い文書ベクトルを探索する方法である近似最近傍探索(ANN; Approximate Nearest Neighbor)の基本的なアルゴリズムが紹介されている。ANNの具体的なライブラリとしてAnnoyが取り上げられていたが、その名称は "ANN Oh Yeah" から来ているとのこと(なんじゃそりゃ)。第3章の最後は、「ベクトル検索をめぐるこれまで」と題して、2000年代以降、ベクトル検索のアルゴリズムやライブラリの発展、それらを業務システムに適用しようと奮闘する企業の取り組みなどがまとめられていて興味深く読んだ。そして著者は「 ベクトル検索エンジンと埋め込み表現獲得のエコシステムが整備されてきた、今がベクトル検索を始める好機 」と読者を鼓舞しながら次の章に繋げている。

第4章は、前の章で理解したベクトル検索を、実際にApache Solrを使って行うための各種設定とインデクシング方法、検索方法について説明している。本章では基本的な使い方の説明に徹し、より本格的な埋め込みを使った検索は次章に委ねている。たとえば、ベクトルは4次元のサンプル程度にしておいた上で、ベクトル検索とApache Solrの特徴でもあるファセットやグルーピング検索との組み合わせも丁寧に説明している。この工夫により、JSONレスポンスがスッキリして読みやすくなっている。

(キーワード検索と組み合わせることでハイライトを使う)
「4.7.1 キーワード検索と組み合わせる」にて著者は、ベクトル検索ではハイライトができないので、キーワード検索と組み合わせてハイライトする方法を提案し、具体的な方法を提示している。これは標準のApache Solrではそのとおりである。が、Apache Lucene/SolrコミッターのAlessandro氏がセマンティック検索でのハイライトを実装したとのこと。需要があり環境が整えばOSSになる可能性を同氏は言及している。
書籍に戻るが、ハイライトするキーワードは hl.q を使えとあった。確かこのパラメーターは、私が10年以上前にコントリビュートしたものではなかったか。もちろん当時はベクトル検索と組み合わせて使われるとは想像もしていなかった。まさかこんなところで再会するとは!懐かしい。

第5章は、より本格的なデータを使い埋め込みを計算してインデクシングと検索を行っている。テキスト検索の方では、livedoorニュースコーパスを始めとするコーパスを用いて、CPUでも(サンプルとして)実用的な時間で計算できるWord2Vecで埋め込みを計算している。テキスト以外の例としては、画像-to-画像とテキスト-to-画像の検索を行うプログラムを紹介している。

本編で参照されたアルゴリズム等は付録に丁寧にまとめられている。私としては理解があやふやだったHNSW(Hierarchical Navigate Small World)が親切に説明されていてありがたかった。付録ではKandaSearchでも多用しているSentence BERTも紹介されている。

KandaSearchのコミュニティ版Solrで、livedoorニュースコーパスをSentence BERTでベクトル検索する

本書では実用的な時間でベクトル計算できるようにということで、Word2Vecを用いてベクトル検索のサンプルを実行していた。そして、実際の業務で多用されているSentence BERTについては付録で紹介するにとどめている。

せっかくなのでこの書評では、KandaSearchコミュニティ版Solrを使って、livedoorニュースコーパスのSentence BERTを使ってのベクトル検索を試す方法を紹介したい。KandaSearchでは拡張機能ライブラリーであらかじめSentence BERTを使ってベクトル計算されているlivedoorニュースコーパス(embeddings)と、それに対応したApache Solrのコンフィグセットが配布されているので、15分程度あれば試せてしまうのである。

1. KandaSearchにログイン

まずは、KandaSearchにログインする(アカウントがない人はアカウント作成を行う)。操作は簡単なので特に説明の必要はないと思うが、詳しくはKandaSearchドキュメントのユーザーアカウントの作成と管理を参照いただきたい。

2. プロジェクトを作成

KandaSearchのプロジェクトは、検索エンジン(Apache Solr)が動くのに必要な「場所」を提供する。KandaSearchにログインしたら、まず行うのがプロジェクトを作成することである。もちろん、プロジェクトがすでにあるなら作成しなくてもよい。ログインしたら表示される「プロジェクトを作成する」ボタンをクリックし、指示に従って操作を進めれば、プロジェクトは簡単に作成できる。更に詳しくは、プロジェクトの作成と管理を参照いただきたい。

3. コミュニティ版Solrインスタンスを作成

プロジェクトを作成したらいよいよ検索エンジンインスタンス(Apache Solr)を作成する。コミュニティ版Solrを使えば、利用料金など一切かからない。プロジェクトオーバービューの「インスタンスを作成する」をクリックし、一番左の「Communityエディション」を選択し、あとは画面の指示に従っていくだけで、数分後には自分専用のApache Solrが稼働する。

なお、「Step-3 インスタンス情報」の「+IPアドレス範囲を追加する」にて、忘れずに自分のPC(Apache Solrのクライアントとなる)のIPアドレス範囲(CIDR形式)を登録しておこう。そうしないと、後述のインデクシング手順でApache Solrに接続できなくなってしまう。ただし、インスタンス作成後でもインスタンスの設定メニューで後からIPアドレス範囲は設定・変更が可能である。詳しくはインスタンスの作成と管理を参照いただきたい。

4. コレクションを作成

Apache Solrのインスタンスを作成したら、次はいよいよ(「いよいよ」ばっかだな)コレクションを作成する。このコレクション作成時に前述の拡張機能ライブラリーのひとつ、Livedoorニュース(embeddings) configuration(Solr 9)を利用することになる。

拡張機能ライブラリーのSolrコンフィグを使うには、KandaSearchにログインしている状態で、右上のジグソーパズルのアイコンをクリックして、拡張機能ライブラリーの一覧を表示させ、使いたい拡張機能を選ぶ。ここでは、 SOLR COLLECTION CONFIG をクリックして絞り込むといいだろう。拡張機能を選んだら、「プロジェクトに追加」をクリックして、拡張機能をプロジェクトに追加する。プロジェクトメニューの「拡張機能」に行くと、追加された拡張機能が表示されるので、それを選択してローカルPCにダウンロードする。

インスタンスメニューから「コレクション」を選択し、「+コレクションを追加する」をクリック、そして「インポートによる作成」からローカルPCにダウンロードしたファイルを指定してコレクションを作成する。このようにして作成したコレクションは、ベクトル検索のための設定がすべて完了しているので、livedoorニュースコーパス(embeddings)が登録できる。

5. livedoorニュースコーパス(embeddings)の登録

コレクションを作成できたので、次はいよいよ(まだ言うか)livedoorニュースコーパス(embeddings)を登録する。書籍ではきちんとベクトル計算をしているが、KandaSearchの拡張機能ライブラリーで配布しているサンプルデータ(embeddingsと表記があるもの)は、あらかじめ適切なSentence BERTの埋め込みが計算されているので、ただApache Solrに登録(インデクシング)するだけである。

拡張機能ライブラリーのlivedoorニュースコーパス(embeddings)を先述の手順と同じく、KandaSearchにログインしている状態で、ジグソーパズルのアイコンクリックから見つけ、プロジェクトに追加して、ローカルPCにダウンロードする。ダウンロードしたファイルはZIPになっているので解凍し、Apache Solrに登録できるJSONデータを得る。

このJSONデータを、次のようにcurlコマンドでKandaSearch上のApache Solrに登録する。なお、SolrのURLは、KandaSearchでインスタンスを選ぶと、オーバービューページでApache SolrへのURLが表示されるので、クリップボードアイコンのクリックによりURLがコピーができる。

curl -X POST 'https://<subdomain>.c.kandasearch.com/solr/<collection>/update?commit=true&indent=true' --data-binary @livedoor_embeddings.json -H 'Content-Type: text/json'
6. ベクトル検索の実行

あとはベクトル検索を試すだけだ。「いよいよ」ともいよいよお別れである(なんのこっちゃ)。KandaSearchコンソールで以下のように実行すれば、従来型のキーワード検索ではなく、意味で検索するセマンティック検索(書籍で言うところのベクトル検索)が実行できる。

(KandaSearchドキュメントのセマンティック検索からの抜粋)

(1)インスタンスビューの左サイドメニューから「検索」を選択します。

(2)検索条件に以下のような指定(設定の例です)を行い「検索」をクリックします。

- キーワード - 検索したいキーワードや調べたい内容の文章を指定します。例:「スマホ」「男性がもらって喜ぶもの」など。
- コレクション - 上記の操作で作成したコレクション名を選択します。
- リクエストハンドラ - /select のままにします。この値は以下で指定するセマンティックリクエストハンドラで上書きされます。
- ユニークキー - id が自動的に選択されます。
- タイトル - title と指定します。
- ボディ - body と指定します。
- セマンティック検索を有効にする - チェックボックスをオンにします。
- セマンティックリクエストハンドラ - /semantic を選択します。
- Dense Field - ベクトル値の格納されたフィールド名を指定します。body_vector と指定します。
- Dense Top K - 返される検索結果件数を指定します。10 と指定します。
- デフォルトフィールド - body と指定します。

(3)検索結果が表示されます。

続編

書評がだいぶ長くなってしまった。そのことで本書が読まれなくなったら本意ではないので、続編の紹介は簡潔にしておこう。

続編では、本編以降にバージョンアップされたApache Solrの差分や、本編出版後に寄せられたSolrのインストール方法やその他のより具体的な使い方の説明、ベクトル検索に使えそうな最新のモデルやライブラリ情報、生成AI(主にChatGPT等)とベクトル検索の比較や組み合わせ方法の考察が書かれている。特に生成AI周りの情報は分厚くなっていて、最近流行りのRAG(Retrieval Augmented Generation)についても触れられている。

生成AIチャットとベクトル検索はそれぞれ得意分野・不得意分野がある。アプリケーションを構築するときは、要件に応じてどちらを採用するか、あるいは組み合わせをよく検討する必要がある。

ChatGPTがすごすぎてベクトル検索は不要ではないか、と考える人にもたまに出会う。そのような人向けに弊社が制作したYouTube動画がある。なお、動画の中ではベクトル検索をセマンティック検索と呼んでいる。

技術書典オンラインマーケットについて

本書は技術書典オンラインマーケットにて販売されている。見ると相当な数のPDF(紙版もあるようだ)書籍が販売されている。従来型の出版社と異なり、著者が好きなことを好きなように書いて、編集者のチェックもなく、自分の好きな価格で販売できるサイトのように見える(違うかもしれないが)。

私が「Apache Lucene入門」(技術評論社)を執筆したときにLuceneの替え歌を載せようとしたら、技術評論社編集I氏に見つかって「替え歌はダメです」と言われ掲載は叶わなかった。しかたがないので、自身のブログで公開するしかなかった。技術書典ならこういったこともないのであろう。

著者のさしみもち氏について

変化の激しいITやOSSの状況に追随すべく、本編出版後に続編を出版し、さらにその続編出版後に読者の要望を受けて続編を加筆修正する姿勢と情熱。本書からそれが伝わるのがさしみもち氏である。しかし、刺し身と餅って。私はどちらも好きだが、一緒にする発想はない。「ブース」に行けば会えるそうだが(続編「2.2 あの、PDF を取り込みたいのですが...」より)、そのブースがどこにあるのかわからない。

さしみもち氏のXのPhoto

しかし技術に真摯な好人物に違いない。それがPDF書籍から伝わってくる。いつかお会いすることがあったら、ベクトル検索について熱く語り合いたいものだ。

企業名誤植

本書には弊社やKandaSearchが紹介されていて大変ありがたかった。が、弊社名のカタカナ表記のタイポがあったので以下の通り訂正させていただく(ついでに他社名のタイポも見つかったので、合わせて掲載する)。

ロンウィット ロンウイット
キャノンITソリューションズ キヤノンITソリューションズ

カタカナ社名の大文字表記を小文字にしてしまうのはあるあるだ。ついでなので、類似の間違いやすい社名を以下に示そう。

  • キユーピー
  • シヤチハタ
  • オンキヨー
  • 富士フイルム

これら錚々たる大企業と並列して弊社名を掲載するのはどうかと思う。ただいい機会なので、ロンウイットの社名の由来を紹介してこの記事を締めくくることにする。

ロンウイットの創業は東京都江東区の私(関口)の自宅(当時)であり、近所に「丸八通り」という南北に走る通りがあった。「丸」も「八」も縁起がいいので、これを仏語にして「ROND(丸)」「HUIT(八)」としたのがロンウイットの社名の由来である。こう書くと簡単だが、これに決まるのに当時いろいろ悩んだ。その経緯は下記スライドにまとめている。スライドでは結論が出ず、悩んだまま終わっているのが今見るとおかしい。時間があれば御覧ください。

Pre rondhuit-naming-story

お見積もり・詳細は KandaSearch チームに
お気軽にお問い合わせください。

お問い合わせ