构建 LLM 应用为什么需要文本加载器,langchain 中如何使用文本加载器?

news2024/11/24 12:23:44

构建 LLM 应用为什么需要文本加载器,langchain 中如何使用文本加载器?

上一篇文章中 [使用langchain搭建本地知识库系统(新) 我们构建一个 RAG 的本地应用,我们使用到了网页的文本加载器用来动态获取网页的数据。

在不同的应用场景中需要使用不同的文本内容作为内容的载体,针对不同的类型的文本,langchain 提供了多种文本加载器来帮助我们快速的将文本切片,从而使我们将更多的精力放在主要功能的是线上。下面我们介绍这些 Document loader.

image.png

使用文档加载器将源中的数据加载为DocumentDocument 是一段文本和关联的元数据。例如,有用于加载简单 .txt 文件、加载任何网页的文本内容,甚至用于加载 YouTube 视频的转录的文档加载器。

文档加载器提供了加载方法,用于从配置的源中将数据作为文档加载器。他们还可以选择实现“延迟加载”, 以延迟将数据加载到内存中。

image.png

加载txt文档

python复制代码 from langchain_community.document_loaders import TextLoader
 
 loader = TextLoader("./index.md")
 loader.load()

response:

python复制代码 [
     Document(page_content='---\nsidebar_position: 0\n---\n# Document loaders\n\nUse document loaders to load data from a source as `Document`'s. A `Document` is a piece of text\nand associated metadata. For example, there are document loaders for loading a simple `.txt` file, for loading the text\ncontents of any web page, or even for loading a transcript of a YouTube video.\n\nEvery document loader exposes two methods:\n1. "Load": load documents from the configured source\n2. "Load and split": load documents from the configured source and split them using the passed in text splitter\n\nThey optionally implement:\n\n3. "Lazy load": load documents into memory lazily\n', metadata={'source': '../docs/docs/modules/data_connection/document_loaders/index.md'})
 ]

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

## CSV

逗号分隔值 (CSV) 文件是使用逗号分隔值的分隔文本文件。文件的每一行都是一条数据记录。每条记录由一个或多个字段组成,用逗号分隔。

加载每个文档一行的 CSV 数据

python复制代码 from langchain_community.document_loaders.csv_loader import CSVLoader
 
 loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
 data = loader.load()

Response:

python复制代码 print(data)
     [Document(page_content='Team: Nationals\n"Payroll (millions)": 81.34\n"Wins": 98', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 0}, lookup_index=0), Document(page_content='Team: Reds\n"Payroll (millions)": 82.20\n"Wins": 97', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 1}, lookup_index=0), Document(page_content='Team: Yankees\n"Payroll (millions)": 197.96\n"Wins": 95', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 2}, lookup_index=0), Document(page_content='Team: Giants\n"Payroll (millions)": 117.62\n"Wins": 94', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 3}, lookup_index=0), Document(page_content='Team: Braves\n"Payroll (millions)": 83.31\n"Wins": 94', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 4}, lookup_index=0), Document(page_content='Team: Athletics\n"Payroll (millions)": 55.37\n"Wins": 94', lookup_str='', ......]

自定义 CSV 解析和加载

有关支持哪些 csv 参数的更多信息,请参阅 csv 模块文档

python复制代码 loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv', csv_args={
     'delimiter': ',',
     'quotechar': '"',
     'fieldnames': ['MLB Team', 'Payroll in millions', 'Wins']
 })
 data = loader.load()

指定用于标识文档源的列

使用该 source_column 参数指定从每一行创建的文档的源。否则 file_path ,将用作从 CSV 文件创建的所有文档的源。

当使用从 CSV 文件加载的文档时,这很有用,因为链使用源来回答问题。

python复制代码 loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv', source_column="Team")
 data = loader.load()

文件目录加载器

DirectoryLoader 加载目录中的所有文档

python复制代码 from langchain_community.document_loaders import DirectoryLoader
 loader = DirectoryLoader('../', glob="**/*.md")
 docs = loader.load()

我们可以使用该 glob 参数来控制要加载的文件。请注意,这里它不会加载 .rst 文件或 .html 文件。

显示加载进度条

