RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践

RAG(Retrieval-Augmented Generation)是一种结合了信息检索(Retrieval)和生成模型(Generation)的技术,旨在提高生成模型的性能和准确性。RAG 技术通过在生成过程中引入外部知识库,使得生成模型能够更好地理解和利用外部信息,从而生成更准确、更丰富的内容。具体来说,当模型需要生成文本或者回答问题时,它会先从一个庞大的文档集合中检索出相关的信息,然后利用这些检索到的信息来指导文本的生成,从而提高预测的质量和准确性。

Facebook AI Research(FAIR)团队2020年发表名为《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》首次提出了RAG概念。RAG即Retrieval-Augmented Generation,是一种结合检索和生成技术的模型。它通过引用外部知识库的信息来生成答案或内容,具有较强的可解释性和定制能力,适用于问答系统、文档生成、智能助手等多个自然语言处理任务中。RAG模型的优势在于通用性强、可实现即时的知识更新,以及通过端到端评估方法提供更高效和精准的信息服务。

1. RAG 的基本概念

RAG 的核心思想是将生成模型与信息检索系统结合起来,使得生成模型在生成文本时能够动态地检索和利用外部知识库中的信息。具体来说,RAG 模型包括以下几个关键组件:

  • 生成模型:通常是一个预训练的语言模型(如GPT、BERT等),负责生成文本。

  • 检索系统:负责从外部知识库中检索相关信息,通常使用向量搜索或关键词匹配等技术。

  • 知识库:存储大量结构化或非结构化数据,如文本、文档、数据库等。

2. RAG 的工作流程

RAG 的工作流程可以分为以下几个步骤:

2.1 输入处理

首先,将用户的输入(如问题、指令等)传递给生成模型,生成模型会对输入进行初步处理和理解。

2.2 信息检索

生成模型在生成文本的过程中,会根据当前的上下文和生成的内容,动态地调用检索系统,从知识库中检索相关信息。检索系统通常会返回与当前上下文最相关的文档片段或信息片段。

2.3 信息融合

检索到的信息会被融合到生成模型的上下文中,生成模型会结合检索到的信息和当前的上下文,继续生成文本。这一过程可以多次迭代,直到生成完整的文本。

2.4 文本生成

最终,生成模型会根据融合后的上下文,生成最终的输出文本。由于引入了外部知识库的信息,生成的文本通常会更加准确和丰富。

3. RAG 的优势

RAG 技术具有以下几个显著的优势:

3.1 提高生成质量

通过引入外部知识库,RAG 模型能够生成更准确、更丰富的内容。生成模型在生成过程中可以动态地检索和利用外部信息,避免了生成模型在缺乏足够上下文时可能产生的错误或不准确的内容。

3.2 增强可解释性

RAG 模型在生成过程中引入了外部知识库的信息,使得生成过程更加透明和可解释。用户可以清楚地看到生成模型在生成过程中使用了哪些外部信息,从而更容易理解和信任生成的内容。

3.3 灵活性和可扩展性

RAG 模型可以根据需要灵活地引入不同的知识库,从而适应不同的应用场景。知识库可以包含各种类型的信息,如文本、文档、数据库等,使得 RAG 模型具有很强的可扩展性。

3.4 减少幻觉问题

生成模型在缺乏足够上下文时,可能会产生“幻觉”(即生成与事实不符的内容)。RAG 模型通过引入外部知识库,能够减少幻觉问题的发生,生成更符合事实的内容。

4. RAG 的应用场景

RAG 技术在许多领域都有广泛的应用,包括:

4.1 问答系统

在问答系统中,RAG 模型可以根据用户的问题,动态地检索相关信息,并生成准确的答案。由于引入了外部知识库,RAG 模型能够回答更复杂、更专业的问题。

4.2 对话系统

在对话系统中,RAG 模型可以根据对话上下文,动态地检索相关信息,并生成更自然、更丰富的回复。RAG 模型能够更好地理解用户的意图,并提供更有针对性的回复。

4.3 文本生成

在文本生成任务中,RAG 模型可以根据输入的上下文,动态地检索相关信息,并生成更准确、更丰富的文本。例如,在新闻生成、故事生成等任务中,RAG 模型能够生成更符合事实和逻辑的内容。

