Query Auto-Completionに関するテックブログまとめ


# 本記事でやること
私が最近読んだQuery Auto-Completion(以下QAC)をテーマにしたテックブログを列挙し、簡易的なまとめを記載します。


# 対象読者
- 検索窓に入力されたクエリの続きを提示する機能(Query Auto-Completion)の改善事例や文献を探している方

# 概要


| タイトル | 企業名 | 執筆年 | 簡単なまとめ |
|:-:|:-:|:-:|:-:|
| [Autosuggestion services in web search](https://medium.com/data-science-at-microsoft/autosuggestion-services-in-web-search-9d4f71c662c6)  |  Microsoft | 2022  | QACの一般的な改善手法がまとまっています。さらに、改善を評価するための指標がいくつか紹介されています。 |
| [AutoSuggest Retrieval & Ranking(Part2)](https://tech.olx.com/autosuggest-retrieval-ranking-part-2-14a8f50fef34?gi=3240d6e7d3f9)  | OLX Group | 2022  | OLX Groupで実践された、入力クエリと提案するクエリのマッチングアルゴリズムやランキングアルゴリズムの改善方法を紹介しています。  |
| [How Instacart Uses Machine Learning-Driven Autocomplete to Help People Fill Their Carts](https://tech.instacart.com/how-instacart-uses-machine-learning-driven-autocomplete-to-help-people-fill-their-carts-9bc56d22bafb)  | tech-at-instacart | 2022  |  instacartで実践された、QAC機能の改善事例がいくつか紹介されています。ランキングアルゴリズムの改善以外に、スペルミスの吸収や意味が重複するキーワードの削除などが紹介されています。 |
| [A better way to search for music through query suggestion](https://deezer.io/a-better-way-to-search-for-music-through-query-suggestion-4bca10918c27) | Deezer  | 2020  | Deezerで採用されていたインスタント検索をQACに置き換えた話が紹介されています。また、ランキングアルゴリズムを改善した上でABテストを実践し、その際採用した評価指標も紹介されています。

# Autosuggestion services in web search

## 入力されたクエリとサジェスト候補キーワードの関連性の改善

- QACは、ユーザーの検索クエリのログから人気があるキーワードを提案するだけではない

### パーソナライズ

- 使用言語によるパーソナライズ
    - ユーザーが使用している言語の種類によって、提案するクエリを出し分ける
    - 文字の種類が異なる言語間では自動翻訳を行う

![スクリーンショット 2023-04-03 22.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/219f0b96-65f0-67d7-d3d1-503133242987.png)



- 時系列イベントによるパーソナライズ
    - スポーツや政治などのイベントは周期性を持つので、この周期性を利用し提案するクエリを予測し生成する

- ユーザーの検索履歴に基づくパーソナライズ
    - 例えば、「アベンジャーズ」や「キャプテン・アメリカ」を過去に検索したユーザーが検索窓に「マーク」と入力した時は、「マークザッカーバーグ」ではなく「マーク・ラファロ」を一番上に表示すべき
    - ユーザーの過去の検索履歴を通じて、各ユーザーを表現するようなエンドツーエンドの自然言語モデルを利用する

### 多様性

- 同じ意味を持つ冗長なクエリを減らし、QACの多様化を目指す

![スクリーンショット 2023-04-03 22.52.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/c0b51e8c-137e-4316-7158-236e3cb7cb71.png)


### 新規性
- 急速に人気を集めているトレンドワードをピックアップしQACにより提案することでユーザーが最新情報を把握できるようにする

## カバレッジの向上

- スペルミスによってキーワードが表示されない問題を解決するために、検索クエリとのプレフィックスマッチによってマッチしたキーワードではなく、スペル修正メカニズムを持った非プレフィックスマッチによるキーワードを提案する方が良いかもしれない


## その他機能

- 質問に対する回答の表示
    - 計算式などを入力すると解答が得られる
- ゴースティング
    - ユーザーが検索窓にクエリを入力中にクリックする確率が高いと判断したキーワードを自動的に入力する

![スクリーンショット 2023-04-03 22.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/73904a20-5973-25d1-52f3-d53128d77433.png)


- 未入力時の提案
    - 検索窓に何も入力されていない時に検索履歴やトレンドワードなどを提案する

![スクリーンショット 2023-04-03 22.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/722fc52a-a34c-19c4-9003-49fb54695d91.png)


## 評価指標

- Mean Reciprocal Rank (MRR)
  - Q: 評価セット内の全てのユーザークエリ (q)
  - rank_q: クエリqがQACに表示された際のランキング

評価セット内のユーザークエリがQACにてより上位に表示されたことを重視する評価指標

![スクリーンショット 2023-03-31 22.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/3ce5f139-4606-4985-61cc-9c9ae226848f.png)



- Success Rate at TopK (SR@K)
  - ユーザーの検索意図を満たすキーワードが上位K位以内にある平均比率
  
- α-nDCG
  - QACがより多様なワードを提示できているかを評価するために使用するnDCGを拡張した指標。
  - 詳細は「[Diversifying Query Auto-Completion](https://dl.acm.org/doi/abs/10.1145/2910579)」を参照

# AutoSuggest Retrieval & Ranking(Part2)

## 改善前のアルゴリズム
- 当社が保有しているマスタデータのようなもの(商品カテゴリーなど)から提案するクエリを生成していた

## 問題点
- ユーザーがどのように検索しているのかが考慮されていない
- どのサジェスト候補がよりクリックに繋がるのか考慮されていない

## 改善後
- 提案するクエリはユーザーの過去の検索クエリを利用する
- 検索クエリの出現頻度を加味したランキングアルゴリズムを利用する

### マッチングアルゴリズム

- 3つのアルゴリズムによってマッチするワードを探す(ex: 入力クエリ("scoote")
    1. Infix match: クエリと前方一致 (ex: **scoote**r)
    1. Blended Infix match: クエリ内の任意のタームと前方一致(ex: electric **scoote**r)
    1. Fuzzy match: クエリのk番目の文字列と前方一致(ex: **scoot**y)

![スクリーンショット 2023-04-03 22.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/1fdac8d3-9a8e-f93c-cbc9-f9df1009df33.png)



### ランキングアルゴリズム
- 上記3つのマッチングアルゴリズムによってマッチしたワードの出現回数に対してそれぞれ減衰係数を掛けスコアを計算する


| Query=scoote | match word | Frequency | Decayed Frequency |
|:-:|:-:|:-:|:-:|
| Infix match | scooter  | 1800  |  1800 |
| Blended Infix match | elactric scooter  | 1200  | 1200/2  |
|  Fuzzy match | scooty  | 600  |  600/3 |

- 上記の結果からソート順は (scooter, 1800), (electric scooter, 600), (scooty, 200)となる

![スクリーンショット 2023-04-03 22.57.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/ad9e7b73-c921-1939-90fd-ffbb2d2c57ed.png)


#### A/Bテスト
- いくつかの国毎にA/Bテストを実施し0件ヒット率が減少したこと、QACが提案したクエリの採用率、コンバージョン率が上昇した

## How Instacart Uses Machine Learning-Driven Autocomplete to Help People Fill Their Carts

![1_fjy3z5kZEo7T745DN1y_Jg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/70fd5286-5f86-c67d-1e75-31bd4763bf36.gif)


### 提案するクエリの生成方法
- ユーザーの過去の検索ログを利用している
- 以下のようなフィルタリングをクエリに適用している
    1. 不適切な単語の除外
    1. 当社特有の語彙などの除外
    1. 長すぎるキーワードの除外
    1. 重複するキーワードの除外
        1. "egg", "eggs"があった場合、人気なワードを残す

### スペルミスの処理
- [Fuzzy matching](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness)を利用しユーザーのスペルミスを吸収し適切なクエリを提案している
- Fuzzy matchを利用することで、QACのエンゲージメント向上、コンバージョンを発生させたクエリ割合の向上を実現した

![スクリーンショット 2023-04-03 23.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/b94754e5-624f-74d3-ba72-3c7e89be30d8.png)


### 重複削除
- 意味的に同じキーワードが表示されることがある
    - "fresh bananas", "bananas fresh"など

- 重複を削除することで多様なワードを表示することができる
- [Search Embeddingモデル](https://sigir-ecom.github.io/ecom22Papers/paper_8392.pdf)を用いて重複削除に取り組んだ
    - クエリと商品の関連性を利用し予め訓練されたクエリのembeddingを利用しクエリ間の類似度を計算する

![スクリーンショット 2023-04-03 23.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/382fc1e7-35cc-2ff0-d5ac-75326dd64956.png)


### ランキングアルゴリズム
- 元々は人気なクエリを上位に表示するようにしていた

#### Autocomplete Engagement Model 
- 機械学習モデルを利用したランキングアルゴリズムを作成した
    - QACのログを訓練データとし、提案されたクエリへのクリックを正例、その他を負例と定義
    - 二値分類問題として解く
    - 特徴量
        - ac_conversion_rate: 該当のクエリがクリックされた割合
        - ac_skip_rate: 該当のクエリが上位に表示されたがエンゲージ(クリック)されていない割合
        - is_start_match: 該当のクエリがprefix matchでヒットしたかどうか
        - is_fuzzy_match: 該当のクエリがfuzzy matchでヒットしたかどうか
        - has_thumbnail: 該当のクエリが表示される際にサムネイルを持っているかどうか
        - normalized_popurarity: 該当のクエリの（正規化済み）人気度

![スクリーンショット 2023-04-03 23.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/5b03f9d0-0ed3-e5e0-ed6e-8ab91ebc128f.png)


#### Multi-objective Ranking
- QACに対するユーザーのエンゲージメントを最適化するモデルとカート追加を最適化するモデルを併せたモデルを作成した
    - QACが提案したクエリがクリックされ、その検索クエリからカート追加が発生した時にユーザーの検索意図を理解したと定義する

- ユーザーのエンゲージメントを最適化するモデルは前項で説明した"Autocomplete Engagement Model"を利用する

- カート追加最適化モデルはQACから検索されたクエリによって商品がカートに追加されたかどうかの二値分類問題として扱う

![スクリーンショット 2023-04-03 23.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/797586eb-c16c-6e09-9f00-85a88233b645.png)


![スクリーンショット 2023-04-01 23.39.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/6c8454c5-82d4-1833-8103-ddb5a71d4480.png)

- カート追加を最適化するモデル(Add to Cart model)は、検索窓に入力されたクエリ(prefix)に依存しないという仮定を置いている
    - QACの検索ログだけではなく全検索ログの特徴量を利用することができる

- カート追加モデルの特徴量
    - Search Conversion Rate: 該当ワードの過去N日間のコンバージョン率(=コンバージョン数 / 検索された回数)
    - Add to Cart Rate: 該当ワードの過去N日間のカート追加率(=カート追加数/検索された回数)
    - Zero Result Rate / Low Result Rate: 該当ワードの過去N日間の０件ヒット率 もしくは検索結果数が少数であった割合



## A better way to search for music through query suggestion

### 改善前
- 検索窓にクエリを入力するたびに検索結果を表示するインスタント検索を提供していた
- 検索体験を阻害しているという理由でインスタント検索をやめることにした
    - Google検索が2010年にインスタント検索を削除した際の調査結果を参考にした

![1_0ZGLr6f3xvxFnupQqNbR-w.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/dd5c4614-519a-9138-ec81-114ff1cc318a.gif)

### 新しい検索体験
- 以下の要素を備えたQACを開発した
    1. 実際の検索クエリや音楽のメタデータから提案するクエリを生成する
    1. ユーザーの国に応じて提案するクエリをローカライズする
    1. ユーザーの好みに応じて提案するクエリをパーソナライズする
    1. ユーザーの検索履歴を表示する
    1. 関連するクエリを提案する


- 以下のようなデザインパターンに従った
    1. 提案するクエリは最大10個までにする
    1. 入力されたクエリと提案するクエリの差分はハイライトする
    1. ユーザーがカーソルを合わせたクエリをハイライトする
    1. 検索履歴を表示する
    1. 境界線は多用しすぎないようにする


![1_0ZGLr6f3xvxFnupQqNbR-w.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270991/435e774c-4806-7ce5-11ba-df56910fe5f1.gif)

- 入力クエリとドキュメントとのマッチングアルゴリズムはprefix matchよりもexact matchを重視するようなアルゴリズムを開発した
- 検索順位を決めるランキングアルゴリズムは、BM25と視聴回数から算出される人気度を組み合わせた

### A/Bテスト
- 新しいUX, 新しいランキングアルゴリズムにてABテストを行った
- A/Bテストの評価指標は以下3つ
    1. [Ranked Half-Life(RHL) indicator](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.159.9118&rep=rep1&type=pdf)
        1. 関連するアイテムがどの程度の頻度で検索結果の上位に表示されたかを示す指標

    2. Success indicator
        2. セッションの最後にクエリをクリックした検索セッション

    3. Effort indicator
        3. ユーザーがクエリを入力する時間、クエリを入力してからクリックするまでの時間


# おわりに
QACに関する日本語の文献は数が少なく他社事例を収集するのが大変な中、今回扱ったテックブログは具体的かつ応用できそうな内容が多くとても勉強になりました。著者の方々には感謝です。
また、QACを評価する指標に関しても学びが多く、引用されている論文などを時間があるときに読もうと思います。
この記事が自分のようにQACの文献を探している方の参考になれば幸いです。