默认情况下,不会显示文档加载的进度,如果要显示文档加载的进度条,需要安装tqdmpip install tqdm,并将 show_progress 参数设置为 True

python复制代码 loader = DirectoryLoader('../', glob='**/*.md', show_progress=True)
 docs = loader.load()
python复制代码Requirement already satisfied: tqdm in /Users/jon/.pyenv/versions/3.9.16/envs/microbiome-app/lib/python3.9/site-packages (4.65.0)


0it [00:00, ?it/s]

使用多线程加载文档

默认情况下,加载文档是单线程的,我们可以使用多线程加载文档提升文档的加载速度,为了利用多线程,我们可以设置use_multithreading=True 来使用多线程加载器。

python复制代码loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)
docs = loader.load()

更改加载程序类

默认情况下会加载器使用UnstructuredLoader类,但是我们也可以很轻松的修改文档加载器的类型.

python复制代码from langchain_community.document_loaders import TextLoader
loader = DirectoryLoader('../', glob='**/*.md', loader_cls=TextLoader)
docs = loader.load()

如果需要加载Python代码,我们使用PythonLoader

python复制代码from langchain_community.document_loaders import PythonLoader
loader = DirectoryLoader('../../../../../', glob="**/*.py", loader_cls=PythonLoader)
docs = loader.load()

文件编码

如果我们加载的目录中文档有多种不同的编码方式,我们在执行load()函数的时候回失败,并显示一条有用的消息,指示哪个文件 example-non-utf8.txt 解码失败。

在默认情况下 TextLoader ,任何未能加载任何文档都将使整个加载过程失败,并且不会加载任何文档。如果要解决部分失败的情况,我们可以使用一下方法:

1、可以将参数silent_errors传递 DirectoryLoader,跳过无法加载的文档,并继续执行加载过程。

python复制代码loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, silent_errors=True)
docs = loader.load()

2、我们可以配置文档加载器自动检测编码

我们还可以通过将autodetect_encoding 传递给加载器类来要求 TextLoader 在失败之前自动检测文件编码。

python复制代码text_loader_kwargs={'autodetect_encoding': True}
loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs)
docs = loader.load()

HTML loader

我们可以按以下方式去加载一个HTML网页文档

python复制代码from langchain_community.document_loaders import UnstructuredHTMLLoader
loader = UnstructuredHTMLLoader("example_data/fake-content.html")
data = loader.load()

使用 BeautifulSoup4 加载 HTML

我们还可以使用 BeautifulSoup4 BSHTMLLoader .这会将 HTML 中的文本提取到 page_content 中,并将页面标题提取为 title metadata

python复制代码from langchain_community.document_loaders import BSHTMLLoader
loader = BSHTMLLoader("example_data/fake-content.html")
data = loader.load()

JSON格式

JSON(JavaScript 对象表示法)是一种开放的标准文件格式和数据交换格式,它使用人类可读的文本来存储和传输由属性值对和数组(或其他可序列化值)组成的数据对象。JSON 行是一种文件格式,其中每行都是一个有效的 JSON 值。

JSONLoader 使用指定的 jq 模式来解析 JSON 文件。它使用 jq python 包。

python复制代码#!pip install jq
from langchain_community.document_loaders import JSONLoader
import json
from pathlib import Path
from pprint import pprint

file_path='./example_data/facebook_chat.json'
data = json.loads(Path(file_path).read_text())

如果我们需要提取 json数据中某个字段的数据,可以通过下面的示例轻松提取,JSONLoader

python复制代码loader = JSONLoader(
	file_path='',
     file_path='./example_data/facebook_chat.json',
    jq_schema='.messages[].content',
    text_content=False,
)
data = loader.load()

JSON 行文件

如果要从 JSON 行文件加载文档,请传递 json_lines=True 并指定 jq_schema page_content 从单个 JSON 对象中提取。

python复制代码file_path = './example_data/facebook_chat_messages.jsonl'
pprint(Path(file_path).read_text())
ini复制代码loader = JSONLoader(
    file_path='./example_data/facebook_chat_messages.jsonl',
    jq_schema='.content',
    text_content=False,
    json_lines=True)

data = loader.load()

设置 jq_schema='.' 另一个选项并提供 content_key