4.4 知识问答

在知识问答任务中,RAG 模型可以根据用户的问题,动态地检索相关知识,并生成准确的答案。RAG 模型能够处理更复杂、更专业的知识问答任务。

5. RAG 的挑战

尽管 RAG 技术具有许多优势,但在实际应用中仍然面临一些挑战:

5.1 检索效率

检索系统的效率直接影响 RAG 模型的性能。高效的检索系统能够快速地从知识库中检索相关信息,从而提高生成模型的响应速度。

5.2 信息融合

如何有效地将检索到的信息融合到生成模型的上下文中,是一个重要的挑战。信息融合不当可能会导致生成内容的不准确或不连贯。

5.3 知识库的质量

知识库的质量直接影响 RAG 模型的性能。高质量的知识库能够提供准确、丰富的信息,从而提高生成模型的性能。

5.4 模型的复杂性

RAG 模型结合了生成模型和检索系统,模型的复杂性较高。如何有效地训练和部署 RAG 模型,是一个重要的挑战。

6. RAG 应用实践

RAG 技术通过结合信息检索和生成模型,能够显著提高生成模型的性能和准确性。RAG 模型在生成过程中动态地检索和利用外部知识库的信息,生成更准确、更丰富的内容。RAG 技术在问答系统、对话系统、文本生成等领域具有广泛的应用前景,但也面临检索效率、信息融合、知识库质量等挑战。随着技术的不断发展,RAG 技术有望在更多领域发挥重要作用。构建一个基于开源大模型的RAG(Retrieval-Augmented Generation)系统涉及多个步骤,包括数据检索、模型选择、模型微调、以及系统集成。

首先,你需要选择一个适合的开源大模型。常见的开源大模型包括:

  • GPT-2/GPT-3 (OpenAI): 虽然GPT-3不是开源的,但GPT-2是开源的,并且有一些社区改进版本。

  • BERT (Google): 一个强大的预训练模型,适用于文本分类、问答等任务。

  • T5 (Google): 一个多任务模型,可以用于文本生成、翻译、问答等。

  • GPT-Neo/GPT-J (EleutherAI): 社区开发的GPT-3替代品,性能接近GPT-3。

  • LLaMA (Meta): 一个较新的开源大模型,性能优异。

RAG的核心是检索增强生成,因此你需要一个高效的数据检索系统。常见的检索方法包括:

  • TF-IDF: 适用于简单的文本检索。

  • BM25: 改进的TF-IDF,适用于更复杂的检索任务。

  • Dense Retrieval (如DPR): 使用预训练的嵌入模型(如BERT)进行检索。

这里我们可以使用开源的检索库,如:

  • Elasticsearch: 一个强大的全文搜索引擎。

  • FAISS (Facebook AI Similarity Search): 一个高效的向量检索库。

  • Pyserini: 一个基于Lucene的Python接口,支持BM25和Dense Retrieval。

选择好想要使用的模型权重和检索技术之后就可以尝试构建自己的RAG了,但是如果自己的应用场景比较垂直化,这里可以考虑基于自己场景下构建数据集来对开源大模型的效果进行微调,这里就不再展开去说了。一个Demo实例如下:

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, Trainer, TrainingArguments# 加载预训练模型和分词器
model_name = "t5-small"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)# 准备训练数据
train_dataset = ...  # 你的训练数据# 定义训练参数
training_args = TrainingArguments(output_dir="./results",evaluation_strategy="epoch",learning_rate=2e-5,per_device_train_batch_size=8,per_device_eval_batch_size=8,num_train_epochs=3,weight_decay=0.01,
)# 定义Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=eval_dataset,
)# 开始训练
trainer.train()

最后实现需要将检索系统和生成模型集成在一起,整体计算流程如下:

  1. 用户输入问题

  2. 检索系统根据问题从知识库中检索相关文档。

  3. 生成模型根据检索到的文档生成答案。

简单的实现如下:

from flask import Flask, request, jsonify
from transformers import pipelineapp = Flask(__name__)# 加载微调后的模型
generator = pipeline("text2text-generation", model="./results")# 检索函数
def retrieve_documents(query):# 这里实现你的检索逻辑return ["相关文档1", "相关文档2"]@app.route("/generate", methods=["POST"])
def generate():data = request.jsonquery = data["query"]# 检索相关文档documents = retrieve_documents(query)# 生成答案input_text = f"{query} [SEP] {' '.join(documents)}"answer = generator(input_text, max_length=100)return jsonify({"answer": answer[0]["generated_text"]})if __name__ == "__main__":app.run(debug=True)

