はじめに
近年、RAG 構成が広く使われるようになり、検索精度を高めるための「再ランキング(reranking)」手法としてCross-Encoderが注目されています。
Cross-Encoderとは
Cross-Encoderとは、クエリ(質問文)と文書を同時にモデルへ入力し、それらの関連度を直接スコアとして出力するモデルです。
この形式により、クエリと文書のトークン同士の相互作用を考慮した高精度なスコアリングが可能になります。
Pythonによる実装例
ここでは sentence-transformers ライブラリを使って、Cross-Encoderを実際に動かしてみます。
サンプルコード
from sentence_transformers import CrossEncoder
# Hugging Face に公開されているCross-Encoderモデルの読み込み
model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
query = "RAGとは何ですか?"
docs = [
"RAGは検索と生成AIを組み合わせた仕組みです。",
"今日は天気がいいです。",
"Pythonはプログラミング言語です。"
]
# (query, doc) のペアを作成
pairs = [(query, doc) for doc in docs]
# スコアを計算
scores = model.predict(pairs)
# スコアの高い順に表示
for doc, score in sorted(zip(docs, scores), key=lambda x: x[1], reverse=True):
print(f"{score:.3f}: {doc}")
実行結果イメージ
0.92: RAGは検索と生成AIを組み合わせた仕組みです。
0.15: Pythonはプログラミング言語です。
0.02: 今日は天気がいいです。
出力スコアの意味
Cross-Encoderの出力は、クエリと文書の「関連度」を表す値です。
重要なのは、「スコアの絶対値」ではなく「相対的な大小関係」です。
複数の文書を並べたときに、どれが最も関連度が高いかを判断するために利用します。
さいごに
Cross-Encoderは、クエリと文書の関係性をより正確に評価できるため、RAG構成における再ランキング手法として有効です。
Embedding検索と組み合わせることで、検索精度を保ちつつ実用的な構成にできます。
RAGの精度改善を検討している場合は、Cross-Encoderの導入を試すのも良いのかなと思います。