检索增强生成RAG系列1--RAG的实现

大模型出现涌现能力之后,针对大模型的应用也如雨后春笋般。但是,在大模型真正落地之前,其实还需要做好最后一公里,而这个最后一公里,其中不同应用有着不同的方法。其中prompt、微调和RAG都是其中方法之一。本系列就是针对RAG从入门到落地应用的流程。

目录

  • 1 概念
  • 2 架构
  • 3 代码实现

1 概念

RAG的全称是Retrieval-Augment Generation,即称为检索增强生成。通过特定prompt方式为 LLM 提供了从某些数据源检索到的信息,并基于此修正生成的答案。其中有几个关键的点需要知道:

  • 一个是从某些数据源检索到的信息
  • 提供特定的prompt
  • 修正生成答案

简单用一句话来说就是:利用向量数据库将格外的知识以向量存储,然后在回答用户问题时,先将用户问题在向量数据库中进行相似度查询,将查询结果以prompt的方式扔给大模型,获得最终答案。
那么RAG与prompt、微调(fine-tuning)有何应用场景的不同,以下是整理了RAG与其对比表格:

promptfine-tuningRAG
定义在不改变模型参数的前提条件下,利用提示工程来提升大语言模型处理复杂任务场景的能力通过一个微训练的过程来修改大模型它本身的参数,使模型能更加专业化在不改变大模型参数下,通过大语言模型理解用户的查询需求,并将相关的片段从数据库中检索出来,将提示工程与数据库查询相结合以获得上下文丰富的答案
解决问题提高回答的精准度更擅长回答特定场景下的相关问题提升生成内容的精准度且保留数据安全
场景通用且简单的场景,比如普通聊天问答等开放专业领域,比如医疗、法律等场景封闭专业领域,比如企业内部数据场景
优点无需改变模型;推理耗时低;成本低;准确度高;推理耗时低;无需改变模型;准确度高;安全性强;及时内容;
缺点准确度低;稳定性低;无及时内容;成本高;灵活度低;稳定性低 ;流程复杂;成本较高;

三者都有不同的优缺点,在实践中,可以参考以下图表对你的应用场景进行适配:

在这里插入图片描述
1) 横轴表示LLM本身优化,也就是优化LLM本身按照你想要的表达方式来表达
2) 纵轴表示上下文优化,也就是增加LLM的专业知识

  • Prompt engineering:相当于告诉你要考试,但是考试内容没有告诉你
  • RAG:相当于给你一本书,在考试的时候你可以查
  • Fine-tuning:相当于你学习了知识,然后闭卷考试
  • Fine-tuning+RAG:相当于你学了知识的同时开卷考试

2 架构

一个RAG架构应该是怎么样的?你或许见过比较复杂的流程,但是这里先介绍一个RAG最少需要包括哪些部分。(后续会逐步介绍各个模块以及更多优化的流程)

在这里插入图片描述

1)专业知识:需要一个专业知识读取,这时候可能是pdf、Excel等不同类型的文档,因此需要一个文档读取工具
2)入库:需要将专业知识入库,而入库的操作就是将专业知识向量化,也就是embedding,因此你需要一个embedding工具
3)数据库:一般使用向量数据库,当然也可以使用其它(但考虑到相似度搜索,向量数据库最合适),其作用就是用于存储格外的专业知识,用于问题做相似度匹配
4)prompt:给特定的prompt,比如:根据以下知识:…(这里填入查询出来的内容),回答:…(这里是问题)。

3 代码实现

本实例是基于text2vec-large-chinese将文档向量化,采用Chroma向量数据库,大模型使用ChatGLM,基础架构使用LangChain。都是本地部署,因此需要做一些前置工作。

前置工作:
1)下载text2vec-large-chinese模型
2)下载ChatGLM3-6B的模型
3)下载ChatGLM3的github源码,运行openai_api_demo/api_server.py文件,启动api服务