当然了我们大可以直接使用开源的模型权重,亦或是直接调用各大厂商提供的API接口来构建实践我的应用程序,如果自己可以使用OpenAI的功能的话,构建RAG会更加简单。

from llama_index.llms.openai import *
from llama_index.embeddings.openai import *
from llama_index.core import *# 参数配置
Settings.llm = llm
Settings.embed_model = embed_model# 模型初始化
llm = OpenAI(model="gpt-4o")# 嵌入初始化
embed_model = OpenAIEmbedding(model="text-embedding-3-small")# 加载外部数据
data = SimpleDirectoryReader(input_dir="data/",required_exts=[".docx"]).load_data()# 向量化索引存储
index = VectorStoreIndex.from_documents(data)# 查询引擎
query_engine = index.as_query_engine(similarity_top_k=3)# 生成
response = query_engine.query("碳硅化合物分子结构是什么?")
print(response)

借助于预先提供的外部专业领域的数据内容,可以帮助模型生成这个垂直细分领域下更加精细细腻的内容,而无需完全基于这个专业领域去开发训练新的模型权重。这里还可以设定内存缓存记录,让模型对历史的对话或者是内容具备记忆功能:

memory = ChatMemoryBuffer.from_defaults(token_limit=4500)
chat_engine = CondensePlusContextChatEngine.from_defaults(    index.as_retriever(),    memory=memory,    llm=llm
)
response = chat_engine.chat(    "超导材料一般具备什么样的共性?"
)
print(str(response))

这里我们从初步学习了解的角度出发,整体学习了解了RAG技术的相关概念、背景、内容,最后基于开源框架实践了简单的应用程序,感兴趣的话也都可以选择自己喜欢的大模型和对应的检索框架来构建自己的RAG应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150714.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之装饰模式(Decorator)

前言 这个模式带给我们有关组合跟继承非常多的思考 定义 “单一职责” 模式。动态(组合)的给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少…

深入探索卷积神经网络(CNN)

深入探索卷积神经网络(CNN) 前言图像的数字表示灰度图像RGB图像 卷积神经网络(CNN)的架构基本组件卷积操作填充(Padding)步幅(Strides) 多通道图像的卷积池化层全连接层 CNN与全连接…

c++难点核心笔记(二)

系列文章目录 c难点&核心笔记(一) 继续接着上一章记录的重点内容包括函数,类和对象,指针和引用,C对象模型和this指针等内容,继续给大家分享!! 文章目录 系列文章目录友元全局函数做友元类做友元成员函…

傅里叶变换及其应用笔记

傅里叶变换 预备知识学习路线扼要描述两者之间的共同点:线性运算周期性现象对称性与周期性的关系周期性 预备知识 学习路线 从傅里叶级数,过度到傅里叶变换 扼要描述 傅里叶级数(Fourier series),几乎等同于周期性…

springboot中药材进存销管理系统

基于springbootvue实现的中药材进存销管理系统 (源码L文ppt)4-079 4 系统总体设计 4.1系统功能结构设计图 根据需求说明设计系统各功能模块。采用模块化设计方法实现一个复杂结构进行简化,分成一个个小的容易解决的板块,然…

二叉树进阶oj题【二叉树相关10道oj题的解析和代码实现】

目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历,非递归迭代实现9.二叉树中序遍历 &…

从0新建一个微信小程序实现一个简单跳转

首先 1.从这里下载开发工具 https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.htm 2. 等下载完毕后 创建一个空白项目 在pages目录下右键创建一个page : testUI,这时候会生成四个文件 新建一个文件夹 testUI 给他们放一起 3.增加一个按钮 …

SaaS(Software as a Service)软件的主流技术架构

在当今数字化时代,SaaS(Software as a Service,软件即服务)软件以其灵活、高效和成本效益高的特点,成为企业信息化建设的首选。为了实现SaaS软件的稳定、可靠和高效运行,其技术架构的设计显得尤为重要。本文…

