OpenAI Embeddings 会把文本转换成数值向量。做语义检索时,要把文档段落和用户问题用同一个嵌入模型向量化,再按距离排序;最终还要用已知相关和不相关样本验证,不能只凭某一次搜索结果判断系统有效。
先准备可追踪的文本块
官方 Embeddings 指南列出搜索、聚类和推荐等用途。入库前给每个文本块保存 document_id、章节和原文,避免返回向量后无法追溯来源。切分应尽量保持一个语义完整段落。

from openai import OpenAI
import numpy as np
client = OpenAI()
chunks = [
{"id": "refund-1", "text": "签收后七天内可申请退货。"},
{"id": "invoice-1", "text": "电子发票在订单完成后开具。"},
]
vectors = client.embeddings.create(
model="text-embedding-3-small",
input=[x["text"] for x in chunks],
).data
for row, item in zip(vectors, chunks):
item["vector"] = np.array(row.embedding, dtype=float)
对问题计算相似度
question = "收到货后多久还能退?"
q = client.embeddings.create(
model="text-embedding-3-small",
input=question,
).data[0].embedding
q = np.array(q, dtype=float)
def cosine(a, b):
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
ranked = sorted(
((cosine(q, x["vector"]), x) for x in chunks),
key=lambda pair: pair[0], reverse=True,
)
for score, item in ranked:
print(round(score, 4), item["id"], item["text"])
预期“退货”段落排在“发票”之前,这只是功能检查。阈值不能照抄别人的数字:不同语料、切分方式和模型会改变分布,应在自己的标注集上选择。
验证检索质量
- 至少准备相关、近似但不相关、完全不相关三类问题。
- 记录正确段落是否出现在前 3 条,而不是只看第一条。
- 对产品名、缩写和数字做专门测试;必要时结合关键词检索。
- 更换嵌入模型时重新生成文档和问题向量,不能混用不同模型的向量。
生产环境还要保存模型版本、向量维度和语料更新时间。向量相似只表示文本关系,不代表事实正确,也不能替代用户权限过滤。
常见问题
向量要不要存数据库?少量演示可放内存,实际系统通常用支持向量索引的数据库,并连同来源元数据保存。
为什么中文命中不好?先检查切分是否破坏语义、问题与文档是否同一领域,再用标注集比较模型和混合检索。本文示例没有实际调用你的账号,成本和效果以你的测试数据为准。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31332.html