from langchain.document_loaders import DirectoryLoader
from langchain.prompts import PromptTemplate
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import ChatGLM
import os# 第一步,加载text2vec-large-chinese模型
encode_kwargs = {"normalize_embeddings": False}
model_kwargs = {"device": "cuda:0"}
embeddings = HuggingFaceEmbeddings(model_name='text2vec-large-chinese路径',  # 换成自己的embedding模型路径model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
# 第二步,创建数据库
if os.path.exists('VectorStore'):db = Chroma(persist_directory='VectorStore', embedding_function=embeddings)
# 第三步,加载文档
loader = DirectoryLoader("documents文档路径")  # 换成自己的文档路径
documents = loader.load()
text_spliter = CharacterTextSplitter(chunk_size=256, chunk_overlap=0)
documents = text_spliter.split_documents(documents)
# 第四步,存储文档
database = Chroma.from_documents(documents, embeddings, persist_directory="VectorStore")
database.persist()
# 第五步,创建llm
print("load model api")
llm = ChatGLM(endpoint_url='http://127.0.0.1:8000',  # 换成自己的apimax_token=80000,top_p=0.9
)
# 第六步,设置prompt
QA_CHAIN_PROMPT = PromptTemplate.from_template("""根据下面的上下文(context)内容回答问题。
如果你不知道答案,就回答不知道,不要试图编造答案。
{context}
问题:{question}
""")
print("load RetrievalQA")
# 第七步,进行相似度查询数据
retriever = database.as_retriever()
# 第八步,将数据和问题组成prompt格式,扔给大模型获取回答
qa = RetrievalQA.from_chain_type(llm=llm,retriever=retriever,verbose=True,chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
)
print("running... ...")
print(qa.run("ChatGLM是什么"))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音外卖服务商有哪些,盘点这几家正规服务商!

当前,抖音外卖的关注度不断上涨,抖音外卖服务商也逐渐成为了众多创业者心中的理想创业赛道。在此背景下,抖音外卖服务商的入局途径多次引发创业者热议,以抖音外卖服务商有哪些公司为代表的相关话题更是长期位居创业者问题榜单的前…

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失,因此就此作罢。对于 macOS 用户来说,当文件被删除时,垃圾箱已被清空,他们可能不知道如何恢…

【最新综述】基于伪标签的半监督语义分割

Semi-Supervised Semantic Segmentation Based on Pseudo-Labels: A Survey 摘要: 语义分割是计算机视觉领域的一个重要而热门的研究领域,其重点是根据图像中像素的语义对其进行分类。然而,有监督的深度学习需要大量数据来训练模型&#xff…

数据恢复篇:适用于Windows 的顶级数据恢复软件

适用于Windows的免费和付费的最佳数据恢复软件 **嘿,我要和大家一起泄露所有的测试工具。在评论中留下您的想法和最喜欢的选择! 适用于 Windows 的最佳数据恢复软件 1.奇客数据恢复 奇客数据恢复版是Microsoft操作系统的顶级数据恢复软件应用程序之一&a…

基于协方差信息的Massive MIMO信道估计算法性能研究

1. 引言 随着移动互联网不断发展,人们对通信的速率和可靠性的要求越来越高[1]。目前第四代移动通信系统已经逐渐商用,研究人员开始着手研究下一代移动通信系统相关技术[2][3]。在下一代移动通信系统中要求下行速率达到10Gbps,这就要求我们使…

怎么把图片转成jpg格式?其他格式快速转换成jpg图片的方法

怎么把图片在线转jpg?jpg格式的图片是现在使用最广泛的一种图片格式,一般在网上传图时都会需要使用jpg格式的图片,那么当手中的图片不满足使用的要求时,如何操作能够快速将其他格式的图片转换jpg格式呢? 下面来教大家…

【Unity】Excel配置工具

1、功能介绍 通过Excel表配置表数据,一键生成对应Excel配置表的数据结构类、数据容器类、已经二进制数据文件,加载二进制数据文件获取所有表数据 需要使用Excel读取的dll包 2、关键代码 2.1 ExcelTool类 实现一键生成Excel配置表的数据结构类、数据…

iptables(11)target(SNAT、DNAT、MASQUERADE、REDIRECT)

简介 前面我们已经介绍了ACCEPT、DROP、REJECT、LOG,这篇文章我们介绍SNAT、DNAT、MASQUERADE、REDIRECT,这几个参数的定义我们在上篇文章中都有介绍,我这里再列出回顾一下 DNAT(目标地址转换)和 SNAT(源地址转换) 原理:修改数据包的源或目标 IP 地址。通常用于 NAT(…

重生之我要学后端0--HTTP协议和RESTful APIs

http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下: 客户端请求(Request&#xf…

Linux下Cmake安装或版本更新

下载Cmake源码 https://cmake.org/download/ 找到对应的版本和类型 放进linux环境解压 编译 安装 tar -vxvf cmake-3.13.0.tar.gz cd cmake-3.13.0 ./bootstrap make make install设置环境变量 vi ~/.bashrc在文件尾加入 export PATH/your_path/cmake-3.13.0/bin:$PAT…

【D3.js in Action 3 精译】第一部分 D3.js 基础知识

第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界!可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证,这一目标很快就能达成!但首先,我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…

Psychtoolbox 脑电实验范式之mp4视频绘制

1. 读取 首先需要使用到Screen(‘OpenMovie’)函数,该函数可以读取mp4、gif格式的数据,具体方式如下: clear; clc; Screen(Preference, SkipSyncTests, 1); screens Screen(Screens); screenNum max(screens); [window, screenRect] Scr…

AL8807是一款降压型DC/DC转换器,旨在以恒定电流驱动LED,可串联驱动多达9个LED,从6V至36V的电压源

一般描述 AL8807是一款降压型DC/DC转换器,旨在以恒定电流驱动LED。根据LED的正向电压,该设备可串联驱动多达9个LED,从6V至36V的电压源。LED的串联连接提供相同的LED电流,从而实现均匀的亮度,并消除了对镇流电阻…

数学建模 —— 矩阵的运算(上)

目录 调用函数运算 sum : 求和函数 prod : 求乘积函数(product) cumsum : 计算累积和(cumulative sum) diff : 计算差分(difference) mean : 计算平均值 (average) median : 计算中位数 mode : 计算众数 var : 计算方差 (variance) std : 计 算 标 准 差 (standard d…

教程:在 Kubernetes 集群上部署 WordPress 网站

WordPress 是专为每个人设计的开源软件,强调创建网站、博客或应用程序的可访问性、性能、安全性和易用性。WordPress 是一个基于 PHP 的内容管理系统(CMS),使用 MySQL 作为数据存储,目前很多网站、电商独立站、个人博客…

华为od-C卷200分题目3 - 两个字符串间的最短路径问题

华为od-C卷200分题目3 - 两个字符串间的最短路径问题 题目描述 给定两个字符串,分别为字符串A与字符串B。 例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂…

知识图谱介绍及其应用领域分析

1.知识图谱 知识图谱(Knowledge Graph)乃一种精心设计的技术,旨在储存并整合交织的描述性知识信息。此技术通过构建由实体及其相互关系所组成的网络结构,实现对知识的有序组织与呈现。这些实体涵盖广泛的范畴,包括但不限于具体的物体、事件或抽象概念,它们经由多样化的关…

【论文导读】CCF语音对话与听觉专委会论文导读(2024年第1期)-- INTERSPEECH 2024专题(一)

为促进最新研究成果的传播与交流,CCF语音对话与听觉专委在专委会微信公众号启动论文导读栏目,定期分享最新语音、对话与听觉相关研究方向论文。本期是2024年导读栏目的第1期,也是INTERSPEECH 2024专题第一部分,共遴选了7篇论文&am…

参加六西格玛绿带培训是投资未来,还是花冤枉钱?

是否值得花费资金参加六西格玛绿带培训,取决于多个因素。 从积极的方面来看,参加六西格玛绿带培训具有以下潜在价值: 1. 提升专业技能:使您掌握一套系统的问题解决方法和流程改进工具,有助于在工作中更高效地解决复杂…

今天不看明天付费------中国AGI(人工智能)的发展趋势

深入解析了中国AGI(人工智能)的发展趋势,并清晰地展示了其市场分层结构。 ** 从下至上,AGI市场被划分为四个主要层级:基础设施层、模型层、中间层和应用层。 基础设施层作为最底层,为AGI的发展提供了坚实…