- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 埋め込みを替えることはインデックスを作り直すことです
- 次元と最大長が実際の設計値です
- 接頭辞を落とすと使い方が間違っている状態になります
- 多言語対応の表記と日本語・韓国語の品質は別の話です
- リランカーは埋め込みとは別物です
- MTEBのスコアが語らないこと
- コード例
- 選ぶ順序
- 自分で試す
- シリーズ案内
- 参考資料
モデル情報は2026-08-12にHugging Faceのページで直接確認しました。モデルカードとライセンスは変わりうるので、使用前に原本を再確認してください。
埋め込みを替えることはインデックスを作り直すことです
生成モデルはいつでも交換できます。埋め込みモデルは違います。替えた瞬間に保存済みのベクトルはすべて無意味になり、原文全体を再エンコードする必要があります。文書が数百万件なら数日仕事で、その間の検索品質は2つのインデックスの間のどこかに置かれます。
そのため埋め込みの選択は、生成モデルの選択よりずっと前に、ずっと慎重に行う必要があります。判断材料はリーダーボードの順位ではなく、以下の4つの数字と1つの規約です。
次元と最大長が実際の設計値です
| リポジトリ | license | 次元 | 最大入力 | カード記載の言語 |
|---|---|---|---|---|
sentence-transformers/all-MiniLM-L6-v2 | apache-2.0 | 384 | 256 word pieceを超えると切り捨て | 英語 |
intfloat/multilingual-e5-large | mit | 1024 | 512トークンを超えると切り捨て | 94言語 |
BAAI/bge-m3 | mit | 1024 | 8192 | 100以上 |
Alibaba-NLP/gte-multilingual-base | apache-2.0 | 768 | 8192 | 70以上 |
Qwen/Qwen3-Embedding-0.6B | apache-2.0 | 最大1024、32から1024まで指定可 | 32k | 100以上 |
Qwen/Qwen3-Embedding-8B | apache-2.0 | 最大4096、32から4096まで指定可 | 32k | 100以上 |
次元は品質の等級ではなく、保存コストと検索速度です。文書1000万件をfloat32で保存すると、384次元でおよそ15GB、1024次元でおよそ41GBになります。ベクトルデータベースの料金とメモリ常駐の可否がここで分かれます。Qwen/Qwen3-Embedding-0.6B のように出力次元を32から1024の間で指定できるモデルは、この判断を配備時点まで先送りできます。
最大入力長はチャンク戦略を直接決めます。intfloat/multilingual-e5-large のカードは512トークンを超えるテキストが切り捨てられると明記します。切り捨ては エラーではなく後半が静かに消えることなので、長い段落をそのまま入れて検索できない理由が分からず迷う事態がよく起きます。BAAI/bge-m3 と Alibaba-NLP/gte-multilingual-base は8192まで受け取るため、文書単位のエンコードが可能です。
接頭辞を落とすと使い方が間違っている状態になります
intfloat/multilingual-e5-large のカードは、すべての入力がqueryまたはpassageの接頭辞で始まる必要があり、英語以外のテキストでも同じだと記します。同じ規約は nlpai-lab/KoE5 にも書かれています。非対称な検索では、質問にqueryの接頭辞を、文書にpassageの接頭辞を付けます。
これを落とすと、モデルはエラーなくベクトルを返し、検索品質だけが静かに落ちます。新しい埋め込みモデルを付けて期待より悪いなら、スコアを疑う前にカードの使用例を一字ずつ読み直す方が早道です。
Qwen/Qwen3-Embedding-0.6B は別の形の規約を使います。カードはこのモデルが指示を認識し、質問ごとに課題を説明する一文の指示を添える必要があると記し、指示を使うと使わない場合よりおよそ1から5パーセントの改善があったと報告します。Alibaba-NLP/gte-multilingual-base は使用例に trust_remote_code=True が必要だと記していますが、これは品質の問題ではなくリポジトリのコードを実行する承認なので、社内のセキュリティ方針と衝突しうる点です。
多言語対応の表記と日本語・韓国語の品質は別の話です
100言語対応という文は、その言語のテキストを処理するという意味であって、その言語で上手だという意味ではありません。intfloat/multilingual-e5-large のカード自身が、資源の少ない言語では性能が落ちうると記しています。
韓国語を狙って追加学習したモデルもあります。
| リポジトリ | license | ベースモデル | 次元 | 最大入力 |
|---|---|---|---|---|
nlpai-lab/KURE-v1 | mit | BAAI/bge-m3 | 1024 | 8192 |
nlpai-lab/KoE5 | MIT | intfloat/multilingual-e5-large | 1024 | 512 |
dragonkue/BGE-m3-ko | apache-2.0 | BAAI/bge-m3 | 1024 | 8192 |
3つともベースモデルの次元と最大長をそのまま受け継ぎます。つまり nlpai-lab/KoE5 を選ぶと512トークンの制約も一緒に付いてきます。dragonkue/BGE-m3-ko のカードは、中国語と英語以外の言語の学習が十分でなく追加学習が必要だというベースモデル側の限界をそのまま書き写し、短い文字列より長いコーパスで利点があると述べます。
どちらが自分のデータに合うかはカードでは決められません。自分の文書から質問を100件ほど抜き出して正解文書をラベル付けし、直接測る以外に方法はありません。
リランカーは埋め込みとは別物です
埋め込みは文書をあらかじめベクトルにしておき、質問ベクトルと比べます。リランカーは質問と文書を一組にして入れ、関連度スコアを出します。事前計算できないため全文書には使えず、埋め込みが絞った上位候補にのみ適用します。
| リポジトリ | license | 形態 | 最大長 |
|---|---|---|---|
BAAI/bge-reranker-v2-m3 | apache-2.0 | テキスト分類に分類されたリランカー、ベースは bge-m3 | 使用例で512 |
Qwen/Qwen3-Reranker-0.6B | apache-2.0 | テキストリランキング、100以上の言語 | 32k |
BAAI/bge-reranker-v2-m3 のカードは、出力が関連度スコアであり、シグモイドを通せば0から1の実数に写せると記します。つまり生の出力は確率ではないので、しきい値を0.5のままにしてはいけません。同じカードは use_fp16 を有効にすると計算が速くなる代わりに性能がわずかに落ちるとも述べています。
MTEBのスコアが語らないこと
Qwen/Qwen3-Embedding-8B のカードは、MTEB多言語部門のスコア70.58と2025年6月5日時点で1位という自己申告値を載せています。この文で実務的に重要なのはスコアではなく日付です。
リーダーボードの順位は時間が経てば変わり、カードの値はその時点のスナップショットです。より根本的には、MTEBの課題構成と言語比重は自分のサービスの文書分布と違います。社内ウィキ検索と商品説明検索と法律文書検索は別の問題であり、総合スコア1行では並びません。
カードのベンチマーク数値は配布者の自己申告であり、独立した評価ではありません。この記事が複数の埋め込みモデルのスコアを並べた比較表を作らない理由も同じです。評価ツールとプロンプト規約が違えば、同名の指標が別のものを測るからです。
コード例
# 例: 接頭辞の規約を守って埋め込みを作ります
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("intfloat/multilingual-e5-large")
queries = ["query: 年次有給休暇の繰り越しはどうなりますか"]
passages = ["passage: 未使用の年休は翌年3月まで繰り越せます。"]
qv = model.encode(queries, normalize_embeddings=True)
pv = model.encode(passages, normalize_embeddings=True)
print((qv @ pv.T)[0][0])
リランカーは候補を絞ってから付けます。
# 例: 上位候補にのみリランカーを適用します
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3", max_length=512)
query = "年休の繰り越し規定"
candidates = ["未使用の年休は翌年3月まで繰り越せます。", "出張費の精算は月末に処理します。"]
scores = reranker.predict([(query, c) for c in candidates])
print(sorted(zip(scores, candidates), reverse=True))
選ぶ順序
- 文書数と予算で賄える次元の範囲を先に決めます。
- チャンク長を決め、その長さを切り捨てない最大入力を持つモデルだけを残します。
- カードの接頭辞または指示の規約を確認し、そのまま実装します。
- 自分の文書から質問を100件抜き出してラベル付けし、候補を直接比較します。
- 埋め込みで上位50件を取り、リランカーで上位5件を選ぶ2段構成を基本にします。
自分で試す
- ML学習データエクスプローラー — 学習データの性格が検索品質にどうつながるかを見ます。
- AIベンチマーク集 — ベンチマークが何を測り何を測らないかを確認します。
- ブラウザAIラボ — 小さな埋め込みモデルを動かして類似度の感覚をつかみます。
シリーズ案内
- 前の記事: テキスト生成オープンモデルをサイズ別に選ぶ
- 次の記事: 韓国語に対応するオープンモデルとトークナイザのコスト
参考資料
- 表のすべての値は2026-08-12に該当モデルのHugging Faceページから直接読みました。ページになかった項目は明記なしと書いています。
Qwen/Qwen3-Embedding-8BのMTEB数値はカードに載った自己申告値であり、独立した評価ではありません。- ライセンス全文を自分で読み、商用利用は法務レビューを通してください。