A Day in the Life

日本語 RAG タスクで e5-large 並みの性能の ColBERT

先日公開された、ColBERT の日本語pretrainモデル、JaColBERTの性能が良いらしい。早速、普段評価に利用している、AIクイズ王のQ&A RAGタスクで評価してみた。

評価

結果としては、multilingual-e5-large よりわずかに低い、という結果となった。学習データも少なく、モデルサイズも12層のBert(= multilingual-e5-smallと同じサイズ)とほとんど一緒なのにね、すごい。

ColBERT の実装と論文を読む

というわけで、ColBERT に興味が湧いたので、論文と実装を読んでみる。

ColBERTはいわゆるSentenceTransformer等を用いて文からEmbeddings(文ベクトル)を出力して類似度比較で検索、ではなくトークンベースの類似度検索だ。文の最終隠れ層は、その文章のコンテキスト文脈の情報をトークン単位でも持っているので、文全体ではなくトークン単位で使って類似度を算出する。

MaxSim

類似度計算は、queryとdocumentのトークンの出力のコサイン類似度をとって、最大のものを足し合わせるという MaxSim という計算手法。MaxSimの計算自体は単純である。

query と document は別にエンコードする必要があるのだけど、使っているモデルは Bert (12層) + 独自HEAD (linear 128次元)。Bert 12層の隠れ層出力は768次元なので、それを128次元へと線形層を通して変換している。

実実装では、queryとdocumentは、query の場合は prefix に [CLS][unused0] を、document の場合は [CLS][unused1] といった形で CLS の後に判断のための独自トークンをつけて区別をしているだけで、エンコーダ自体は同じである。

これらでエンコードした結果を、MaxSimをとることで、一番数値が大きいdocumentがqueryに似ていると判定する。なおColBERT実装では、documentのtokenのうち、記号やpadding tokenなどは無視(mask)して計算していた。

検索時のパフォーマンス問題の解消

普通の文ベクトルを探す手法なら、ANNを始めとした近似最近傍探索を使えば、数億以上の文章からも高速な検索が可能だ。しかしながらColBERTは文ベクトルではなく、トークン同士の類似度を用いたMaxSim計算なので、この手法はママ使えない。

という問題に対応するために高速に近傍探索ができるindexを作る方法が載っているのが論文ColBERTv2。あれこれとベクトルを情報圧縮し、Kmeansでcentroidを求め、そこから探索しているようだ。実装ではfaissをimportしていたので、そのままfaissのindexを使っているのかな、と思いきや、faissはKmeanでクラスタ中心点を計算しているのに使っているだけであった。一度インデクスを作ってしまえば、その後の検索はサクサク。

なお、前述のAIクイズ王のQ&A RAGタスクの550万Passageをこの方法でindex作成するのに、Ryzen 3900 + RTX 3090の環境で5時間前後であった。faissはgpu利用版のfaiss-gpuでないと、かなり遅いので注意だ。

省データで学習可能

JaColBERT のレポートによると、bert-base-japanese-v3を元に、1000万のトリプレットデータとNVidia L4 GPU * 8 の省リソースで10時間学習させて作ったとのこと。データ量が少なく、かつ学習時間が短いとなると、夢が広がる結果である。

ColBERT の問題点・利用が大変

ColBERT の実装は読んでみて分かったが、処理の複雑性とそもそもの実装コードの複雑性も相まって、サクッと使うのが難しい。それを解消するために、ゼロコンフィグでもすぐに使えるアプローチが RAGatouille である。今回の評価にもRAGatouilleを利用した。

RAGatouille はインデクスの作成・検索はもちろん、Trainerで学習させることもできる。また、LangChain の retriver にすることもできるなど、今風の対応も入っている。

ColBERT は本番環境の検索サーバで使えそうか?

ColBERT の気になりどころとしては、そもそも本番で運用できそうかというところがある。今(2024/02頭)時点では、自前で検索用APIサーバ実装して運用が前提になり、手軽に動かすのがなかなか大変そうである。

しかしながらRAGatouilleのドキュメントによると、近日中に検索エンジンのVespaが対応するっぽいことが書かれているので、そうなるとだいぶ運用が楽になりそうである。またIndexのデータ追加もまだ試験的なようで、その辺も問題なくできるようになれば、本番環境でも十分検討できそうである。

何より、自前ドメインのデータを省コストで学習させることができるなら、自前データに対して高品質なRAG用のデータ取得検索として使えそうなので、そのようなユースケースなら積極的に検討したい。

おわりに

というわけで ColBERT すごい!というお話でした。情報検索を研究している人からすると ColBERT は既知の話かとは思うが、自分は知らなかったので調べてみて新鮮だった。また、JaColBERT が無ければそもそも興味がわかなかったと思うので、作者の Benjamin Clavié 氏に感謝。なお氏は RAGatouille の作者でもある、ありがたい。

記事の一覧 >

関連するかもエントリー

RAG用途に使える、Wikipedia 日本語の embeddings とベクトル検索用の faiss index を作った
この記事は、情報検索・検索技術 Advent Calendar 2023の12月4日の記事である。昨今のLLMの台頭により、外部情報を In-Context Learning として利用しLLMの生成結果の性能を高めることが可能な RAG(Retrieval Augmented ...
この記事は、情報検索・検索技術 Advent Calendar 2023の12月4日の記事である。昨今のLLMの台頭により、外部情報を In...
OpenAIの新embeddings,text-embedding-3-smallをRAGタスクで評価する
先日、OpenAI から新しい embeddings モデルである、text-embedding-3-smallとtext-embedding-3-largeが公開された。text-embedding-3-smallは、古いembeddingsモデルのada-v2よりも価格は1/...
先日、OpenAI から新しい embeddings モデルである、text-embedding-3-smallとtext-embeddin...
ベクトル検索のみで、AI王クイズ第一回コンペに臨む - Q&Aタスクでの複数の日本語embeddingsの評価
この記事は、Kaggle Advent Calendar 2023の21日の記事である。長いトークンを扱えるLLMの登場などの背景もあり、LLM出力の精度を上げる手法として Retrieval-Augmented Generation(RAG)の重要性の高まりを感じる。例えば K...
この記事は、Kaggle Advent Calendar 2023の21日の記事である。長いトークンを扱えるLLMの登場などの背景もあり、L...