OpenAI Embedding 和密集检索(如 BERT/DPR)其实是“同一种思想的不同实现”,它们都属于Dense Retrieval(密集向量检索),只不过使用的模型、部署方式和调用方式不同。
只要满足这两个条件,就叫“密集检索”:
text-embedding-3-small
)生成 embedding,然后在本地或云上检索 → 也属于密集检索它们只是实现方式不同,但原理一模一样。
特性 | BERT / DPR 本地部署 | OpenAI Embedding |
---|---|---|
模型来源 | 开源(如 sentence-transformers ) |
商业闭源(OpenAI API) |
运行方式 | 本地运行模型(CPU/GPU) | 调用 API(联网) |
embedding 大小 | 常见是 384 或 768 维 | 最新的 text-embedding-3-small 是 1536 维 |
质量与泛化 | 开源模型精度不错,但略低于 GPT embedding | OpenAI embedding 训练在海量数据上,质量非常高 |
响应速度 | 本地部署后很快 | 受限于网络,API 请求有延迟 |
成本 | 免费(但你需要 GPU 资源) | 收费(按 token 计费) |
可控性 | 可调参、微调 | 不可修改,只能用 API 提供的模型 |
语言支持 | 中文模型支持不一 | OpenAI embedding 对中文支持也很好 |
你可以用 OpenAI embedding 替代 BERT 向量来做密集检索流程:
流程一致:
只是你用的是:
from openai import OpenAI
import faiss
import numpy as np
client = OpenAI(api_key="你的 key")
# 文档库
texts = ["苹果是一种水果", "小米是一家公司", "香蕉富含钾"]
# 批量生成文档向量
def get_embedding(text):
response = client.embeddings.create(
input=text,
model="text-embedding-3-small"
)
return response.data[0].embedding
doc_embeddings = [get_embedding(t) for t in texts]
dimension = len(doc_embeddings[0])
index = faiss.IndexFlatL2(dimension)
index.add(np.array(doc_embeddings))
# 用户查询
query = "香蕉的营养成分有哪些?"
query_embedding = np.array([get_embedding(query)])
# 搜索
D, I = index.search(query_embedding, k=2)
for idx in I[0]:
print("Top Match:", texts[idx])
对比点 | 密集检索(BERT/DPR) | OpenAI Embedding 检索 |
---|---|---|
属于什么 | 都属于 Dense Retrieval | |
本质做什么 | 都是文本→向量→向量相似度匹配 | |
区别 | 使用的模型来源不同(开源 vs 商业 API) | |
联系 | 可以完全互换,流程一致,只是底层模型不同 |
shibing624/text2vec-base-chinese
或 bge-small-zh