【2024最全最细Langchain教程-6 】Langchain数据增强之加载、转换

【2024最全最细Langchain教程-5 】Langchain模型I/O之输出解析器-CSDN博客

什么是数据增强 RAG(Retrieval Augmented Generation)?

        数据增强是指“利用大模型以外的数据来增强应用的数据获取和提供能力”。数据增强之所以存在的一个根本原因在于——大模型自身无法包含所有数据。不管是ChatGPT或者其他大模型,他们都是预训练模型,这就意味着他们总有一个截止日期,不可能包含昨天或者今天互联网上产生的最新数据。而且在一些场景下,比如TOB业务中,企业会有自己的私有数据,甚至模型部署也是本地化的,而集成企业内部数据是一个非常重要的工作,这些场景和需求都需要我们的应用具备使用大模型之外数据的能力,这种能力就被称为数据增强。

 数据增强的基本业务流程

       数据增强的基本业务流程大同小异,我们使用langchain官网上的一个流程图,就能很好地展示数据增强的整个过程:

1. 加载数据(Load)

        我们可以加载的数据源包括但不限于各种文本文档(PDF、TXT、HTML、CSV等),数据库,互联网实时数据,API接口数据等。在本文中首先将会以PDF文件为例进行加载,在后面介绍create_sql_query_chain 的文章中,我们将会介绍如何加载数据库数据。

        在langchain_community中有一个专门的库,document_loaders中有各种数据加载器,比如有PDF加载器PyPDFLoader,有网络数据加载器AsyncChromiumLoader用于加载网页数据等等。

2. 转化数据(Transform)

        这一步是将加载后的数据进行处理,基本上都是做切分处理,把较大块的文本数据切分成小块的文本数据,方便进行向量化处理。

3. 词嵌入(Embedding)

        将文本转化为词向量的过程,只有向量化之后的文本才可以进行相似性比较等运算,这里不再展开,大家感兴趣的可以自己查找相关文章,这里面学问很大很大,要是展开了讲,讲两天也不一定能讲完。

4. 向量存储(Store to Vector)

        将向量化的数据存储入FAISS或Chroma等向量数据库。

5. 检索获取数据(Retrieval)

        在向量数据库里进行数据检索和查找,获取所需数据。

加载数据的示例

        我们来看具体的代码:

pip install pypdf
pip install rapidocr-onnxruntime 

        安装pypdf库和这个 rapidocr-onnxruntime ,这个rapidocr-onnxruntime 的作用是可以扫描PDF中的图片上文字做OCR提取,我们继续:

import sys

from langchain_community.document_loaders import PyPDFLoader


loader = PyPDFLoader(r"C:\Users\Administrator\Desktop\AI\PRD.pdf", extract_images=True)
pages = loader.load()

print(pages[1])
print(type(pages))

        我们引入PyPDFLoader,然后加载目标PDF的路径构造一个loader,注意extract_images= True就是用rapidocr-onnxruntime来进行PDF图片文字的提取。通过PyPDFLoader的load()方法进行加载,可以得到pages对象,它是一个LIST列表,每一个元组是文档的一页,你可以打印查看文档信息:

        我们可以通过下面的代码查看加载出来数据的内存地址和内存大小

memory_address = id(pages)
print(f"Memory Address: {memory_address}")

object_size = sys.getsizeof(pages)
print(f"Object Size: {object_size} bytes")

对数据进行转换(切分)

        我们加载出来的数据一般都比较大,需要进行切分,就是把大块的数据切成小块的数据方便进行向量化处理,具体代码如下:

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
                chunk_size = 200,
                chunk_overlap  = 50,
                length_function = len,
            )

pages_splitter = loader.load_and_split(text_splitter)


object_size = sys.getsizeof(pages_splitter)
print(f"Object Size: {object_size} bytes")

print(pages_splitter)

        我们引入了一个RecursiveCharacterTextSplitter,我们设置我们切分文本的大小为200个字符,然后chunk_overlap的意思是重叠,就是为了防止我们切分的时候把一个完整的句子拆散,我们需要一部分重叠来做冗余保护。之前我们使用loader的load()方法,此时,我们要是用load_and_split方法,然后把我们构造的text_splitter传进去,这样我们就成功对pages这个对象进行了数据转换(切分),我们来看一下切分的效果:

        我们用len(pages_splitter)可以看到我们把一个PDF分档切成了37份,每份都是一个文档块,为我们后面进行词嵌入(将自然语言转化为向量)进行准备

视频教学:【2024最全最细】langchain之数据增强RAG介绍_哔哩哔哩_bilibili

本教学演示代码已上传github: https://github.com/jerry1900/jupyter

如需openai国内节点账号请与我联系:15652965525(V/X)

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值