基础概念解析动手学RAG 概念解析篇-CSDN博客

初识RAG(传统模型介绍)

大模型的局限性

大型语言模型在自然语言处理领域展示了显著的能力,但它们也存在一系列固有的缺点。首先,虽然这些模型在掌握大量信息方面非常有效,但它们的结构和参数数量使得对其进行修改、微调或重新训练变得异常困难,且相关成本相当可观。

其次,大型语言模型的应用往往依赖于构建适当的提示(prompt)来引导模型生成所需的文本。这种方法通过将信息嵌入到提示中,从而引导模型按照特定的方向生成文本。然而,这种基于提示的方法可能使模型过于依赖先前见过的模式,而无法真正理解问题的本质。

大模型现存问题 大型语言模型的局限性

问题1 模型幻觉问题:生产内容可能不准确或不一致

问题2 时效性问题:生成的内容不具有当前时效性

问题3 数据安全问题:可能存在敏感信息泄露风险

在自然语言处理领域,幻觉(Hallucination)被定义为生成的内容与提供的源内容无关或不忠实,具体而言,是一种虚假的感知,但在表面上却似乎是真实的。在一般语境中,幻觉是一个心理学术语,指的是一种特定类型的感知。在自然语言处理或大型语言模型的语境下,这种感知即为一种虚假的、不符合实际的信息。

造成幻觉的原因主要可以归结为数据驱动原因、表示和解码的的不完善以及参数知识偏见。首先,数据对不齐或不匹配可能导致幻觉,因为模型在训练中未能准确地理解源内容容与参考内容之间的关系。

知识库问答(Knowledge Base Question Answering,KBQA)

知识库问答(Knowledge Base Question Answering,简称KBQA)是一种早期的对话系统方法,旨在利用结构化的知识库进行自然语言问题的回答。这种方法基于一个存储在图数据库中的知识库,

通常以三元组的形式表示为<主题,关系,对象>,其中每个三元组都附带相关的为属性信息

知识库问答早期是对话系统中的有效方法,其基于知识图谱的结构为系统提供了丰富的语义信息,使得系统能够更深入地理解用户提出的问题,并以结构化的形式回答这些些问题。随着技术的不断发展,KBQA方法也在不断演进,为对话系统的进一步提升奠定了基础。

在KBQA中,有两种主流方法用于处理自然语言问题:

  • 主题识别与实体链接:该方法从识别问题中的主题开始,将其链接到知识库中的实体(称为主题实体)。通过主题实体,系统能够在知识库中查找相关的信息并回答答问题。

  • 多跳查询:基于图数据库的优势,KBQA能够进行多跳查询,即通过多个关系跨越多个实体来获取更深层次的信息。这种灵活性使得系统能够更全面地理解和回答用户的复杂问题。

RAG介绍

什么是RAG

检索增强生成(RAG)技术在弥补大型语言模型(LLM)的局限性方面取得了显著进展,尤其是在解决幻觉问题和提升实效性方面。在之前提到的LLM存在的问题中,特别是幻觉问题和时效性问题,RAG技术通过引入外部知识库的检索机制,成功提升了生成内容的准确性、相关性和时效性。

  • RAG技术通过检索外部知识库,避免了幻觉问题的困扰。相较于单纯依赖大型语言模型对海量文本数据的学习,RAG允许模型在生成文本时从事实丰富的外部知识库中检索相关信息。

  • RAG技术的时效性优势使其在处理实效性较强的问题时更为可靠。通过与外部知识库的连接,RAG确保了模型可以获取最新的信息,及时适应当前的事件和知识。

  • 与传统的知识库问答(KBQA)相比,RAG技术在知识检索方面更加灵活,不仅能够从结构化的知识库中检索信息,还能够应对非结构化的自然语言文本。

RAG优点 描述

优点1.1 提高准确性和相关性

优点1.2 改善时效性,使模型适应当前事件和知识

优点1.3 降低生成错误风险,依赖检索系统提供的准确信息

RAG被构建为一个应用于大型语言模型的框架,其目标是通过结合大模型的生成能力和外部知识库的检索机制,提升自然语言处理任务的效果。RAG并非旨在取代已有的知识库问答(KBQA)系统,而是作为一种补充,利用检索机制强调实时性和准确性,从而弥补力大型语言模型固有的局限性。

RAG框架的最终输出被设计为一种协同工作模式,将检索到的的知识融合到大型语言模型的生成过程中在应对任务特定问题时,RAG会生成一段标准化的句子,引导大模型进行回答。下面是RAG输出到大型语言模型的典型模板:

