RAG全解析和LangChain代码实现

news2024/11/23 5:10:20

大家好,自从人们意识到可以用自有数据为大型语言模型(LLM)增效之后,就开始讨论如何最有效地弥合 LLM 的通用知识与专有数据之间的差距。围绕着微调还是检索增强生成(RAG)哪个更适合这一问题,人们展开了激烈的争论。

本文重点介绍 RAG 的概念,首先介绍其理论,然后会继续展示如何使用LangChain进行编排、OpenAI 语言模型和 Weaviate 向量数据库来实现一个简单的 RAG 流水线。

1.检索增强生成(RAG)

检索增强生成(RAG)是一种技术概念,旨在为大型语言模型(LLM)提供来自外部知识源的附加信息。这样,它们能够生成更准确、更具上下文的答案,同时还能减少误导性答案或虚假信息的生成。

简而言之,RAG 是一个多步骤的流程,从检索开始,然后推进到生成。它能够加速模型的回答过程,同时确保模型能够访问最新、最及时的事实和相关信息。

1.1 问题

最先进的大型语言模型(LLM)是通过在大量数据上进行训练,以获得存储在神经网络权重(参数记忆)中的广泛通用知识。然而,当提示 LLM 生成一些不包含在其训练数据中的知识时,例如更新的、专有的或特定领域的信息,可能会导致生成的结果不准确或不符合实际情况,从而误导用户。如下图所示:

ChatGPT回答“总统对布雷耶法官说了什么”的问题

因此,弥合 LLM 的通用知识与附加上下文之间的差距非常重要,这样才能帮助 LLM 生成更准确、更符合语境的补全,减少误导。

1.2 解决方案

传统上,神经网络通过微调模型来适应特定领域或专有信息。虽然这种技术是有效的,但它需要大量计算资源,成本高昂,并且需要专业技术知识,因此在适应不断变化的信息方面不够灵活。

在2020年,Lewis等人在论文《 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 》中提出了一种更灵活的技术,称为检索增强生成(RAG)。在这篇论文中,研究人员将生成模型与检索模块相结合,从外部知识源提供更易于更新的附加信息。

1.3 RAG基本工作流程

简单来说,检索增强生成(RAG)对于语言模型(LLMs)就像人类的开卷考试一样。开卷考试背后的理念是,考试侧重于学生的推理能力,而不是记忆特定信息的能力。

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

  • 参数化知识:在训练过程中学到的,隐式存储在神经网络的权重中。

  • 非参数化知识:存储在外部知识源中,例如向量数据库。

下面是RAG的基本工作流程:

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

(2) 增强(Augment):将用户查询和检索到的附加上下文填入提示模板。

(3) 生成(Generate):最后,将检索增强的提示输入LLM。

这种方法使LLM能够从外部知识源中获取更丰富的信息,而不仅仅依赖于其内部参数化知识。

2.使用 LangChain 实现RAG流程

这里使用 OpenAI LLM 结合 Weaviate 向量数据库和 OpenAI 嵌入模型,在 Python 中实现一个 RAG 流程。LangChain 用于协调整个流程。

2.1 先决条件

请确保已安装所需的 Python 包:

  • langchain 用于协调

  • openai 用于嵌入模型和 LLM

  • weaviate-client 用于向量数据库

#!pip install langchain openai weaviate-client

还需要在根目录下的 .env 文件中定义相关环境变量。要获取 OpenAI API 密钥,需要拥有 OpenAI 账户,然后在 API 密钥下选择“创建新密钥”。

OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

接下来,运行以下命令以加载相关环境变量:

import dotenv
dotenv.load_dotenv()

2.2 准备工作

作为准备步骤,需要准备一个向量数据库作为外部知识源,其中包含所有附加信息。该向量数据库通过以下步骤进行填充:

(1) 收集并加载数据

(2) 将文档分块

(3) 嵌入和存储块

2.3 具体步骤

首先,需要收集和加载数据。在这个示例中,将使用拜登总统2022年的国情咨文作为附加上下文。原始文本文件可在 LangChain 的 GitHub 存储库(https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt)中找到。要加载数据,可以使用 LangChain 提供的多个内置 DocumentLoaders。一个 Document 是一个包含文本和元数据的字典。为了加载文本,将使用 LangChain 的 TextLoader

import requests
from langchain.document_loaders import TextLoader

url = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"
res = requests.get(url)
with open("state_of_the_union.txt", "w") as f:
    f.write(res.text)

loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()

