二、RAG核心
1.向量 (Vector) 与 Embeddings
1.1 向量 (Vector) 与 Embeddings 的定义
向量,可以理解为从原点 (0, 0, ...) 指向空间中某个点的有向线段,在机器学习中,向量是数据的数学表示形式,让计算机能够理解和计算数据之间的关系。
Embeddings 是将离散的、非数值型的数据(如文字、图片、音频)转换为连续的、稠密的向量的技术。 Embeddings 就是给每个事物(词、句子、图片)分配一个独特的坐标,让语义相似的事物在空间中彼此靠近。
| 概念 | 比喻 |
|---|---|
| 原始文本 | "苹果"、"香蕉"、"汽车" |
| Embeddings | 给每个词分配一个地址(坐标) |
| 向量空间 | 一个巨大的地图 |
| 语义相似度 | 地图上的距离(近的意思相近) |
1.2 向量 vs Embeddings 的关系
| 维度 | 向量 (Vector) | Embeddings (嵌入) |
|---|---|---|
| 定义 | 数学概念:一组有序数字 | 应用概念:将数据转换成的向量 |
| 本质 | 母概念(大类) | 子概念(特指语义向量) |
| 关系 | 所有 Embeddings 都是向量 | 但并非所有向量都是 Embeddings |
一句话总结:Embeddings 是一种特殊用途的向量,专门用于表示语义信息。
1.3 具体例子
例子1:词向量 (Word Embeddings)
"国王" → [0.32, -0.45, 0.89, 0.12, -0.67, ...] ← 这就是向量
"皇后" → [0.31, -0.44, 0.88, 0.53, -0.66, ...] ← 语义相近,向量距离近
"苹果" → [0.12, 0.78, -0.23, 0.91, 0.34, ...] ← 语义不同,向量距离远
例子2:在 RAG 中的应用
文本块1:"苹果是一种水果" → 向量 A
文本块2:"香蕉是热带水果" → 向量 B(与A距离近)
文本块3:"汽车需要加油" → 向量 C(与A距离远)
用户问题:"苹果好吃吗?" → 向量 Q
检索系统:找与 Q 距离最近的向量 → 返回向量 A 对应的文本
2 相似度计算方法
| 方法 | 关注点 | 取值范围 | 适用场景 | 是否受长度影响 |
|---|---|---|---|---|
| 余弦相似度 | 方向 | [-1, 1] | 文本语义匹配(最常用) | ❌ 否 |
| 欧氏距离 | 直线距离 | [0, +∞) | 图像、聚类分析 | ✅ 是 |
| 点积 | 方向+长度 | (-∞, +∞) | 归一化后的向量 | ⚠️ 取决于是否归一化 |
| 曼哈顿距离 | 网格距离 | [0, +∞) | 高维稀疏数据 | ✅ 是 |
3. 把文本切分成 chunks
新手首选:直接使用 LangChain 的 RecursiveCharacterTextSplitter
原始文本:"今天天气真好。我们去公园散步吧。“
| 方法 | 切分效果 | 语义完整性 | 说明 |
|---|---|---|---|
| 按句子切分 | Chunk1: 今天天气真好。 Chunk2: 我们去公园散步吧。 | 高 ✅ | 最理想的结果 |
| 按字符数 | Chunk1: 今天天气真 Chunk2: 好。我们去 Chunk3: 公园散步吧 Chunk4: " | 极低 ❌ | 句子被切碎 |
| 固定字符+重叠 | Chunk1: 今天天气真好。 Chunk2: 真好。我们去公 Chunk3: 我们去公园散步吧" | 中 ⚠️ | 保留了一些上下文,仍有割裂 |
| 递归方法 | 默认情况:Chunk1: 今天天气真好。 Chunk2: 我们去公园散步吧。 | 高 ✅ | 智能识别句子边界 |
| 方法 | 切分依据 | 语义完整性 | 实现难度 | 适用场景 |
|---|---|---|---|---|
| 按句子切分 | 标点符号 | 高 | 低 | 规范文本、对话 |
| 按字符数切分 | 固定长度 | 低 | 最低 | 实时处理、日志 |
| 固定字符+重叠 | 长度+重叠 | 中 | 中 | 长文档、防信息丢失 |
| 递归切分 | 分层递归 | 最高 | 较高 | 通用场景(推荐) |
4. 向量检索
检索的方式有哪些?列举两种:
4.1 匹配方式
| 维度 | 关键词搜索 | 语义搜索 |
|---|---|---|
| 匹配逻辑 | 字面匹配 | 意图匹配 |
| 如何工作 | 在文档中查找包含相同词语的内容 | 理解问题含义,找含义相近的内容 |
| 是否要求词一致 | ✅ 必须包含相同的关键词 | ❌ 不需要,同义词、相关概念也可 |
例子1:搜索"笔记本电脑"
| 文档内容 | 关键词搜索 | 语义搜索 | 说明 |
|---|---|---|---|
| "笔记本电脑价格" | ✅ 匹配 | ✅ 匹配 | 包含"笔记本" |
| "便携电脑推荐" | ❌ 不匹配 | ✅ 匹配 | "便携电脑" ≈ "笔记本电脑" |
| "台式机性能" | ❌ 不匹配 | ❌ 不匹配 | 不相关 |
| "laptop评测" | ❌ 不匹配 | ✅ 匹配 | 英文同义词 |
例子2:搜索"心情不好怎么办"
| 文档内容 | 关键词搜索 | 语义搜索 | 说明 |
|---|---|---|---|
| "心情不好缓解方法" | ✅ 匹配 | ✅ 匹配 | 包含关键词 |
| "如何调节情绪" | ❌ 不匹配 | ✅ 匹配 | "调节情绪" ≈ "心情不好怎么办" |
| "抑郁症治疗" | ❌ 不匹配 | ⚠️ 可能匹配 | 语义相关但程度不同 |
| "今天天气" | ❌ 不匹配 | ❌ 不匹配 | 不相关 |