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()
最后实现需要将检索系统和生成模型集成在一起,整体计算流程如下:
-
用户输入问题。
-
检索系统根据问题从知识库中检索相关文档。
-
生成模型根据检索到的文档生成答案。
简单的实现如下:
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应用程序。
相关文章:

RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践
RAG(Retrieval-Augmented Generation)是一种结合了信息检索(Retrieval)和生成模型(Generation)的技术,旨在提高生成模型的性能和准确性。RAG 技术通过在生成过程中引入外部知识库,使…...

基于SpringBoot实现高性能缓存组件
1. 简介 为了体现我们的实力,首先我们要有造轮子的能力。这意味着我们不仅要熟练掌握现有的技术栈和框架,还要具备深厚的技术功底。通过自主设计和实现关键组件,如高性能缓存系统,我们能够深入理解技术背后的原理,掌握…...

【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 详细理解并附实现代码。
【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 文章目录 【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN)1.算法原理介绍:递归神经网络 (Recurrent…...

python全栈学习记录(十九) hashlib、shutil和tarfile、configparser
hashlib、shutil和tarfile、configparser 文章目录 hashlib、shutil和tarfile、configparser一、hashlib二、shutil和tarfile1.shutil2.tarfile 三、configparser 一、hashlib hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。如果把hash…...

RL进阶(一):变分推断、生成模型、SAC
参考资料: 视频课程《CS285: Deep Reinforcement Learning, Decision Making, and Control》第18讲、第19讲,Sergey Levine,UCerkeley课件PDF下载:https://rail.eecs.berkeley.edu/deeprlcourse/主要内容:变分推断、生成模型、以及Soft Actor-Critic。变分推断在model-bas…...

WPF 绑定 DataGrid 里面 Button点击事件 TextBlock 双击事件
TextBlock双击事件 <DataGridTemplateColumn Width"*" Header"内标"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBlockBackground"Transparent"Tag"{Binding InternalId}"Text"…...

828华为云征文|华为云Flexus云服务器X实例Windows系统部署一键短视频生成AI工具moneyprinter
在追求创新与效率并重的今天,我们公司迎难而上,决定自主搭建一款短视频生成AI工具——MoneyPrinter,旨在为市场带来前所未有的创意风暴。面对服务器选择的难题,我们经过深思熟虑与多方比较,最终将信任票投给了华为云Fl…...

非标精密五金加工的技术要求
非标精密五金加工在现代制造业中占据着重要地位,其对于产品的精度、质量和性能有着较高的要求。以下是时利和整理的其具体的技术要求: 一、高精度的加工设备 非标精密五金加工需要先进的加工设备来保证加工精度。例如,高精度的数控机床是必不…...

新手小白怎么通过云服务器跑pytorch?
新手小白怎么通过云服务器跑pytorch?安装PyTorch的步骤可以根据不同的操作系统和需求有所差异,通过云服务器运行PyTorch的过程主要包括选择GPU云服务器平台、配置服务器环境、部署和运行PyTorch模型、优化性能等步骤。具体步骤如下: 第一步&a…...

Spring 全家桶使用教程
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

Spark SQL性能优化高频面试题及答案
目录 高频面试题及答案1. 如何通过分区(Partitioning)优化Spark SQL查询性能?2. 什么是数据倾斜(Data Skew)?如何优化?3. 如何使用广播(Broadcast)优化Join操作ÿ…...

云原生链路观测平台 openobserve + fluent-bit,日志收集
grpc-opentracing https://github.com/grpc-ecosystem/grpc-opentracing openobserve fluent-bit 为啥会选择这个组合 一个 rust 写的一个是c写的,性能和内存方面不用担心,比java 那套好太多了 openobserve 文档 :https://openobserve.ai/…...

Android 车载应用开发指南 - CarService 详解(下)
车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务,车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说,如何将自己的应用程序无缝集成到车载系统中,利用汽车的硬件和服务能力,是一个极具挑战性…...

【Linux网络 —— 网络基础概念】
Linux网络 —— 网络基础概念 计算机网络背景网络发展 初始协议协议分层协议分层的好处 OSI七层模型TCP/IP五层(或四层)模型 再识协议为什么要有TCP/IP协议?什么是TCP/IP协议?TCP/IP协议与操作系统的关系所以究竟什么是协议? 网络传输基本流程…...

el-form动态标题和输入值,并且最后一个输入框不校验
需求:给了固定的label,叫xx单位,要输入单位的信息,但是属性名称都一样的,UI画图也是表单的形式,所以改为动态添加的形式,实现方式也很简单,循环就完事了,连着表单校验也动…...

一,初始 MyBatis-Plus
一,初始 MyBatis-Plus 文章目录 一,初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明:3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 …...

安卓13删除下拉栏中的关机按钮版本2 android13删除下拉栏关机按钮
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。我们之前写过一个文章也是一样的删除…...

快递物流单号识别API接口代码
官网:快递鸟 API参数 一、接口描述/说明 (1)该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。 (2)接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订…...

AI时代的程序员:如何保持和提升核心竞争力
1.引言 随着AIGC(如 ChatGPT、Midjourney、Claude 等)大语言模型的快速崛起,AI辅助编程工具逐渐成为程序员工作的重要组成部分。这一转变不仅改变了工作方式,更深刻影响了程序员的职业角色和技术路径。有人担心,AI将取…...

Oracle 数据库常用命令与操作指南
Oracle 数据库是企业级系统中常用的数据库管理系统,掌握基础的命令可以让你在日常管理中更加高效。本指南将介绍几条常用的 Oracle 数据库命令,涵盖用户权限管理、修改用户密码、删除用户、以及其他日常操作。 目录 授权用户操作权限使用最高权限登录 O…...

spring boot项目对接人大金仓
先确认一下依赖 第一 是否引入了mybatis-plus多数据源,如果引入了请将版本保持在3.5.0以上 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynam…...

《操作系统 - 清华大学》1 -2:操作系统概述 —— 什么是操作系统
文章目录 1. 操作系统定义2. 操作系统的位置3. 操作系统软件的分类4. 操作系统软件的组成5. 操作系统内核特征 现在来继续讲什么是操作系统,操作系统什么样的?它是一个程序,它和其他程序是什么样的关系?然后它有些什么样的组成&am…...

power bi制作各季度收入累加柱状图——日期表、calculate、datesytd
一、数据介绍: 2017-2019年订单销售收入数据(订单日期,销售收入) 二、效果展示: 三、操作步骤: 1、建立日期表 (1)建立原因 本次度量值编写需要运用到datesytd这一时间智能函数…...

OceanBase 3.X 高可用 (一)
OceanBase 3.X 高可用(一) 一、分布式核心 OceanBase 3.x 采用的是paxos 协议,与raft协议相比。其复杂程度高,实现技术难度大。 Paxos 协议允许事务日志乱序发送,顺序提交。raft允许事务顺序发送,顺序提…...

CSR、SSR、SSG
客户端渲染(Client-Side Rendering, CSR)在SEO方面存在一些不利因素,主要原因包括: 初始加载内容的缺乏:CSR依赖于JavaScript来动态生成页面内容。当搜索引擎爬虫访问一个使用CSR技术构建的网站时,它们最初…...

linux -L16-linux 查看应用占用的资源top
linux 查看应用占用的资源top Targetsteps启动 top 命令排序进程:查看特定进程:过滤进程其他常用选项交互式帮助 Target linux 查看应用占用的资源top steps 在 Linux 系统中,top 命令是一个非常有用的工具,它提供了一个实时更…...

QT——多线程操作
一、单线程和多线程的区别 单线程指的是程序在执行时只有一个流程,也就是一次只能执行一个任务。当程序中某个任务需要花费大量时间时,单线程会导致整个程序阻塞,用户体验会变差。 多线程则是指程序在执行时可以同时执行多个任务,每个任务都是一个独立的线程。多线程可以…...

理解C语言之深入理解指针(三)
目录 1. 字符指针变量 2. 数组指针变量 2.1 数组指针变量是什么? 2.2 数组指针变量怎么初始化 3. ⼆维数组传参的本质 4. 函数指针变量 4.1 函数指针变量的创建 4.2 函数指针变量的使⽤ 4.3 两段有趣的代码 4.3.1 typedef 关键字 5. 函数指针数组 6. 转移…...

「芯片知识」MP3解码ic方案,音乐芯片在数字音频中的作用
MP3解码芯片是一种由内部晶振器组成的简单语音电路,将这种独特的MP3音乐芯片与其他零件进行接驳,便能够形成一个完整的语音集成电路。而深受顾客欢迎的MP3音乐芯片现如今已经广泛的使用在电子玩具和家用电器等众多的场合之中,它在数字音频中扮…...

MyBatis与 Springboot 的集成
MyBatis 是一个优秀的持久层框架,专注于 SQL 语句的灵活控制,与 Spring Boot 集成可以简化数据库操作,提升开发效率。Spring Boot 提供了与 MyBatis 无缝集成的支持,使得 MyBatis 可以轻松与 Spring Boot 应用结合使用。 一、MyB…...