接下来,对文档进行分块处理。由于原始文档过长,无法适应 LLM 的上下文窗口,需要将其分成较小的块。LangChain 提供了许多内置的文本分块工具。在这个简单的示例中,可以使用 CharacterTextSplitter,设置 chunk_size 约为 500,chunk_overlap 为 50,以保持文本在块之间的连续性。

from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
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
)

步骤 1:检索(Retrieve)

向量数据库被填充后,可以将其定义为检索器组件,该组件根据用户查询与嵌入式块之间的语义相似性获取附加上下文。

retriever = vectorstore.as_retriever()

步骤 2:增强(Augment)

接下来,为了将附加上下文与提示一起使用,需要准备一个提示模板。如下所示,可以轻松地从提示模板自定义提示。

from langchain.prompts import ChatPromptTemplate

template = """You are an assistant for question-answering tasks. 
Use the following pieces of retrieved context to answer the question. 
If you don't know the answer, just say that you don't know. 
Use three sentences maximum and keep the answer concise.
Question: {question} 
Context: {context} 
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)

print(prompt)

步骤 3:生成(Generate)

最后,可以构建一个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 = "What did the president say about Justice Breyer"
rag_chain.invoke(query)
"The president thanked Justice Breyer for his service and acknowledged his dedication to serving the country. 
The president also mentioned that he nominated Judge Ketanji Brown Jackson as a successor to continue Justice Breyer's legacy of excellence."

可以在下面的示例中看到生成的RAG:

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

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

相关文章

【李沐论文精读】Transformer精读

论文&#xff1a;Attention is All You Need 参考&#xff1a;李沐视频【Transformer论文逐段精读】、Transformer论文逐段精读【论文精读】、李沐视频精读系列 一、摘要 主流的序列转换(sequence transduction)模型都是基于复杂的循环或卷积神经网络&#xff0c;这个模型包含一…

基于单片机的蓝牙无线密码锁设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1 系统总体设计 3 1.1 系统设计要求 3 1.2 系统设计思路 3 2 系统硬件设计 5 2.1 设计原理 5 2.2 主控模块 5 2.3 芯片模块 8 2.4 矩阵键盘模块 9 2.5 液晶显示模块 10 2.6 继电器驱动模块 12 2.7 蜂鸣器模块 13 2.8 蓝牙模块 14 3 系统软…

Linux入门攻坚——16、Linux系统启动流程

CentOS5、6的启动流程 Linux&#xff1a;kernel rootfs&#xff0c;Linux系统就是内核加上根文件系统。 内核之上是库&#xff1a; 库&#xff1a;函数集合&#xff0c;function&#xff0c;函数具有调用接口&#xff0c;库函数不能单独执行&#xff0c;必须被其他程序调用…

51-17 视频理解串讲— MViT,Multiscale Vision Transformer 论文精读

继TimeSformer模型之后&#xff0c;咱们再介绍两篇来自Facebook AI的论文&#xff0c;即Multiscale Vision Transformers以及改进版MViTv2: Improved Multiscale Vision Transformers for Classification and Detection。 本文由深圳季连科技有限公司AIgraphX自动驾驶大模型团…

农业风险管理案例参考:农作物受灾严重,如何降低损失?

1月20日&#xff0c;国家防灾减灾委员会办公室应急管理部发布2023年全国十大自然灾害&#xff0c;据公布数据显示&#xff0c;此次十大自然灾害致使农作物受灾面积超1092.7千公顷&#xff0c;直接经济损失达2353.22亿元。 农业是安天下、稳民心的战略产业&#xff0c;也是典型…

混沌工程-经典案例分享

目录 前言 案例 1、强弱依赖不合理 2、预案不生效 3、异常数据不兼容 4、监控体系缺陷 5、系统缺整体架构设计 总结 前言 我们公司从启动混沌工程到现在已经几乎覆盖了线上的所有核心业务&#xff0c;先后进行过2000次演练共挖掘出120个漏洞。这些漏洞有些得了及时修复…

基于Skywalking开发分布式监控(四)一个案例

上一篇我们简单介绍了基于SkyWalking自定义增强的基本架构&#xff0c;即通过把Trace数据导入数据加工模块进行加工&#xff0c;进行持久化&#xff0c;并赋能grafana展示。 现在我们给出一个例子&#xff0c;对于量化交易系统&#xff0c;市场交易订单提交&#xff0c;该订单…

2024国内知名大厂Java岗面经,java容器面试题

前言 刚刚过去的双十一&#xff0c;让“高性能”“高可用”“亿级”这3个词变成了技术热点词汇&#xff0c;也让很多人再次萌发成为「架构师」的想法。先问大家一个问题&#xff1a;你觉得把代码熟练、完成需求加上点勤奋&#xff0c;就能成为架构师么&#xff1f;如果你这么认…

Ubuntu22.04系统 安装cAdvisor提示找不到 CPU 的挂载点错误解决办法。

如果我们在安装cAdvisor时容器启动不起来 查看日志如下图所示 1、查看cgroup文件系统是v2 还是 v1 mount | grep cgroup 如图所示我的是v2 &#xff0c; cAdvisor 目前的最新版本&#xff08;v0.39.0&#xff09;仍然只支持 cgroup v1&#xff0c;不支持 cgroup v2。因此&#…

PRewrite: Prompt Rewriting with Reinforcement Learning

PRewrite: Prompt Rewriting with Reinforcement Learning 基本信息 2024-01谷歌团队提交到arXiv 博客贡献人 徐宁 作者 Weize Kong&#xff0c;Spurthi Amba Hombaiah&#xff0c;Mingyang Zhang 摘要 工程化的启发式编写对于LLM&#xff08;大型语言模型&#xff09;应…

大数据分析技术工程师CCRC-BDATE

大数据分析技术工程师介绍 大数据始于科技之美&#xff0c;归于创造价值。大数据时代&#xff0c;“谁用好数据&#xff0c;谁就能把握先机、赢得主动”。当下数据驱动的电信、社交媒体、生物医疗、电子政务商务等行业都在产生着海量的数据&#xff0c;随着大规模数据关联、交叉…

vue基本用法

文本插值 {{}} 用来绑定data方法返回的对象属性 v-bind:为标签的属性绑定data方法中返回的属性 事件绑定v-on:xxx 简写为xxx 双向绑定v-model 条件渲染 v-if v-else v-else-if 动态渲染页面元素

兰德:《中国量子技术的产业基础和军事部署报告》

2月1日&#xff0c;美国智库兰德公司发表中国量子技术的产业基础和军事部署报告&#xff0c;该报告强调了美国和中国均视量子科学和技术为确保各自经济和军事领导地位的战略要素。还指出量子科学是一项军民两用的技术。 该报告提到目前美国政府已经为量子科学制定了一项公开的国…

SoraAI优先体验资格注册教程

SoraA1视频工具优先体验资格申请 申请网址&#xff1a;https://openai.com/form/red-teaming-network 申请步骤&#xff1a; 填写基础信息 请使用英文根据内容填写以下内容&#xff0c;名、姓、电子邮件、居住国家、组织隶属关系(如果有)、教育水平 、学位&#xff08;哪个领…

数据库-DDL

show databases; 查询所有数据库 select database(); 查询当前数据库 use 数据库名&#xff1b; 使用数据库 creat database[if not exists] 数据库名…

【python】六个常见爬虫案例【附源码】

大家好&#xff0c;我是博主英杰&#xff0c;整理了几个常见的爬虫案例&#xff0c;分享给大家&#xff0c;适合小白学习 一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序&a…

leetcode热题HOT 54. 螺旋矩阵(59. 螺旋矩阵 II)

一、问题描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 二、解题思路&#xff1a; 整体思路就是模拟螺旋遍历矩阵的过程&#xff0c;依次遍历外围边界的元素&#xff0c;并将其按顺序存入结果列表…

vant van-field 密码输入框小程序里隐藏、显示密码bug总结

老规矩先上效果图: vant 输入框组件 密码的隐藏与显示功能&#xff1a; 注: 用password属性控制密码的显示与隐藏 不要用type属性&#xff0c;type属性在真机上有时会没有效果 1、当然如果只用typepassword 不需要切换显示、隐藏也可以使用。 2、如果用到了密码的显示与…

计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll

电脑显示mfc140.dll文件缺失信息时&#xff0c;不必担心&#xff0c;这通常是个容易解决的小问题。接下来让我们详细探究并解决mfc140.dll文件缺失的状况。以下将详述相应的解决方案&#xff0c;从而帮助您轻松克服这一技术难题。通过几个简单步骤&#xff0c;即可恢复正常使用…

mac使用Vscode运行C语言遇到的问题

mac系统如何使用vscode运行C语言 Unable to start debugging. Program path ‘/Users/ling/Learning/frontEnd/web/Test/main.cpp’ is missing or invalid. LLDB failed with message: Command ‘file-exec-and-symbols’. Target binary ‘/Users/ling/Learning/frontEnd/we…