OpenAI Embeddings 向量怎么用:text-embedding-3-small 调用、dimensions 缩短、余弦相似度搜索

想做语义搜索、相似推荐或文本分类?先用 embeddings 接口把文字变成向量,再比距离。本文按官方文档讲 text-embedding-3-small 的 Python 和 Node 调用、默认向量长度、dimensions 缩短、余弦相似度、批量计数 token,以及官方 FAQ 里的几个坑。

NNathaniel bigo··原创首发·AI 辅助撰写
7 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 其他 账号
本文根据 OpenAI 官方《Vector embeddings》整理,资料核对于 2026-11-05。配图为本站整理的示意图,不是界面截图。本站(bigolab.com)不是 OpenAI 官方网站。API 是按用量计费的独立服务,与 ChatGPT 订阅分开计算,Key 的获取见 /guides/openai-api-key。

适用于谁

  • 想给自己的文档、客服问答、笔记做“按意思搜索”的开发者;
  • 听说过 RAG、向量数据库,但不知道第一步“生成向量”到底怎么调的人;
  • 想知道向量模型选哪个、向量太长怎么缩短的人。

结论先说

  1. embedding 就是一串浮点数。 官方说,两个向量的距离衡量两段文字的相关度:距离小表示相关度高,距离大表示相关度低。
  2. 调用很简单:embeddings.create,给模型名和文本,拿回向量。
  3. 官方的两个第三代模型是 text-embedding-3-small 和 text-embedding-3-large,默认向量长度分别是 1536 和 3072。
  4. 可以用 dimensions 参数缩短向量,省存储和计算。
  5. 距离函数官方推荐余弦相似度;OpenAI 的向量已经归一化到长度 1,所以用点积算余弦更快,排序结果也和欧氏距离一致。
  6. 按输入的 token 数计费。 价格以官方价格页当天为准,见 /guides/openai-api-price-official-table。

用向量做语义搜索的流程:切段、生成向量、保存、问题也做向量、按余弦相似度排序

图:本站根据 OpenAI 官方《Vector embeddings》 整理的示意图,流程顺序为本站归纳

一、第一次调用

Python(需 pip install openai,密钥设置见 /guides/openai-api-python-quickstart):

python
from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
    input="你好,这里是要变成向量的文字",
    model="text-embedding-3-small",
)

vector = response.data[0].embedding
print(len(vector))   # 默认 1536
print(vector[:5])

Node.js(保存为 .mjs):

javascript
import OpenAI from "openai";

const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "你好,这里是要变成向量的文字",
  encoding_format: "float",
});

console.log(embedding.data[0].embedding.length);

响应里的 data[0].embedding 就是向量,usage 里有这次消耗的 token 数。你可以把向量存进向量数据库,之后用于各种用途。input 也可以一次传一个字符串列表,官方的数据集示例就是这样一次嵌入多条文字(示例里先把换行符换成空格再嵌入)。

二、选哪个模型

官方页面的对照:

模型官方表中的 MTEB 成绩最大输入
text-embedding-3-small62.3%8192
text-embedding-3-large64.6%8192
text-embedding-ada-00261.0%8192

两个第三代向量模型对照:默认长度、最大输入、MTEB 成绩、dimensions

图:本站根据 OpenAI 官方《Vector embeddings》 整理的示意图

官方说它提供两个第三代向量模型(模型名里带 -3)。更大的模型成绩更高但更贵,具体费用以官方价格页当天为准。同一个知识库里,文档和问题必须用同一个模型生成向量,不同模型的向量不能互相比较,这一条是向量搜索的基本要求,官方示例也都是同模型比较。

三、dimensions:缩短向量

向量越长,存储、内存和计算越贵。官方说两个新模型的训练方式允许你去掉向量末尾的一部分数字,而不丢失它表示概念的能力,做法是在请求里加 dimensions 参数:

python
response = client.embeddings.create(
    model="text-embedding-3-large",
    input="需要更短的向量",
    dimensions=1024,
)
print(len(response.data[0].embedding))  # 1024

官方给的例子:向量数据库只支持最多 1024 维时,仍然可以用 text-embedding-3-large,把 dimensions 设为 1024,用一点准确度换更小的向量。官方还说,在 MTEB 评测上,text-embedding-3-large 缩短到 256 维,成绩仍高于未缩短的 text-embedding-ada-002(1536 维)。

