用 OpenAI Embeddings 给文档做语义检索向量
按 OpenAI Embeddings 指南生成文本向量,并完成一次最小的相似度比对。
基于 OpenAI Developers 整理 · Embeddings · 官方资料
Embedding 把文本变成向量,供检索、聚类和去重使用。它不负责写答案。
这篇完成一件事:用官方 embeddings.create 接口生成向量,再对两段文本算余弦相似度,确认同一语义更接近。
生成第一条 Embedding
安装 openai SDK 并设置 OPENAI_API_KEY。官方推荐 text-embedding-3 系列;维度可按产品需要裁剪。
官方 embeddings.create
python
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
model="text-embedding-3-small",
input="TodayAI Guides help you complete a concrete API task.",
)
vector = response.data[0].embedding
print(len(vector), response.usage)比较两段文本是否语义接近
余弦相似度
python
import numpy as np
from openai import OpenAI
client = OpenAI()
def embed(text: str) -> list[float]:
return client.embeddings.create(
model="text-embedding-3-small",
input=text,
).data[0].embedding
a = np.array(embed("如何生成 embedding"))
b = np.array(embed("怎样把文本变成向量"))
c = np.array(embed("今天天气怎么样"))
def cosine(x, y):
return float(x @ y / (np.linalg.norm(x) * np.linalg.norm(y)))
print(cosine(a, b), cosine(a, c))同义问句的分数应明显高于无关句子。把向量写入你的向量库前,先固定 model 与 dimensions。
最容易踩的坑
不同 model 的向量混进同一索引
一个索引只用一个 embedding 模型;换模型必须重建。
输入过长被截断
按官方 token 限制切块;超长文档先分片再 embed。