用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

Retrieval-Augmented Generation(RAG)是一种强大的技术,能够提高大型语言模型(LLM)的性能,使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。

本文将详细介绍 RAG 在 LangChain 中的应用,以及如何构建一个简单的 RAG 管道。

LangChain 是什么

LangChain 是一个强大的自然语言处理工具,提供了丰富的功能来简化文本处理和信息检索任务。它的强大之处在于可以无缝集成不同的组件,从而构建复杂的文本处理管道。

RAG 是什么

RAG 的核心思想是将语言模型(LLM)与检索模块结合起来,使其能够利用外部知识源的信息。这有助于生成更加准确和上下文相关的回答,从而减少幻觉(hallucination)的风险。

RAG 工作原理分为两个主要阶段:

索引阶段

该阶段是信息检索系统中的一个关键步骤,旨在将原始数据(例如文档、文本等)进行处理和组织,以便后续能够更快速、有效地检索和获取相关信息。

以下是索引阶段的主要组成部分:

  1. 索引: 数据被处理成一个索引结构,其中特定的信息块被赋予唯一的标识符或值。索引结构充当后续检索操作的入口,加速信息查找的过程。

  2. 文档加载器: 负责从各种来源(如私有S3存储桶、信息网站、社交平台等)获取原始数据。文档加载器的任务是将原始数据导入系统,以便进行后续的处理和索引。

  3. 文档转换器: 对原始文档进行处理,将其转换成更容易处理的形式。这可能包括将大型文档分解为小块,准备文档以便后续的信息检索。

  4. 文本嵌入模型: 一旦文档被转换,系统会使用文本嵌入模型为文本创建嵌入。嵌入捕捉文本的潜在语义含义,使得后续的检索可以更准确地匹配用户查询。

  5. 向量存储: 为了存储处理后的数据和相应的嵌入,系统提供与多种向量存储的连接。

检索和生成阶段

该阶段是信息检索系统中的两个关键步骤,涉及根据用户的查询检索相关信息并生成自然语言响应。以下是的主要组成部分:

  1. 检索: 在用户提出问题时,系统使用检索器从存储中获取与用户需求相关的信息。这类似于搜索引擎,系统寻找匹配用户问题的数据片段。

  2. 生成: 获取所需信息后,ChatModel 或大语言模型(LLM)介入,通过将用户的问题与获取的数据结合,生成自然而直接相关的响应。

RAG 的工作流程

在这里插入图片描述

RAG 的工作流程主要分为三个步骤:检索、增强和生成。

  • 检索: 使用用户查询从外部知识源中检索相关上下文。将用户查询嵌入到向量空间中,与向量数据库中的附加上下文进行相似性搜索,返回前 N 个最接近的数据对象。

  • 增强: 使用用户查询和检索到的附加上下文填充提示模板。

  • 生成: 将经过检索增强的提示传递给LLM。

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程

  • 用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

  • 用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:结合检索和重排序模型,改善大模型 RAG 效果明显

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:ChatGLM3-6B 功能原理解析

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:一个强大的 LLM 微调工具 LLaMA Factory

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:LangChain Agent 原理解析

  • 用通俗易懂的方式讲解:HugggingFace 推理 API、推理端点和推理空间使用详解

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:使用 FastChat 部署 LLM 的体验太爽了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:使用 Docker 部署大模型的训练环境

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:LangChain 知识库检索常见问题及解决方案

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:代码大模型盘点及优劣分析

  • 用通俗易懂的方式讲解:Prompt 提示词在开发中的使用

  • 用通俗易懂的方式讲解:万字长文带你入门大模型

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

相关资料、数据、技术交流提升,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:mlc2060,备注:来自CSDN + 技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:加群

在这里插入图片描述

配置与准备

在开始使用 LangChain 之前,首先需要安装必要的依赖。以下是配置OpenAI 环境和安装所需依赖项的代码:

!pip install openai --quiet
!pip install langchain --quiet
!pip install docx2txt --quiet
!pip install weaviate-client --quiet

然后,配置 OpenAI 环境的代码如下:

import os

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

文档处理与分段

接下来,加载并处理示例文档。这包括使用文档加载器加载文档,然后将其分成较小的段落。

from langchain.document_loaders import Docx2txtLoader
from langchain.text_splitter import CharacterTextSplitter

# 加载文档
document_path = "文件路径"
loader = Docx2txtLoader(document_path)
documents = loader.load()

# 分割文档
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

文本嵌入与向量存储

现在,使用 LangChain 进行文本嵌入和向量存储,以便后续的检索操作。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Weaviate

# 初始化 OpenAI 嵌入模型
embeddings = OpenAIEmbeddings()