你是一个{task}方面的专家,请结合给定的资料,并回答最终的问题。请如实回答,如果问题在资料中找不到答案则回答不知道

问题:

{question}

资料:

{information1}

{information2}

{information3}

RAG和SFT对比

在更新大型语言模型的知识方面,微调模型和使用RAG这两种方法有着各自的优缺点。微调模型优势在于能够通过有监督学习的方式,通过对任务相关数据的反复迭代调整,使得模型更好地适应特定领域的知识和要求。RAG能够从外部知识库中检索最新、准确的信息,人人而提高了答案的质量和时效性。其优势在于可以利用最新的外部信息,从而更好地适应当前事件和知识。

RAG实现流程

如果使用RAG,主要包括信息检索和大型语言模型调用两个关键过程。信息息检索通过连接外部知识库,获取与问题相关的信息;而大型语言模型调用则用于将这些信息整合到自然语言生成的过程中,以生成最终的回答。

RAG流程 描述:

步骤1:问题理解 准确把握用户的意图

步骤2:知识检索 从知识库中相关的知识检索

步骤3:答案生成 将检索结果与问题

RAG每个步骤都面临一些挑战,这些挑战使得RAG的实现变得复杂而困难。在问题理解阶段,系统需要准确把握用户的意图。用户提问往往是短文本,而知识库中的信息可可能是长文本。将用户提问与知识库中的知识建立有效的关联是一个难点,特别是考虑到用户提问可能模模糊,用词不规范,难以直接找到相关的知识。

知识检索是RAG流程中的关键步骤,但也是面临挑战的步骤之一。用户提问可能以多种方式表达,而知识库的信息来源可能是多样的,包括PDF、PPT、Neo4j等格式。此外用户的意图可能非常灵活,可能是提问,也可能需要进行闲聊。

在这个阶段,需要确保生成的答案与用户的意图一致,同时保持自然、连贯的文本。此外,大型模型的输出可能存在幻觉问题,即生成的内容可能与问题不相关,增加了生成准确回答的难度。

在论文综述「Retrieval-Augmented Generation for Large Language Models:A Survey」中,作者将RAG技术按照复杂度继续划分为Naive RAG, Advanced RAG、Modular RAG。

在RAG技术流程中,涉及多个关键模块,每个模块承担着特定的任务,协同工作以实现准确的知识检索和生产自然语言回答

ChatGPT/GLM API使用

两个大模型介绍

ChatGPT

ChatGPT OpenAl开发的聊天生成预训练转换器,基于GPT-3.5和GPT-4架构。该模型通过强化学习训练,具有出色的语言生成能力。ChatGPT支持文字方式的交互,用户可以使用自然语言对话的方式与ChatGPT进行通信。API的引入使得开发者能够将ChatGPT整合到自己的应用中,实现自动文本生成、自动问答等功能。

GLM

GLM 智谱Al推出的新一代基座大模型,相比上一代有着显著提升的性能,逼近GPT-4。GLM支持更长的上下文(128k),具备强大的多模态能力,并且推理速度更快支持更高的并发。GLM的API接口为开发者提供了在自己应用中利用GLM进行语言生成的机会,为多种领域的任务提供了新的解决方案。

虽然这两个大模型都非常有效,但我们希望所有的学习者都需要学会对应的API调用。如果在本地使用ChatGLM3-6B等开源模型,也可以完成类似功能,但整体效果肯定不如这些收费的API。

ChatGPT

ChatGLM

官网

https://chat.openai.com/

https://open.bigmodel.cn/

API文档

https://platform.openai.com/docs/api-reference

https://open.bigmodel.cn/dev/api

API计费说明

https://openai.com/pricing

https://open.bigmodel.cn/pricing

在继续后续的学习中,有以下注意事项:

1.ChatGPT/GLM API可以通过Python的库进行调用,也可以通过HTTP方式进行调用。为了代码方便,后续都使用HTTP方式调用。

2.ChatGPT/GLMAPI都有v3.5和v4两个对话版本的模型,但v4价格比v3.5高5-10倍,且更慢。所以除非必要,请默认使用v3.5模型。

3.ChatGPT API在国内无法链接,教程使用了第三方充值和转发发方式。

对话API

对话API是所有大模型的最常见的API,可以完成通用对话,也可以完成很多功能。但在进行调用时需要注意如下入参和参数返回结果。

  • 请求参数说明

  • 返回结果字段

对话API的使用:

chatgrm

指定调用的地址和模型,写调用对话即可

