DataWhale AI夏令营 大模型应用开发 - Task3 RAG实战

主线任务1 学习基础知识

1 引言


1.1 什么是RAG

知识局限性:大模型的知识来源于训练数据,而这些数据主要来自于互联网上已经公开的资源,对于一些实时性的或者非公开的,由于大模型没有获取到相关数据,这部分知识也就无法被掌握。

数据安全性:为了使得大模型能够具备相应的知识,就需要将数据纳入到训练集进行训练。然而,对于企业来说,数据的安全性至关重要,任何形式的数据泄露都可能对企业构成致命的威胁。

大模型幻觉:由于大模型是基于概率统计进行构建的,其输出本质上是一系列数值运算。因此,有时会出现模型“一本正经地胡说八道”的情况,尤其是在大模型不具备的知识或不擅长的场景中。

为了上述这些问题,研究人员提出了检索增强生成(Retrieval Augmented Generation, RAG)的方法。这种方法通过引入外部知识,使大模型能够生成准确且符合上下文的答案,同时能够减少模型幻觉的出现。

由于RAG简单有效,它已经成为主流的大模型应用方案之一。

如下图所示,RAG通常包括以下三个基本步骤:

索引:将文档库分割成较短的 Chunk,即文本块或文档片段,然后构建成向量索引。

检索:计算问题和 Chunks 的相似度,检索出若干个相关的 Chunk。

生成:将检索到的Chunks作为背景信息,生成问题的回答。

1.2 一个完整的RAG链路


本小节我们将带大家构建一个完整的RAG链路。

从上图可以看到,线上接收到用户query后,RAG会先进行检索,然后将检索到的 Chunks 和 query 一并输入到大模型,进而回答用户的问题。

为了完成检索,需要离线将文档(ppt、word、pdf等)经过解析、切割甚至OCR转写,然后进行向量化存入数据库中。

接下来,我们将分别介绍离线计算和在线计算流程。

1.2.1 离线计算


首先,知识库中包含了多种类型的文件,如pdf、word、ppt等,这些 文档(Documents)需要提前被解析,然后切割成若干个较短的 Chunk,并且进行清洗和去重。

由于知识库中知识的数量和质量决定了RAG的效果,因此这是非常关键且必不可少的环节。

然后,我们会将知识库中的所有 Chunk 都转成向量,这一步也称为 向量化(Vectorization)或者 索引(Indexing)。

向量化 需要事先构建一个 向量模型(Embedding Model),它的作用就是将一段 Chunk 转成 向量(Embedding)。如下图所示:

一个好的向量模型,会使得具有相同语义的文本的向量表示在语义空间中的距离会比较近,而语义不同的文本在语义空间中的距离会比较远。

由于知识库中的所有 Chunk 都需要进行 向量化,这会使得计算量非常大,因此这一过程通常是离线完成的。

随着新知识的不断存储,向量的数量也会不断增加。这就需要将这些向量存储到 数据库 (DataBase)中进行管理,例如 Milvus 中。

至此,离线计算就完成了。

1.2.2 在线计算


在实际使用RAG系统时,当给定一条用户 查询(Query),需要先从知识库中找到所需的知识,这一步称为 检索(Retrieval)。

在 检索 过程中,用户查询首先会经过向量模型得到相应的向量,然后与 数据库 中所有 Chunk 的向量计算相似度,最简单的例如 余弦相似度,然后得到最相近的一系列 Chunk 。

由于向量相似度的计算过程需要一定的时间,尤其是 数据库 非常大的时候。

这时,可以在检索之前进行 召回(Recall),即从 数据库 中快速获得大量大概率相关的 Chunk,然后只有这些 Chunk 会参与计算向量相似度。这样,计算的复杂度就从整个知识库降到了非常低。

召回 步骤不要求非常高的准确性,因此通常采用简单的基于字符串的匹配算法。由于这些算法不需要任何模型,速度会非常快,常用的算法有 TF-IDF,BM25 等。

另外,也有很多工作致力于实现更快的 向量检索 ,例如 faiss,annoy。