python复制代码loader = JSONLoader(
    file_path='./example_data/facebook_chat_messages.jsonl',
    jq_schema='.',
    content_key='sender_name',
    json_lines=True)

data = loader.load()

JSON 中提取元数据

通常,我们希望将JSON文件中可用的元数据包含在我们从内容创建的文档中,

加载Markdown

Markdown 是一种轻量级标记语言,用于使用纯文本编辑器创建格式化文本。

python复制代码# !pip install unstructured > /dev/null
from langchain_community.document_loaders import UnstructuredMarkdownLoader
markdown_path = "../../../../../README.md"
loader = UnstructuredMarkdownLoader(markdown_path)
data = loader.load()

Unstructured 为不同的文本块创建不同的“元素”。默认情况下,我们将这些组合在一起,但可以通过指定 mode="elements" 来轻松保持这种分离。

python复制代码loader = UnstructuredMarkdownLoader(markdown_path, mode="elements")
data = loader.load()

加载PDF

使用 PyPDF

使用 pypdf 将 PDF 加载到文档数组中,其中每个文档都包含页面内容和带有 page 编号的元数据。

python

复制代码pip install pypdf
python复制代码from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split()

这种方法的一个优点是可以使用页码检索文档。

我们想要使用 OpenAIEmbeddings ,所以我们必须获得 OpenAI API 密钥。

python复制代码import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
python复制代码from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

faiss_index = FAISS.from_documents(pages, OpenAIEmbeddings())
docs = faiss_index.similarity_search("How will the community be engaged?", k=2)
for doc in docs:
    print(str(doc.metadata["page"]) + ":", doc.page_content[:300])

提取PDF中的图像

使用该 rapidocr-onnxruntime 包,我们也可以将图像提取为文本:

python复制代码pip install rapidocr-onnxruntime
loader = PyPDFLoader("https://arxiv.org/pdf/2103.15348.pdf", extract_images=True)
pages = loader.load()
pages[4].page_content

使用MathPix

python复制代码from langchain_community.document_loaders import MathpixPDFLoader
loader = MathpixPDFLoader("example_data/layout-parser-paper.pdf")
data = loader.load()

使用非结构化

python复制代码from langchain_community.document_loaders import UnstructuredPDFLoader
loader = UnstructuredPDFLoader("example_data/layout-parser-paper.pdf")
data = loader.load()

保留元素

UnstructuredPDFLoader为不同的文本块创建不同的“元素“,默认情况下,我们将这些组合在一起,但您可以通过指定 mode="elements" 来轻松保持这种分离。

python复制代码loader = UnstructuredPDFLoader("example_data/layout-parser-paper.pdf", mode="elements")
data = loader.load()

使用非结构化方式获取远程 PDF

很多时候我们需要读取远程网络的pdf文件并解析以加载到我们下游使用的文档格式,所有其他 PDF 加载器也可用于获取远程 PDF,但这是 OnlinePDFLoader 旧功能,专门用于 UnstructuredPDFLoader . // todo

python复制代码from langchain_community.document_loaders import OnlinePDFLoader
loader = OnlinePDFLoader("https://arxiv.org/pdf/2302.03803.pdf")
data = loader.load()

使用 PyPDFium2

python复制代码from langchain_community.document_loaders import PyPDFium2Loader
loader = PyPDFium2Loader("example_data/layout-parser-paper.pdf")
data = loader.load()

使用 PDFMiner

python复制代码from langchain_community.document_loaders import PDFMinerLoader
loader = PDFMinerLoader("example_data/layout-parser-paper.pdf")
data = loader.load()

使用 PDFMiner 生成 HTML 文本

使用 PDFMiner 生成 HTML 文本有助于在语义上将文本分块。可以通过解析输出html内容BeautifulSoup 来获取有关字体大小、页码、PDF 页眉/页脚等的更结构化和丰富的信息。

python复制代码from langchain_community.document_loaders import PDFMinerPDFasHTMLLoader
loader = PDFMinerPDFasHTMLLoader("example_data/layout-parser-paper.pdf")
data = loader.load()[0]   # entire PDF is loaded as a single Document
python复制代码from bs4 import BeautifulSoup
soup = BeautifulSoup(data.page_content,'html.parser')
content = soup.find_all('div')

