ベクトル検索のみで、AI王クイズ第一回コンペに臨む - Q&Aタスクでの複数の日本語embeddingsの評価
この記事は、Kaggle Advent Calendar 2023の21日の記事である。
長いトークンを扱えるLLMの登場などの背景もあり、LLM出力の精度を上げる手法として Retrieval-Augmented Generation(RAG)の重要性の高まりを感じる。例えば Kaggle コンペLLM Science Examでは、上位解放の全てでRAGが使われている。RAGのコア要素の一つである、質問文などの対象文章をうまく表現した文章を取得する検索方法として、主な方法にBM25等のキーワードベースの検索や文の特徴量(embeddings)からのベクトル検索がある。
本記事では、この日本語のベクトル検索のみを使って、AI王 〜クイズAI日本一決定戦〜 第1回コンペティション(すでに終了済み)の課題を解き、どれぐらいのスコアが出るのかを確認する。また、複数の日本語embeddingsへの変換モデルを使うことで、それらの評価も行なっている。
AI王 〜クイズAI日本一決定戦〜 第一回コンペとは?
AI王 〜クイズAI日本一決定戦〜 第一回コンペとは、質問に対して約20個の候補から、回答となる一つを選択するコンペだ。train用に約13,000件、val用に約2,000件データが公開されている。またクイズの回答は、必ず日本語wikipediaに含まれている。データセット例はこのような形である。
## 質問
1868年に化石が発見された南フランスの地名から名が付いた、現在の人類の直接的な祖先とされる化石人類は何でしょう?
## 回答候補
['ホモ・ハイデルベルゲンシス', 'ホモ・サピエンス・イダルトゥ', 'クロマニョン人', 'ホモ・エルガステル', 'ジャワ原人', 'オロリン', 'サヘラントロ プス', 'アウストラロピテクス・アフリカヌス', 'ホモ・アンテセッサー', '猿人', 'ネアンデルタール人', 'ホモ・ ゲオルギクス', 'ホモ・エレクトス', '元謀原人', 'アウストラロピテクス', 'ホモ・フローレシエンシス', 'ホモ・ローデシエンシス', 'アウストラロピテクス・アファレンシス', 'ホモ・サピエンス', 'ホモ・ハビリス']
## 正解
クロマニョン人
ベクトル検索でのみで正解を予想する
コンペのクイズの回答は、必ず日本語wikipediaに含まれているということから、質問文をembeddingsを変換したものを日本語 wikipedia の passage のembeddingsから検索して、類似度が高いTop-Nのpassageとwikipedia タイトルを抜き出す。そのデータに対し、20個の候補の文字列の最初の登場位置を抽出し、最も登場位置が先頭なものを正解予想とする。wikipedia の検索にはRAG用途に使える、Wikipedia 日本語の embeddings とベクトル検索用の faiss index を作ったの約550万件の Passage データを対象とする。
例えば先ほどの例なら、「1868年に化石が発見された南フランスの地名から名が付いた、現在の人類の直接的な祖先とされる化石人類は何でしょう?」をembeddingsに変換して、ベクトル検索でTop-N(以下の例はTop-3)を取り出し、一つのテキストに結合する。
南アフリカの人類化石遺跡群 クロマニョン人 化石人類 そのため、180万年前から150万年前と推測されるその時期、東アフリカではヒト属が優勢になっていたのに対し、南アフリカで優勢だったのはパラントロプス属の方だったのだろうと考えられている。グラディスヴェール はスタルクフォンテインから8 km ほどの場所にある遺跡で、1948年には探索が行われていたが、化石人骨の出土は1992年になってのことだった。この地で調査に当たっていた古人類学者リー・バーガー(英語版)は、アウストラロピテクス・アフリカヌスの断片を見つけるにとど まっていたという。しかし、バーガーは2008年8月にヨハネスブルグからグラディスヴェールに向かう大きな道を数 km 手前で脇に逸れ、グーグル・アースで見当をつけていた近隣の石灰石採掘場跡に赴いた。その場所で彼は9歳の息子マシューとともに、新種の猿人化石を発見した。 クロマニョン人(クロマニョンじん、Cro-Magnon man)とは、南フランスで発見された人類化石に付けられた名称である。1868年、クロマニョン (Cro-Magnon) 洞窟で、鉄道工事に際して5体の人骨化石が出土し、古生物学者ルイ・ラルテ(フランス語版、英語版)によって研究された。その後、ヨーロッパ、北アフリカ各地でも発見された。現在ではクロマニョン人を、現世人類と合わせて解剖学的現代人(英語: anatomically modern human) (AMH) と呼ぶことがある。またネアンデルタール人を、従来の日本語では旧人と呼ぶのに対し(ネアンデルター ル人以外にも、25万年前に新人段階に達する前の、現代型サピエンスの直接の祖先である古代型サピエンス等も旧人段階の人類とみなすこ とがある)、クロマニョン人に代表される現代型ホモ・サピエンスを、従来の日本語では新人と呼ぶこともある。 化石人類(かせきじんるい、英語: fossil hominidまたはfossil man)は、現在ではすでに化石化してその人骨が発見される過去の人類。人類の進化を考察していくうえで重要な化石資料となる。資料そのものは化石人骨(かせきじんこつ)とも称する。また、主に第四紀更新世(洪積世)の地層で発見される ので更新世人類ないし洪積世人類とも称する。
このテキストから、先ほどの回答候補で探索して、最初に登場したものを答えとする。回答候補が 'ホモ・ハイデルベルゲンシス', 'ホモ・サピエンス・イダルトゥ', 'クロマニョン人', 'ホモ・エルガステル', 'ジャワ原人',...
なので、この中では「クロマニョン人」が正解予想となる。そして正解は「クロマニョン人」なので、この場合は正解予想と真の正解が一致するので、正解となる。
各種日本語 embeddings モデルと正解率
利用データとしては、AI王 〜クイズAI日本一決定戦〜 第一回で提供されているvalidation(dev1, dev2)用のデータ約2000件を使って正解率で評価した。また日本語を embeddings へ変換するモデルとして、以下を利用した。
- intfloat/multilingual-e5-small
- intfloat/multilingual-e5-base
- intfloat/multilingual-e5-large
- pkshatech/GLuCoSE-base-ja
- cl-nagoya/sup-simcse-ja-base
e5シリーズはRetrive用なら大元の文章の接頭語に passage:
を、それ以外なら query:
をつけることで異なったembeddingsが生成されるので、両方のデータを試した。また、検索はfaissのIVFPQで圧縮したインデクスを使っているため、ベクトル検索の高速化アルゴリズムと量子化パラメータの速度・データサイズ・精度の計測 - RAGでの利用時にはtop-N を意識するの値を用いると、圧縮しなかった場合に比べTop-3では+=2%、Top-5では+=0.5%ほど回答精度に揺らぎが発生している可能性がある。
結果は以下。参考に、trainの13,000件のデータの評価別シートに記載してある。なおacc@NがTop-Nのデータから計算した正解率、NMR@Nが回答候補20キーワードがTop-Nから見つからなかった率(no match rate)である。
- 評価に使ったコード
- スコアまとめ
Top-1,3,5,10,20...どのケースにおいても、multilingual-e5-large
が圧勝である。正直multilingual-e5-small
でもmultilingual-e5-large
でもそんなに変わらないんじゃない?という偏った視点があったが、small と large で正解率が7%前後も違うもなるとだいぶ変わってくる。また、意外だったのがe5でのembeddingsで passage:
と query:
を接頭語に使った時の差がbase以外はほとんどないこと。というかbase以外は結果がほぼ逆転している。質問に対した回答文章を取得するいわゆる Retrieve タスクでは、passage:
の方がスコアが良いと思っていたがそんなことなかった。この結果だけ見ると、RAG検索におけるe5でのembeddings変換は類似文章タスクでも使える、汎化性能が高いquery:
の方を用いれば良い、と思えてしまう。
なお、acc@10 より acc@100 の方が結果が悪いものがほとんどなのは、キーワード探索の順序(title@1, title@2, ..., title@N, passage@1, passage@2という順序で文字結合している)の差で、Nが増えるほど間違ったタイトルにマッチしてしまう可能性が高まるからで。
実際のコンペ上位チームスコアとの差
【AI王 〜クイズAI日本一決定戦〜】ふりかえりによると、コンペ上位チーム(LB1位)のdevのデータセットに対するCVスコアは0.95超えとのことで、e5-largeの最高スコアの 0.7791
でも全く歯が立たない。
ただ学習なし、前処理・後処理もしていないベクトル検索+単純な探索のみとしては、なかなかのスコアなのではなかろうか。今は確認できないが、当初公開されていたベースラインのBERTにファインチューニングして解いたスコアは0.8前後とのことで、学習なしの検索で0.78の精度が出るなら悪くないと感じている。
おわりに
今回は、AI王クイズ第一回コンペにベクトル検索のみで挑戦してみた。質疑応答システム等々で、LLMが持っていない知識を挿入しRAG + In-Context Learningで望んだ結果を出力する技術は、今後LLMが外部知識の追加学習を低コストで実現でき、かつハルシネーションがほぼなくなるような状況になるまで続くと思われる。また、Kaggleにおいても、NLP課題でRAG・In-Context Learningが再度出題される可能性はあるであろう。
また取り組んだコンペ課題の解き方、質問に対しての回答が含まれそうな文を検索する日本語embeddings変換モデルとしては、multilingual-e5-large
の性能が高かった。ただ、たとえば類似文章の検索タスクに関して見ると、他のモデルの方が性能が高い(JSTS, JSICKなど)ケースもあるし、取り組みたい課題・データに対して適切な性能評価をする必要がありそうだ。
この記事が kaggle の課題のヒントになったり、日本語の embeddings 活用・選択の参考になれば幸いである。