Embedding(向量嵌入)
一句话
把文字变成一串固定长度的数字(向量)。 意思相近的文字,向量也相近。
核心直觉
「苹果」 → [0.12, -0.34, 0.78, ..., 0.05] (1024 个数字)
「香蕉」 → [0.15, -0.31, 0.75, ..., 0.08] ← 和「苹果」很接近
「汽车」 → [-0.52, 0.41, -0.23, ..., 0.67] ← 和「苹果」差很远向量之间的夹角(余弦相似度)代表了语义距离。夹角越小 = 意思越近。
在 RAG 中的角色
文档 → Embedding 模型 → 向量 → 存入 Milvus
问题 → Embedding 模型 → 向量 → Milvus 相似度搜索 → 返回最相近的文档片段Embedding 是 语义检索 的核心——它不依赖关键词匹配,「汽车」和「轿车」虽然字不同,但向量很近。
应用场景
| 场景 | 说明 |
|---|---|
| 语义搜索 | 搜「怎么部署」能命中「上线流程」、「发布指南」 |
| 文本聚类 | 把相似文档自动归类——不需要人工打标签 |
| 推荐系统 | 「看过这篇的人也看了」= 找向量最近的 N 个文档 |
| 异常检测 | 和正常模式的向量距离突变 → 可能是异常 |
两个关键约束
- 维度必须一致:写入和查询必须用同一个 embedding 模型,否则坐标系不同,结果乱套
- 模型有上下文上限:超长文本需要先切块再 embedding
横向对比:Embedding vs BM25
| Embedding | BM25 | |
|---|---|---|
| 匹配依据 | 语义相似度 | 关键词命中 |
| 冷门术语 | ⚠️ 可能偏移 | ✅ 精准 |
| 同义表达 | ✅ 「车」≈「轿车」 | ❌ 不同词=不匹配 |
| 支持语言 | 训练时覆盖 | 任何(完全靠词) |
| 可解释性 | 低(「为什么觉得相关?」很难说清) | 高(「因为都包含 LangGraph」) |
| 存储格式 | 浮点数组(高维) | 倒排索引(紧凑) |
优缺点
优点: 理解语义而非字面,跨语言/同义词天然支持,适用面广 缺点: 专有名词/编码可能漂移、不可解释、依赖模型质量、向量库存储成本高
如何选择
当用户可能用「不同的话问同一个意思」——用 Embedding。当用户会搜具体的编号/术语/代码——用 BM25。生产环境:两个都用。
小结
Embedding 是把人类语言翻译成数学语言的那座桥。理解它不需要懂微积分,只需要记住一个直觉:向量离得近 ≈ 意思差不多。在这个直觉上,整个语义搜索体系就通了。