用检索增强生成让大模型更强大,这里有个手把手的Python实现

python实战(七)——基于LangChain的RAG实践 本文详细介绍了使用LangChain构建RAG程序的各个流程,并给出了对应的python实现代码。 阅读详情

自从人们认识到可以使用自己专有的数据让大型语言模型(LLM)更加强大,人们就一直在讨论如何有效地将 LLM 的一般性知识与专有数据整合起来。对此人们也一直在争论:微调和检索增强生成(RAG)到底哪个更合适?
在这里插入图片描述

前言

本文首先将关注 RAG 的概念和理论。然后将展示可以如何使用用于编排(orchestration)的 LangChain、OpenAI 语言模型和 Weaviate 向量数据库来实现一个简单的 RAG。

检索增强生成是什么?

检索增强生成(Retrieval Augment Generate,简称RAG)这一概念是指通过外部知识源来为 LLM 提供附加的信息。这让 LLM 可以生成更准确和更符合上下文的答案,同时减少幻觉。

问题

当前最佳的 LLM 都是使用大量数据训练出来的,因此其神经网络权重中存储了大量一般性知识(参数记忆)。但是,如果在通过 prompt 让 LLM 生成结果时需要其训练数据之外的知识(比如新信息、专有数据或特定领域的信息),就可能出现事实不准确的问题(幻觉),如下截图所示:
在这里插入图片描述
因此,将 LLM 的一般性知识与附加上下文整合起来是非常重要的,这有助于 LLM 生成更准确且更符合上下文的结果,同时幻觉也更少。

解决方案

传统上讲,通过微调模型,可以让神经网络适应特定领域的或专有的信息。尽管这种技术是有效的,但其需要密集的计算,成本高,还需要技术专家的支持,因此就难以敏捷地适应不断变化的信息。

2020 年,Lewis et al. 的论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》提出了一种更为灵活的技术:检索增强生成(RAG)。在这篇论文中,研究者将生成模型与一个检索模块组合到了一起;这个检索模块可以用一个更容易更新的外部知识源提供附加信息。

用大白话来讲:RAG 之于 LLM 就像开卷考试之于人类。在开卷考试时,学生可以携带教材和笔记等参考资料,他们可以从中查找用于答题的相关信息。开卷考试背后的思想是:这堂考试考核的重点是学生的推理能力,而不是记忆特定信息的能力。

类似地,事实知识与 LLM 的推理能力是分开的,并且可以保存在可轻松访问和更新的外部知识源中:

  • 参数化知识:在训练期间学习到的知识,以隐含的方式储存在神经网络权重之中。
  • 非参数化知识:储存于外部知识源,比如向量数据库。

下图展示了最基本的 RAG 工作流程:
检索增强生成(RAG)的工作流程
1. 检索:将用户查询用于检索外部知识源中的相关上下文。为此,要使用一个嵌入模型将该用户查询嵌入到同一个向量空间中,使其作为该向量数据库中的附加上下文。这样一来,就可以执行相似性搜索,并返回该向量数据库中与用户查询最接近的k 个数据对象。
2. 增强:然后将用户查询和检索到的附加上下文填充到一个 prompt 模板中。
3. 生成:最后,将经过检索增强的 prompt馈送给 LLM。

使用 LangChain 实现检索增强生成

下面将介绍如何通过 Python 实现 RAG 工作流程,这会用到 OpenAI LLM 以及 Weaviate 向量数据库和一个 OpenAI 嵌入模型。LangChain 的作用是编排。

必要前提

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

  • langchain,编排
  • openai,嵌入模型和 LLM
  • weaviate-client,向量数据库
#!pip install langchain openai weaviate-client

