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…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...