如果你是生成之后手动截断,必须再做一次归一化(L2),官方的示例就是先取前 256 个数,再除以向量长度。能在请求时用 dimensions 就用它,官方说这是推荐做法。

四、一个最小的语义搜索

下面是本站写的最小版本,思路对应官方「用 embeddings 做文本搜索」:先给所有文档生成向量,再给问题生成向量,按余弦相似度排序。因为 OpenAI 向量长度已是 1,直接用点积即可:

python
import numpy as np
from openai import OpenAI

client = OpenAI()
MODEL = "text-embedding-3-small"

docs = [
    "怎么申请 API Key",
    "账单页面在哪里查看用量",
    "请求太频繁会返回 429 错误",
]

def embed(texts):
    res = client.embeddings.create(model=MODEL, input=texts)
    return np.array([d.embedding for d in res.data])

doc_vecs = embed(docs)                  # 形状:(3, 1536)
query_vec = embed(["为什么提示请求太多"])[0]

scores = doc_vecs @ query_vec           # 点积 = 余弦相似度
best = int(np.argmax(scores))
print(docs[best], float(scores[best]))

文档很多时,别每次都全部重新算。官方 FAQ 的建议是:要快速找最近的 K 个向量,用向量数据库。官方的 Cookbook 里有与各种向量数据库配合的例子。向量搜索只是帮你找出相关的文字,最后的回答通常还要交给聊天模型,写法见 /guides/openai-responses-api。

五、数 token 和费用

官方 FAQ 提供了用 tiktoken 数 token 的方法,三代向量模型用 cl100k_base 编码:

python
import tiktoken

def num_tokens(text, encoding_name="cl100k_base"):
    return len(tiktoken.get_encoding(encoding_name).encode(text))

print(num_tokens("tiktoken is great!"))

这样能在发请求前估算输入多长、大约花多少,也能避免超过模型的最大输入。数量巨大的文档集,可以考虑用 Batch API 做,写法见 /guides/openai-api-batch,该文件的端点要填 /v1/embeddings。

常见问题

Q:向量模型知道最近的事吗?

官方说,text-embedding-3-large 和 text-embedding-3-small 不了解 2021 年 9 月之后发生的事件。对大多数搜索场景影响不大,个别情况下会降低效果。

Q:我能把向量公开分享吗?

官方 FAQ 的回答是可以:客户拥有自己输入和模型输出的内容,包括向量。但你要自己保证输入的内容不违反适用法律和使用条款。

Q:用余弦相似度还是欧氏距离?

官方推荐余弦相似度,并说距离函数的选择通常影响不大。因为向量已归一化,两者排序结果相同。

Q:请求报 429?

见 /guides/openai-api-429-error。

参考资料

  • OpenAI 官方:Vector embeddings — https://developers.openai.com/api/docs/guides/embeddings

