如何在 Ollama 中使用 Qwen 3 Embedding 和 Reranker (2026)
在本地为 RAG 流水线部署 Qwen 3 嵌入模型
开始使用 Hypereal 构建
通过单个 API 访问 Kling、Flux、Sora、Veo 等。免费积分开始,扩展到数百万。
无需信用卡 • 10万+ 开发者 • 企业级服务
如何通过 Ollama 使用 Qwen 3 Embedding 和 Reranker (2026)
Qwen 3 Embedding 和 Qwen 3 Reranker 是阿里巴巴最新推出的开源模型,专为检索增强生成(RAG)工作流量身定制。它们在 Embedding 基准测试中表现出顶尖性能,同时能够通过 Ollama 在消费级硬件上高效运行。
本指南将带你完成两个模型的本地部署,并演示如何将它们集成到 RAG 流程中,以及如何针对生产环境进行性能优化。
什么是 Embedding 和 Reranker 模型?
在开始配置之前,我们先明确这些模型在 RAG 流程中的作用:
| 模型 | 角色 | 作用 |
|---|---|---|
| Embedding 模型 | 检索 (Retrieval) | 将文本转换为数值向量,用于语义搜索 |
| Reranker 模型 | 精排 (Refinement) | 对检索到的文档进行重新打分,判断其与查询的相关性 |
| LLM | 生成 (Generation) | 结合检索到的上下文生成最终答案 |
一个典型的 RAG 流程如下:
查询 → Embedding 模型 → 向量搜索 → Top-K 结果
→ Reranker 模型 → 重排后的 Top-N → LLM → 答案
Embedding 模型负责快速找到候选结果,而 Reranker 模型负责过滤以提升精度。两者结合使用,比起仅使用 Embedding 能显著提升回答质量。
Qwen 3 Embedding:模型版本
Qwen 3 提供多种尺寸的 Embedding 模型:
| 模型 | 参数量 | 维度 | 最大 Token | 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 模型在质量和性能之间达到了最佳平衡。
第一步:安装 Ollama
如果你还没有安装 Ollama:
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.com/install.sh | sh
# Windows
# 从 https://ollama.com/download 下载
启动 Ollama 服务:
ollama serve
第二步:拉取 Qwen 3 Embedding 模型
# 拉取推荐的 4B 模型
ollama pull qwen3-embedding:4b
# 显存较低的系统拉取较小模型
ollama pull qwen3-embedding:1.5b
# 需要最高质量则拉取最大尺寸模型
ollama pull qwen3-embedding:8b
验证模型是否可用:
ollama list
第三步:生成 Embedding
使用 Ollama API
通过 REST API 生成向量:
curl http://localhost:11434/api/embed -d '{
"model": "qwen3-embedding:4b",
"input": "检索增强生成是如何工作的?"
}'
响应:
{
"model": "qwen3-embedding:4b",
"embeddings": [
[0.0123, -0.0456, 0.0789, ...]
]
}
使用 Python
import ollama
# 单个文本向量化
response = ollama.embed(
model="qwen3-embedding:4b",
input="检索增强生成是如何工作的?"
)
embedding = response["embeddings"][0]
print(f"维度: {len(embedding)}") # 4B 模型为 2560
# 批量向量化
documents = [
"RAG 将检索与生成结合以提供准确答案。",
"向量数据库存储向量以实现快速相似度搜索。",
"Reranker 通过重新打分来提高检索进度。",
]
response = ollama.embed(
model="qwen3-embedding:4b",
input=documents
)
embeddings = response["embeddings"]
print(f"生成了 {len(embeddings)} 个向量")
第四步:设置 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"分数: {r['score']:.3f} | {r['document'][:60]}")
第五步:构建完整的 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"已添加 {len(documents)} 个文档。总计: {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 相似度检索 Top-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}
问题: {question}
回答:"""
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 这样的向量数据库可以高效存储向量。",
])
# 提出问题
answer = rag.query("Reranker 是如何改进 RAG 流程的?")
print(answer)
第六步:在 LangChain 或 LlamaIndex 中使用
LangChain 集成
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
# 创建向量模型实例
embeddings = OllamaEmbeddings(
model="qwen3-embedding:4b",
base_url="http://localhost:11434",
)
# 与 ChromaDB 配合使用
vectorstore = Chroma.from_texts(
texts=["文档1", "文档2", "文档3"],
embedding=embeddings,
collection_name="my_collection",
)
# 搜索
results = vectorstore.similarity_search("我的查询", 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) | 使用较小的模型变体或增加交换内存 |
| 向量化速度慢 | 减少批大小或启用 GPU 加速 |
| 检索质量低 | 升级到 8B Embedding 模型 |
| Reranker 分数不一致 | 确保 temperature 设置为 0 |
结论
将 Qwen 3 Embedding 和 Reranker 模型与 Ollama 结合,你可以获得一个完全本地化、保护隐私且性能媲美云端方案的 RAG 流程。4B 版本在质量和性能之间提供了极佳的平衡,而 8B 模型则将性能推向了顶尖水平。
如果你的 RAG 流程涉及根据检索信息生成图像、视频或音频等媒体内容,Hypereal AI 提供了快速且经济的 AI 媒体生成 API。将本地检索与云端生成结合,即可打造强大的端到端 AI 工作流。
