·

一文带你了解大模型的RAG(检索增强生成) | 概念理论介绍+ 代码实操(含源码)

发布时间:2024-08-27 11:29:26阅读量:174
专业文章
转载请注明来源

针对大型语言模型效果不好的问题,之前人们主要关注大模型再训练、大模型微调、大模型的Prompt增强,但对于专有、快速更新的数据却并没有较好的解决方法,为此检索增强生成(RAG)的出现,弥合了LLM常识和专有数据之间的差距。

今天给大家分享的这篇文章,将介绍RAG的概念理论,并带大家利用LangChain进行编排,OpenAI语言模型、Weaviate 矢量数据库(也可以自己搭建Milvus向量数据库)来实现简单的 RAG 管道。

什么是RAG?

RAG的全称是Retrieval-Augmented Generation,中文翻译为检索增强生成。它是一个为大模型提供外部知识源的概念,这使它们能够生成准确且符合上下文的答案,同时能够减少模型幻觉。

知识更新问题

最先进的LLM会接受大量的训练数据,将广泛的常识知识存储在神经网络的权重中。然而,当我们在提示大模型生成训练数据之外的知识时,例如最新知识、特定领域知识等,LLM的输出可能会导致事实不准确,这就是我们常说的模型幻觉。如下图所示:

因此,弥合大模型的常识与其它背景知识之间的差距非常重要,以帮助LLM生成更准确和更符合背景的结果,同时减少幻觉。

解决方法

传统的解决方法是通过微调神经网络模型来适应特定领域的专有信息。尽管这种技术很有效,但它属于计算密集型的,并且需要技术专业知识,使其难以灵活地适应不断变化的信息。

2020 年Lewis等人,在知识密集型 NLP 任务中,提出了一种更灵活的技术,称为检索增强生成(RAG)[参考论文:https://arxiv.org/abs/2005.11401]。在本文中,研究人员将生成模型与检索器模块相结合,以提供来自外部知识源的附加信息,并且这些信息可以很方便的进行更新维护。

简单来说,RAG 对于LLM来说就像学生的开卷考试一样。在开卷考试中,学生可以携带参考材料,例如课本或笔记,可以用来查找相关信息来回答问题。开卷考试背后的想法是,测试的重点是学生的推理能力,而不是他们记忆特定信息的能力。

同样,事实知识与LLM的推理能力分离,并存储在外部知识源中,可以轻松访问和更新:

  • 「参数知识」:在训练期间学习到的知识,隐式存储在神经网络的权重中。
  • 「非参数知识」:存储在外部知识源中,例如向量数据库。

一般的 RAG 工作流程如下图所示:

「检索(Retrive)」 根据用户请求从外部知识源检索相关上下文。为此,使用嵌入模型将用户查询嵌入到与向量数据库中的附加上下文相同的向量空间中。这允许执行相似性搜索,并返回矢量数据库中最接近的前 k 个数据对象。

「增强(Augment)」 用户查询和检索到的附加上下文被填充到提示模板中。

「生成(Generate)」 最后,检索增强提示被馈送到 LLM。

LangChain实现RAG

上面介绍了RAG产生和工作原理,接下来将展示如何使用LangChain,结合 OpenAI LLM 、Weaviate 矢量数据库在 Python 中实现 RAG Pipeline。

基础环境准备

1、安装所有需要依赖的相关python包,其中包括用于编排的langchain、大模型接口openai、矢量数据库的客户端 weaviate-client。

pip install langchain openai weaviate-client

2、申请OpenAI的账户,要获取 OpenAI API 密钥,如下图所示:

3、在项目根目录创建.env文件,用来存放相关配置文件,如下图所示。

4、在main目录中,加载配置文件信息,这里用到了python-dotenv包。

向量数据库

接下来,你需要准备一个矢量数据库作为保存所有附加信息的外部知识源。该矢量数据库是通过以下步骤填充的:1)加载数据;2)数据分块;3)数据块存储。

「加载数据」:这里选择了一篇斗破苍穹的小说,作为文档输入 。文档是txt文本,要加载文本这里使用 LangChain 的 TextLoader。

from langchain.document_loaders import TextLoader
loader = TextLoader('./斗破苍穹.txt')
documents = loader.load()

