在信息检索和 RAG 里,我们把一段文本(句子、段落、文档)转换成一个数字列表,这个列表就叫向量(Vector)。
- 向量就像一个坐标点,用来表示文本的“位置”。
- 两个向量越相似(距离越近),说明两段文本的意思越接近。
向量有两个关键属性:
- 维度:向量里有多少个数字(长度)。
- 密度:这些数字里有多少是0。
稀疏向量#
定义: 稀疏向量是维度非常高,但绝大多数元素都是0的向量。
为什么叫“稀疏”? 因为数字“稀稀疏疏”,大部分位置都是0,只有极少数位置有非0值(像稀疏的树林,只有几棵树)。
经典例子:BM25(关键词精确匹配) / TF-IDF(词袋模型)
- 假设你的语料库有10,000个不同的词(词汇表大小=10,000维)。
- 一段文本:“我爱吃苹果”
- 向量表示:[0, 0, 1, ..., 0, 1, ..., 0] (只有"我""爱""吃""苹果"对应的位置是1或某个权重,其他9996个位置都是0)
BM25 与分词#
核心机制回顾:
- BM25 的输入是已经分好词的文档和查询(list of tokens)。
- 它基于词频(TF)、逆文档频率(IDF)和文档长度来打分。
- BM25 不包含任何分词逻辑!分词是你在构建索引前的独立步骤。
不同语言的分词逻辑差异#
总结:英语最友好,中文等东亚语言最麻烦——必须用专用分词器,否则 BM25 效果远不如稠密向量。
| 语言类型 | 分词特点 | 典型分词方式 | 常见工具/库 | 分词错误影响 |
|---|---|---|---|---|
| 英语/法语等(空格分隔) | 词之间有天然空格,相对简单 | 直接按空格 + 标点分词,小写化、去除停用词 | Python split() + NLTK | 基本没问题,但专有名词可能连字符问题 |
| 中文/日语(无空格) | 没有天然词边界,必须用算法切分 | 基于词典 + 统计/深度学习模型 | Jieba(中文)、MeCab(日语)、Kuromoji | 分词错误率高,BM25 几乎失效 |
| 泰语/越南语(无空格) | 类似中文,词边界模糊 | 专用分词器 | PyThaiNLP、VnCoreNLP | 召回率极低 |
| 阿拉伯语/希伯来语 | 右到左书写,形态变化复杂 | 需要形态还原 + 分词 | CAMeL Tools、FARASA | 词形变化导致匹配失败 |
| 德语 | 复合词多(如“Kindergarten”) | 需要复合词拆分 | German Compound Splitter | 长复合词无法匹配短查询 |
稠密向量#
定义: 稠密向量是维度相对较低(几百到几千维),几乎所有元素都是非0的实数(如0.23, -0.87等)。
为什么叫"稠密"? 因为数字"密密麻麻",每个位置基本都有值(像茂密的树林,到处是树)。
经典例子:Embedding 模型(如 BERT、BGE、text-embedding-ada-002)
- 通常768维或1024维。
- 一段文本:"我爱吃苹果"
- 向量可能是:[0.12, -0.45, 0.78, 0.33, ..., -0.01] (768个位置几乎都有小数,没有严格的0)
Embedding 模型是怎么工作的?#
Embedding 模型(如 BERT、BGE、OpenAI text-embedding)通过深度学习将文本编码为稠密向量。训练方式通常是对比学习(Contrastive Learning):
- 让语义相近的文本对应的向量距离更近
- 让语义不同的文本对应的向量距离更远
这样训练出来的模型,能把"苹果手机"和"iPhone"映射到相近的向量空间位置,即使它们没有共同的关键词。
向量相似度怎么算?#
检索时,我们需要计算 query 向量和文档向量之间的相似度,常用方法有:
- 余弦相似度(Cosine Similarity):衡量两个向量方向的夹角,值越接近1越相似。最常用。
- 点积(Dot Product):直接计算两个向量的内积,速度快,但受向量长度影响。
- 欧氏距离(L2 Distance):衡量两个向量在空间中的直线距离,值越小越相似。
选择 Embedding 模型的注意事项#
- 维度与效果的权衡:维度越高通常效果越好,但存储和计算成本也越高。768维是常见的平衡点。
- 多语言支持:如果你的场景涉及中英文混合,选择多语言模型(如 BGE-M3、multilingual-e5)很重要。
- 领域适配:通用模型在特定领域(如医学、法律)可能效果不佳,可以考虑微调或选择领域专用模型。
对比#
RAG(Retrieval-Augmented Generation)的核心是"先检索相关文档,再让 LLM 生成答案"。
- 稀疏检索(Sparse Retrieval):用 BM25 等,擅长找包含精确关键词的文档。
- 适合:专有名词、数字、明确短语(如"2025年香港地铁规划"中的"香港地铁")。
- 稠密检索(Dense Retrieval):用向量相似度,擅长找语义相近的文档。
- 适合:自然语言、模糊查询(如"怎么用AI做智能助手")。
稀疏向量 vs 稠密向量#
| 特性 | 稀疏向量 (Sparse) | 稠密向量 (Dense) |
|---|---|---|
| 维度 | 极高(等于词汇表大小,动辄几万~几十万) | 较低(768、1024、1536等) |
| 元素值 | 大部分是0,只有少数非0 | 几乎所有位置都有非0实数 |
| 核心机制 | 基于 TF-IDF 的关键词匹配 | 将文本编码为向量,通过余弦相似度匹配 |
| 优点 | 计算快、解释性强、对专有名词敏感、不依赖深度学习 | 能理解同义词和语义相似性、对自然语言查询更鲁棒 |
| 缺点 | 无法理解同义词、对查询改写敏感 | 对精确关键词/稀有词可能失效、需要算力、可能语义漂移 |
| 典型算法 | BM25、TF-IDF | Sentence-BERT、BGE、OpenAI Embedding |
| 存储/计算 | 只需存非0值,节省空间 | 需存所有值,但维度低 |
| 典型场景 | 关键词明确、包含专有名词的查询 | 语义模糊、自然语言查询 |
混合检索(Hybrid Search)—— 实践中的最佳选择#
混合检索的常见做法:
- 并行检索:同时用 BM25 和 Embedding 向量检索,各自返回 Top-K 结果。
- 结果融合:用 RRF(Reciprocal Rank Fusion) 等算法将两路结果合并排序。RRF 根据每个文档在两路检索中的排名计算综合分数,简单有效。
- 返回结果:按融合后的分数排序,输出最终的相关文档。
主流向量数据库(如 Milvus、Qdrant、Weaviate)都已原生支持混合检索功能。
评论
还没有评论,来发第一个吧