RAG深入学习之Emabedding

引言

前面已经介绍过RAG流程中的chunk,也就是分块,详细介绍了几种分块的方法,比如固定长度切分、递归分块、基于文件结构语义切分和父子结构语义分块,分块的目的就是为了接下来的Embedding,就是将这些分块转化为数学中的向量,然后同用户的问题去做相似度匹配,找出语义最接近的分块,然后组装成完善的提问交给大模型。

本文就深入探索下Embedding的原理与演进,以及后续的应用和优化,希望学完后对于RAG有着更加深入的理解。

一起努力。

1、基础原理与演进

1.1 什么是Emnedding

Embedding是一种将离散文本映射到连续向量空间的技术,也就是说将自然语言转换为多维度坐标中的向量,其核心目的就是捕捉语义信息,从而可以通过使用数学方法来判断文本相似度,通过余弦相似度、欧氏距离来计算向量距离,距离更近的文本就表明语义更加相关。比如文本A"我爱吃水果",文本B"我喜欢吃水果",文本C"今天下雨了",这里通过Emnedding映射后,文本A和文本B的向量距离就更加接近。

有两个非常经典的将词转化为向量的模型Word2VecGloVe,接下来分别介绍下这俩模型,这样对于向量的转化就有着更加直观的认识:

Word2Vec是谷歌推出的一个浅层神经网络,用于把自然语言中的词转化为高维向量,每个向量捕捉了词的语义信息。它包含两个模型:CBOWSkip-gram

  • CBOW(Continuous Bag of Words)

    • 核心思想:通过上下文词预测中心词。
    • 举例:句子"我今天吃了苹果",上下文词是"我今天吃了",模型通过学习把这些上下文映射到一个隐藏向量,然后训练网络预测中心词"苹果"。
    • 特点:训练速度快,对高频词效果好。训练完成后,每个词都有一个对应的向量,这个向量就是它在语义空间中的坐标。
  • Skip-gram

    • 核心思想:通过中心词预测上下文词。
    • 举例:句子"我今天吃了苹果",中心词选"吃",模型通过学习这个词向量去预测周围的词"我""今天""了""苹果"。
    • 特点:对低频词和生僻词效果更好,也适合小数据集。训练完成后,中心词和上下文词都会获得向量表示,每个向量都是模型学习得到的语义坐标。

GloVe是斯坦福做的统计+矩阵分解的方法,就是遍历所有的文本,统计词和词一起出现的次数,造出一个超大的矩阵,然后对这个矩阵做降维处理,得到每个词的向量。

1.2 深度学习时代的Embedding

传统的RNN,循环神经网络,处理文本都是一个词一个词的处理,前一个词的信息会传递给下一个词,比如输入输入一个词,通过Embedding转化为向量,后续所有的词都会按照顺序输入RNN,前面隐藏的状态都会传递给后面来累计上下文信息,最终输出每个句子的向量。这种方式就会导致速度非常的慢,而且很难处理很深的网络。

Transformer是目前所有主流的embedding模型的核心架构,包括BERT、OpenAI Emdeddings、LLama系列都是基于Transformer。其核心思想就是完全基于自注意力机制,一次性去处理整个序列,让每个词都能看到其他的词,每个词都有一个query、key、value向量,通过计算query与其他token key的相似度,得到注意力权重,然后用注意力权重加权sun value向量,得到包含全局上下文信息的表示。比如当模型处理"我喜欢吃苹果,因为它很甜甜"这样句子时,Emnedding会自动让甜与苹果产生强关联,而不是只看到局部的词领域。

BERT 是 Transformer 架构的代表作,也是现代 embedding 模型的里程碑。他的Embedding能力来自两个核心的预训练任务,MLM(Masked Language Modeling),随机遮盖句子中的某些token,让模型去预测被这盖住的词,通过这种方式让模型去理解上下文信息;还有一个就是NSP(NEXT Sentence Prediction),预测两个句子是否相邻,来让模型理解句子之间的关系。举一个简单的例子,在以往的 Word2Vec、GloVe 模型中,苹果这个词永远都是用一个向量,不管是水果还是公司,而BERT是根据上下文来确定的动态词向量,不同的句子中,同一个词的向量是不一样的。