「数据分块」:因为文档在其原始状态下太长(将近5万行),无法放入大模型的上下文窗口,所以需要将其分成更小的部分。LangChain 内置了许多用于文本的分割器。这里使用 chunk_size 约为 1024 且 chunk_overlap 为128 的 CharacterTextSplitter 来保持块之间的文本连续性。

from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1024, chunk_overlap=128)
chunks = text_splitter.split_documents(documents)

「数据块存储」:要启用跨文本块的语义搜索,需要为每个块生成向量嵌入,然后将它们与其嵌入存储在一起。要生成向量嵌入,可以使用 OpenAI 嵌入模型,并使用 Weaviate 向量数据库来进行存储。通过调用 .from_documents(),矢量数据库会自动填充块。

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions

client = weaviate.Client(
  embedded_options = EmbeddedOptions()
)

vectorstore = Weaviate.from_documents(
    client = client,    
    documents = chunks,
    embedding = OpenAIEmbeddings(),
    by_text = False
)

RAG实现

「第一步:数据检索」 将数据存入矢量数据库后,就可以将其定义为检索器组件,该组件根据用户查询和嵌入块之间的语义相似性获取相关上下文。

retriever = vectorstore.as_retriever()

「第二步:提示增强」 完成数据检索之后,就可以使用相关上下文来增强提示。在这个过程中需要准备一个提示模板。可以通过提示模板轻松自定义提示,如下所示。

from langchain.prompts import ChatPromptTemplate
template = """你是一个问答机器人助手,请使用以下检索到的上下文来回答问题,如果你不知道答案,就说你不知道。问题是:{question},上下文: {context},答案是:
"""
prompt = ChatPromptTemplate.from_template(template)

「第三步:答案生成」 利用 RAG 管道构建一条链,将检索器、提示模板和 LLM 链接在一起。定义了 RAG 链,就可以调用它了。

from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

rag_chain = (
    {"context": retriever,  "question": RunnablePassthrough()} 
    | prompt 
    | llm
    | StrOutputParser() 
)

query = "萧炎的表妹是谁?"
res=rag_chain.invoke(query)
print(f'答案:{res}')

总的来说,RAG的生成过程如下图所示:

总结

本文介绍了 RAG 的概念及其背后的一些理论,本文通过Python、LangChain将其实现,在此过程中使用了 OpenAI的ChatGPT接口(可以自己搭建chatGLM3)、Weaviate矢量数据库(可以自己搭建Milvus )、OpenAI 嵌入模型实现了 RAG 管道。


原文链接:https://blog.csdn.net/m0_59596990/article/details/135310933

0 人喜欢

评论区

暂无评论,来发布第一条评论吧!

弦圈热门内容

React Native UI库介绍与对比

React Native的生态与React.js相比,没那么丰富,或者说手机端的生态本身就跟Web端相差甚远。React.js作为Web端虽然生态丰富,但由于其JS库大多数都不能直接用在React native中,因此很多在Web端存在诸多解决方案的问题,如代码块高亮、渲染数学公式,在手机端都难找到合适的办法。React Native的UI库,其实可以选择的并不多,不像Web端百花齐放,选个UI库都能选择困难症。在本文,我将会介绍几个我所知道的React native UI库,其中有几个我是用过的。1. React Native Paper这是一个Material Design风格的UI库,在GitHub拥有13.4k个stars,官方文档👉React Native Paper。该库安装步骤简单,组件使用以及自定义也容易,唯一的缺点就是组件不够多,有些场景需要你另外补充其他库来满足需求。React Native Paper应该是React native唯一一个Material Design UI库,该库能够跟React native navigation整合,构建Material风格的 ...

🇪🇸 3.3 阿维拉

​宛如异世界城镇般的城市,中世纪时期的巨大的围墙将整个旧城区彻底包围,竟然没有经过火药的洗礼,一直保存至今。尖顶城垛却有着半圆形的塔楼,很明显是融合了穆斯林世界和基督教王国的风格,印证了阿维拉在再征服运动中的战略地位。不知道巨人里的玛利亚之墙灵感会不会是来自这里()没有过度的商业化和游客旅行团,所有的古迹都显得如此纯粹。以及三月正是赏樱的季节,没想到在西班牙也能欣赏到灿烂绽放的樱花,这几天在卡斯蒂利亚拉曼查的赏樱体验也是十分独特,比起虽然是漫山遍野但却人山人海的樱花园,我更喜欢一个人独自欣赏公路旁孤芳自赏无人问津的野樱。具有东方色彩的樱花竟然能与西式的城墙塔楼同框,有一说一确实有种奇妙的违和感()不过说起来不知道什么时候能有机会在樱花祭再去一次日本呢😭

