7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「RAG」「言語の“隔離”」という発想

Last updated at Posted at 2026-01-20

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 を変えれば改善するのでは?」

しかし実運用では、

  1. 言語が増えるたびに Index を分ける
  2. モデルを切り替える
  3. Prompt 側で頑張る

といった対応は、スケール・保守性・コスト面で破綻しやすいです。

解決策:Vector Distance に“依存しない”

発想の転換

Vector Search は意味検索だけに使う。
言語の正しさは、別のレイヤーで保証する。

そこで採用したのが Metadata Filtering です。

アプローチ:言語を Metadata として明示的に隔離する

基本方針

  1. すべての Document / Cache Entry に language タグを付与
  2. 検索時に 必ず language filter を強制
  3. 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 は魔法ではない。だからこそ、設計で制御する。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?