用 LangChain 手搓 RAG 系统:从原理到实战

news2025/4/26 11:53:29

一、RAG 系统简介

在当今信息爆炸的时代,如何高效地从海量数据中获取有价值的信息并生成准确、自然的回答,成为了人工智能领域的重要课题。检索增强生成(Retrieval-Augmented Generation,RAG)系统应运而生,它结合了信息检索(IR)和自然语言生成(NLG)技术,能够在生成回答时利用外部知识库的信息,显著提高回答的准确性和可靠性。

RAG 系统的核心思想是:首先通过检索模块从知识库中查找与用户问题相关的文档或段落,然后将这些检索到的信息输入到生成模型中,生成最终的回答。这种方法避免了传统生成模型仅依赖内部参数知识的局限性,能够处理更专业、更实时的问题。

二、LangChain 概述

LangChain是一个用于构建端到端应用程序的框架,特别适用于涉及语言模型(LLM)的应用。它提供了一系列工具和组件,方便开发者连接不同的数据源、整合多种工具,并构建复杂的工作流。在 RAG 系统中,LangChain 可以帮助我们高效地管理检索模块和生成模型之间的交互,简化开发流程。

三、准备工作

(一)安装依赖

首先,我们需要安装必要的 Python 库,包括 LangChain、Hugging Face 的 Transformers 和 Datasets、以及用于向量存储的 FAISS 等。可以通过以下命令进行安装:

pip install langchain transformers datasets faiss-cpu

(二)准备知识库

我们需要一个包含相关领域知识的数据集来构建知识库。这里以维基百科的部分数据为例,使用 Hugging Face 的 Datasets 加载数据:

from datasets import load_dataset

dataset = load_dataset("wikipedia", "20220301.en", split="train")

接下来,对数据进行预处理,包括文本清洗、分句、分词等操作。为了便于检索,我们通常会将文本分割成较小的段落或句子,并为每个段落生成向量表示。

四、构建 RAG 系统

(一)加载语言模型

我们使用 Hugging Face 的 Transformers 加载一个预训练的语言模型,例如 T5:

from transformers import T5Tokenizer, T5ForConditionalGeneration

tokenizer = T5Tokenizer.from_pretrained("t5-base")

model = T5ForConditionalGeneration.from_pretrained("t5-base")

(二)创建检索器

使用 LangChain 的 FAISS 向量存储来创建检索器。首先,将预处理后的文本转换为向量,并存储到 FAISS 索引中:

from langchain.vectorstores import FAISS

from langchain.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

vectorstore = FAISS.from_texts(dataset["text"], embeddings)

retriever = vectorstore.as_retriever()

(三)构建 RAG 链

使用 LangChain 的 RagChain 类来组合检索器和生成模型。RagChain 会自动处理检索和生成的流程,将检索到的相关文本作为上下文输入到生成模型中:

from langchain.chains import RetrievalQA

rag_chain = RetrievalQA.from_chain_type(

    llm=model,

    chain_type="stuff",

    retriever=retriever,

    input_key="question"

)

五、测试与优化

(一)进行问答测试

准备一些测试问题,例如 "Who is the author of the Harry Potter series?",然后使用 RAG 系统进行回答:

question = "Who is the author of the Harry Potter series?"

answer = rag_chain.run(question)

print(answer)

(二)优化检索和生成效果

如果回答效果不理想,可以从以下几个方面进行优化:

  1. 调整检索参数:例如设置检索的相关度阈值、返回的文档数量等。
  2. 改进文本预处理:优化文本分割策略、增加文本清洗的规则等。
  3. 选择更合适的模型:尝试不同的语言模型或嵌入模型,提高检索和生成的准确性。
  4. 增强知识库:增加更多的训练数据,或者对现有数据进行更精细的标注。

六、总结

通过 LangChain,我们可以快速地搭建一个 RAG 系统,实现基于外部知识库的问答功能。本文只是一个简单的示例,实际应用中还需要考虑更多的因素,例如处理长文本、支持多模态输入输出、提高系统的效率和可扩展性等。

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

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

相关文章

联合体和枚举类型

1.联合体类型 1.1:联合体类型变量的创建 与结构体类型一样,联合体类型 (关键字:union) 也是由⼀个或者多个成员变量构成,这些成员变量既可以是不同的类型,也可以是相同的类型。但是编译器只为最⼤的成员变量分配⾜够的内存空间。联合体的特…

C语言指针5

1.void*概述 void称为无类型,void*称为无类型指针,void不可以单独定义变量,却可以定义无类型的指针,而且所定义的指针称为泛型指针,所谓泛型指针,其含义是void*类型的指针可以接收一切类型变量的地址 struc…

文档构建:Sphinx全面使用指南 — 强化篇

文档构建:Sphinx全面使用指南 — 强化篇 Sphinx 是一款强大的文档生成工具,使用 reStructuredText 作为标记语言,通过扩展兼容 Markdown,支持 HTML、PDF、EPUB 等多种输出格式。它具备自动索引、代码高亮、跨语言支持等功能&#…

深度理解C语言函数之strlen()的模拟实现