另外,在根目录下用一个 .env 文件定义相关环境变量。你需要一个 OpenAI 账户来获取 OpenAI API Key,然后在 API keys(https://platform.openai.com/account/api-keys )「创建新的密钥」。

 OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

然后,运行以下命令来加载相关环境变量。

import dotenv
dotenv.load_dotenv()

准备工作

在准备阶段,你需要准备一个作为外部知识源的向量数据库,用于保存所有的附加信息。这个向量数据库的构建包含以下步骤:

  1. 收集并载入数据
  2. 将文档分块
  3. 对文本块进行嵌入操作并保存

第一步是收集并载入数据。举个例子,如果我们使用拜登总统 2022 年的国情咨文作为附加上下文。LangChain 的 GitHub 库提供了其原始文本文档。为了载入这些数据,我们可以使用 LangChain 内置的许多文档加载工具。一个文档(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:检索

填充完向量数据库之后,我们可以将其定义成一个检索器组件,其可根据用户查询和嵌入块之间的语义相似性获取附加上下文。

retriever = vectorstore.as_retriever()

步骤 2:增强

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)

接下来,为了使用附加上下文增强 prompt,需要准备一个 prompt 模板。如下所示,使用 prompt 模板可以轻松地定制 prompt。

步骤 3:生成

最后,我们可以为这个 RAG 流程构建一个思维链,将检索器、prompt 模板和 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 的概念,其最早来自 2020 年的论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》。在介绍了 RAG 背后的理论(包括动机和解决方案)之后,本文又介绍了如何用 Python 实现它。本文展示了如何使用 OpenAI LLM 加上 Weaviate 向量数据库和 OpenAI 嵌入模型来实现一个 RAG 工作流程。其中 LangChain 的作用是编排。

原文链接:Retrieval-Augmented Generation (RAG): From Theory to LangChain Implementation

RAG实战案例:如何基于 LangChain 实现智能检索生成系统 检索增强生成 (RAG) 是一种使用来自私有或专有数据源的信息来辅助文本生成的技术。它将检索模型(设计用于搜索大型数据集或知识库)和生成模型(例如大型语言模型 (LLM),此类模型会使用检索到的信息生成可供阅读的文本回复)结合在一起。通过从更多数据源添加背景信息,以及通过训练来补充 LLM 的原始知识库,检索增强生成能够提高搜索体验的相关性。这能够改善大型语言模型的输出,但又无需重新训练模型。 阅读详情

相关推荐

基于检索增强的生成式AI:使用 Python + LangChain 构建 RAG 系统

随着大模型在各类应用场景中的广泛落地,单纯的生成式模型(如 GPT)在知识更新、上下文理解等方面也暴露出局限。检索增强生成(Retrieval‑Augmented Generation,RAG)通过将外部知识库与生成模型结合,既能保证回答的准确性,又能动态扩展知识面。本文将手把手教你使用 Python、LangChain、Pinecone 和 OpenAI API 完整构建一个 RAG 问答系统。

oneyyang的博客 1003

RAG入门实践:手把手Python实现搭建本地知识问答系统

向量数据库是AI时代的“数据配对专家”,用向量化思维解决非结构化数据的存储和检索难题,尤其适合需要。

Arbboter的专栏 7709

python实现RAG相关思路与过程

python实现大模型向量检索RAG

NLP与推荐算法 1025

【Python大语言模型系列】不到两百行代码教你实现一个完整的RAG系统(案例+源码)

不到两百行代码教你实现一个完整的RAG系统(案例+源码)

数据杂坛 3675

朴素RAG:Python从零实现

检索增强生成(RAG)是一种将信息检索与生成模型相结合的混合方法。它通过引入外部知识来增强语言模型的性能,从而提高准确性和事实正确性。数据摄取:加载并预处理文本数据。分块:将数据分成较小的块以提高检索性能。嵌入创建:使用嵌入模型将文本块转换为数值表示。语义搜索:根据用户查询检索相关块。响应生成:使用语言模型基于检索到的文本生成响应。本文实现了一个简单的RAG方法,评估模型的响应,并探索各种改进。

AI人工智能的学习之路 898

比微软的GraphRag更加强大的LightRAG:简单快速的检索增强生成

如果您想使用 Ollama 模型,您需要拉取您计划使用的模型和嵌入模型,例如nomic-embed-text。texts,),

洛阳泰山的博客 3513

AI大模型|RAG 检索增强生成

LangChain 包括 ChatGPT 的官方 assistant 的 Retrieval 其实都利用了 RAG 的原理。在后续的课程中会有更深入的实战应用。比如打造垂直领域内容的问答机器人。

huang9604的博客 775

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 824

比较图检索增强生成(Graph RAG)和向量检索增强生成(Vector RAG)

检索增强生成(Retrieval Augmented Generation,RAG)是一项前沿技术,它融合了基于检索的人工智能模型与生成式人工智能模型的优势,能够给出更准确、相关且更具人类语言特征的回复。通过整合这两种方法,RAG 使大型语言模型(LLM)能够访问并利用外部知识库中的最新信息,减少“幻觉”现象或不准确回复的出现。RAG 的核心思想是用有针对性的领域特定信息,来补充大型语言模型中已有的海量知识。这使得模型生成的回复不仅连贯自然,而且以真实、及时的数据为依据。

weixin_43156294的博客 1304

用Seurat和ComplexHeatmap绘制单细胞marker基因热图:从数据处理到可视化全流程

本文详细介绍了使用Seurat和ComplexHeatmap绘制单细胞marker基因热图的全流程,涵盖从数据处理、基因筛选、平均表达矩阵计算到高级可视化与注释添加。重点解析了如何利用ComplexHeatmap生成发表级热图,并整合热词信息,解决单细胞数据可视化中的常见问题,提升科研图表质量。

weixin_29048775的博客 530

C/C++面试八股文汇总

以对象管理资源,利用的就是C++构造的对象最终会被对象的析构函数销毁的原则。上述的的申请、使用、释放资源的程序较为简单,但是如果程序很复杂的时候,需要为所有的new 分配的内存delete掉,导致极度臃肿,效率下降,更可怕的是,程序的可理解性和可维护性明显降低了,当操作增多时,处理资源释放的代码就会越来越多,越来越乱。栈在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。

wzzrh的博客 1万+

LangChain入门系列:RAG检索增强生成全解析