由于备案需要,xianquan.net暂时关闭,原地址manitori.xyz可正常访问。由于苹果开发者账号费用过高,弦圈APP IOS版暂不支持。

这几天,我在给弦圈新域名xianquan.net以及弦圈APP备案,其中域名备案为了让管局通过,需要我暂时关闭掉xianquan.net,多有不便尽请谅解。弦圈的原地址manitori.xyz不受影响,可正常访问,然后未来manitori.xyz是不会丢弃的(见弦圈更换新网址xianquan.net,原地址manitori.xyz保留)。接着,这几天我原本打算把弦圈APP IOS版也给上线了,可惜苹果太吸血了,每年费用比微信还得高一半。因此我决定暂时只支持弦圈APP安卓版,IOS版等以后再说吧,虽然代码写了,但是无法打包IPA文件,而且就算打包完成也无法安装到苹果手机。最后不得不说,目前访问弦圈还是有点卡,虽然之前已经优化过了(最近有人反馈网站卡、打不开,我自己也试过这种情况,已再次对弦圈进行优化),但人多了还是会明星感觉到卡。原因目前也基本确定,之后我会再次更换并升级服务器,而更换服务器就需要迁移数据,迁移数据过程需要关停服务器。为了将影响降到最低,我选择关闭服务器在晚上进行,错开访问高峰。

弦圈APP已开发完成,准备发布

经过两个月的漫长艰难开发,大家期待已久的弦圈APP终于开发完成,目前正在准备发布的工作。马上弦圈APP的第一个版本就要跟大家见面了,暂时先推出安卓版,之后测试完苹果手机再推出IOS版。目前弦圈APP的核心功能已经基本开发完毕,包括:写文章、发帖子、回答问题、创建圈子、看文章、看书、看帖子、看词条、圈子、看问题和回答、发布评论与回复、点赞与踩、收藏夹、关注用户、搜索、用户中心、个人主页、设置、消息中心等等。但是仍然有一些未完成的功能,这些功能计划之后慢慢更新吧,它们包括:创建词条、写书、提问、任务中心、商店、赞赏、钱包与充值、交易中心、签到等等。上面提到的都是大的功能模块,下面我就提及一下APP一些细节的问题,这些问题虽然小,但也同样重要。与网页端弦圈不同,手机端弦圈APP使用markdown编辑器,用于文本格式、图片、链接等输入。关于markdown语法可自行百度,事实上markdown语法写起来比富文本要方便。至于为啥使用markdown编辑器,原因如下:首先APP跟网页端(Web端)有很大的不同,这使得想要跟Web端一样用富文本编辑器会变得困难。绝大多数现有的富文本编辑器都是基于W ...

狭义相对论核心问题

狭义相对论(Special Relativity)是爱因斯坦在1905年提出的理论,它主要为了解决经典物理学(牛顿力学和麦克斯韦电磁理论)之间的矛盾,并重新定义时间、空间、质量和能量等基本物理概念。以下是狭义相对论旨在解决的核心问题:1.经典力学与电磁学的矛盾牛顿力学的相对性原理:牛顿力学认为,在惯性参考系(匀速直线运动或静止的参考系)中,物理定律的形式保持不变(例如,在均匀运动的火车上做实验,结果与静止时一致)。麦克斯韦方程的“特殊地位”:麦克斯韦方程组预言了光速的恒定值,但经典物理认为光速应遵循伽利略变换(即速度叠加)。例如,若你以速度 v 追赶一束光,光速对你来说应变为 c - v ,但这与实验观测矛盾。矛盾的核心:牛顿力学的伽利略变换与麦克斯韦方程组的不兼容性,引发了物理学基础的危机。2.以太理论的失败以太假说的背景:19世纪物理学家假设存在一种名为“以太”(aether)的绝对静止介质,光波通过以太传播(类似声波在空气中传播)。迈克尔逊-莫雷实验(1887年):实验试图通过测量地球在以太中运动引起的“以太风”来验证以太的存在,但结果却表明光速在不同方向上始终相同,与以太假说矛 ...

