基本概念与名词:http://www.uml.org.cn/ai/2025032044.asp?artid=26752
RAG(检索、增强、生成)
通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力,如问答、文本摘要、内容生成等。
检索:检索是RAG流程的第一步,从预先建立的知识库中检索与问题相关的信息。这一步的目的是为后续的生成过程提供有用的上下文信息和知识支撑。
增强:RAG中增强是将检索到的信息用作生成模型(即大语言模型)的上下文输入,以增强模型对特定问题的理解和回答能力。这一步的目的是将外部知识融入生成过程中,使生成的文本内容更加丰富、准确和符合用户需求。通过增强步骤,LLM模型能够充分利用外部知识库中的信息。
生成:生成是RAG流程的最后一步。这一步的目的是结合LLM生成符合用户需求的回答。生成器会利用检索到的信息作为上下文输入,并结合大语言模型来生成文本内容。
如何使用
数据准备与知识库构建:
收集数据:首先,需要收集与问答系统相关的各种数据,这些数据可以来自文档、网页、数据库等多种来源。
数据清洗:对收集到的数据进行清洗,去除噪声、重复项和无关信息,确保数据的质量和准确性。
知识库构建:将清洗后的数据构建成知识库。这通常包括将文本分割成较小的片段(chunks),使用文本嵌入模型(如GLM)将这些片段转换成向量,并将这些向量存储在向量数据库(如FAISS、Milvus等)中。
检索模块设计:
问题向量化:当用户输入查询问题时,使用相同的文本嵌入模型将问题转换成向量。
相似度检索:在向量数据库中检索与问题向量最相似的知识库片段(chunks)。这通常通过计算向量之间的相似度(如余弦相似度)来实现。
结果排序:根据相似度得分对检索到的结果进行排序,选择最相关的片段作为后续生成的输入。
生成模块设计:
上下文融合:将检索到的相关片段与原始问题合并,形成更丰富的上下文信息。
大语言模型生成:使用大语言模型(如GLM)基于上述上下文信息生成回答。大语言模型会学习如何根据检索到的信息来生成准确、有用的回答。
RAG通用范式
基础方案
Naive RAG
原始RAG是最早的研究范式,主要包括以下几个步骤:
建立索引:这一过程通常在离线状态下进行,数据清洗并分块,将分块后的知识通过embedding模型产出语义向量,并创建索引。
检索:用户的query问题,使用相同的embedding模型,计算问题嵌入和文档块嵌入之间的相似度,选择相似度最高的前K个文档块作为当前问题的增强上下文信息。
生成:将给定的问题和相关文档合并为新的提示,然后由大型语言模型基于提供的信息回答问题。如果有历史对话信息,也可以合并到提示中,用于多轮对话。
问题:
主要在三个方面:检索质量低、生成质量差和增强过程难。
优化方案
围绕着知识检索做优化,新增了检索前、检索中以及检索后的优化策略,用于解决索引、检索和生成的问题。
检索前优化
知识切分主要把较长的文本按照语义内聚性的分析切成小块,解决核心知识湮没以及语义截断的问题。
query改写主要需要理解用户想表达的意图,把用户原始的问题转换成适合知识库检索的问题,从而提高检索的精准程度。
检索优化
混合搜索,通常是指将向量搜索与基于关键字的搜索相结合的概念。
检索后优化
提示压缩:通过删除无关内容并突出重要上下文,减少整体提示长度。
用户query降噪
当用户问一个问题时,有些停用词是不起作用的,比如:How to register an account on Alibaba.com,在这个语境中,核心诉求是 register an account,至于How to在表达核心诉求时,意义没那么大。
可以针对用户问题,去除停用词,比如ES中维护了一份停用词库,可直接使用。如果解决方案中没有ES,也可自己维护停用词库,在nltk、stopwords-iso、Rank NL、Common Stop Words in Various Languages等开源库中维护了大量的停用词库,可根据需要取用。
检索优化
Fusion retrieval:基于向量和基于bm25的检索
实现方法:
接受一个查询,并执行基于向量和基于bm25的检索。
两种方法的得分归一化到一个共同的尺度。
计算这些分数的加权组合(由alpha参数控制)。
根据综合得分对文档进行排名,并返回前k个结果。
HyDE(假设文档嵌入):通过根据查询生成和嵌入假设文档来增强检索。
实现方法:
查询扩展:HyDE 使用语言模型根据用户的查询生成假设答案或文档。
增强嵌入:这些假设文档被嵌入,从而创建了更丰富的语义搜索空间。
相似性搜索:嵌入用于查找数据库中最相关的实际文档。
知情生成:检索到的文档和原始查询用于生成最终响应。
RAG-Fusion:通过结合多次搜索迭代的结果来提高检索质量。
实现方法:
查询扩展:利用原始查询生成多个相关查询,为用户的问题提供不同的视角。
多次检索:每个生成的查询都用于从数据库中检索相关文档。
倒数秩融合:使用 RRF 算法对检索到的文档进行重新排序,该算法结合了多次检索尝试的排名。
增强 RAG:重新排序的文档以及原始和生成的查询用于生成最终响应。
多模态内容理解与处理:https://github.com/HKUDS/RAG-Anything
可能用到的相关工具:https://github.com/NirDiamant/RAG_Techniques