Nathaniel 的更多内容

  1. 01

    Claude Code 在 Windows 上的常见坑:Git Bash 还是 PowerShell、路径反斜杠、假报错、WSL 怎么选

    Windows 上用 Claude Code,装好之后最容易踩的是:用哪个 shell、路径写法不一致、grep 没匹配就报错、钩子没生效、WSL 和原生怎么选。本文逐条按官方文档整理原因和处理办法,附三段提示词和一张对照表。

    Claude0
  2. 02

    Claude Code Hooks 实战「提交前自动跑测试」:PreToolUse 拦住 git commit,测试不过就退出码 2,附 Windows 注意点

    只写一个完整例子:让 Claude Code 每次要执行 git commit 之前,先自动跑项目测试,没通过就拦下并把输出交给它修。本文按官方 Hooks 文档给出脚本、settings.json 配置、测试方法、排错和 Windows 的两处坑。

    Claude0
  3. 03

    Claude Code 自定义斜杠命令与 Skill 实战:从零写一个「生成更新日志」的 /release-notes,含传参、预执行命令和调试

    概念看过了,还是不知道从哪下手?本文按 Claude Code 官方「Extend Claude with skills」写一个完整可用的例子:用 /release-notes 根据 git 记录生成更新日志,覆盖目录、frontmatter、传参、预执行命令、预授权和调试。

    Claude0
  4. 04

    Claude Code 部署网站:先写 Dockerfile 和 compose 在本机跑通,再按清单上云服务器,别让它直接改线上

    想让 Claude Code 帮你把网站部署到云服务器。本文只写通用做法,按 Docker 官方文档讲:让它写 Dockerfile、.dockerignore 和 compose,在本机跑通,端口和数据卷怎么设,再给出上线清单,并说明为什么不要让它直接动线上机器。

    Claude0
  5. 05

    Claude Code 写爬虫与数据清洗:先查 robots.txt 和网站条款,控制频率,原始数据留一份再清洗

    想让 Claude Code 写爬虫抓数据再清洗。本文先讲合规:robots.txt 不是授权也不是安全措施、网站条款要自己读;再讲怎么用 Python 标准库检查规则、小样本先试、保存原始数据,以及用 pandas 清洗,附四段提示词。

    Claude0
  6. 06

    Claude Code 写 Chrome 扩展:按 Manifest V3 起步,加载未打包的扩展,改了哪些文件要重新加载

    想让 Claude Code 帮你写一个 Chrome 扩展。本文按 Chrome 官方扩展文档讲:manifest.json 的最小写法、在 chrome://extensions 加载未打包的扩展、哪些改动要刷新、怎么看控制台和报错,再给四段提示词,以及权限要尽量少。

    Claude0

同产品的其他教程

  1. 01

    OpenAI API 的 token 怎么算、怎么估算费用:input_tokens 计数接口、tiktoken 和隐藏的输出 token

    发请求前想知道会用多少 token?官方有 Responses 的 input_tokens 计数接口,能把文字、图片、文件、工具定义一起算准;本地 tiktoken 只适合纯文本。本文给 Python 和 Node 示例,讲输出 token 为什么可能比看到的多,以及怎么估算费用。

    ChatGPT0
  2. 02

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一个请求,到流式、函数调用、联网搜索

    用 Node.js 调 OpenAI API:设置 OPENAI_API_KEY 环境变量,npm install openai,新建 example.mjs,用 client.responses.create 发出第一个请求。并列出图片、文件、流式、函数调用、联网搜索和错误捕获的 Node 写法。

    ChatGPT0
  3. 03

    OpenAI API 用量层级(usage tiers)与速率限制怎么提升:Free、Build、Launch、Grow 和后台 Limits 页

    OpenAI API 的限速不是固定的:官方按累计购买额度把组织分成 Free、Build、Launch、Grow 四个层级,达到门槛自动升级。本文讲 RPM、TPM 等指标、怎么在后台查自己的限额、响应头怎么读、花费上限和限速的区别,以及怎么让限额变得够用。

    ChatGPT0
  4. 04

    OpenAI API 报错 400、401、403、404、429、500、503 怎么排查:按官方错误码页逐个看原因和解决办法

    调用 OpenAI API 返回 400、401、403、404、429、500、503,各自什么意思?本文按官方 Error codes 页,每个状态码一节,写清官方给的原因和解决办法,并说明 404 在官方页面里的位置、429 的六种情形,附 Python 和 Node 的错误捕获写法。

    ChatGPT0
  5. 05

    OpenAI Realtime API 是什么:语音到语音会话、WebRTC 与 WebSocket、临时密钥和事件机制

    Realtime API 让模型直接处理音频,做可以随时打断的语音助手。本文按官方文档讲它是什么、什么时候用、浏览器接入的流程、session 与事件、可用声音、60 分钟会话上限、安全标识,以及它和转写、文字转语音的分工。

    ChatGPT0
  6. 06

    OpenAI 图像生成 API 怎么用:gpt-image 系列、images.generate 与 Responses 工具、尺寸质量和遮罩编辑

    用 OpenAI API 生成或编辑图片,有 Image API 和 Responses 里的 image_generation 工具两条路。本文按官方文档给 Python 和 Node 示例,讲 gpt-image 模型选择、尺寸质量格式参数、遮罩编辑、被拦截时的错误处理,以及需要组织验证的提醒。

    ChatGPT0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~