婚礼拍摄流程

设备:a7m3 + 28-75 f2.8 + 棍灯 + 闪光Tip 1: 要电梯卡:摄影师可以在酒店前台说明自己是拍摄婚礼的,通常可以拿到电梯卡,方便进出。提前联系:如果是朋友关系,可以要伴娘的联系方式,方便沟通,避免被堵在酒店楼下;但如果是工作关系,则不建议这样做,以免引起不必要的麻烦,可以提前要电梯卡。Tip 2: 收费标准:在二三线城市,婚礼摄影的费用一般在1000-1500元之间;在一线城市如北京、上海、广州、深圳,费用则从1500元起,上不封顶。影响因素:收费标准主要取决于摄影师的样片质量和实际拍摄水平。Tip 3: 自报家门:摄影师见到新娘和伴娘时,应先自我介绍,表明身份。拍摄环境:新娘可能会询问房间布置是否适合拍摄,如果光线不足,摄影师需要自带灯光;如果房间空间狭小,则需要使用广角镜头。Tip 4: 静物拍摄:先拍摄婚鞋、婚戒、婚书等静物,记录这些细节。场景布置:观察房间布置,拍摄好看的地方,尤其是新人用心布置的部分。新娘化妆:拍摄新娘化妆的过程,留意光线充足的地方,适合摆拍。贵重物品拍摄:拍摄婚戒等贵重物品时,一定要有主家人在场,避免后续出现问题。Tip 5: 晨袍拍摄 ...

1月26日弦圈APP进度更新

最近这段时间,我都把时间花在开发弦圈APP上了。这个过程可谓是历经波折,开发过程中我曾多次更换框架,每更换一次就意味着得重新从零开始写,而更换完框架后又因为遇到某些难以解决的问题,又重新回到原来的框架。总之,如今经过两个星期的开发,终于逐渐成型,但还是有很多地方未实现的。目前弦圈APP,已实现功能包括:登陆注册、看文章、看帖子、看问题和回答、看百科词条、圈子、发布评论与回复、点赞与踩、关注用户等。未完成功能包括:用户主页、个人中心、消息中心、词条部分功能(如目录)、写文章、发帖子、写书、提问和回答、看书、签到、任务中心、交易中心等等。完成弦圈APP仍然任重而道远,因为弦圈从开发到上线就写了六个月代码,再加上上线至今又经过半年陆陆续续的更新,如今的弦圈已然代码规模已经不小。而我从零开始写APP,用的还是新技术,不亚于从零开始重写一遍整个弦圈。这工作量对于一个人来说,实在是太大了。同时,我在开发APP的过程中,也发现弦圈网站的一些bug,也来不及修复。最后我就发一发弦圈APP的测试图片吧。

写作小标题

一 抓好思想教育,“主旋律”越唱越响1.一以贯之,强化思想政治引领。集中学习抓引导,小组共论鼓干劲,个人自学促提升。2.上下同步,提升青年精神素养。 以上率下强推进,调研座谈保落实,简报交流取真经。3.双效合一,深化优良传统教育。先辈传承长士气 专题培训固根本 时空沉浸坚信仰,青言青语润人心。二 强化职能定位,“主力军”越建越强1.多维发力,围绕中心服务大局。安全生产不懈怠,优质服务不断档,创新创效不停歇。2.齐头并进,践行央企责任担当。乡村振兴亮实效,低碳生活有妙招。3.统筹谋划,志愿服务成效显著。冬奥保障显担当,旺季生产加满油,蓝天课堂掀新篇。三 提升服务能力,“主心骨”越来越硬1.多措并举,有效助力青年发展。基层调研知实情,青春助力有延续。2.对准焦距,关心关爱青年成长。新春送福暖人心,圆梦助力解难题,双节关爱有温度。3.双轮驱动,持续推动争先创优。文艺文创树形象,青年才俊扬志气。四 夯实团建基础,“主阵地”越筑越实1.分类施策,健全制度合规管理。完善制度粗管理,人才培养筑根基。2.挖掘典型,组织建设活力十足。先进典型展风采。

