(RAG 系列)RAG 技术原理

RAG 技术原理

背景和概念
  • 在自然语言处理领域,大型语言模型(LLM)如GPT-3、BERT等已经取得了显著的进展,它们能够生成连贯、自然的文本,回答问题,并执行其他复杂的语言任务。然而,这些模型存在一些固有的局限性,如“模型幻觉问题”、“时效性问题”和“数据安全问题”。为了克服这些限制,检索增强生成(RAG)技术应运而生。

    大模型现存问题大型语言模型的局限性
    问题1.1模型幻觉问题:生成内容可能不准确或不一致
    问题1.2时效性问题:生成的内容不具有当前时效性
    问题1.3数据安全问题:可能存在敏感信息泄露风险

请添加图片描述

  • RAG技术结合了大型语言模型的强大生成能力和检索系统的精确性。它允许模型在生成文本时,从外部知识库中检索相关信息,从而提高生成内容的准确性、相关性和时效性。这种方法不仅增强了模型的回答能力,还减少了生成错误信息的风险。

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

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

    知识检索是RAG流程中的关键步骤,但也是面临挑战的步骤之一。用户提问可能以多种方式表达,而知识库的信息来源可能是多样的,包括PDF、PPT、Neo4j等格式。

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

    技术类型描述
    Naive RAGNaive RAG是RAG技术的最基本形式,也被称为经典RAG。包括索引、检索、生成三个基本步骤。索引阶段将文档库分割成短的Chunk,并构建向量索引。检索阶段根据问题和Chunks的相似度检索相关文档片段。生成阶段以检索到的上下文为条件,生成问题的回答。
    Advanced RAGAdvanced RAG在Naive RAG的基础上进行优化和增强。包含额外处理步骤,分别在数据索引、检索前和检索后进行。包括更精细的数据清洗、设计文档结构和添加元数据,以提升文本一致性、准确性和检索效率。在检索前使用问题的重写、路由和扩充等方式对齐问题和文档块之间的语义差异。在检索后通过重排序避免“Lost in the Middle”现象,或通过上下文筛选与压缩缩短窗口长度。
    Modular RAGModular RAG引入更多具体功能模块,例如查询搜索引擎、融合多个回答等。技术上融合了检索与微调、强化学习等。流程上对RAG模块进行设计和编排,出现多种不同RAG模式。提供更大灵活性,系统可以根据应用需求选择合适的功能模块组合。模块化RAG的引入使得系统更自由、灵活,适应不同场景和需求。
  • 在RAG技术流程中,涉及多个关键模块,每个模块承担着特定的任务,协同工作以实现准确的知识检索和生成自然语言回答。

    技术模块描述
    意图理解意图理解模块负责准确把握用户提出的问题,确定用户的意图和主题。处理用户提问的模糊性和不规范性,为后续流程提供清晰的任务目标。
    文档解析文档解析模块用于处理来自不同来源的文档,包括PDF、PPT、Neo4j等格式。该模块负责将文档内容转化为可处理的结构化形式,为知识检索提供合适的输入。
    文档索引文档索引模块将解析后的文档分割成短的Chunk,并构建向量索引。或通过全文索引进行文本检索,使得系统能够更快速地找到与用户问题相关的文档片段。
    向量嵌入向量嵌入模块负责将文档索引中的内容映射为向量表示,以便后续的相似度计算。这有助于模型更好地理解文档之间的关系,提高知识检索的准确性。
    知识检索知识检索模块根据用户提问和向量嵌入计算的相似度检索或文本检索打分。这一步骤需要解决问题和文档之间的语义关联,确保检索的准确性。
    重排序重排序模块在知识检索后对文档库进行重排序,以避免“Lost in the Middle”现象,确保最相关的文档片段在前面。
    大模型回答大模型回答模块利用大型语言模型生成最终的回答。该模块结合检索到的上下文,以生成连贯、准确的文本回答。
    其他功能模块可根据具体应用需求引入其他功能模块,如查询搜索引擎、融合多个回答等。模块化设计使得系统更加灵活,能够根据不同场景选择合适的功能模块组合。
实现步骤
1. ChatGPT/GLM 等大语言模型的调用
2. 读取知识库数据
3. 文本索引与答案检索

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

  • 步骤1(文本预处理):在文本预处理阶段,对原始文本进行清理和规范化,包括去除停用词、标点符号等噪声,并将文本统一转为小写。接着,采用词干化或词形还原等技术,将单词转换为基本形式,以减少词汇的多样性,为后续建立索引做准备。
  • 步骤2(文本索引):构建倒排索引是文本检索的关键步骤。通过对文档集合进行分词,得到每个文档的词项列表,并为每个词项构建倒排列表,记录包含该词项的文档及其位置信息。这种结构使得在查询时能够快速找到包含查询词的文档,为后续的文本检索奠定了基础。
  • 步骤3(文本检索):接下来是查询处理阶段,用户查询经过预处理后,与建立的倒排索引进行匹配。计算查询中每个词项的权重,并利用检索算法(如TFIDF或BM25)对文档进行排序,将相关性较高的文档排在前面

在实际应用中,倒排索引的构建和维护需要考虑性能问题,采用一些优化技术来提高检索效率,如压缩倒排索引、分布式索引等。这些步骤共同构成了一个有序而逻辑完整的文本检索流程。

4. 文本嵌入与向量检索

语义检索流程

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

