機械学習による検索ランキング改善ガイドを読みました

Posted by johtani on Monday, September 25, 2023

目次

「機械学習による検索ランキング改善ガイド」を読みました。

著者の鈴木さんより献本いただいたのを読み終わったのでレビューと、あとおまけです。

紹介とレビュー

どんな本なのか?は打田さんが書かれたブログ、「ブックレビュー:『機械学習による検索ランキング改善ガイド』 - Tomoko Uchida - Medium」に詳しく書かれているので、そちらも参考にしてもらうほうがわかりやすいと思います(丸投げ)。

読みながらいくつかツイートしていたので、そちらも参考のために貼っておきいます。

私のレビュー

わかりやすく検索の基本を紹介しつつ、本書のメインであるランキング改善について全体の流れが書かれています。 ランキング改善のやり方といっても、手法の話だけではなく、プロジェクトとしてどの様に進めていくべきなのか?また、関係するものはどんなものがあり(システムだけではなくチームについても書かれていたり)、どういう判断をもちながら運用していくのか?、負荷テストにまで言及されています。

読んでいて特に私が気に入ったのは以下のような話でした

  • ランキング改善を進める前にきちんと解ける問題なのか?それ以前にやることはないのかを考えましょう
    • マッチング改善についても少しだけ触れられているが、メインはランキングについてだと明記されている
  • 実際に体験されたのであろう落とし穴の話
  • 負荷テストについて1章設けてある!
    • ハンズオンのパートでもレイテンシの話がされている
  • 付録としてベクトル検索についても触れてある

日本語でまとまって読める本があるのは本当に幸せですよね。

おまけ

書籍ではハンズオンで、Elasticsearchとランキング学習のプラグインであるelasticsearch-learning-to-rankを利用しています(GitHubにサンプルが公開されています)。 書籍ではElasticsearchが7.13.4、プラグインが1.5.7-es7.13.4というバージョンになっていました。

ブログを書いている時点でのElasticsearchは8.x系になっています。せっかくなので、書籍を読みながら現時点で最新のものに置き換えてみるというのをやってみました。

Elasticsearchは8.10.2が最新なのですが、ランキング学習のプラグインはサードパティ製で、1.5.8-es8.8.2が最新版となっています。 ハンズオンのサンプルコードをフォークして、以下の構成にして動くようにしてみました。

  • Elasticsearch : 8.8.2
  • learning-to-rankプラグイン : 1.5.8-es8.8.2
  • Kibana : 8.8.2
  • Python : 3.10

Elasticsearch、プラグイン、Kibanaのアップグレード

Elastic社が提供しているDockerイメージが利用されているので、バージョン番号を書き換えました。 あとは、learning-to-rankプラグインのバージョンを書き換えるついでに、elasticsearch-pluginコマンドで直接ダウンロードさせる形に書き換えました。

https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/search-engine/Dockerfile

Python3.10にアップグレード

本当は必要なかったのですが、Pythonのイメージもついでに3.10にしました。 ただ、このおかげでインストールされるXGBoostのバージョンも1系から2系に上がってしまい、XGBoostを利用してモデル生成をする処理でエラーが出るようになってしまいました。。。

2系へのアップグレードは手間がかかりそうだということで、pipコマンドでのインストールでのバージョンを<2として、1系をインストールすることで回避しました。

https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/workspace/Dockerfile

elasticsearch-pyのアップグレード

Elasticsearchを8系にしたので、クライアントライブラリ側も8系に書き換えました(元は7.17以下に固定されていた)。 pipで7系に固定されていたものを外して最新のもの(8系)をインストールするようにしました。 これだけでも特に問題なく動いたのですが、「DeprecationWarning」が出ている部分が1か所だけあります(サンプルではDeprecationWarningが出力されない形になっていましたが、出力するように変更しました)。

Elastic公式のドキュメントにMigrate to 8.0というページが公開されています。Pythonクライアントのアップグレードを行う際はこちらを参考にすると指針が記載されています。

今回のサンプルコードではsearchの時の引数としてbodyを渡していたのですが、8系のクライアントライブラリからこちらが廃止になり、queryrescoreなど個別の引数を渡す形に変更されています(search APIのリファレンス)。 ですので、body**bodyでアンパックして渡すようにしただけです。サンプルコードがわかりやすく書かれているので変更も少しで済みました。

https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/workspace/collect_responses.py#L59

一応、これでエラーが出ないで動きました。 すべて適用した、フォークして修正したブランチはhttps://github.com/johtani/building-search-app-w-ml/tree/es8で公開しています。

まとめ

すごくわかりやすいうえに、手を動かしながらどんなデータを使ってどんなことをやるのかが体験できる良い本でした。 理論的な話だけでなく、システムとしてどういうものが必要で、どういうことをやらないといけないのか?というのがわかるのがイメージできるのは重要だと思います。

最後は広告ですが、ランキング改善以外の検索システムについて学べる本を検索システム ― 実務者のための開発改善ガイドブック – 技術書出版と販売のラムダノート出していますので、こちらも参考書として読んでいただけるとうれしいです。


comments powered by Disqus

See Also by Hugo


Related by prelims-cli