Ollama Embed 端点(嵌入向量)

2026-10-29 19:01 更新

POST /api/embed 把文本转成向量,是 RAG、语义搜索、聚类的基础。它和推理端点有两个重要差别:支持批量输入,且没有 keep_alive 以外的运行时控制。

版本基线 v0.40.12,官方 docs.ollama.com/api/embed。

一、最小调用

curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
  "input": "Why is the sky blue?"
}'

返回:

{
  "model": "embeddinggemma",
  "embeddings": [
    [0.010071029, -0.0017594862, 0.05007221, 0.04692972, 0.054916814,
     0.008599704, 0.105441414, -0.025878139, 0.12958129, 0.031952348]
  ],
  "total_duration": 14143917,
  "load_duration": 1019500,
  "prompt_eval_count": 8
}

注意 embeddings 是二维数组——即使只传一个字符串,外面也套一层。这是按批量设计的结构:embeddings[0] 对应 input[0]。

向量维度由模型决定(上面的示例被截断为 10 维展示,实际通常几百到几千维)。

二、请求字段

字段 类型 必填 说明
model string 是 嵌入模型名
input string | string[] 是 单条文本或文本数组
truncate boolean 默认 true,超长输入截断;false 则报错
dimensions integer 指定输出维度
keep_alive string 模型驻留时长
options object 运行时参数

truncate 值得单独说

默认 true——超过上下文窗口的输入被静默截断。

这意味着:一篇文章太长时,只有前面部分参与嵌入,后面的内容直接丢失。如果你的场景是索引长文档,要么自己切块,要么设 truncate: false 让请求显式失败,避免无声的数据丢失。

## 严格模式:超长直接报错
curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
  "input": "超长文本……",
  "truncate": false
}'

dimensions 的用途

某些模型支持降维输出(比如原生 1024 维降到 256 维)。降维能显著减小索引体积、加快检索,代价是精度略降。不是所有模型都支持这个参数。

三、响应字段

字段 说明
model 产出向量的模型
embeddings 向量数组,number[][]
total_duration 总耗时(纳秒)
load_duration 模型加载耗时(纳秒)
prompt_eval_count 处理的输入 token 数

注意没有 eval_count 和 eval_duration——嵌入不是逐 token 生成,所以没有生成阶段的指标。

四、批量嵌入

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

返回的 embeddings 长度等于输入长度,顺序一一对应。

批量比循环单条快得多——模型只需加载一次,且推理时可以并行。索引几千个文档时这个差别是数量级的。

五、Python 示例

import requests, numpy as np

def embed(texts):
    r = requests.post("http://localhost:11434/api/embed", json={
        "model": "embeddinggemma",
        "input": texts,
        "truncate": False,
    })
    r.raise_for_status()
    return np.array(r.json()["embeddings"])

## 建索引
docs = ["Ollama 是本地模型运行时", "KV 缓存影响显存占用", "量化能降低内存需求"]
vecs = embed(docs)
print("向量形状:", vecs.shape)

## 检索
q = embed(["显存怎么优化"])[0]

## 余弦相似度
sims = vecs @ q / (np.linalg.norm(vecs, axis=1) * np.linalg.norm(q))
for i in np.argsort(-sims)[:2]:
    print(f"{sims[i]:.4f}  {docs[i]}")

六、选模型

嵌入模型和生成模型是两类东西,不能混用。命名上通常带 embed 字样(如 embeddinggemma)。

选型时看三点:

  • 维度:越高表达力越强,但索引和计算成本也越高
  • 上下文长度:决定单块文本能多长
  • 语言支持:中文场景要确认训练数据覆盖

下载:

ollama pull embeddinggemma

嵌入的完整机制见 3.6 Ollama 嵌入向量(Embeddings)。

常见问题

现象 原因 处理
取向量时多了一层数组 embeddings 是二维 用 embeddings[0]
长文档检索不准 默认被静默截断 切块,或设 truncate: false
向量维度对不上 换了嵌入模型 换模型必须重建整个索引
用生成模型报错 模型不支持嵌入 换专门的 embed 模型
批量很慢 单条循环调用 用数组一次传

动手试

## ① 拉嵌入模型
ollama pull embeddinggemma

## ② 批量嵌入两条,看维度
curl -s http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
  "input": ["你好", "世界"]
}' | python -c "
import sys,json
d=json.load(sys.stdin)
print('条目数:', len(d['embeddings']))
print('维度:', len(d['embeddings'][0]))"

输出的「条目数 2」和「维度」能确认你对返回结构的理解是否正确。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号