共青团工作要点

一、政治建设:思想政治引领:注重加强团员政治教育和青年思想政治引领,以习近平新时代中国特色社会主义思想为指引,深入学习习近平总书记关于青年工作的重要思想,坚持党建带团建,扎实开展团员和青年主题教育,深入学习党的二十大精神和团十九大精神,有针对性开展“青年大学习”教育培训。战略文化传导:结合集团战略和本单位觉政工作重点,依托青年论坛,组建青年讲师团,教育引导广大团员青年传承弘扬集团自身优良传统、红色精神,加强宣讲,积极传播企业文化理念。舆论宣传工作:田青工作有宣传阵地、有宣传队伍,持续加强宣传平台建设,团青活动开展丰富多彩的宣传工作。二、作用发挥国绕中心、服务大局:常态化开展青年籍神素养提升工程、主题实践活动,引领团员青年在安全生产防范风险、深化改革等领域发挥生力军与突击队作用,保障生产、运行、服务、创新等方面工作平稳有序。青年文明号活动:国绕持续打造世界一流产品服务水平,推进青年文明号创建,积极组织青年文明号开放周主题实践话动,创建活动特色鲜明,创建工作有制度、有记录、有成效,加强对往届青年文明号监督工作。青年志愿者活动:以青春之力服务-国之大者”,开展形式多样的志愿者活动及社会公益活 ...

未来所有人都能被一种名为‘复活术’的仪式复活,而我被复活进了一座神秘的监狱,在这里每个人无时无刻都要接受无比残忍的折磨...

在未来的地球上,诞生了一种名为“复活术”的神奇仪式,所有人都能被该仪式复活,且不需要付出任何代价。你只需要在任意地方画出一些玄奥的几何图案,然后随意念出任意条件,如果有人满足你所说的条件,那么这个人就会马上被复活。如果满足条件的不止一个人,那么所有满足条件的人都会被同时复活。于是,死去的科学家、伟人们都被人们争相复活,人类的科技水平在短短数年内就得到了飞速发展。同时地球的人口也开始了指数型暴涨,到了2080年,全世界人口就已经到达400亿!因为人口的暴涨资源开始紧缺,加上死亡已经不再忌讳,很多人开始胡作为非,有些无聊的人甚至把烧杀抢夺、花样自杀当作自己的日常生活。于是各国政府纷纷出台《复活法》,限制复活术的使用,每个人禁止生育后代,以及禁止自杀,所有自杀者复活后会被直接拘禁。就这样,社会秩序的混乱才逐渐消停了一些。虽然人类距离抵达一级文明的水平还有很长一段时间,但这样史无前例的科技发展速度还是让大家沉浸在了征服宇宙的未来无尽幻想之中,却殊不知一场同样史无前例的浩大危机正在逼近......不知道多少年过去,在仙界死去的陈默也被复活术复活后,就发现自己已经置身在这座名为“通天塔”的监狱之中 ...

李群和李代数经典教材:Structure and Geometry of Lie Groups

本书隶属于Springer Monographs in Mathematics系列,作者是Joachim Hilgert和Karl-Hermann Neeb。这是本不错的李群李代数教材,可以用于入门李群和李代数。我不是做李群和李代数这方面的,但印象中,李群李代数相关的教材似乎并不是很多,并且很多教材写得并不那么好懂。而这本教材,应该算是我所知道的最适合入门的教材之一了。本书从最基础的一般线性群开始讲起,借助这些矩阵群的例子,一步步上升到李群。所谓的李群其实就是一个群加上流形结构而已。本书在讲完李括号后,就直接开始提及李代数,所谓的李代数就是一个向量空间带上一个叫做李括号的双线性函数。本书节奏紧凑、内容推进速度恰当,知识密度也高没有太多废话,是标准的代数风格的教材。由于我当初只大概看过一二章,用于补充李群和李代数相关的基础知识,因此并没有太过深入,就不过多评价。顺带一提,李群和李代数都跟表示论有直接联系,因此想要做表示论的朋友或许也应该学点李群和李代数。最后我看了一下下载这本书的日期,已经是2020年了,当时的我刚刚大一,印象中是首师大的一位学长在数学群里推荐的。特此怀念一下。