总结

本文主要介绍了 langchain 中已经提供的文本加载器 txt, csv, pdf,markdown,html,json ,以及基本的使用方式和使用场景。 这些不同类型的文本加载器加载完成文本后 langchain 都统一为 Document 对象,提供 embedding-model 使用。

如果你有特殊的文本类型,那基本的思路就是: 将文本拆分 -> 切片(langchain Document) -> 向量化 -> 向量存储

我们该如何学习大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、大模型全套的学习路线

学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。

L1级别:AI大模型时代的华丽登场

L2级别:AI大模型API应用开发工程

L3级别:大模型应用架构进阶实践

L4级别:大模型微调与私有化部署

一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。

以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

【Spine学习07】之跑步动作制作思路总结

前几节试着做了待机和走路动画 现在开始尝试做跑步动作 注意跑步动作和走路一样 暂时不需要使用IK约束但是会用到塞贝尔曲线(模拟裙子飞起动效) 第一步: 先将人物整体斜放置(因为人跑步的时候,身体前倾) …

速度与激情:解锁8款免费文件传输利器,让大数据秒传成为可能

以下是8个免费高速文件传输工具的推荐,这些工具可以帮助您彻底告别数据线,使文件传输更加便捷和高效: 1、百度网盘 特点:云存储和共享应用,支持多种形式的文件存储和分享,提供大容量的免费存储空间。 适用…

力扣每日一题(2024-06-14)2786. 访问数组中的位置使分数最大

参考官方题解2786. 访问数组中的位置使分数最大 - 力扣&#xff08;LeetCode&#xff09; 问题描述 给定一个下标从 0 开始的整数数组 nums 和一个正整数 x。你一开始在数组的第 0 个位置&#xff0c;你可以移动到满足 i < j 的任意位置 j。如果你访问的位置 i&#xff0c…

毕业生季,你的校园卡开始注销了吗?

​ 毕业季&#xff0c;好多朋友们已经走出校园了&#xff0c;换了一个新的城市接着工作了&#xff0c;那么&#xff0c;之前办理的校园卡你都是怎么处理的&#xff1f; 其实&#xff0c;校园卡就是为了方便校园生活而推出的一种卡&#xff0c;在学校期间可能比较优惠&#xff…

企业薪酬体系的搭建

随着企业的逐步发展&#xff0c;其人力资源管理方面的问题也逐渐显露出来&#xff0c;诸如职责不清、相互推卸责任、员工工作积极性较低等问题&#xff0c;这些管理上的问题导致产品质量不断下降&#xff0c;客户投诉率也不断上升&#xff0c;且优秀人员的流失率也有增加的趋势…

沃沃阀门×蓝卓 | 再度携手!数字化车间项目启动会顺利召开

6月13日&#xff0c;蓝卓与沃沃阀门数字化车间项目正式启动&#xff0c;依托蓝卓supOS工业操作系统&#xff0c;打造统一数字化底座&#xff0c;助推沃沃阀门物料自动配送、产销高效协同、设备全面管理、车间可视化管理等目标实现。 丽水莲都区经信局副局长李军舫、区经信局信…

Arco-design <a-range-picker> 快捷键日期点击后不关闭面板

需求&#xff1a;点击快捷日期&#xff0c;面板预览日期&#xff0c;点击确定后触发事件 思路&#xff1a;手动控制面板开启和关闭&#xff0c;点击input时开启&#xff0c;点击面板确定或除input和面板的其他位置时关闭面板 <a-range-pickerid"input"v-model&quo…

学习理解 CompletableFuture

学习理解 CompletableFuture CompletableFuture 是 Java 8 引入的一个强大的工具&#xff0c;它使得编写异步和并行代码变得更加容易。 CompletableFuture 是 java.util.concurrent 包的一部分&#xff0c;是 Future 的扩展&#xff0c;它不仅允许你手动完成计算&#xff0c;还…

锂电池航空运输报告办理 UN38.3电池报告

锂电池航空运输报告办理 锂电池航空运输报告&#xff0c;通常指的是UN38.3测试报告&#xff0c;这是联合国针对危险品运输制定的《联合国危险物品运输试验和标准手册》的第3部分38.3款的要求。UN38.3测试报告证明锂电池在运输过程中的安全性&#xff0c;包括高度模拟、高低温循…

