TodayAI

用 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。

官方资料

OpenAI DevelopersEmbeddings