Embeddings 与 RAG 预告

Embedding(嵌入) 把文本变成固定长度的浮点向量,用来做语义检索、聚类和 RAG。向量维度由模型决定(常见约 384–1024)。官方说明:/api/embed 返回的是 L2 归一化(单位长度) 向量,相似度用 余弦 即可。

聊天模型不要拿来当 embed:既慢,空间也不为检索训练。请在 ollama.com/libraryembedding 类模型,再 ollama pull


拉一个当前可用的嵌入模型

官方能力页当前推荐示例包括 embeddinggemmaqwen3-embeddingall-minilm。社区里仍常见:

模型(示例名)备注
embeddinggemma与官方文档、/api/embed 示例对齐
nomic-embed-text长文本检索里很常见
bge-m3中文 / 多语言检索常被提到

名字和标签会变。 到 Library 确认后执行,例如:

ollama pull embeddinggemma
# 或
ollama pull nomic-embed-text
# 中文检索也可评估
ollama pull bge-m3

CLI 也可直接出向量(输出为 JSON 数组):

ollama run embeddinggemma "Hello world"
echo "Hello world" | ollama run nomic-embed-text

索引和查询必须用同一个嵌入模型,否则向量不在同一空间。


REST:/api/embed

curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
  "input": "The quick brown fox jumps over the lazy dog."
}'

批量:

curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
  "input": ["第一句", "第二句", "第三句"]
}'

可选字段:truncate(超长是否截断)、dimensions(若模型支持降维)、keep_alive

Windows PowerShell:

Invoke-RestMethod -Method Post -Uri "http://localhost:11434/api/embed" `
  -ContentType "application/json" `
  -Body '{"model":"embeddinggemma","input":"天空为什么是蓝色的?"}'

OpenAI 兼容:POST http://localhost:11434/v1/embeddings,字段为 model + input


官方库

import ollama

single = ollama.embed(
    model="embeddinggemma",
    input="The quick brown fox jumps over the lazy dog.",
)
print(len(single["embeddings"][0]))  # 维数

batch = ollama.embed(
    model="embeddinggemma",
    input=["第一句", "第二句"],
)
print(len(batch["embeddings"]))
import ollama from "ollama";

const single = await ollama.embed({
  model: "embeddinggemma",
  input: "The quick brown fox jumps over the lazy dog.",
});
console.log(single.embeddings[0].length);

最小「检索」直觉

  1. 把文档切成块(按标题或约 300–800 token)。
  2. 对每块 embed,连同原文存进向量库(Chroma、FAISS、pgvector…)。
  3. 对用户问题用同一模型 embed。
  4. 取余弦相似度最高的 k 块,拼进提示词,再 chat / generate

伪代码:

import ollama
from numpy import dot
from numpy.linalg import norm

def cos(a, b):
    return float(dot(a, b) / (norm(a) * norm(b)))

docs = ["Ollama 默认端口 11434。", "用 /bye 离开对话。"]
vecs = ollama.embed(model="embeddinggemma", input=docs)["embeddings"]
q = ollama.embed(model="embeddinggemma", input="端口是多少?")["embeddings"][0]
best = max(range(len(docs)), key=lambda i: cos(q, vecs[i]))
print(docs[best])

单位向量时余弦与点积等价。这只是教学;生产要用真正的 ANN 索引和元数据过滤。


接到 LangChain RAG

完整流水线(Loader → Splitter → VectorStore → Retriever → Agent)在本站 LangChain 教程:

那里可以用 OpenAI 嵌入,也可以换成 Ollama 嵌入 + ChatOllama / OpenAI 兼容的本地聊天模型,数据仍留在本机。Dify 知识库若选择 Ollama 嵌入,同样遵守「同一模型编解码」规则,见 应用集成Dify 教程


注意

  • 换嵌入模型 = 整库重嵌
  • 中文效果以你的语料评测为准,不要只看英文榜单。
  • 嵌入模型也占显存;检索服务和 30B 聊天模型同卡时,注意 ollama ps

下一步

评论