Sentence Transformer
问题句子
PDF内容句子
标准化
标准化
相似度计算
相似度计算
排序
选取最大值
写入结果
加载模型
编码文本
问题Embeddings
PDF内容Embeddings
相似度矩阵
排序后的相似度
最相似的页码
生成提交结果

文本编码模型

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

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

文本切分方法

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

更多阅读资料:

名称分割依据描述
递归式分割器一组用户定义的字符递归地分割文本。递归分割文本的目的是尽量保持相关的文本段落相邻。这是开始文本分割的推荐方式。
HTML分割器HTML特定字符基于HTML特定字符进行文本分割。特别地,它会添加有关每个文本块来源的相关信息(基于HTML结构)。
Markdown分割器Markdown特定字符基于Markdown特定字符进行文本分割。特别地,它会添加有关每个文本块来源的相关信息(基于Markdown结构)。
代码分割器代码(Python、JS)特定字符基于特定于编码语言的字符进行文本分割。支持从15种不同的编程语言中选择。
Token分割器Tokens基于Token进行文本分割。存在一些不同的Token计量方法。
字符分割器用户定义的字符基于用户定义的字符进行文本分割。这是较为简单的分割方法之一。
语义分块器句子首先基于句子进行分割。然后,如果它们在语义上足够相似,就将相邻的句子组合在一起。

对于自然语言,可以推荐使用Token分割器,结合Chunk Size和Overlap Size可以得到不同的切分:

  • Chunk Size(块大小):表示将文本划分为较小块的大小。这是分割后每个独立文本块的长度或容量。块大小的选择取决于应用的需求和对文本结构的理解。
  • Overlap Size(重叠大小):指相邻两个文本块之间的重叠部分的大小。在切割文本时,通常希望保留一些上下文信息,重叠大小就是控制这种上下文保留的参数。
5. 文本多路召回与重排序

多路召回逻辑

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

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

重排序逻辑(BM25 + BGE Rerank)

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

  • 重排序逻辑常常使用更为强大的模型,如交叉编码器(cross-encoder)模型。这类模型能够更好地理解文本之间的交叉关系,捕捉更复杂的语义信息。
  • 首先通过传统的嵌入模型获取初始的Top-k文档,然后使用重排序逻辑对这些文档进行重新排序。这样可以在保留初步筛选文档的基础上,更精确地排列它们的顺序。
6. 文本问答Promopt优化
原创链接

这部分内容属于摘录,原文见 http://discussion.coggle.club/t/topic/30

### RAG技术的工作原理 RAG(Retrieval-Augmented Generation)是一种结合检索和生成的技术框架,旨在提升自然语言处理任务中的性能。其核心思想是通过引入外部知识源,在生成过程中增强模型的表现力[^1]。 #### 背景与概念 RAG的核心在于将传统的纯生成模式转变为一种混合模式——即先从外部知识库中检索相关信息,再基于这些信息生成最终的结果。这种方法能够有效缓解传统生成模型可能存在的幻觉问题(hallucination),并提高生成内容的相关性和准确性[^2]。 #### 实现步骤详解 以下是RAG技术的主要实现过程: 1. **调用大语言模型** 使用预训练的大规模语言模型(如ChatGPT、GLM等)作为基础架构,负责后续的文本生成任务。这一阶段通常依赖于强大的上下文理解能力以及高效的参数化结构。 2. **读取知识库数据** 构建或接入一个大规模的知识库,该知识库可以是以文档形式存储的数据集或者经过加工后的语料集合。此部分决定了可被检索的信息范围及其质量[^3]。 3. **文本索引与答案检索** 对知识库内的文本进行预处理,并建立高效查询机制以便快速定位相关内容片段。常见的方法包括倒排索引等技术手段。 4. **文本嵌入与向量检索** 将输入问题转化为高维空间中的表示向量,并计算它与其他已知样本之间的相似度得分;随后依据得分选取最接近的一组候选对象作为潜在匹配项。 5. **文本多路召回与重排序** 经过多轮筛选后得到多个备选方案,进一步采用机器学习算法对其进行综合评估打分,最终选出最优解路径。 6. **文本问答Prompt优化** 针对具体应用场景设计合理的提示模板(Prompt Engineering),引导LLMs按照预期方向完成指定操作,比如精确回答特定领域的问题等等。 ```python import numpy as np def rag_pipeline(question, knowledge_base): """ A simplified example of the RAG pipeline. Args: question (str): The input query from user. knowledge_base (list): List of documents or passages to search through. Returns: str: Generated answer based on retrieved information. """ # Step 1: Embedding and Retrieval embeddings = generate_embeddings([question] + knowledge_base) scores = compute_similarity(embeddings[0], embeddings[1:]) top_k_indices = np.argsort(scores)[-3:] # Top-3 relevant docs # Step 2: Generate Answer with Retrieved Contexts context = "\n".join([knowledge_base[i] for i in top_k_indices]) prompt = f"Question: {question}\nContext:\n{context}" generated_answer = call_large_language_model(prompt) return generated_answer def generate_embeddings(texts): pass # Placeholder function; implement embedding generation here. def compute_similarity(query_embedding, doc_embeddings): pass # Placeholder function; calculate cosine similarity between vectors. def call_large_language_model(prompt): pass # Placeholder function; invoke LLM API using provided prompts. ``` 上述代码展示了简化版的RAG流水线逻辑,实际应用中还需要考虑更多细节和技术挑战。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小白_鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值