Ollama で Qwen 3 Embedding と Reranker を使用する方法 (2026年版)
RAGパイプライン向けにQwen 3埋め込み(embedding)モデルをローカル環境でセットアップする
Hyperealで構築を始めよう
Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。
クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応
OllamaでQwen 3 Embedding & Rerankerを使用する方法 (2026年版)
Qwen 3 EmbeddingおよびQwen 3 Rerankerは、Alibabaが開発した検索拡張生成(RAG)パイプライン専用の最新オープンソースモデルです。これらのモデルは、Embeddingベンチマークで最先端のパフォーマンスを発揮しながら、Ollamaを通じてコンシューマー向けハードウェア上でも効率的に動作します。
このガイドでは、両モデルのローカルでのセットアップ、RAGパイプラインへの統合、および本番環境向けたパフォーマンスの最適化方法について解説します。
EmbeddingモデルとRerankerモデルとは?
セットアップに進む前に、RAGパイプラインにおけるこれらのモデルの役割を整理しましょう。
| モデル | 役割 | 機能 |
|---|---|---|
| Embeddingモデル | 検索(Retrieval) | テキストをセマンティック検索用の数値ベクトルに変換する |
| Rerankerモデル | 再評価(Refinement) | 取得されたドキュメントをクエリへの関連性に基づいて再スコアリングする |
| LLM | 生成(Generation) | 取得されたコンテキストを使用して最終的な回答を生成する |
一般的なRAGパイプラインの流れは以下の通りです。
クエリ → Embeddingモデル → ベクトル検索 → 上位 K件の結果
→ Reranker → 再ランク付けされた上位 N件 → LLM → 回答
Embeddingモデルは候補を素早く見つけ出し、Rerankerはそれらを精査して精度を高めます。両者を併用することで、Embedding単体の場合と比べて回答の質が劇的に向上します。
Qwen 3 Embedding: モデルのバリエーション
Qwen 3には複数のEmbeddingモデルサイズが用意されています。
| モデル | パラメータ数 | 次元数 | 最大トークン数 | MTEBスコア | 必要VRAM |
|---|---|---|---|---|---|
| qwen3-embedding-0.6b | 0.6B | 1024 | 8,192 | 68.2 | ~1.5 GB |
| qwen3-embedding-1.5b | 1.5B | 1536 | 8,192 | 71.8 | ~3 GB |
| qwen3-embedding-4b | 4B | 2560 | 32,768 | 74.1 | ~6 GB |
| qwen3-embedding-8b | 8B | 4096 | 32,768 | 76.3 | ~10 GB |
ほとんどのユースケースにおいて、4Bモデルが品質とパフォーマンスのバランスが最も優れています。
ステップ 1: Ollamaのインストール
まだOllamaをインストールしていない場合:
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.com/install.sh | sh
# Windows
# https://ollama.com/download からダウンロード
Ollamaサーバーを起動します:
ollama serve
ステップ 2: Qwen 3 Embeddingモデルのプル
# 推奨される4Bモデルをプル
ollama pull qwen3-embedding:4b
# VRAMが少ないシステム向けに小規模モデルをプル
ollama pull qwen3-embedding:1.5b
# 最高品質を求める場合は最大モデルをプル
ollama pull qwen3-embedding:8b
モデルが利用可能か確認します:
ollama list
ステップ 3: Embeddingの生成
Ollama APIの使用
REST API経由でEmbeddingを生成します:
curl http://localhost:11434/api/embed -d '{
"model": "qwen3-embedding:4b",
"input": "検索拡張生成(RAG)はどのように機能しますか?"
}'
レスポンス:
{
"model": "qwen3-embedding:4b",
"embeddings": [
[0.0123, -0.0456, 0.0789, ...]
]
}
Pythonの使用
import ollama
# 単一テキストのEmbedding
response = ollama.embed(
model="qwen3-embedding:4b",
input="検索拡張生成(RAG)はどのように機能しますか?"
)
embedding = response["embeddings"][0]
print(f"Dimensions: {len(embedding)}") # 4Bモデルの場合は 2560
# バッチ処理によるEmbedding
documents = [
"RAGは検索と生成を組み合わせ、正確な回答を提供します。",
"ベクトルデータベースは、高速な類似性検索のためにEmbeddingを保存します。",
"Rerankerは候補を再スコアリングすることで検索精度を向上させます。",
]
response = ollama.embed(
model="qwen3-embedding:4b",
input=documents
)
embeddings = response["embeddings"]
print(f"Generated {len(embeddings)} embeddings")
ステップ 4: Qwen 3 Rerankerのセットアップ
Rerankerモデルをプルします:
ollama pull qwen3-reranker:4b
RerankerはEmbeddingモデルとは仕組みが異なります。ベクトルを生成する代わりに、クエリとドキュメントのペアを受け取り、関連性スコアを返します。
Rerankerの使用
import ollama
import json
def rerank(query: str, documents: list[str], model: str = "qwen3-reranker:4b") -> list[dict]:
"""クエリに対する関連性でドキュメントを再ランク付けします。"""
scored = []
for doc in documents:
# Rerankerは特定のプロンプト形式を期待します
prompt = f"Query: {query}\nDocument: {doc}\nRelevance:"
response = ollama.generate(
model=model,
prompt=prompt,
options={"temperature": 0}
)
# レスポンスから関連性スコアを解析
try:
score = float(response["response"].strip())
except ValueError:
score = 0.0
scored.append({"document": doc, "score": score})
# スコアの降順でソート
scored.sort(key=lambda x: x["score"], reverse=True)
return scored
# 使用例
query = "RAGの利点は何ですか?"
documents = [
"RAGは、取得したデータに基づいて回答を生成することで、ハルシネーションを抑制します。",
"東京の現在の天気は摂氏22度です。",
"検索拡張生成は、LLM出力の事実の正確性を向上させます。",
"Pythonはデータサイエンスで人気のプログラミング言語です。",
]
results = rerank(query, documents)
for r in results:
print(f"Score: {r['score']:.3f} | {r['document'][:60]}")
ステップ 5: 完全なRAGパイプラインの構築
検索に Qwen 3 Embedding、精査に Qwen 3 Reranker を使用した完全な例を以下に示します。
import ollama
import numpy as np
from typing import Optional
class SimpleRAG:
def __init__(
self,
embed_model: str = "qwen3-embedding:4b",
rerank_model: str = "qwen3-reranker:4b",
llm_model: str = "qwen3:8b",
):
self.embed_model = embed_model
self.rerank_model = rerank_model
self.llm_model = llm_model
self.documents: list[str] = []
self.embeddings: list[list[float]] = []
def add_documents(self, documents: list[str]):
"""知識ベースにドキュメントを追加します。"""
self.documents.extend(documents)
response = ollama.embed(model=self.embed_model, input=documents)
self.embeddings.extend(response["embeddings"])
print(f"Added {len(documents)} documents. Total: {len(self.documents)}")
def _cosine_similarity(self, a: list[float], b: list[float]) -> float:
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def retrieve(self, query: str, top_k: int = 10) -> list[dict]:
"""Embeddingの類似性によって上位k件のドキュメントを取得します。"""
query_embedding = ollama.embed(
model=self.embed_model, input=query
)["embeddings"][0]
scored = []
for i, doc_embedding in enumerate(self.embeddings):
score = self._cosine_similarity(query_embedding, doc_embedding)
scored.append({"index": i, "document": self.documents[i], "score": score})
scored.sort(key=lambda x: x["score"], reverse=True)
return scored[:top_k]
def rerank(self, query: str, candidates: list[dict], top_n: int = 3) -> list[dict]:
"""Rerankerモデルを使用して候補を再ランク付けします。"""
for candidate in candidates:
prompt = f"Query: {query}\nDocument: {candidate['document']}\nRelevance:"
response = ollama.generate(
model=self.rerank_model,
prompt=prompt,
options={"temperature": 0}
)
try:
candidate["rerank_score"] = float(response["response"].strip())
except ValueError:
candidate["rerank_score"] = 0.0
candidates.sort(key=lambda x: x["rerank_score"], reverse=True)
return candidates[:top_n]
def query(self, question: str, top_k: int = 10, top_n: int = 3) -> str:
"""完全なRAGパイプライン:検索、再ランク、生成。"""
# ステップ 1: 検索
candidates = self.retrieve(question, top_k=top_k)
# ステップ 2: 再ランク
reranked = self.rerank(question, candidates, top_n=top_n)
# ステップ 3: 生成
context = "\n\n".join([r["document"] for r in reranked])
prompt = f"""提供されたコンテキストに基づいて質問に答えてください。
Context:
{context}
Question: {question}
Answer:"""
response = ollama.generate(model=self.llm_model, prompt=prompt)
return response["response"]
# 使用法
rag = SimpleRAG()
# 知識ベースの追加
rag.add_documents([
"Qwen 3 Embeddingは、高品質なベクトル表現を生成します。",
"Ollamaを使用すると、コンシューマー向けハードウェアでモデルをローカル実行できます。",
"Rerankerは、取得したドキュメントを再スコアリングして精度を向上させます。",
"RAGパイプラインは検索と生成を組み合わせ、より良い回答を提供します。",
"ChromaDBやQdrantなどのベクトルデータベースは、Embeddingを効率的に保存します。",
])
# 質問する
answer = rag.query("RerankerはどのようにRAGパイプラインを改善しますか?")
print(answer)
ステップ 6: LangChain または LlamaIndex での使用
LangChain との統合
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
# Embeddingのインスタンス作成
embeddings = OllamaEmbeddings(
model="qwen3-embedding:4b",
base_url="http://localhost:11434",
)
# ChromaDBでの使用
vectorstore = Chroma.from_texts(
texts=["doc1", "doc2", "doc3"],
embedding=embeddings,
collection_name="my_collection",
)
# 検索
results = vectorstore.similarity_search("my query", k=5)
LlamaIndex との統合
from llama_index.embeddings.ollama import OllamaEmbedding
embed_model = OllamaEmbedding(
model_name="qwen3-embedding:4b",
base_url="http://localhost:11434",
)
# LlamaIndexパイプラインでの使用
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(
documents,
embed_model=embed_model,
)
パフォーマンスのチューニング
バッチサイズの最適化
大量のドキュメントセットを処理する場合は、速度とメモリのバランスを取るためにバッチサイズを調整してください。
# ドキュメントをバッチ単位で処理
batch_size = 32
for i in range(0, len(documents), batch_size):
batch = documents[i:i + batch_size]
embeddings = ollama.embed(model="qwen3-embedding:4b", input=batch)
推奨ハードウェア
| VRAM | 推奨構成 |
|---|---|
| 4 GB | Embedding: 0.6B, Reranker: なし, LLM: 1.5B |
| 8 GB | Embedding: 1.5B, Reranker: 1.5B, LLM: 4B |
| 16 GB | Embedding: 4B, Reranker: 4B, LLM: 8B |
| 24 GB | Embedding: 8B, Reranker: 4B, LLM: 14B |
量子化
Ollamaのモデルは通常、量子化されたフォーマットで提供されます。Embeddingモデルの場合、精度の高さがより重要になります。
# EmbeddingモデルにはQ8量子化を使用(高品質)
ollama pull qwen3-embedding:4b-q8_0
# RerankerとLLMにはQ4で十分です
ollama pull qwen3-reranker:4b-q4_K_M
トラブルシューティング
| 問題 | 解決策 |
|---|---|
| "Model not found" | ollama pull qwen3-embedding:4b を実行してください |
| メモリ不足 (Out of memory) | より小さいモデルバリアントを使用するか、スワップを増やしてください |
| Embeddingの速度が遅い | バッチサイズを減らすか、GPUアクセラレーションを使用してください |
| 検索品質が低い | 8B Embeddingモデルへのアップグレードを検討してください |
| Rerankerのスコアが不安定 | temperature が 0 に設定されているか確認してください |
結論
Qwen 3 EmbeddingおよびRerankerモデルをOllamaと組み合わせることで、クラウドベースのソリューションに匹敵する、完全にローカルでプライバシーに配慮したRAGパイプラインを構築できます。4Bバリアントは品質とパフォーマンスの優れたバランスを提供し、より大規模な8Bモデルは最先端の領域まで精度を押し上げます。
もしRAGパイプラインにおいて、取得した情報に基づいた画像、ビデオ、オーディオなどのメディアコンテンツ生成が必要な場合は、Hypereal AI が高速で手頃な価格のAIメディア生成APIを提供しています。ローカルの検索機能とクラウドベースの生成機能を組み合わせることで、強力なエンドツーエンドのAIパイプラインを実現してください。