文章目录 前言一、strlen的模拟实现二、模拟实现代码及思路2.1 计数法2.2 指针相减法三、递归计数法 总结 前言 我写这篇文章的目的主要是帮助理解C语言中重要函数的用法,后面也会总结C相关的函数的模拟实现,这里的算法不一定是最好的,因为只…

0基础 | Proteus仿真 | 51单片机 | 继电器

继电器---RELAY 本次选择一款5v一路继电器进行讲解 信号输入 IN1输入高电平,三极管导通,LED1点亮,电磁铁12接通吸引3向下与4接通,J1A的12接通 IN1输入低电平,则J1A的23接通 产品引脚定义及功能 序号 引脚符号 引脚…

Python解析地址中省市区街道

Python解析地址中省市区街道 1、效果 输入:海珠区沙园街道西基村 输出: 2、导入库 pip install jionlp3、示例代码 import jionlp as jiotext 海珠区沙园街道西基村 res jio.parse_location(text, town_villageTrue) print(res)

在vscode终端中运行npm命令报错

解决方案 这个错误信息表明,你的系统(可能是 Windows)阻止了 PowerShell 执行脚本,这是由于 PowerShell 的执行策略导致的。PowerShell 的执行策略控制着在系统上运行哪些 PowerShell 脚本。默认情况下,Windows 可能…

提升变电站运维效率:安科瑞无线测温系统创新应用

一、引言 变电站作为电力系统的关键枢纽,承担着变换电压、分配电能以及控制电力流向等重要任务。在变电站的运行过程中,电气设备的接点温度监测至关重要。过热问题可能由多种因素引发,如电阻过大、接头质量欠佳、衔接不紧密、物理老化等&…

vue3 使用 vite 管理多个项目,实现各子项目独立运行,独立打包

场景: 之前写过一篇 vite vue2 的配置,但是现在项目使用 vue3 较多,再更新一下 vue脚手架初始化之后的项目,每个项目都是独立的,导致项目多了之后,node依赖包过多,占用内存较多。想实现的效果…

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施,以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中,域(realm)是一种逻辑上的分组概念,用于对不同的用户群体、应用或者服务进行区…

如何使用极狐GitLab 的外部状态检查功能?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 外部状态检查 (ULTIMATE ALL) pending 状态引入于极狐GitLab 16.5 pending 状态检查的超时时间为两分钟引入于极狐GitLab 16…

【Langchain】RAG 优化:提高语义完整性、向量相关性、召回率--从字符分割到语义分块 (SemanticChunker)

RAG 优化:提高语义完整性、向量相关性、召回率–从字符分割到语义分块 (SemanticChunker) 背景:提升 RAG 检索质量 在构建基于知识库的问答系统(RAG)时,如何有效地将原始文档分割成合适的文本块(Chunks&a…

深入剖析扣子智能体的工作流与实战案例

前面我们已经初步带大家体验过扣子工作流,工作流程是 Coze 最为强大的功能之一,它如同扣子中蕴含的奇妙魔法工具,赋予我们的机器人处理极其复杂问题逻辑的能力。 这篇文章会带你更加深入地去理解并运用工作流解决实际问题 目录 一、工作流…

基于K8s日志审计实现攻击行为检测

K8s日志审计以一种事件溯源的方式完整记录了所有API Server的交互请求。当K8s集群遭受入侵时,安全管理员可以通过审计日志进行攻击溯源,通过分析攻击痕迹,找到攻击者的入侵行为并还原攻击者的攻击路径,修复安全问题。 在本篇文章中…

【Linux网络编程】应用层协议HTTP(实现一个简单的http服务)

目录 前言 一,HTTP协议 1,认识URL 2,urlencode和urldecode 3,HTTP协议请求与响应格式 二,myhttp服务器端代码的编写 HTTP请求报文示例 HTTP应答报文示例 代码编写 网络通信模块 处理请求和发送应答模块 结…

短视频+直播商城系统源码全解析:音视频流、商品组件逻辑剖析

时下,无论是依托私域流量运营的品牌方,还是追求用户粘性与转化率的内容创作者,搭建一套完整的短视频直播商城系统源码,已成为提升用户体验、增加商业变现能力的关键。本文将围绕三大核心模块——音视频流技术架构、商品组件设计、…

STM32定时器---基本定时器

目录 一、定时器的概述 二、时基单元 三、基本定时器的的时序 (1)预分频器时序 (2)计数器时序 四、基本定时器的使用 一、定时器的概述 在没有定时器的时候,我们想要延时往往都是写一个Delay函数,里面…

大模型微调 - transformer架构

什么是Transformer Transformer 架构是由 Vaswani 等人在 2017 年提出的一种深度学习模型架构,首次发表于论文《Attention is All You Need》中 Transformer 的结构 Transformer 编码器(Encoder) 解码器(Decoder) …

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成

在GEE中实现时,发现简单的QA60是无法去云的,最近S2地表反射率数据集又进行了更新,原有的属性集也进行了变化,现在的SR数据集名称是“S2_SR_HARMONIZED”。那么: 要想得到研究区无云的图像,可以参考执行以下…

HTMLCSS模板实现水滴动画效果

.container 类:定义了页面的容器样式。 display: flex:使容器成为弹性容器,方便对其子元素进行布局。justify-content: center 和 align-items: center:分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh:设…