2、应用与挑战

2.1 RAG工作流中的Embedding

在RAG中,文档被划分为合适的大小后,就需要通过embedding将分块转化为向量,然后再将用户的问题使用同样的模型也转化为向量,然后计算向量间的相似度来找出和用户提问相关的文档,这就是embedding在RAG流程中的作用。

通过embedding嵌入模型转化的向量,称之为稠密向量,比如上一篇使用的智普发布的bge‑small‑zh‑v1.5,这种通过embedding模型直接生成的稠密向量,维度一般都在768/0124和1536维,几乎每个维度有值,很少是0,语义上泛化能力很强,非常擅长寻找一些语义相似的文本。

直接将稠密向量存入向量数据库,然后和用户的提问去匹配,这种做法仅仅通过衡量向量距离来做相似度匹配,一旦遇到一些专业性很高的术语,就很容易遗漏。在生产级RAG中使用的大多都是混合检索,先将文本分块,然后生成稠密向量,这里就是使用嵌入模型,然后再生成稀疏向量,比如使用BM25这种模型,将稠密向量和稀疏向量都存入到数据库,当用户提问时,同样生成稠密向量和稀疏向量,向量库同时去做稠密检查和稀疏检查,然后融合两种结果一起投喂给大模型。这种混合检索就能够兼顾语义性和关键字匹配,对于一些专业领域的专业性高的术语,也能做到很好的匹配。

稠密向量主要是将文本压缩成低维语义编码,这个过程就会丢失部分的关键字信息,而稠密检索就是基于字面关键字的硬匹配,能够精准的抓住一些专业性很高的关键字,来弥补稠密向量的模糊性。

2.3 Embedding面临的挑战

Embedding在应用中主要有下面这几个问题:

  1. 语义鸿沟

    向量相似度只是计算向量之间的数学相似性,这个相似性不一定等同于人类的语义理解,比如苹果手机发布和苹果水果成熟,句子中有苹果,但是语义完全不同,模型就很有可能会混淆。因为embedding是低维压缩,信息一定会丢失的,还有模型关注的都是单词出现的概率模式,不是真正的理解其含义,这就可能会导致召回一些似是而非的内容,导致大模型出现幻觉。

    这种就需要使用一些对上下文敏感的模型,比如BERT,还可以训练一些特定领域的专属模型来处理这种情况。

  2. 长文本处理

    模型都是有token限制的,遇到一些非常长的文档,模型就会把整段转化成一个向量,文档的重点就会被稀释,分块也会变得很难,很难保证文本的语义完整性。

    这种可以使用一些分块技巧来尽可能的保证语义完整性,比如基于文件结构的语义分块。

  3. 领域适应性

    我们所使用的大模型都是通用大模型,对于一些特定领域,比如医学文献、金融报告这种,尤其是缩写、术语、公式等,相似度计算的结果可能会导致偏差很大,导致检索的召回率下降。这种就可能需要涉及到模型的微调了。

3、 模型选择与评估

3.1 主流Embedding模型介绍

当前的Embedding生态大致可以分为一下这四类:

  1. OpenAI系列

    主要模型有text-embedding-3-smalltext-embedding-3-large,是目前商业API中最稳定、质量最高的embedding之一,支持多语言,高语义的理解能力,与GPT系列模型无缝适配,语义相似度系数达0.89+,开箱即用无需额外微调。

    Open AI系列的还有一个重要的技术就是支持Matryoshka Representation Learning,也就是一个长向量可以被剪裁成多个短向量使用,仍然保持语义能力,这就可以很大的节省向量数据库的内存空间,而且计算相似度也会更快。

    缺点就是成本较高,毕竟是付费模型,而且不支持本地部署,对数据隐私有要求的就不适合了。

  2. BGE系列

    BGE是开源embedding的标杆,代表模型就是BGE-M3,这个M3有这么几个含义

    1. Multi-lingual 多语言,支持中文、英文,对于跨语言搜索有着很好的适配
    2. Multi-granularity 多粒度,支持句子、词语、段落和文档,对RAG的chunk很友好
    3. Multi-function 多功能,同时支持稠密检索、稀疏检索和多向量检索

    优势就在于支持本地私有化部署,质量接近商业模型,就是GPU需求较高,有一定的推理成本。

  3. Cohere Emged

    Cohere是一家专门做NLP API的公司,代表模型有embed-english-v3embed-multilingual-v3,专门为企业级场景设计的,支持私有化部署,满足金融、医疗等行业的数据隐私性要求;支持多模态,可以实现文本、图像的跨模态检索。缺点就是太贵。

  4. 开源embedding

    除了BGE,还有很多优秀的开源embedding,比如阿里达摩院的General Text Embedding,比如GTE系列的;还有jina 系列的开源模型,支持超长上下文的embedding

