AI 大模型开发

稠密向量 与 稀疏向量

JACIN··12 分钟阅读

在信息检索和 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-IDFSentence-BERT、BGE、OpenAI Embedding
存储/计算只需存非0值,节省空间需存所有值,但维度低
典型场景关键词明确、包含专有名词的查询语义模糊、自然语言查询

混合检索(Hybrid Search)—— 实践中的最佳选择#

混合检索的常见做法:

  1. 并行检索:同时用 BM25 和 Embedding 向量检索,各自返回 Top-K 结果。
  2. 结果融合:用 RRF(Reciprocal Rank Fusion) 等算法将两路结果合并排序。RRF 根据每个文档在两路检索中的排名计算综合分数,简单有效。
  3. 返回结果:按融合后的分数排序,输出最终的相关文档。

主流向量数据库(如 Milvus、Qdrant、Weaviate)都已原生支持混合检索功能。

评论

还没有评论,来发第一个吧