# 创建Weaviate向量数据库
vectorstore = Weaviate.from_documents(
    client=weaviate.Client(embedded_options=EmbeddedOptions()),
    documents=texts,
    embedding=embeddings,
    by_text=False
)

检索链的创建

接下来,将演示如何在 LangChain 中创建检索链。使用一个示例文档,并将其分段以便进行更有效的检索。

基于文档填充的检索链
from langchain.chains import RetrievalQA

# 创建 RetrievalQA 检索链
retriever = vectorstore.as_retriever()
qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0), chain_type="stuff", retriever=retriever)

# 运行查询
query = "这文档里都有什么内容?"

result = qa_map_reduce.run(query)
print(result)

Map-Reduce 文档链

from langchain.chains import RetrievalQA

# 构建 Map-Reduce文档链
retriever = vectorstore.as_retriever()
qa_map_reduce = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="map_reduce", retriever=retriever)

# 运行查询
query = "这文档里都有什么内容?"

result = qa_map_reduce.run(query)
print(result)

优化文档链

from langchain.chains import RetrievalQA

# 构建优化文档链
retriever = vectorstore.as_retriever()
qa_refine = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="refine", retriever=retriever)

# 运行查询
query = "这文档里都有什么内容?"

result = qa_refine.run(query)
print(result)

RAG 实现示例

1. 基础设置和文档处理:通过 LangChain 处理文本数据,将其嵌入为向量,并通过 Weaviate 向量数据库,为文本搜索或相似性匹配提供支持。

import requests
from weaviate import Weaviate, Client, EmbeddedOptions
from weaviate.language_embedding.vectorization import OpenAIEmbeddings
from weaviate.util import CharacterTextSplitter, TextLoader
import dotenv

# 加载环境变量
dotenv.load_dotenv()

# 下载数据
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)

# 使用 TextLoader 加载文本
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()

# 使用 CharacterTextSplitter 拆分文本成小块
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# 初始化 Weaviate 客户端
client = Client(embedded_options=EmbeddedOptions())

# 在 Weaviate 中创建向量存储
vectorstore = Weaviate.from_documents(
    client=client,
    documents=chunks,
    embedding=OpenAIEmbeddings(),
    by_text=False
)

2. 构建 RAG Pipline:使用 RAG 模型进行问答对话,通过检索上下文信息来支持生成更精准的回答。

from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser

# 定义检索器
retriever = vectorstore.as_retriever()

# 准备中文prompt模板
template = """你是一个用于问答任务的助手。
使用以下检索到的上下文片段来回答问题。
如果你不知道答案,只需说你不知道。
最多使用三句话,保持回答简洁。
问题: {question}
上下文: {context}
回答:
"""
prompt = ChatPromptTemplate.from_template(template)

# 定义LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# 构建RAG链
rag_chain = (
    {"context": retriever,  "question": RunnablePassthrough()} 
    | prompt 
    | llm
    | StrOutputParser() 
)

# 运行RAG链
query = "总结内容并列出关键词."
result = rag_chain.invoke(query)
print(result)

以上就是一个简单的 RAG Pipline 的构建和运行过程。通过这种方式,LangChain 提供了一种方便而强大的方法来实现检索增强生成任务,使得语言模型能够更好地利用外部知识源来提高其性能。

总结

LangChain 提供了丰富的组件和功能,使得 RAG 的实现变得简单而灵活。通过检索增强生成,使我们能够充分利用大语言模型和外部知识源,生成更加准确和具有上下文的回答,从而提高自然语言处理任务的性能。

引用

  1. https://github.com/langchain-ai/langchain
  2. https://python.plainenglish.io/rag-using-langchain-c371fcd02d13
  3. https://towardsdatascience.com/retrieval-augmented-generation-rag-from-theory-to-langchain-implementation-4e9bd5f6a4f2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机安装linux

下载linux镜像文件 记住下载到的路径,后面需要用到!!! 开始: 1. 双击打开VMware 2. 点击 创建新的虚拟机 3. 新建虚拟机向导,选择 自定义(高级) ,点击 下一步 4. 选择虚拟机硬件兼容性,默认 点击 下一步…

C2-4.3.1 多个决策树——随机森林

C2-4.3.1 多个决策树——随机森林 参考链接 1、为什么要使用多个决策树——随机森林? 决策树的缺点: A small change in the data can cause a large change in the structure of the decision tree causing instability 即:对数据集 中…

已安装MySQL5.7的基础上安装MySQL8教程

类似文章很多,但部分问题解决方案并不是很完整,且对细节描述不够清楚,特意总结一篇 在本机已经安装MySQL5.7的情况下新安装MySQL8.x的方案如下(请按照步骤详细操作): 1.进入官网下载 https://dev.mysql.c…

