Skip to content

Embedding 与向量数据库

什么是 Embedding

Embedding 是将离散数据(文本、图片等)映射到连续向量空间的过程。语义相近的内容在向量空间中距离更近。

"猫" → [0.12, -0.34, 0.56, ...]
"狗" → [0.15, -0.31, 0.52, ...]   // 与"猫"距离近
"汽车" → [-0.67, 0.89, -0.12, ...]  // 与"猫"距离远

常用 Embedding 模型

模型维度特点
OpenAI text-embedding-3-small1536性价比高
OpenAI text-embedding-3-large3072精度更高
BGE-M31024开源,多语言支持好
Cohere embed-v31024多语言,支持多种搜索类型

相似度计算

余弦相似度

$$ \cos(\theta) = \frac{A \cdot B}{|A| |B|} $$

值域 [-1, 1],越接近 1 表示越相似。

欧几里得距离

$$ d(A, B) = \sqrt{\sum_{i=1}^{n}(a_i - b_i)^2} $$

值越小表示越相似。

向量数据库

专门存储和检索高维向量的数据库:

数据库类型特点
Pinecone云服务全托管,开箱即用
Milvus开源高性能,支持大规模数据
Chroma开源轻量,适合原型开发
Qdrant开源Rust 实现,性能优秀
pgvector扩展PostgreSQL 扩展,无需额外服务

基本使用流程

python
from openai import OpenAI
import chromadb

client = OpenAI()
chroma = chromadb.Client()
collection = chroma.create_collection("notes")

def embed(text: str) -> list[float]:
    resp = client.embeddings.create(input=text, model="text-embedding-3-small")
    return resp.data[0].embedding

collection.add(
    documents=["React 是一个 UI 库", "Vue 是渐进式框架"],
    ids=["doc1", "doc2"],
    embeddings=[embed("React 是一个 UI 库"), embed("Vue 是渐进式框架")],
)

results = collection.query(query_embeddings=[embed("前端框架")], n_results=2)