EmbeddingモデルとLLMを組み合わせて、より賢いAIアプリを作る方法

最近では 大規模言語モデル(LLM)、たとえば GPT-4、Llama-3、Qwen2.5 などが大きな注目を集めています。
しかし、LLMをあなた独自のデータで効果的に活用するには、もう一つのモデル — Embeddingモデル — が必要です。

この記事では、Embeddingとは何か、その重要性、そしてEmbeddingモデルとLLMを組み合わせて セマンティック検索RAG(Retrieval-Augmented Generation) を構築する方法を解説します。


1. Embeddingモデルとは?

Embeddingモデル はテキスト(または他の種類のデータ)を ベクトル(数値のリスト)に変換し、その意味を数値空間にエンコードします。
ベクトル空間 では、意味が似ているコンテンツは近くに配置され、異なる意味は遠くに配置されます。

例:

"犬"    → [0.12, -0.09, 0.33, ...]
"子犬"  → [0.11, -0.08, 0.31, ...]  ← 意味が近い
"飛行機" → [-0.44, 0.88, 0.05, ...]  ← 意味が遠い

代表的なEmbeddingモデル

  • OpenAI: text-embedding-3-largetext-embedding-3-small
  • ローカル実行: mxbai-embed-largeall-MiniLM-L6-v2Qwen3-Embedding-0.6B-GGUF
  • 多言語対応: embed-multilingual-v3.0(Cohere)

2. なぜLLMと組み合わせるのか?

LLMは文章生成や推論が得意ですが、あなたの固有データには直接アクセスできません。
Embeddingモデルを使えば、**意味ベースの検索(セマンティック検索)**でデータベースから関連情報を取得できます。

この組み合わせが RAG の中核です:

  1. Embeddingモデル → すべての文書をベクトル化し、ベクトルDB に保存。
  2. LLM → 質問を受け取り、ベクトルDBから関連情報を取得して回答を生成。

3. RAGの流れ

graph TD
A["ユーザーの質問"] --> B["Embeddingモデル → クエリベクトル"]
B --> C["ベクトルDB → 類似ドキュメント検索"]
C --> D["関連ドキュメント"]
D --> E["LLM → 質問+情報 → 最終回答"]

ステップごとの解説

ステップ1: 文書の前処理と保存

  • 文書を小さなチャンク(例:500トークン)に分割
  • Embeddingモデルで各チャンクをベクトル化
  • ベクトル+メタデータを ベクトルDB(例:Qdrant, Milvus, Weaviate)に保存

ステップ2: ユーザー質問の処理

  • 質問を同じEmbeddingモデルでベクトル化
  • 類似度検索で最も近いベクトルを取得
  • 元のテキストを取得

ステップ3: 回答生成

  • 質問と取得したテキストをLLMに入力
  • LLMが文脈に基づいて回答を生成

4. コード例: OpenAI API + Qdrant + GPT-4

from openai import OpenAI
import qdrant_client

client = OpenAI(api_key="YOUR_KEY")
qdrant = qdrant_client.QdrantClient(":memory:")

# 1. 文書を埋め込み
doc = "ドリアンは東南アジアで栽培される熱帯フルーツです。"
embedding = client.embeddings.create(
    model="text-embedding-3-large",
    input=doc
).data[0].embedding

qdrant.recreate_collection("docs", vector_size=len(embedding))
qdrant.upsert("docs", [(0, embedding, {"text": doc})])

# 2. 質問を埋め込み
query = "ドリアンはどこで栽培されていますか?"
query_vec = client.embeddings.create(
    model="text-embedding-3-large",
    input=query
).data[0].embedding

results = qdrant.search("docs", query_vec, limit=1)
context = results[0].payload["text"]

# 3. 回答生成
answer = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "提供された情報に基づいて回答してください。"},
        {"role": "user", "content": f"情報: {context}\n\n質問: {query}"}
    ]
)

print(answer.choices[0].message["content"])

5. ベストプラクティス

  • ドメインに合ったEmbeddingモデルを選ぶ(多言語対応が必要ならそれに合うモデルを)
  • チャンクサイズは重要:小さすぎると文脈を失い、大きすぎると検索精度が落ちる
  • 埋め込みと検索は必ず同じモデルを使う
  • 複数チャンクを扱う場合は長コンテキスト対応のLLMを使う

6. 利用シーン

  • ナレッジベースQ\&A
  • 大規模コーパスのセマンティック検索
  • 独自文書にアクセスできるチャットボット
  • 企業向け文脈対応アシスタント

まとめ
EmbeddingモデルLLMを組み合わせることで、検索の精度と文章生成の自然さを両立できます。
これは、ChatGPT EnterpriseからローカルRAGボットまで、ほぼすべての高度なAIアプリケーションが採用している方法です。


Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products