Embedding:让计算机理解语义的原理

Embedding:让计算机理解语义的原理

你搜索”手机坏了怎么修”,关键词检索只能找到包含”手机”和”维修”的文档。但如果文档写的是”设备故障维修流程”,意思完全一样,却搜不到。

Embedding 解决了这个问题。

为什么关键词检索不够用

同义词问题

  • 用户说:”手机坏了怎么修”
  • 知识库写:”设备故障维修流程”
  • 关键词检索:❌ 匹配不上

一词多义问题

“苹果”可能是水果,也可能是 Apple 品牌。关键词检索无法判断上下文。

上下文理解问题

“我不想要了,但已经拆了包装”问的是退货政策,不是包装说明。

向量:让计算机理解语义

核心思想

把文本映射到高维空间中,让语义相近的文本在空间中距离相近

示例

1
2
3
"七天无理由退货" → [0.0234, -0.0156, 0.0891, ...]
"买了一周的东西还能退吗" → [0.0231, -0.0149, 0.0887, ...] ← 距离很近!
"物流配送时效说明" → [-0.1234, 0.4567, -0.0231, ...] ← 距离很远

上图中,距离用余弦相似度衡量。

相似度计算:余弦相似度

核心概念

衡量两个向量的”方向”有多接近:

  • 1.0:语义完全相同
  • 0:语义完全无关
  • -1.0:语义完全相反

经验阈值

相似度范围 含义
0.9 ~ 1.0 高度相关,几乎同一意思
0.7 ~ 0.9 明显相关,主题一致
0.5 ~ 0.7 有一定关联
0.3 ~ 0.5 关联很弱
0.0 ~ 0.3 基本无关

主流 Embedding 模型对比

模型 向量维度 中文效果 部署方式
text-embedding-v3 1024/768 优秀 云端 API
BGE-large-zh 1024 优秀 本地/API
BGE-M3 1024 优秀 本地/API
Qwen3-Embedding-8B 4096 优秀 本地/API
GTE-large-zh 1024 优秀 本地/API

中文场景推荐:BGE-M3(性价比)或 Qwen3-Embedding(精度更高)

模型选型建议

什么时候选云端 API

  • 项目初期,想快速验证效果
  • 团队没有 GPU 资源
  • 对数据安全要求不高

什么时候选本地部署

  • 数据量大(每天数十万+)
  • 对数据安全有严格要求(数据不出域)
  • 对延迟敏感(内网调用更快)

在 RAG 流程中的位置

1
2
文本块 → [Embedding 模型] → 向量 → 向量数据库
用户问题 → [Embedding 模型] → 查询向量 → 相似度计算 → 检索结果

Embedding 是 RAG 的核心纽带:文档和用户问题使用同一个模型向量化,才能保证”问的是退货,召回的也是退货”。

实战:使用 BGE-M3 进行向量化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sentence_transformers import SentenceTransformer

# 加载 BGE-M3 中文模型
model = SentenceTransformer('BAAI/bge-m3')

# 文档向量化
docs = [
"退货政策:七天无理由退货",
"物流配送:下单后2-3个工作日送达",
]
doc_vectors = model.encode(docs)

# 用户问题向量化
query = "买了一个星期还能退吗?"
query_vector = model.encode(query)

# 计算相似度
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity([query_vector], [doc_vectors[0]])[0][0]
print(f"相似度: {similarity:.4f}") # 接近 0.9+

相关阅读: