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-text768本地部署友好

生成 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))  # 3072

Sentence-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 对比

维度文本 EmbeddingGraph-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
)

相关文档

  • RAG — 检索增强生成,Embedding 的核心应用场景
  • Milvus — 向量数据库
  • Qdrant — 向量数据库
  • Neo4j — 图数据库(Graph-enhanced Embedding)