3.2 模型评估指标

embedding模型的评估可以通过下面两个方向

  1. 检索效果指标

    在RAG系统中,经常会关注的问题就是,正确的答案有没有被搜索出来,有三个常用的指标可以来衡量下:

    1. Recall@k

      在k个结果中,找到了多少正确答案

      ini 复制代码
      Recall@k = (检索到的相关文档数) / (所有相关文档数)
    2. Precision@k

      在返回的结果中,有多少是真的相关的

      ini 复制代码
      Precision@k = (相关文档数) / k
    3. NDCG@K

      排序是否合理,越靠前的答案,权重越高。

  2. 向量相似度计算方式

    余弦相似度,这个高中课程学习过,计算两个向量之间的夹角

    css 复制代码
    cos(A,B) = (A·B) / (|A||B|)

    值越大,表明向量越相关

    欧氏距离

    计算两点之间的距离

    ini 复制代码
    distance = √Σ(Ai-Bi)^2

    越小表明越相似

3.3 选型策略

如何筛选模型呢,有一个embedding评测排行榜MTEB, 由 Hugging Face 维护,包括全面的文本嵌入模型评测基准。它涵盖了分类、聚类、检索、排序等多种任务,并提供了公开的排行榜,为评估和选择嵌入模型提供了重要的参考依据。

在做RAG时,有这么embedding模型选型有这么几个关键指标

  1. 语义相似度:能不能把意思一样、字不一样的匹配上
  2. 长文本能力:对文档、段落和多句子的编码效果
  3. 向量维度:越小检索越快
  4. 语言适配:中文一定要选用中文预训练模型
  5. 领域适配:在垂直领域优先选用专用模型

在实际选型上,可以按照这三个步骤来:

  1. 按语言选

    纯英文场景,可以使用all-MiniLM-L6-v2,中英混合可以使用bge-small-en-zh或者bge-base-zh-v1.5,纯中文业务就直接上中文专属模型,不要使用那些多语言的

  2. 按业务场景选

    在通用回答、知识库、内部文档场景中,优先选用一些综合能力较强的通用模型,比如BGE-base-zh-v1.5bge-small-zh-v1.5

    涉及到长文档、PDF、书籍和报告场景的,BGE-large-zh-v1.5gte-large-zh

  3. 垂直领域

    在垂直领域,优先选用专属模型,比如医疗金融,涉及到大量的专属名词的

向量维度常见的有这么几个

  1. 384维,小模型,检索极快
  2. 768维,base模型,均衡
  3. 1024维,大模型,精度高,但是检索压力大

当数据量小于100w时,可以考虑base模型,当大于1000w时,优先选用小维度模型了。

相关推荐
We་ct2 小时前
React Scheduler & Lane 详解
前端·react.js·前端框架·reactjs·个人开发·任务调度·优先
2401_883035462 小时前
数据分析与科学计算
jvm·数据库·python
kgduu2 小时前
js之json处理
前端·javascript·json
野犬寒鸦2 小时前
从零起步学习计算机操作系统:进程篇(基础知识夯实)
java·服务器·后端·学习·面试
我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列2--相关Python基础知识
python·学习·测试工具·pytest
@木尘2 小时前
前端面试【 八股文篇】
前端·面试·职场和发展
闻哥2 小时前
MySQL索引核心原理:B+树生成、页分裂与页合并全解析
java·jvm·b树·mysql·adb·面试·springboot
独自破碎E2 小时前
【面试真题拆解】Redis的8种内存淘汰策略
redis·面试·职场和发展
吴佳浩2 小时前
OpenClaw、Claude Code 等 Agent 为什么都选择 Node.js?
前端·人工智能·langchain