检索增强生成(RAG)技术是大语言模型实现知识扩展的关键突破,其核心工作原理可概括为"现查现用"的智能增强机制。当大模型遇到超出其训练数据范围的问题时,RAG会实时从外部知识库检索相关信息,将这些新鲜知识智能整合到生成过程中,使模型能够结合最新数据给出准确回答。这一过程完美弥补了大模型固有的三大知识短板:训练数据的时效性局限、专有知识的缺失问题以及特定领域的深度不足。通过动态检索与智能融合的双重机制,RAG既保留了预训练模型的强大推理能力,又突破了静态知识库的边界,实现了"即需即学"的智能进化。这种技术特别

yihanss的博客 2091

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 833

Python 解析 RAG(检索增强生成)的核心概念

RAG 是一种混合模型架构,它结合了传统的信息检索方法和现代的神经网络生成模型。与传统的生成模型不同,RAG 不仅依赖于模型内部的知识,还可以动态地从外部知识库中检索相关信息。这使得 RAG 能够更好地理解和回答复杂问题,尤其是在缺乏训练数据的情况下。RAG 是一种非常有潜力的技术,它通过结合检索和生成的能力,为解决复杂的自然语言处理问题提供了新的思路。通过 Python 和现有的开源工具,我们可以相对容易地实现和部署 RAG 模型。

2501_91163186的博客 1691

爬取二手房数据:Python爬虫+Geopy实战,看透房价与地理位置的隐藏关系

哪些区域单价虚高(房源少但单价远高于周边);哪些小区性价比高(靠近地铁/学校,单价低于同地段平均水平);房价与地理位置的量化关系(如距离地铁每远1公里,单价下降多少)。如果想扩展分析范围,可爬取多个城市/区域的数据,对比不同城市的房价差异;或结合时间维度(定期爬取),分析房价的涨跌趋势。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 949

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1640

raglite:一款强大的检索增强生成Python工具包

在当今信息爆炸的时代,如何高效地从海量数据中提取关键信息,生成有价值的文本内容,已经成为人工智能领域的重要课题。本文将为您介绍一款开源Python工具包——raglite,它为检索增强生成(Retrieval-Augmented Generation, RAG)提供了便捷、高效的支持。 ## 项目介绍 raglite是一个基于Python的开源工具包,专为检索增强生成(RAG)设计。它支持使用

gitblog_00601的博客 729

实战:RK3568 Android14 调试 MIPI DSI 液晶屏

LCD1_RST -> 对应原理图网络连接到 GPIO。LCD1_PWR_EN ->用于给屏幕 VCC 供电。LCD0_BL_EN / LCD0_BL_PWM -> MP3302 升压芯片驱动 LED 灯条。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/100f2be7f763494da1032464e272e63b.png&pinctrl {/* 配置 LCD_RST 和 LCD_EN */

qq_33427070的博客 1549

大模型必备知识|什么是检索增强生成(RAG)?

为解决这一问题,近期业界热议基于RAG(检索增强生成)的系统——但究竟什么是RAG?它能做什么?为何值得关注?

瓦罗兰特顶级C位的博客 971

如何在 R 中执行 Kruskal-Wallis 检验

Kruskal-Wallis 检验用于确定三个或更多独立组的中位数之间是否存在统计学上的显着差异。它被认为是单向方差分析的非参数等效项。本教程介绍了如何在 R 中执行 Kruskal-Wallis 检验。示例:R 中的 Kruskal-Wallis 检验 假设研究人员想知道三种不同的肥料是否会导致不同水平的植物生长。他们随机选择 30 种不同的植物并将它们分成三组,每组 10 株,每组施用不同的肥料。在一个月结束时,他们测量每株植物的高度。使用以下步骤执行 Kruskal-Wallis 检验以确定三个组的中

Mrrunsen的博客 3799

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大模型RAG检索增强生成 | FlashRAG用于高效 RAG 研究的 Python 工具包

FlashRAG 是一款专为 RAG 研究开发的 Python 工具包,它帮助研究者和开发者更方便地再现和开发检索增强生成的各类应用。该工具包集成了高效的检索与生成组件,旨在让用户能够快速搭建 RAG 系统,从而探索文本生成、信息检索、回答生成等任务的各种可能性。FlashRAG 的核心优势在于简洁且高效的 API,它能够兼容现有的多种检索模型和生成模型。同时,它的模块化设计让用户能够自由定制检索和生成流程,方便根据不同应用需求进行调整。

老皮的博客 858

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

从大模型(LLM)、检索增强生成(RAG)到智能体(Agent)的应用

通过上一章的介绍,你可以发现OpenAI已经大规模使用工程化的技术使用户能够基于自己的知识库对其GTP系列大模型进行“增强”,从而实现更加垂直化、个性化的能力。那么,如果你基于成本或安全的考虑,想在私域进行自有知识库的“增强”,甚至切换成其它的大模型来使用这个“增强”,就不得不考虑自行开发实现了,这时候就需要了解检索增强生成(RAG)概念和向量数据库技术的应用。检索增强生成(RAG)技术人工智能的应用方法,它通过结合传统的信息检索技术与最新的生成式深度学习模型,来提升信息的准确性和相关性。

m0_59164304的博客 4301

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 什么是大模型微调?微调的分类、方法、和步骤
下一篇: BGE M3-Embedding 模型介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值