【好书推荐】《架构真意:企业级应用架构设计方法论与实践》

在快速迭代的互联网和大数据时代,企业级应用架构设计成为了企业技术创新的基石。《架构真意:企业级应用架构设计方法论与实践》一书,由范钢和孙玄两位资深架构师联袂撰写,不仅为工程师、架构师和管理者提供了一套深入且实用的架构…

Humanoid 3D Charactor_P08_Federica

3D模型(人形装备)女孩 “P08_联邦” 内容仅为3D人物模型。 图片中的背景和家具不包括在内。 由Blender制作 包括: 1. 人形机器人3D模型和材质。 2. “Unity-chan!”着色器。 性别:女 装备:人形 皮肤网格:4个骨骼权重 多边形: 20000~40000 纹理分辨率:2K纹理 混合形状:…

828华为云征文|Flexus X实例安装ShowDoc文档管理工具

828华为云征文|Flexus X实例安装showdoc文档管理工具 引言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 主要使用场景 二、购买Flexus云服务器X实例2.1 购买规格参考2.2 查看Flexus云服务器X实例状态 三、远程连接Flexus云服务器X实例3.1 重置密码3.…

页面在移动设备上显示不正常的原因及解决方案

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介页面在移动设备上显示不正常的原因及解决方案1. 缺少 viewport 元标签1.1 问题描述1.2 解决方案1.3 注意事项 2. 响应式设计未实现或设计不当2.1 问题描述2.2 解决方案示例:媒体查询的使用 2.3 常见的媒体查询断点 3. 固…

【C++取经之路】红黑树封装set

目录 前言 红黑树的结构 红黑树的结点定义 红黑树的迭代器 红黑树 封装set 前言 本文参考《STL源码剖析》中SGI STL对红黑树的结构设计,涉及到红黑树迭代器的实现等,所以在读这篇文章之前,我希望你对红黑树有一定的了解,比如…

网站建设中,常用的后台技术有哪些,他们分别擅长做什么网站平台

PHP、Python、JavaScript、Ruby、Java和.NET各自适用于不同类型的网站平台。以下是对这些编程语言适用场景的具体介绍: PHP Web开发:PHP是一种广泛使用的开源服务器端脚本语言,特别适合Web开发。全球有超过80%的网站使用PHP作为服务器端编程语…

SuperMap GIS基础产品FAQ集锦(20240923)

一、SuperMap iDesktopX 问题1:请问一下,桌面11i导入功能好像有bug,shp导入到pg库中丢数据,明明60多万条但是导入进去只剩13万条了,这个哪位同事能处理一下呢 11.2.0 【问题原因】2个问题原因:1、序列已…

两张图讲透软件测试实验室认证技术体系与质量管理体系

软件测试实验室在申请相关资质认证时,需要建立一套完整的质量管理体系和过硬的技术体系。这其中涉及到的要素非常繁杂,工作量非常庞大,为了帮助大家快速梳理清楚软件测试实验室认证过程中质量管理体系和技术体系的建设思路,我们梳…

HttpServletRequest简介

HttpServletRequest是什么? HttpServletRequest是一个接口,其父接口是ServletRequest;HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;HttpServletRequest代表客户端发来的请…

普渡大学和麻省理工学院合作开发集成视触觉指尖传感器的5自由度抓手

虽然机器人已经开始在现代制造业、医疗、服务业等领域进行渗透,但对于机器人尤其是机械臂的操作能力,仍然有很大的提升空间,传统多指机器人手虽然能够实现复杂的操作任务,但其高度冗余性也带来了不必要的复杂性。近日来自普渡大学…

使用Kolors生成图像:从部署到生成

文章目录 1. Kolors模型的背景什么是Kolors?运行Kolors需要的条件 2. 在DAMODEL上准备环境创建计算实例 3. 部署Kolors模型安装Anaconda下载Kolors代码创建虚拟环境并安装依赖 4. 开始生成你的图像5. 个人体验与总结一些建议: 最近我接触到了一个非常有趣…

【数学分析笔记】第3章第4节闭区间上的连续函数(1)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.1 有界性定理 【定理3.4.1】 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续,则 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上有界。 【证】用反证法,假设 f ( x ) f(x) f(x)在 [ …