Liquibase(Oracle SQLcl集成版)简明示例

本文使用的是Oracle SQLcl中集成的Liquibase&#xff0c;而非开源版Liquibase。 Liquibase的快速入门可以参见Liquibase Core Concepts。需要了解一下概念&#xff1a; Change log&#xff1a;基于文本的更改日志文件按顺序列出对数据库所做的所有更改Change set&#xff1a;…

Python学习之旅:你的大学计算机专业宝藏路线图

在信息时代的浪潮中&#xff0c;Python以其强大的功能和极简的语法成为了无数程序员心中的白月光。作为大学计算机专业的学生&#xff0c;掌握Python不仅能够为未来的职业生涯铺路&#xff0c;更能让您在学术研究和实际应用中如鱼得水。今天&#xff0c;我将与大家分享一套实用…

Vue3-滑动到最右验证功能

1、思路 1、在登录页面需要启动向右滑块验证 2、效果图 3、文章地址&#xff1a;滑动验证码的实现-vue-simple-verify 2、成分分析 1、由三块构成&#xff0c;分别是底部条、拖动条、拖动移动部分 2、底部条&#xff1a;整体容器&#xff0c;包括背景、边框和文字&#xf…

人工智能的研究方向

人工智能的应用、技术与基础研究方向 人工智能&#xff08;AI&#xff09;的发展已经渗透到社会的每一个角落&#xff0c;从自动驾驶汽车到智能语音助手&#xff0c;从图像识别到疾病诊断&#xff0c;AI技术正在重塑我们的工作和生活方式。为了更好地理解这一领域的广泛性和深度…

管理十大定律:深度解析与实际应用

在复杂多变的企业管理环境中&#xff0c;掌握并运用一些基本的定律和规律&#xff0c;对于提升管理效率、优化资源配置具有至关重要的作用。 1、马太效应 定律解析&#xff1a;马太效应描述了资源分配中的一种累积优势现象&#xff0c;即强者愈强&#xff0c;弱者愈弱。这源…

53.Python-web框架-Django开始第一个应用的多语言

针对上一篇的功能&#xff0c;本次仅对页面做了多语言&#xff0c;大家可以看看效果。 51.Python-web框架-Django开始第一个应用的增删改查-CSDN博客 目录 部门列表 新增部门 编辑部门 部门列表 源码 <!DOCTYPE html> {% load static %} {% load i18n %} <html …

RAG 实践-Ollama+AnythingLLM 搭建本地知识库

什么是 RAG RAG&#xff0c;即检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;是一种先进的自然语言处理技术架构&#xff0c;它旨在克服传统大型语言模型&#xff08;LLMs&#xff09;在处理开放域问题时的信息容量限制和时效性不足。RAG的…

wmv转换mp4怎么操作?3个格式转换方法分享

wmv转换mp4怎么操作&#xff1f;将WMV转换为MP4格式&#xff0c;可以方便我们在多种设备和平台上流畅播放视频。MP4格式具有广泛的兼容性和优化过的编码&#xff0c;使其在各种媒体播放器、智能手机、平板电脑以及电视上都能得到良好的支持。此外&#xff0c;MP4格式的视频文件…

12.1 Go 测试的概念

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

C语言——自定义类型:结构体

前言 本篇博客位大家介绍C语言中一块儿重要的内容&#xff0c;那就是结构体&#xff0c;关于结构体的内容&#xff0c;大家需要深入掌握&#xff0c;在后面的学习中依然会用到&#xff0c;如果你对本文感兴趣&#xff0c;麻烦点进来的老铁一键三连。多多支持&#xff0c;下面我…

WPS JS宏获取自动筛选后的行数

//WPS JS宏获取自动筛选后的行数 function getFilterRowCnt(shtRng)//shtRng表示筛选目标工作表范围 {let lngRowCnt 0;for(let rngCell of shtRng.SpecialCells(xlCellTypeVisible).Areas)//获取自动筛选后的单元格行数{lngRowCnt lngRowCnt rngCell.Rows.Count;}return ln…