文本预处理 → 分块 → Embeddings API → 向量与 metadata 入库 → 查询向量化 → 权限过滤后相似度检索 → 离线评测。新项目通常先用 text-embedding-3-small 建立成本与质量基线;只有真实评测显示需要更高召回或多语言能力时,再比较 text-embedding-3-large。查询和文档必须使用同一模型、同一维度及兼容的预处理版本。
官方资料(2026-10-31 核对):Vector embeddings guide · Create embeddings API Reference · text-embedding-3-small · text-embedding-3-large
Embeddings API 与 File Search 有什么区别?
| 方案 | 返回或管理 | 应用负责 | 适合 |
|---|---|---|---|
| Embeddings API | 文本对应的向量 | 分块、数据库、索引、过滤、召回、权限与引用 | 需要自有数据层、排序或跨来源检索 |
| File Search | 托管 Vector Store 与检索工具 | 文件版本、metadata、访问控制、评测和结果展示 | 希望减少分块和向量索引运维 |
| Files API | File 与 file_id | 用途、生命周期和下游调用 | 上传和管理原始文件 |
Embeddings API 不会自动保存向量,也不会替你搜索。需要托管知识库时阅读 OpenAI File Search 指南;需要管理原始文件时查看 Files API 生命周期。不要因为向量“看不懂”就把它当成脱敏结果,授权仍必须在查询端执行。
第一步:选择模型和维度
| 模型 | 默认维度 | 当前价格 | 选择建议 |
|---|---|---|---|
text-embedding-3-small | 1536 | 每 100 万输入 Token 0.02 美元 | 先建立低成本基线,适合大多数搜索、分类和推荐试验 |
text-embedding-3-large | 3072 | 每 100 万输入 Token 0.13 美元 | 在多语言或长尾召回评测确有提升时使用 |
两种第三代模型都支持 dimensions 参数缩短输出。降维会减少数据库存储、内存和相似度计算成本,但不能假设质量不变。为每个候选维度使用相同的语料、query 集、K 值和过滤条件评测,并把 model、dimensions、切分版本写入索引元数据。
价格为 2026-10-31 官方模型页显示的同步 Embeddings 输入价格,未来可能调整;批量离线任务应单独核对 Batch API 当时支持的端点、折扣和完成窗口。
第二步:调用 /v1/embeddings
import OpenAI from "openai";
const client = new OpenAI();
const response = await client.embeddings.create({
model: "text-embedding-3-small",
input: [
"退款申请应从原购买渠道提交。",
"API Credits 与 ChatGPT Plus 分开计费。"
],
encoding_format: "float"
});
for (const item of response.data) {
console.log(item.index, item.embedding.length);
}
console.log(response.usage.total_tokens);服务端 SDK 会从环境变量读取 API Key,浏览器页面不应直接持有密钥。返回的 data 数组包含 index 与 embedding,用 index 对齐原输入;usage 提供本次输入 Token。若网络或 5xx 失败,使用有限次数指数退避,并保留输入内容哈希作为幂等去重依据。
请求限制怎样拆分?
- 单个输入:当前所有 embedding 模型最大输入为 8192 tokens;空字符串不可提交。
- 批量数量:一次请求的输入数组最多 2048 项。
- 总 Token:一次请求内所有输入合计最多 300,000 tokens。
- 输出格式:
encoding_format可选float或base64;数据库字段与解码流程要匹配。 - 维度参数:仅
text-embedding-3及后续模型支持;切换 dimensions 后必须使用新的索引版本。
不要按字符数估算中文 Token。可使用官方指南推荐的 tiktoken 和 cl100k_base 在入队前计数;超长正文按语义边界分块,同时保留来源、标题、章节和偏移位置。
第三步:建立可迁移的向量索引
| 字段 | 用途 | 为什么不能省 |
|---|---|---|
chunk_id / source_id | 回溯原文与去重 | 支持更新、删除和引用 |
tenant_id / acl | 查询前权限过滤 | 向量相似不代表有权读取 |
content_hash | 识别内容变化 | 避免重复向量化与重复收费 |
model / dimensions | 索引兼容性 | 防止查询与文档向量不匹配 |
chunk_version | 切分和预处理版本 | 支持灰度重建与回滚 |
text / metadata | 结果展示与过滤 | 向量本身不能生成可读引用 |
文档更新时先写入新版本索引,完成回填、质量评测和权限抽查后,再切换查询别名并延迟清理旧索引。不要在原索引中静默混入另一模型或另一维度;即使数据库允许写入,也会使距离不可比较或直接查询失败。
第四步:把查询向量化并进行相似度搜索
- 使用与文档相同的模型、dimensions 和规范化规则处理 query。
- 在向量数据库中先应用租户、权限、语言、有效期和内容版本过滤。
- 按余弦相似度或等价点积查询 Top K;不要照搬固定阈值。
- 把命中 chunk 的原文、来源和分数返回应用;需要生成回答时再交给模型。
- 记录 query、候选集合、命中 ID、最终点击或人工相关性,用于后续评测。
OpenAI 指南推荐余弦相似度,并说明 embedding 已归一化为长度 1,因此点积可以更快地得到等价排序;欧氏距离也会得到相同排序。数据库的近似索引参数、过滤顺序和量化方式仍会改变召回,应在自己的部署上测量。
怎样评测向量检索,而不是只看“能搜到”?
- 建立带答案的 query 集:覆盖高频、长尾、同义词、多语言、否定和无答案问题。
- 离线指标:至少记录 Recall@K、MRR 或 NDCG,并分租户、语言、内容类型观察。
- 端到端指标:如果检索结果交给生成模型,还要评测答案正确性、引用匹配和拒答。
- 成本指标:区分首次文档回填、增量更新和实时查询 Token;与数据库存储及查询费用一起核算。
- 对照实验:一次只改变模型、维度、chunk 或 K 中的一项,防止错误归因。
常见错误与排查
- 400 / 输入过长:用 Token 计数而不是字符数,拆分单项并控制请求总 Token。
- 向量维度不一致:读取索引的 model 与 dimensions 元数据,确认查询请求未切换配置。
- 结果语义相近但业务无权访问:把租户和 ACL 作为数据库过滤条件,不要在取回结果后才隐藏。
- 批量响应和输入错位:使用响应
index映射原数组,不依赖异步任务完成顺序。 - 成本突然上升:检查重复回填、内容哈希、chunk 数量、失败重试与所用模型;再到 API Usage 按 Project 对账。
- 换模型后召回下降:不能复用旧文档向量;新旧索引要并行评测并原子切换。
上线前检查清单
- API Key 仅存在服务端,使用独立 Project 与最小权限。
- 输入拒绝空字符串,并在入队前检查单项和请求总 Token。
- model、dimensions、切分版本和内容哈希写入每条向量记录。
- 查询和文档使用相同配置,数据库字段维度固定。
- 租户与 ACL 在相似度查询阶段强制过滤,并做越权回归测试。
- 批量结果用 index 对齐,失败项可单独重试且不会重复写入。
- 上线前有真实 query 集、Recall@K、下游质量、延迟与成本基线。
- 模型或维度变更走新索引、回填、灰度、切换和回滚流程。
- 监控 API 429/5xx、Token、数据库延迟、空结果率和索引版本。
常见问题
OpenAI Embeddings API 是做什么的?
Embeddings API 把文本转换成浮点向量,用向量距离衡量语义相关性。它常用于语义搜索、聚类、推荐、异常检测和分类;它不会生成回答,也不会自动创建向量数据库、权限过滤或引用。
text-embedding-3-small 和 text-embedding-3-large 怎么选?
先用 text-embedding-3-small 建立成本和质量基线;当多语言、长尾召回或业务评测显示质量不足时,再测试 text-embedding-3-large。不要只依据模型名称决定,应在相同语料、切分和检索参数上比较 Recall@K、下游任务质量、延迟和成本。
Embeddings API 一次可以提交多少内容?
当前 API Reference 说明单个输入不能超过模型最大输入 8192 tokens;批量数组最多 2048 个输入,并且一次请求内所有输入合计最多 300,000 tokens。空字符串不可作为输入。上线前仍应按所用模型文档和实际错误响应复核。
OpenAI embedding 默认有多少维?
text-embedding-3-small 默认输出 1536 维,text-embedding-3-large 默认输出 3072 维。text-embedding-3 系列支持 dimensions 参数缩短向量,但降维会影响存储、速度和质量,应通过自己的检索评测选择。
Embedding 搜索应该用什么距离函数?
OpenAI Embeddings 指南推荐余弦相似度。官方说明其 embedding 已归一化为长度 1,因此可用点积加速;余弦距离和欧氏距离会产生相同排序。数据库索引类型和阈值仍需用真实数据评测。
可以把不同模型或不同维度的向量放在同一个索引吗?
不建议。查询向量与文档向量必须使用兼容的模型和维度才能计算距离;模型、dimensions 或预处理改变时,应建立带版本的新索引,完成回填和评测后再切换,不要静默混用。
Embeddings API 和 OpenAI File Search 有什么区别?
Embeddings API 只返回向量,切分、存储、索引、过滤、召回、授权和引用都由应用负责;File Search 使用 OpenAI 托管的 Vector Store,自动完成分块、向量化与检索,并可在 Responses 中返回文件引用。需要完全控制索引时用 Embeddings API,希望降低运维时可评估 File Search。
本文核对日期为 2026-10-31。模型、价格、请求限制、维度和 SDK 字段可能变化,生产调用前请再次读取官方 Embeddings guide、API Reference 与对应模型页。