1 . 引言
1.1 什么是RAG
RAG通常是指Retrieval-Augmented Generation,这是一种结合信息检索与生成模型的自然语言处理技术。RAG通过检索外部知识库中的相关信息来增强生成模型的能力,使得生成的回答更为准确和富有信息量。这种方法通过引入外部知识,使大模型能够生成准确且符合上下文的答案,同时能够减少模型幻觉的出现。由于RAG简单有效,它已经成为主流的大模型应用方案之一。
基本步骤如下:
1. 检索阶段:使用查询在预先构建的知识库中检索相关文档或段落。
2. 生成阶段:将检索到的相关文档或段落与原始查询一同输入到生成模型中,以生成最终的回答。
-
索引:将文档库分割成较短的 Chunk,即文本块或文档片段,然后构建成向量索引。
-
检索:计算问题和 Chunks 的相似度,检索出若干个相关的 Chunk。
-
生成:将检索到的Chunks作为背景信息,生成问题的回答。
1.2 一个完整的RAG链路
从上图可以看到,线上接收到用户query
后,RAG会先进行检索,然后将检索到的 Chunks
和 query
一并输入到大模型,进而回答用户的问题。为了完成检索,需要离线将文档(ppt、word、pdf等)经过解析、切割甚至OCR转写,然后进行向量化存入数据库中。
离线计算和实时计算(以下内容来自知乎,因为我觉得课件有点点繁琐)
离线计算
离线计算,通常也称为“批处理”,表示那些离线批量、延时较高的静态数据处理过程。
离线计算适用于实时性要求不高的场景,比如离线报表、数据分析等,延时一般在分钟级或小时级,多数场景是定时周期性执行一个Job任务,任务周期可以小到分钟级,比如每五分钟做一次统计分析,大到月级别、年级别,比如每月执行一次任务。我们最熟悉的MapReduce就是一个离线计算框架,Spark SQL也通常用于离线计算任务。
实时计算
实时计算,通常也称为“实时流计算”、“流式计算”,表示那些实时或者低延时的流数据处理过程。
实时计算通常应用在实时性要求高的场景,比如实时ETL、实时监控等,延时一般都在毫秒级甚至更低。目前比较流行的实时框架有Spark Streaming与Flink。其中,Spark Streaming属于微批处理,是一种把流当作一种批的设计思想,具有非常高的吞吐量但延时也较高,这使得Streaming的场景也得到了一定的限制;Flink则是事件驱动的流处理引擎,是一种把批当作一种有限的流的设计思想,具有高吞吐,低延时,高性能的特点。
(下面这段是来自课件)
由于 向量模型
能力有限,而随着知识库的增大,已经超出了其容量,因此准确性就会下降。在这种情况下,相似度最高的结果可能并不是最优的。为了解决这一问题,提升RAG效果,研究者提出增加一个二阶段检索——重排
(Rerank),即利用 重排模型
(Reranker),使得越相似的结果排名更靠前。这样就能实现准确率稳定增长,即数据越多,效果越好(如上图中紫线所示)。通常,为了与 重排
进行区分,一阶段检索有时也被称为 精排
。而在一些更复杂的系统中,在 召回
和 精排
之间还会添加一个 粗排
步骤,这里不再展开,感兴趣的同学可以自行搜索。综上所述,在整个 检索
过程中,计算量的顺序是 召回
> 精排
> 重排
,而检索效果的顺序则是 召回
< 精排
< 重排
。当这一复杂的 检索
过程完成后,我们就会得到排好序的一系列 检索文档
(Retrieval Documents)。然后我们会从其中挑选最相似的 k
个结果,将它们和用户查询拼接成prompt的形式,输入到大模型。最后,大型模型就能够依据所提供的知识来生成回复,从而更有效地解答用户的问题。至此,一个完整的RAG链路就构建完毕了。
2 . 实战
还是一如既往建造实例,然后下载需要用的,最后运行所有代码
git lfs install git clone https://www.modelscope.cn/datasets/Datawhale/AICamp_yuan_baseline.git cp AICamp_yuan_baseline/Task\ 3:源大模型RAG实战/* .(代码)
为了进行模型微调以及Demo搭建,还需要在环境中安装streamlit
。
# 安装 streamlit pip install streamlit==1.24.0(代码)
紧接着进行模型的下载,就一步一个脚印按照攻略就完事了。
首先是向量模型下载
# 向量模型下载 from modelscope import snapshot_download model_dir = snapshot_download("AI-ModelScope/bge-small-zh-v1.5", cache_dir='.')(代码)
紧接着就接着他的步骤:
最后七七八八整一下就完成咯。