另一方面,人们发现,随着知识库的增大,除了检索的速度变慢外,检索的效果也会出现退化,如下图中绿线所示:

(图片来源:https://github.com/netease-youdao/QAnything)

这是由于 向量模型 能力有限,而随着知识库的增大,已经超出了其容量,因此准确性就会下降。在这种情况下,相似度最高的结果可能并不是最优的。

为了解决这一问题,提升RAG效果,研究者提出增加一个二阶段检索——重排 (Rerank),即利用 重排模型(Reranker),使得越相似的结果排名更靠前。这样就能实现准确率稳定增长,即数据越多,效果越好(如上图中紫线所示)。

通常,为了与 重排 进行区分,一阶段检索有时也被称为 精排 。而在一些更复杂的系统中,在 召回 和 精排 之间还会添加一个 粗排 步骤,这里不再展开,感兴趣的同学可以自行搜索。

综上所述,在整个 检索 过程中,计算量的顺序是 召回 > 精排 > 重排,而检索效果的顺序则是 召回 < 精排 < 重排 。

当这一复杂的 检索 过程完成后,我们就会得到排好序的一系列 检索文档(Retrieval Documents)。

然后我们会从其中挑选最相似的 k 个结果,将它们和用户查询拼接成prompt的形式,输入到大模型。

最后,大型模型就能够依据所提供的知识来生成回复,从而更有效地解答用户的问题。

至此,一个完整的RAG链路就构建完毕了。

1.2 开源RAG框架


目前,开源社区中已经涌现出了众多RAG框架,例如:

TinyRAG:DataWhale成员宋志学精心打造的纯手工搭建RAG框架。

LlamaIndex:一个用于构建大语言模型应用程序的数据框架,包括数据摄取、数据索引和查询引擎等功能。

LangChain:一个专为开发大语言模型应用程序而设计的框架,提供了构建所需的模块和工具。

QAnything:网易有道开发的本地知识库问答系统,支持任意格式文件或数据库。

RAGFlow:InfiniFlow开发的基于深度文档理解的RAG引擎

这些开源项目各具优势,功能丰富,极大的推动了RAG技术的发展。

然而,随着这些框架功能的不断扩展,学习者不可避免地需要承担较高的学习成本。

因此,本节课将以 Yuan2-2B-Mars 模型为基础,进行RAG实战。希望通过构建一个简化版的RAG系统,来帮助大家掌握RAG的核心技术,从而进一步了解一个完整的RAG链路。

第一步 PAI实例创建


第二步 体验rag

1,环境准备

推荐使用支付宝扫码

step1在Termial里面复制
 

git lfs install git clone https://www.modelscope.cn/datasets/Datawhale/AICamp_yuan_baseline.git cp AICamp_yuan_baseline/Task\ 3:源大模型RAG实战/* .

 step2 run all

step3模型微调

2,模型下载

向量模型下载

# 向量模型下载 from modelscope import snapshot_download model_dir = snapshot_download("AI-ModelScope/bge-small-zh-v1.5", cache_dir='.')

源大模型

# 源大模型下载 from modelscope import snapshot_download model_dir = snapshot_download('IEITYuan/Yuan2-2B-Mars-hf', cache_dir='.')

第二步 实战

1,丰富知识库

2,效果


学习心得:


参与DataWhale AI夏令营的大模型应用开发Task 1是一次宝贵的学习经历。以下是我的心得体会:

技术了解:这次任务让我对大模型有了更深的理解,对大模型的基本逻辑和实现方法有了大概的思路,并且对大模型的历史有了部分了解。

前景展望:通过学习大模型rag知识,我了解到大模型的发展方向和难点,对未来大模型的发展有了大概的了解

项目完成:通过这次实战我对之后的大项目有了更多的想法,对知识的应用能力也有了提高,希望接下来发挥作用。

这次学习经历不仅提升了我的技术能力,也加深了我对大模型应用开发的理解。我期待将这些知识应用到更多实际项目中,并在未来的AI领域中不断进步

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值