messages:里面是一个列表

role:代表用户输入

content: 代表用户的输入字符串

不同大模型的model英文缩写不同,但是messages一般保持一致。

choices:默认大模型返回结果只有一个, 这个字段包含了一个数组,数组中的每个元素代表一个选择

message:用于封装大模型输出结果,对应我们的输入

role:代表大模型输入

created:返回的是一个时间戳,用于表示请求时间

id:是这次请求的唯一标识符。

model:表示使用的模型名称。

reyuest_id:与 id 相同,用于跟踪请求。

usage:描述了本次请求使用的资源量。

  • completion_tokens: 30 表示生成回复时使用的令牌数量。

  • prompt_tokens: 6 表示输入提示(用户提问)的令牌数量。

  • total_tokens: 36 表示总共使用的令牌数量(包括输入和输出)

我们可以在messages中模拟用户的对话:

那么大模型会将之前的对话当作我们的输入来输出结果

Embeeding API

Chatgrm API

function_call的理解

function_call是非常有用的功能,不仅能对文本进行理解,还可以将文本转化成函数的调用,当function里只传入了一个函数的时候,那么默认调用一个函数,如果传入多个函数,那么大模型会判断调用哪一个函数更为合适。

仍然是在messages中传入对话

我们调用了get_connection函数,并传入了两个参数 李华 和 小王

输出结果为function_call,代表了我们调用了函数以及调用了什么函数

数据集读取与评测方法

背景:

在线评测地址:https://competition.coggle.club/

使用代码读取数据集

数据集可以有pdf格式和JSON格式

可以通过impurt pdfpluber库和josn库来进行读取pdf格式数据集

通过 json 方法得到pdf的实例

通过 open 方法得到pdf的实例

通过 pages 来索引他们的页数

通过 extract_text 解析指定页数的文字

注意:所导入的pdf需要可复制这种版本才行,否则需要对图片先进行ocr

评测机制:

评分使用answer的重合比例和reference的准确率进行评价,各自占比50%的权重。

