Embedding
→ 返回工程实践
将文本、图片、节点等离散对象映射为稠密向量,使语义相近的对象在向量空间中距离更近。是 RAG、语义搜索、推荐系统的核心基础。
主流 Embedding 模型
| 模型 | 维度 | 特点 |
|---|---|---|
text-embedding-ada-002(OpenAI) | 1536 | 通用,API 调用 |
text-embedding-3-large(OpenAI) | 3072 | 更高精度 |
BGE-M3(BAAI) | 1024 | 中文效果好,开源 |
E5-large(Microsoft) | 1024 | 多语言,开源 |
bge-reranker | — | 重排序专用 |
nomic-embed-text | 768 | 本地部署友好 |
生成 Embedding
OpenAI API
from openai import OpenAI
client = OpenAI()
def embed(text: str) -> list[float]:
response = client.embeddings.create(
model="text-embedding-3-large",
input=text
)
return response.data[0].embedding
vec = embed("Redis 是一个基于内存的键值数据库")
print(len(vec)) # 3072Sentence-Transformers(本地)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-m3")
texts = ["Redis 是缓存数据库", "MongoDB 是文档数据库"]
vectors = model.encode(texts, normalize_embeddings=True)
print(vectors.shape) # (2, 1024)相似度计算
import numpy as np
def cosine_similarity(a: list, b: list) -> float:
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 已归一化的向量可直接点积
similarity = np.dot(vec_a, vec_b)| 度量 | 说明 | 适用 |
|---|---|---|
| 余弦相似度 | 方向夹角,与模长无关 | 文本语义相似 |
| 点积 | 归一化后等同余弦 | 速度更快 |
| 欧氏距离 | 空间绝对距离 | 图像、音频 |
Graph-enhanced Embedding
纯文本 Embedding 只捕捉语义,Graph-enhanced Embedding 额外引入实体关系结构,提升表达能力。
Node2Vec(图节点嵌入)
在图上做随机游走,用 Word2Vec 方式学习节点向量:
from node2vec import Node2Vec
import networkx as nx
G = nx.karate_club_graph()
n2v = Node2Vec(G, dimensions=128, walk_length=30, num_walks=200)
model = n2v.fit(window=10, min_count=1)
vec = model.wv["0"] # 节点向量
model.wv.most_similar("0", topn=5) # 最相似节点Knowledge Graph Embedding(TransE)
将知识图谱三元组 (头实体, 关系, 尾实体) 映射到向量空间:
h + r ≈ t
Redis + is-a ≈ 缓存数据库
常用模型:TransE、RotatE、ComplEx(用于知识图谱补全和链路预测)
GraphSAGE(归纳式图神经网络)
节点向量 = 聚合(自身特征, 邻居特征)
支持对未见过的节点生成向量,适合动态图场景。
与纯文本 Embedding 对比
| 维度 | 文本 Embedding | Graph-enhanced Embedding |
|---|---|---|
| 信息来源 | 文本语义 | 语义 + 图结构关系 |
| 多跳推理 | 不支持 | 支持(沿边传播) |
| 实体消歧 | 弱 | 强(依靠图上下文) |
| 构建成本 | 低 | 高(需构建知识图谱) |
| 典型应用 | RAG 检索 | GraphRAG、推荐系统 |
向量存储
# Milvus 存储与检索
from pymilvus import connections, Collection
connections.connect(host="localhost", port=19530)
collection = Collection("knowledge_base")
collection.insert([ids, vectors])
collection.create_index("vector", {"metric_type": "COSINE"})
results = collection.search(
[query_vec], "vector",
param={"metric_type": "COSINE", "nprobe": 10},
limit=5
)