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

news2024/11/15 23:25:10

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 pipeline

app = Flask(__name__)

# 加载微调后的模型
generator = pipeline("text2text-generation", model="./results")

# 检索函数
def retrieve_documents(query):
    # 这里实现你的检索逻辑
    return ["相关文档1", "相关文档2"]

@app.route("/generate", methods=["POST"])
def generate():
    data = request.json
    query = 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.coloradmin.cn/o/2163262.html

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

相关文章

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

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

Humanoid 3D Charactor_P08_Federica

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

AI漏扫工具:SmartScanner

SmartScanner 是一款先进的 AI 漏洞扫描工具,旨在帮助用户识别和修复软件、系统及网络中的安全漏洞。以下是 SmartScanner 的一些主要特点: 1.智能识别 通过机器学习和深度学习技术,SmartScanner 能够快速识别已知和未知的漏洞,提…

Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制&#…

为什么会出现电话机器人?语音电话机器人的出现起到了什么作用?

电话机器人的出现是科技发展与市场需求相结合的产物,它们的广泛应用反映了现代社会对效率、成本和服务质量的不断追求。以下是电话机器人出现的几个主要原因。 1. 市场需求的变化 随着经济的发展和消费模式的转变,客户对服务的期望不断提高。他们希望能…

ecology9的待办推送外部系统

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&…

Maven重点学习笔记(包入门 2万字)

Maven依赖管理项目构建工具 尚硅谷 5h 2023最新版 一,Maven简介 1.为什么学习Maven 1.1, Maven是一个依赖管理工具 1️⃣ jar包的规模 随着我们使用越来越多的框架,或者框架封装程度越来越高,项目中使用的jar包也越来越多。项目中&…

小红书开源StoryMaker:个性化图像生成模型,实现角色一致性与背景变化的完美结合

文章链接:https://arxiv.org/pdf/2409.12576 Github链接:https://github.com/RedAIGC/StoryMaker 模型链接:https://huggingface.co/RED-AIGC/StoryMaker 亮点直击 解决了生成具有一致面部、服装、发型和身体的图像的任务,同时允许…

关系数据库标准语言SQL(3,4)

目录 定义基本表 数据类型 模式与表 创建基本表 修改基本表 删除基本表 定义基本表 每行都定义一个列及其约束条件,最后加上表的约束条件。 其中sno,约束为primary key,表示它是主码,sname约束为unique表示它是唯一值&#x…

VScode的c/c++环境搭建

文章目录 前言1、下载VScode2、安装cpptools3、下载MinGW4、配置环境变量5、修改C/C配置文件5.1、编辑 launch.json 配置文件5.2、编辑 tasks.json 文件 6、运行7、其他 前言 用VS进行C/C开发,环境配置遵循以下步骤: 1.指定头文件目录。“配置属性”→…

【质优价廉】GAP9 AI算力处理器赋能智能可听耳机,超低功耗畅享未来音频体验!

当今世界,智能可听设备已经成为了流行趋势。随后耳机市场的不断成长起来,消费者又对AI-ANC,AI-ENC(环境噪音消除)降噪的需求逐年增加,但是,用户对于产品体验的需求也从简单的需求,升…

Spring源码学习:SpringMVC(3)mvcannotation-driven标签解析【RequestMappingHandlerMapping生成】

目录 前言mvc:annotation-driven标签概述mvc:annotation-driven标签解析【RequestMappingHandlerMapping生成】AnnotationDrivenBeanDefinitionParser#parse (解析入口)RequestMappingHandlerMapping的实例化类图afterPropertiesSetAbstractHandlerMetho…

Spring6梳理11——依赖注入之注入List集合类型属性

以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 11 依赖注入之注入List集合类型属性 11.1 创建实体类Emp以及Dept Dept类中添加了遍历Emp…

最大似然估计,存在即合理

一、感性认识 认识的第一步来自感性的认识,先来感性的了解一下最大似然估计。现在,假设有两个学院,物理和外语学院。两个学院都各有特点,物理学院的男生占比大,外语学院女生占比大。如果在一次实验从两个学院中随机的…

记录linux环境下搭建本地MQTT服务器实现mqtt的ssl加密通讯

1、ubuntu安装mosquitto sudo apt-get update//安装服务端 sudo apt-get install mosquitto//安装客户端 sudo apt-get install mosquitto-clients 2、安装openssl 3、mqtts/tls加密传输 mosquitto原生支持了TLS加密,TLS(传输层安全)是SSL&…

828华为云征文 | 华为云 X 实例服务器存储性能测试与优化策略

目录 引言 1 华为云 X 实例服务器概述 2 存储性能测试方法与工具 2.1 测试方法 2.2 测试工具 3 FIO(Flexible I/O Tester)读写性能测试 3.1 顺序读写测试 3.2 随机读写测试 4 hdparm性能测试 4.1 实际读取速度测试 4.2 缓存读取速度测试 4.3…

乐鑫ESP-ZeroCode方案设备Matter协议开发新选择,设备无缝连接应用

随着科技的不断进步,智能家居正逐渐成为现代生活的一部分。物联网和智能家居行业应用取得了巨大的增长,一系列无线连接的智能设备涌入家庭,为家庭生活带来自动化和便利。 然而,随着设备数量的增加,用户开始面临一个挑…

LeetCode题练习与总结:删除链表中的节点--237

一、题目描述 有一个单链表的 head,我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。 删除给定的节点。注意&…

CentOS下安装Kibana(保姆级教程)

前言 Kibana是一个开源的数据分析和可视化平台,通常与Elasticsearch一起使用,用于展示和分析大规模数据集。以下是关于Kibana的一些主要特点和功能: 数据可视化: Kibana允许用户将数据转化为交互式、实时的图形和可视化展示&…

从零开始,Docker进阶之路(三):Docker镜像与命令

一、Docker核心名词 镜像文件、容器、仓库 镜像:简单理解为就是一个安装包,里面包含容器所需要运行的基础文件和配置信息,比如:redis镜像、mysql镜像等。 镜像的来源方式: 1.自己做镜像,比如自己开发微服…