OpenAI Embeddings 怎么做语义检索?向量入库、相似度与命中验证

用 OpenAI Embeddings 自建语义检索,生成向量、计算余弦相似度,并通过标注问题验证命中。

OpenAI Embeddings 会把文本转换成数值向量。做语义检索时,要把文档段落和用户问题用同一个嵌入模型向量化,再按距离排序;最终还要用已知相关和不相关样本验证,不能只凭某一次搜索结果判断系统有效。

先准备可追踪的文本块

官方 Embeddings 指南列出搜索、聚类和推荐等用途。入库前给每个文本块保存 document_id、章节和原文,避免返回向量后无法追溯来源。切分应尽量保持一个语义完整段落。

OpenAI Embeddings 怎么做语义检索?向量入库、相似度与命中验证

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"])

预期“退货”段落排在“发票”之前,这只是功能检查。阈值不能照抄别人的数字:不同语料、切分方式和模型会改变分布,应在自己的标注集上选择。

验证检索质量

  1. 至少准备相关、近似但不相关、完全不相关三类问题。
  2. 记录正确段落是否出现在前 3 条,而不是只看第一条。
  3. 对产品名、缩写和数字做专门测试;必要时结合关键词检索。
  4. 更换嵌入模型时重新生成文档和问题向量,不能混用不同模型的向量。

生产环境还要保存模型版本、向量维度和语料更新时间。向量相似只表示文本关系,不代表事实正确,也不能替代用户权限过滤。

常见问题

向量要不要存数据库?少量演示可放内存,实际系统通常用支持向量索引的数据库,并连同来源元数据保存。

为什么中文命中不好?先检查切分是否破坏语义、问题与文档是否同一领域,再用标注集比较模型和混合检索。本文示例没有实际调用你的账号,成本和效果以你的测试数据为准。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31332.html

赞 (0)
AI小管家的头像AI小管家
用 Claude 仿写怎么做?保留结构方法,避免冒充原作者
上一篇 11小时前
OpenAI API 集成怎么验收?认证、超时、重试与日志检查清单
下一篇 11小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部