怎么批量创建多个文件夹并命名?

怎么批量创建多个文件夹并命名?在日常的文件管理中,有时候我们需要批量创建多个文件夹并给它们命名,以便更好地组织和分类我们的文件。无论是在工作中还是个人使用中,批量创建文件夹可以帮助我们更高效地整理和管理文件。想象一下…

游戏引擎支持脚本编程有啥好处

很多游戏引擎都支持脚本编程。Unity、Unreal Engine、CryEngine等大型游戏引擎都支持使用脚本编写游戏逻辑和功能。脚本编程通常使用C#、Lua或Python等编程语言,并且可以与游戏引擎的API进行交互来控制游戏对象、设置变量、执行行为等。使用脚本编程,游戏…

java项目启动报错排查过程——mysql服务挂了

来自前端同事无法启动后台项目的案例 Caused by: java.net.ConnectException Create breakpoint : Connection refused: connect The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 大致…

【信息安全】深度分析邮件安全及钓鱼攻击防范

本博文共计3100余字,预计需阅读20分钟 【邮件安全建设】 一、前言 邮件系统作为企业办公网络架构中重要的组成部分,同时也是业务高频使用的办公应用,一旦出现安全问题,业务将会被严重干扰甚至中断,本篇博客通过攻守两…

基于Vue的应届毕业生财务管理系统-计算机毕业设计源码82886

摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发达,应届毕业生财务…

如何正确地理解应用架构并开发

许多同学或多或少都经历过这样的流程: 新同学刚来公司,学习了解团队的一些工程代码,并了解其中的代码风格团队新接手了一些其他团队的项目,需要了解工程结构以及概念如何定义工程项目的工程结构,包目录结构并达成团队共…

Redis底层原理

持久化 Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是…

Docker与微服务实战(基础篇)

Docker与微服务实战(基础篇) 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1…

利用 Vesta 软件绘制团簇构型 ICO多面体(二)

微信公众号:原子与分子模拟更新的快,欢迎大家关注。 -------------------------------------------------------------------- 进入网站下载 ICO 文件: http://www.pas.rochester.edu/~wangyt/algorithms/bop/ 利用 Vesta 软件进行绘制。 …

openssl3.2 - 自己构建openssl.exe的VS工程(在编译完的源码版本上)

文章目录 openssl3.2 - 自己构建openssl.exe的VS工程(在编译完的源码版本上)概述笔记备注END openssl3.2 - 自己构建openssl.exe的VS工程(在编译完的源码版本上) 概述 将openssl3.2编译出来了(openssl3.2 - 编译) 安装后的openssl.exe可以干openssl3.2所有的事情, 用openssl.…

Kubernetes WebHook 入门 -- 入门案例: apiserver 接入 github

博客原文 文章目录 k8s 集群配置介绍Admission WebhookWebHook 入门实践: github 认证接入web 服务器Dockerfile 镜像制作amd64x86_64构造镜像检验镜像 Makefilewebhook 接入 apiserverwebhook.yamlapiserver 挂载 webconfig在 github 中创建认证 token将 token 添加到 kubecon…

mybatisplus快速入门-个人理解版

mybatisplus快速入门 1.快速入门1.1准备开发环境-idea2019.2.1版第一步:新建工程第二步:导入依赖 1.2创建数据库和表创建库表添加数据 1.3编写代码进行测试第一步:配置application.yml第二步:添加实体类第三步:添加map…

如何实现公网访问GeoServe Web管理界面共享空间地理信息【内网穿透】

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入…

前端面试题集合五(css)

CSS 面试知识点总结 本部分主要是笔者在复习 CSS 相关知识和一些相关面试题时所做的笔记,如果出现错误,希望大家指出! 目录 1.介绍一下标准的 CSS 的盒子模型?低版本 IE 的盒子模型有什么不同的?2.CSS 选择符有哪些…

MobileViT

CNN与transformer的混合。 轻量级、通用的、对移动端友好的vision transformer模型。

快乐学Python,数据分析之获取数据方法「公开数据或爬虫」

学习Python数据分析,第一步是先获取数据,为什么说数据获取是数据分析的第一步呢,显而易见:数据分析,得先有数据,才能分析。 作为个人来说,如何获取用于分析的数据集呢? 1、获取现成…

实习学习总结(2023-12-14---2024-1-08)

CS汉化 首先下载CSagent,百度网盘中有 按照如下放置目录 使用出现中文乱码 插件使用乱码主要跟cs客户端加载没有指定UTF-8编码有关 指定编码的字符:-Dfile.encodingUTF-8 上面的字段添加到启动脚本里面即可,如: java -Dfile.e…