用检索增强生成让大模型更强大,这里有个手把手的Python实现
自从人们察觉到能够运用自身专有的数据以使大型语言模型也就是 LLM 变得更为强大之后, 人们便持续在探讨怎样去有效地把 LLM 的一般性知识同专有数据整合到一块。针对此状况人们同样一直处于争论之中, 其中一派观点觉得是微调更合适, 另一派观点则认为检索增强生成也就是也就是 RAG 更合适, 究竟哪个更合适呢?
本文首先会去留意 RAG 的概念以及理论, 之后会呈现能够怎样运用用于编排的、语言模型以及向量数据库去达成一个简易的 RAG。
检索增强生成是什么?
进行检索增强生成即RAG这一概念所指方向是借助外部知识源, 以此为LLM供给更多附加信息, 从而凭借如此做法, 能让LLM生成具备更高准确性的且更加更妥贴处于一定情境下的答案, 与此同时降低减少假象这类虚幻情况的发生概率。
问题
当下最优的语言模型都是运用海量数据进行训练而得出的, 所以其神经网络权重里存储了诸多一般性知识(参数记忆)。然而, 要是在借助语言模型生成结果之际需要其训练数据以外的知识(像新信息、专有数据抑或特定领域的信息这类), 那么就有可能出现事实不准确的情况(幻觉), 如下截图所呈现的那样:
所以呀, 把LLM的一般性知识跟附加上下文整合到一起这件事, 是极为重要的, 这能够帮助LLM生成更加准确并且更契合上下文情境的结果, 与此同时产生的幻觉也是更少的。
解决方案
从传统的角度来讲, 借助对模型进行微调这一方式, 能够使得神经网络来适应特定领域的信息或者专属于某方面的信息。虽说这样的技术是具备有效性的, 然而它需要进行密集的计算, 成本是比较高的, 并且还需要技术专家给予相应的支持, 所以在适应不断变化的信息时就很难做到敏捷。
2020年, Lewis等人所撰写的论文《- for - NLP Tasks》, 提出了一项更为灵活的技术, 即检索增强生成, 也称RAG。在这篇论文里, 研究者把生成模型与一个检索模块组合在了一块儿, 这个检索模块能够借助一个更容易更新的外部知识源来提供附加信息。
就老百姓的话音来讲, RAG 对于 LLM 如同开卷考评对于人类。于开卷考评之际, 学员能够带着教材以及笔记等参考材料, 他们能够从其中找寻用以作答的相关讯息。开卷考评背后的见解是: 此次考评衡量的关键是学员的推导水平而并非记忆特殊信息的本事。
与之相类似, 事实方面的知识跟LLM的推理能力是相互分离存在, 且能够被保存在可以轻易进行访问以及更新这样的外部知识来源里面, 是的:
经过训练期间才可学到进而于神经网络权重那儿以含混隐晦的样式存储起来的知识, 就是参数化知识。
非参数化知识:储存于外部知识源,比如向量数据库。
下图展示了最基本的 RAG 工作流程:
检索增强生成(RAG)的工作流程
为了将用户查询用于检索外部知识源里有关系的上下文, 需要进行检索。要达成这个目的, 得运用一个嵌入模型, 把该用户查询嵌入同一个向量空间当中, 让它成为向量数据库里的附加性的上下文。如此做的话, 便能够执行相似类型的搜索, 进而返回该向量数据库里与用户查询最为接近的k个数据对象。
接下来, 把用户所进行的查询, 以及检索得到的附加上下文, 放入到一个模板里。
生成:最后,将经过检索增强的 馈送给 LLM。
使用 实现检索增强生成
接下来会阐述怎样借由达成RAG工作流程, 这会运用到LLM, 以及向量数据库, 还有一个嵌入模型, 其作用是进行编排。
必要前提
请确保你已安装所需的 软件包:
#!pip -
再者, 于根目录之中, 借由一个名为.env的文件去界定相关的环境变量。你是必定得要有一个账户的, 如此才能够获取API Key, 接着继而在API keys里面。
)「创建新的密钥」。
=""
然后,运行以下命令来加载相关环境变量。
.()
准备工作
于准备阶段之时, 你得准备一个当作外部知识源的向量数据库, 借助它来留存所有的附加信息。而这个向量数据库的构建涵盖以下步骤啦:
收集并载入数据
将文档分块
对文本块进行嵌入操作并保存
第一步, 是去收集数据, 然后将其载入。比如说, 要是我们把拜登总统2022年的国情咨文用作附加上下文, 其库给出了原始文本文档来;为了载入这些数据, 我们能够运用不少内置的文档加载工具;一个文档()是由文本以及元数据所构成的词典;为了加载文本, 可以使用其的。
原始文档地址:
.
你提供的内容存在语法错误。正确的代码应该是: 下面改写符合要求: url等于空字符串, 然后使用.get方法获取该url对应的内容, 接着打开一个名为.txt的文件,以写入模式, 之后将获取到的内容的文本写入该文件。
= ('./.txt') = .load()
紧接而来的是, 要把文档实施分块操作.乃是源于文档处于原始状态之际长度颇长, 没办法放入到LLM的上下文窗口里去, 因而就有必要将其拆分成更为小巧的文本块.而且还存有众多内置的拆分工具.针对这个简易示例而言, 我们能够运用r, 把它设置成500, 把另一个设置成50, 如此一来便能够让文本块之间的文本维持连续性。
from . = r(=500, =50) = .()
那么, 接下来要做的是, 针对文本块, 开展嵌入操作, 随后予以保存。要达成语义搜索能够跨越文本块来执行的目的, 那么, 就得为每一个文本块生成向量嵌入, 并且要将生成的向量嵌入, 同文本块本身一起保存起来。而要生成向量嵌入的话, 可以运用嵌入模型;要是说到储存这方面, 能够使用向量数据库。借助调用. () 的方式, 能够自动地把文本块填充到向量数据库里。
from . . .
= .( = ())
啥呀这是, 等于一个点, 然后括号里等于, 等于, 等于括号打开括号, 等于假值。
步骤 1:检索
向量数据库填充完毕之后, 我们能够将它界定为一种具备检索功能的组件, 该组件可以凭借其自身通过用户查询以及嵌入块其间所存在的语义方面的恰似程度, 进而获取与之相关联的另外的上下文内容。
= .()
步骤 2:增强
from .
print()
随后 , 为了运用经由附加而得来的上下文予以增强 , 得去准备一个 模板。像下面所展现的这样 , 借助该 模板能够简便地进行定制。
步骤 3:生成
最终, 我们能够针对这个RAG流程构架一条思维链, 把检索器、模板以及LLM衔接起来。在完成RAG链的定义之后, 就能够对其进行调用了。
from . .. rom ..
llm = (="gpt-3.5-turbo", =0)
它等于, 由一个包含空值和空括号, 以及管道字符, 还有llm,再加上空括号所组成的内容混合体。
你的内容似乎存在一些不清晰和错误的表述, 不太能准确理解其确切含义, 所以难以按照要求进行改写。请你检查并修正一下内容, 以便能更准确地完成任务。不过大致试着改一下就是: 查询内容是, 说了关于什么, 这个查询。对于他的以及他的到什么的这个。这个也表明他把布朗法官当作什么对于某人的什么的。 这样改写后更乱了, 因为原内容实在较难理解。
下图展示了这个具体示例的 RAG 流程:
总结
首先, 它最初体现于2020年名为《 - for - NLP Tasks》的论文里。对于其背后涵盖动机与解决方案的理论内容, 进行了相关陈述之后, 又阐述了怎样借由 达成践行。接着, 呈现了怎样凭借LLM搭配 向量数据库以及 嵌入模型实现一种工作流程。这里面, 的功能在于进行编排。本文对RAG的概念予以介绍。展示了该工作流程。且说明其来自上述特定论文。还表明了这一系列构成部分来实现RAG工作流程这点。并解释了各内容之间的关联及作用。最终完成了整个阐述!另起一句, 再强调一次, 这是关于RAG概念的介绍。这一介绍包含诸多相关内容。从初出现到背后理论。再到如何凭借相关事物进行实现。直至呈现具体工作流程以及各部分作用!