模型基础05:Embedding
从向量表示、语义相似度、向量空间的边界到常用模型,理解 Embedding 为什么是 RAG 和语义搜索的基础。
Embedding 是将文本、图像等数据转换为向量的过程,它是 RAG(检索增强生成)和语义搜索的基础。理解 Embedding,才能构建高效的知识库系统。
向量表示:从文本到数字
Embedding 的核心是将非结构化数据转换为结构化的向量表示。
什么是 Embedding
Embedding 是一种将离散符号(如单词、句子、图像)映射到连续向量空间的技术:
- 输入:文本、图像、音频等非结构化数据
- 输出:固定长度的实数向量
- 目标:语义相似的输入,在向量空间中距离也相近
向量空间的特点
语义相似性:
"猫" → [0.1, 0.3, -0.2, ...]
"狗" → [0.2, 0.2, -0.1, ...] ← 距离近
"汽车" → [-0.5, 0.1, 0.3, ...] ← 距离远
向量运算:
| 运算 | 含义 | 示例 |
|---|---|---|
| 相似度 | 两个向量的余弦相似度 | 衡量语义相似程度 |
| 加法 | 向量叠加 | ”国王” - “男人” + “女人” ≈ “女王” |
| 减法 | 向量差 | 提取语义差异 |
| 聚类 | 分组相似向量 | 文本分类、主题发现 |
Embedding 的维度
向量维度决定了表达能力和计算成本:
| 维度 | 特点 | 适用场景 |
|---|---|---|
| 128 | 轻量、计算快 | 简单匹配、低延迟场景 |
| 256 | 平衡表达能力和速度 | 大多数场景 |
| 512 | 表达能力强 | 需要精细语义区分 |
| 1024+ | 高表达能力 | 复杂语义理解、研究场景 |
语义相似度:衡量文本相似性
语义相似度是 Embedding 的核心应用,它决定了检索和匹配的质量。
相似度度量方法
| 方法 | 公式 | 特点 | 适用场景 |
|---|---|---|---|
| 余弦相似度 | cos(θ) = A·B / ( | A | |
| 欧氏距离 | A-B | ||
| 点积 | A·B | 计算快,但对长度敏感 | 快速匹配 |
| 曼哈顿距离 | Σ|Aᵢ-Bᵢ| | 计算快 | 低维数据 |
相似度阈值
设定合适的相似度阈值很重要:
| 阈值 | 含义 | 适用场景 |
|---|---|---|
| > 0.9 | 高度相似 | 精确匹配、重复检测 |
| 0.7-0.9 | 相似 | 语义搜索、推荐 |
| 0.5-0.7 | 相关 | 扩展检索、模糊匹配 |
| < 0.5 | 不相关 | 过滤、降噪 |
语义匹配示例
精确匹配:
查询:"如何优化 MySQL 查询性能"
匹配:"MySQL 查询优化技巧" → 相似度 0.92
语义匹配:
查询:"怎样让数据库更快"
匹配:"MySQL 查询优化技巧" → 相似度 0.78
不匹配:
查询:"如何学习 Java"
匹配:"MySQL 查询优化技巧" → 相似度 0.35
Embedding 模型:常用选择
选择合适的 Embedding 模型是构建 RAG 系统的关键。
文本 Embedding 模型
| 模型 | 维度 | 特点 | 适用场景 |
|---|---|---|---|
| text-embedding-ada-002 | 1536 | OpenAI 经典模型,平衡效果和成本 | 通用场景 |
| text-embedding-3-small | 1024 | 新模型,效果更好 | 大多数场景 |
| text-embedding-3-large | 3072 | 效果最好,但成本高 | 需要高精度 |
| all-MiniLM-L6-v2 | 384 | 开源轻量,适合边缘部署 | 资源受限 |
| bge-large-en | 1024 | 开源,效果接近闭源 | 开源部署 |
| mxbai-embed-large | 1024 | 多语言支持好 | 多语言场景 |
代码 Embedding 模型
| 模型 | 特点 | 适用场景 |
|---|---|---|
| code-search-ada-code-001 | OpenAI 代码专用 | 代码搜索、理解 |
| all-code-distilroberta-v1 | 开源代码模型 | 代码分析 |
模型选择建议
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 通用场景 | text-embedding-3-small | 平衡效果和成本 |
| 需要高精度 | text-embedding-3-large | 最好的效果 |
| 成本敏感 | all-MiniLM-L6-v2 | 开源免费 |
| 多语言 | mxbai-embed-large | 支持多种语言 |
| 代码场景 | code-search-ada-code-001 | 代码专用 |
Embedding 的应用场景
Embedding 有广泛的应用场景,核心是语义匹配和检索。
RAG(检索增强生成)
RAG 是 Embedding 最主要的应用:
用户查询 → Embedding → 向量检索 → 知识库文档 → 上下文 → LLM → 回答
关键步骤:
- 知识库构建:将文档切分、Embedding、存入向量数据库
- 查询 Embedding:将用户查询转换为向量
- 向量检索:在向量数据库中查找相似文档
- 上下文构建:将检索到的文档作为上下文输入 LLM
语义搜索
语义搜索比关键词搜索更智能:
| 维度 | 关键词搜索 | 语义搜索 |
|---|---|---|
| 匹配方式 | 精确匹配 | 语义匹配 |
| 理解能力 | 无 | 理解语义 |
| 同义词 | 需要手动配置 | 自动理解 |
| 多语言 | 需要翻译 | 直接匹配 |
| 示例 | ”猫” 匹配 “猫" | "猫” 匹配 “猫咪”、“小猫” |
文本分类
通过 Embedding + 分类器实现文本分类:
文本 → Embedding → 分类器 → 类别
优势:
- 不需要大量标注数据
- 可以利用预训练模型的知识
- 迁移学习效果好
聚类分析
将相似的文本聚在一起:
文本集合 → Embedding → 聚类算法 → 簇
应用:
- 主题发现
- 文档分类
- 异常检测
推荐系统
基于用户行为和内容的 Embedding 推荐:
用户行为 → 用户 Embedding
内容 → 内容 Embedding
相似度计算 → 推荐
Embedding 的挑战与优化
挑战
| 挑战 | 描述 | 影响 |
|---|---|---|
| 语义漂移 | 不同语境下同一个词含义不同 | 检索不准确 |
| 多义性 | 一词多义 | 匹配错误 |
| 长文本 | 长文本的 Embedding 质量下降 | 检索效果差 |
| 领域差异 | 通用模型在特定领域效果差 | 需要领域微调 |
| 时效性 | 模型无法理解新词汇 | 需要更新模型 |
优化方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 领域微调 | 在领域数据上微调 Embedding 模型 | 特定领域 |
| 指令微调 | 用指令-响应对微调 | 提升检索效果 |
| 文本切分 | 将长文本切分为短片段 | 长文档处理 |
| 混合检索 | 结合关键词和语义检索 | 需要精确匹配 |
| 重排序 | 先检索再重排 | 提升精度 |
| 多向量表示 | 一个文本用多个向量表示 | 复杂语义 |
文本切分策略
| 策略 | 方法 | 优缺点 |
|---|---|---|
| 按字符数 | 固定长度切分 | 简单,但可能切断语义 |
| 按段落 | 按段落边界切分 | 保持语义,但长度不均匀 |
| 按语义 | 按句子或语义单元切分 | 效果最好,但复杂 |
| 递归切分 | 先粗切再细切 | 层次化检索 |
向量数据库:存储和检索 Embedding
向量数据库专门用于存储和检索向量,是 RAG 系统的基础设施。
常用向量数据库
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Pinecone | 托管服务,简单易用 | 快速启动 |
| Milvus | 开源,功能丰富 | 大规模部署 |
| Chroma | 轻量级,适合开发 | 开发测试 |
| Weaviate | 混合检索,知识图谱 | 需要多种检索方式 |
| FAISS | Facebook 开源,高性能 | 需要极致性能 |
| Elasticsearch | 传统搜索 + 向量检索 | 已有 ES 集群 |
向量检索流程
1. 索引构建:文档 → Embedding → 向量数据库
2. 查询:用户查询 → Embedding → 向量检索 → Top-K 结果
3. 重排序:对结果进行重排
4. 返回:返回最终结果
检索参数
| 参数 | 含义 | 影响 |
|---|---|---|
| Top-K | 返回前 K 个结果 | K 越大,召回率越高,但成本越高 |
| 相似度阈值 | 过滤低于阈值的结果 | 影响精度和召回率 |
| 索引类型 | 向量索引的类型 | 影响检索速度和精度 |
项目判断清单
- 需要构建知识库系统 → 使用 Embedding + 向量数据库
- 需要语义搜索 → 使用 text-embedding-3-small 或开源模型
- 需要代码搜索 → 使用 code-search-ada-code-001
- 长文档处理 → 先切分再 Embedding
- 检索效果差 → 检查切分策略、模型选择、相似度阈值
- 需要多语言支持 → 使用 mxbai-embed-large 等多语言模型
- 需要成本控制 → 使用开源模型(如 all-MiniLM-L6-v2)
- 需要极致性能 → 使用 FAISS 或 Milvus