Multilingual Vector Search における実践的な設計パターン
LLM や RAG を実運用に組み込む中で、Multilingual Embedding は非常に便利な一方、
実際に使ってみると見過ごせない問題に直面します。
本記事では、
多言語 Vector Search において検索結果の言語が混ざってしまう問題と、
それをMetadata Filtering によって解決した実践的アプローチを紹介します。
問題:Multilingual Embedding Space の落とし穴
多くの Embedding Model(OpenAI, Cohere, SentenceTransformers など)は
**多言語対応(Multilingual)**を前提に設計されています。
その結果、Embedding 空間では以下のような性質が生まれます。
"Hello"
"Xin chào"
"こんにちは"
これらは意味的に同一とみなされ、
Vector Space 上では非常に近い位置に配置されます。
何が問題なのか?
KNN Search(近傍探索)では 「距離が近いものが正義」 です。
そのため、
- ユーザーの入力:ベトナム語
- 検索結果:英語の Document
という状況が 高確率で発生します。
実際のユーザー体験
- 質問:ベトナム語
- 回答:英語(もしくは混在)
👉 意味は合っているが、UX としては最悪
👉 いわゆる「半生半焼け(nửa nạc nửa mỡ)」状態
よくある誤解:Embedding を変えれば解決する?
この問題に直面したとき、最初に考えがちなのは:
- 「単言語 Embedding を使えばいいのでは?」
- 「Model を変えれば改善するのでは?」
しかし実運用では、
- 言語が増えるたびに Index を分ける
- モデルを切り替える
- Prompt 側で頑張る
といった対応は、スケール・保守性・コスト面で破綻しやすいです。
解決策:Vector Distance に“依存しない”
発想の転換
Vector Search は意味検索だけに使う。
言語の正しさは、別のレイヤーで保証する。
そこで採用したのが Metadata Filtering です。
アプローチ:言語を Metadata として明示的に隔離する
基本方針
- すべての Document / Cache Entry に
languageタグを付与 - 検索時に 必ず
language filterを強制 - Vector Distance は 同一言語空間内でのみ有効
例:保存時の Metadata
{
"language": "vi",
"source": "faq",
"version": "v1"
}
実装例:Language Boundary を Firewall にする
以下は RedisStack / VectorDB を想定したシンプルな例です。
def check_with_language(prompt: str, language: str = "vi"):
# Enforce strict language boundary via Metadata Filter
filter_expr = Tag("language") == language
results = cache.check(
prompt=prompt,
filter_expression=filter_expr, # <--- The Firewall
num_results=1
)
return results[0] if results else None
ポイント
-
filter_expressionが 言語の防火壁(Firewall) - Vector Search はこの条件を 絶対に越えられない
- 類似度がどれだけ高くても、言語が違えばヒットしない
トレードオフ:データの重複を受け入れる
この設計では、意図的に以下を受け入れます。
同じ意味の Document が
language = vi
language = en
language = jaとして 複数存在する(Semantic Duplicate)
なぜそれで良いのか?
- ストレージコスト:安い
- 計算コスト:微増
- UX の改善効果:非常に大きい
👉 「正しく表示される」ことは、「少し賢い検索」よりも価値が高い
この設計が有効なケース
- RAG を業務システムに組み込む場合
- 多言語対応 SaaS
- 社内ナレッジ検索
- キャッシュ(Semantic Cache)を使っている構成
特に Semantic Cache × Multilingual の組み合わせでは、この設計を入れないと事故が起きやすいです。
まとめ
- Multilingual Embedding は便利だが、そのまま使うと危険
- Vector Distance にすべてを任せない
- 言語は Metadata で明示的に隔離する
- データの重複より、UX と一貫性を優先する
Vector Search は魔法ではない。だからこそ、設計で制御する。