提交格式样例如下(也为json格式,直接填充问题json提交即可),其中answer为问题对应的回答,reference为相关知识页面的来源(从(page_1)开始。

简单来说评测需要找到两个部分

1.找到资料相应的页码

2.提问汇总则到的答案

文本索引与答案索引

文本检索流程

概念:文本检索是一个多步骤的过程,其核心是构建倒排索引以实现高效的文本检索

构建倒排索引:倒排索引是一种数据结构,它将每个单词映射到包含该单词的文档列表。这种结构使得在大量文档中进行快速搜索成为可能。

TFIDK和BM25相当于是一个打分算法

下面是文本检索和语义检索的区别和联系的表格形式:

在一些场景中,文本检索和语义检索可以结合使用,以充分利用它们各自的优势。例如,可以先使用文本检索筛选出候选文档,然后在这些文档上应用语义检索来进一步提高检索的准确性。当然具体使用哪种检索方法,需要具体分析,在RAG中可以结合两种方法一起进行使用。

TFIDF

TFIDF (Term Frequency-Inverse Document Frequency)是一种中用于信息检索和文本挖掘的常用权重计算方法,旨在衡量一个词项对于一个文档集合中某个文档的重要性。该方法结合了两个方面的信息:词项在文档中的频率(TF)和在整个文档集合中的逆文档频率(IDF)。

1.词项在文档中的频率(TF):

其中,$t$表示词项,$d$表示文档。TF表示了一个词项在文档中的相对频率,即在文档中出现的次数相对于文档总词项数的比例。

2.逆文档频率(IDF):

其中,$t$表示词项。IDF表示了一个词项在整个文档集合中的稀有程度,如果词项在许多文档中都出现,其IDF值较低,反之则较高。

3.TFIDF的计算:

其中,$D$表示文档集合。TFIDF的最终值是将词项在文档中的频率和在整个文档集合中的逆文档频率相乘,这样可以得到一个更全面的评估,既考虑了在文档中的重要性,也考虑了在整个文档集合中的稀有性。

BM25

BM25Okapi是BM25算法的一种变体,它在信息检索中用于评估古文档与查询之间的相关性。以下是BM25Okapi的原理和打分方式的概述:

1.BM25Okapi的主要参数:

2.打分的计算过程:

BM25Okapi的打分过程基于以下三个因素:词项在文档中的频率(TF)、文档的长度(doc_len)以及逆文档频率(IDF)。

文档长度对分数的影响通过6控制。文档长度越长,该项的分数做越小。BM25Okapi的打分公式综合考虑了以上三个因素,通过对每个词项的打分求和得到最终的文档与查询的相关性分数

其中,$\text{avgdl}$是文档集合中的平均文档长度。BM25Okapi通过合理调整参数,兼顾了词项频率、文档长度和逆文档频率,使得在信息检索任务中能够更准确地评估文档与查询之间的相关性,提高检索效果。

注意事项:

1.实现非工业级别:

提供的TFIDF和BM25的实现并非工业级别,仅作为演示目的。在实际进行文本检索时,特别是在大规模数据集和生产环境中,应该使用专业的文本检索引擎工具,例如Elasticsearch,以确保高效、可扩展和内存友好的实现。

2.相似度计算的内存和数据量级考虑:

在实际应用中,对整个文本集合构建矩阵并进行相似度计算可能能导致内存占用较大,尤其在大规模数据集情况下。建议考虑使用基于倒排索引等数据结构的文本检索引擎,以减小内存占用并提高检索效率。

3.停用词和单词筛选:

未对文本进行停用词筛选和额外的单词筛选。在实际应用中,建议进行停用词的去除,以排除常见但无实际意义的词汇,提高检索的准确性。同时,考虑引入领域专有的单词筛选,以过滤掉与任务无关的词汇,优化检索结果。

4.PDF处理方式:

将PDF内每一页都当做一个文档进行处理。实际应用中,对于RPDF文档,可以考虑使用专业的PDF文本提取工具,提取有意义的文本内容,而不是将每一页都当做独立的文档处理。这有助于更好地利用文档内部的语义信息。

文本嵌入与向量检索

语义检索流程

语义检索是通过词嵌入句子嵌入等技术,将文本表示为语义丰富的向量。通过相似度计算和结果排序找到最相关的文档。用户查询经过自然语言处理处理,最终系统返回经过排序的相关文档,提供用户友好的信息展示。语义检索通过深度学习和自然语言处理技术,使得系统能够更准确地理解用户查询,提高检索的准确性和效果。

文本编码模型

文本编码模型对于语义检索精度至关重要。目前,大多数语:义检索系统采用预训练模型进行文本编码,其中最为常见的是基于BERT(Bidirectional Encoder Representations from Transformers)的模型,或者使用GPT(Generative Pre-trained Transformer)等。这些预训练模型通过在大规模语料上进行训练,能够捕捉词语和句子之间的复杂语义关系。选择合适的文本编码模型直接影响到得到的文本向量的有效性,进而影响检索的准确性和效果。

编码模型排行榜:https://huggingface.co/spaces/mteb/leaderboard

文本切分方法

文本的长度是另一个关键因素,影响了文本编码的结果。短文本和长文本在编码成向量时可能表达不同的语义信息。即使两者包含相同的单词或有相似的语义,由于上下文的不同,得到的向量也会有所不同。因此,当在语义检索中使用短文本来检索长文本时,或者反之,可能导致一定的误差。针对文本长度的差异,有些系统采用截断或填充等方式处理,以保持一致的向量表示。

文本多路召回与重排序

多路召回

多路召回逻辑是在文本检索中常用的一种策略,其目的是通过多个召回路径(或方法)综合获取候选文档,以提高检索的全面性和准确性。单一的召回方法可能由于模型特性或数据特点而存在局限性,多路召回逻辑引入了多个召回路径,每个路径采用不同的召回方法。

  • 实现方法1:将BM25的检索结果和语义检索结果按照排名进行加权

  • 实现方法2:按照段落、句子、页不同的角度进行语义编码进进行检索,综合得到检索结果。

重排序逻辑(BM25+BGE Rerank)

意思就是Bert没有考虑到chunk上下文之间的联系

重排序逻辑是文本检索领域中一种重要的策略,主要用于优化原有文本检索方法返回的候选文档顺序,以提高最终的检索效果。在传统的文本检索方法中,往往采用打分的逻辑,如计算BERT嵌入向量之间的相似度。而重排序逻辑引入了更为复杂的文本交叉方法,通过特征交叉得到更进一步的打分,从而提高排序的准确性。

  • 重排序逻辑常常使用更为强大的模型,如交叉编码器(cross-encoder)模型。这类模型能够更好地理解文本之间的交叉关系,捕捉更复杂的语义信息。

  • 首先通过传统的嵌入模型获取初始的Top-k文档,然后使用重排序逻辑对这些文档进行重新排序。这样可以在保留初步筛选文档的基础上,更精确地排列它们的顺序。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