LangChain核心模块 Retrieval——文档加载器

Retrieval

​ 许多LLM申请需要用户的特定数据,这些数据不属于模型训练集的一部分,实现这一目标的主要方法是RAG(检索增强生成),在这个过程中,将检索外部数据,然后在执行生成步骤时将其传递给LLM。

​ LangChain 提供了 RAG 应用程序的所有构建模块 - 从简单到复杂。文档的这一部分涵盖了与检索步骤相关的所有内容 - 例如数据的获取。这包含了几个关键模块:

在这里插入图片描述

Documents loaders

  • 文档加载器

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

最简单的加载程序将文件作为文本读入,并将其全部放入一个文档中。

from langchain_community.document_loaders import TextLoaderloader = TextLoader("./index.md")
loader.load()
  1. CSV

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

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

      from langchain_community.document_loaders.csv_loader import CSVLoaderloader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
      data = loader.load()
      
    • Customizing the CSV parsing and loading(自定义 CSV 解析和加载)

      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文件加载的文档用于使用源回答问题的链时,很有用。

      loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv', source_column="Team")data = loader.load()
      
  2. File Directory

    • 如何加载目录中的所有文档

    在底层,默认情况下使用UnstructedLoader

    from langchain_community.document_loaders import DirectoryLoader
    

    可以使用glob参数来控制加载哪些文件,这里它不会加载.rst.html文件

    loader = DirectoryLoader('../', glob="**/*.md")
    docs = loader.load()
    
    • Show a progress bar(显示进度条)

      要显示进度条,请安装 tqdm 库(例如 pip install tqdm),并将 show_progress 参数设置为 True。

      loader = DirectoryLoader('../', glob="**/*.md", show_progress=True)
      docs = loader.load()
      
    • Use multithreading(使用多线程)

      默认情况下,加载发生在一个线程。要使用多个线程,将use_multithreading 标志设置为 true。

      loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)
      docs = loader.load()
      
    • Change loader class(更改加载类)

      默认情况下,这使用 UnstructedLoader 类。

      from langchain_community.document_loaders import TextLoaderloader = DirectoryLoader('../', glob="**/*.md", loader_cls=TextLoader)
      docs = loader.load()
      

      如果需要加载Python源代码文件,使用PythonLoader

      from langchain_community.document_loaders import PythonLoaderloader = DirectoryLoader('../../../../../', glob="**/*.py", loader_cls=PythonLoader)
      docs = loader.load()
      
    • Auto-detect file encodings with TextLoader(使用 TextLoader 自动检测文件编码)

      • Default Behavior

        loader.load()
        

        loading()函数失败,会显示一条信息显示哪个文件解码失败

        TextLoader 的默认行为下,任何文档加载失败都会导致整个加载过程失败,并且不会再加载任何文档。

      • Silent fail

        可以将参数silent_errors传递给DirectoryLoader来跳过无法加载的文件并继续加载过程。

        loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, silent_errors=True)
        docs = loader.load()
        
        doc_sources = [doc.metadata['source']  for doc in docs]
        doc_sources
        
      • Auto detect encodings

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

        text_loader_kwargs={'autodetect_encoding': True}
        loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs)
        docs = loader.load()
        
        doc_sources = [doc.metadata['source']  for doc in docs]
        doc_sources
        
  3. HTML

    from langchain_community.document_loaders import UnstructuredHTMLLoaderloader = UnstructuredHTMLLoader("example_data/fake-content.html")
    data = loader.load()
    
    • 使用 BeautifulSoup4 加载 HTML

      将HTML中的文本提取到page_content中,并将页面标题作为title提取到metadata

      from langchain_community.document_loaders import BSHTMLLoaderloader = BSHTMLLoader("example_data/fake-content.html")
      data = loader.load()
      
  4. JSON

    JSON(JavaScript Object Notation)是一种开放标准文件格式和数据交换格式,它使用人类可读的文本来存储和传输由属性值对和数组组成的数据对象。

    JSON Lines是一种文件格式,其中每一行都是有效的JSON值。

    JSONLoader 使用指定的 jq 架构来解析 JSON 文件。

    pip install jq
    
    from langchain_community.document_loaders import JSONLoaderimport json
    from pathlib import Path
    from pprint import pprintfile_path='./example_data/facebook_chat.json'
    data = json.loads(Path(file_path).read_text())
    
    • 使用JSONLoader

      如果想要提取JSON数据的messages键中的内容字段下的值

      • JSON file

        loader = JSONLoader(file_path='./example_data/facebook_chat.json',jq_schema='.messages[].content',text_content=False)data = loader.load()
        
      • JSON Lines file

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

        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

          loader = JSONLoader(file_path='./example_data/facebook_chat_messages.jsonl',jq_schema='.',content_key='sender_name',json_lines=True)data = loader.load()
          
      • JSON file with jq schema content_key(带有 jq 架构 content_key 的 JSON 文件)

        要使用jq架构中的 content_key 从 JSON 文件加载文档,要设置 is_content_key_jq_parsable=True,确保content_key 兼容并且可以使用 jq 模式进行解析。

        loader = JSONLoader(file_path=file_path,jq_schema=".data[]",content_key=".attributes.message",is_content_key_jq_parsable=True,
        )data = loader.load()
        
    • 提取元数据(Extracting metadata)

      前面示例中,并没有收集元数据,我们设法直接在架构中指定可以从中提取page_content值的位置。

      .messages[].content
      

      在当前示例中,我们必须告诉加载器迭代消息字段中的记录。jq_schema 必须是:

      .messages[]
      

      这允许我们将记录(dict)传递到必须实现的metadata_func中。metadata_func 负责识别记录中的哪些信息应包含在最终 Document 对象中存储的元数据中。

      此外,还要在加载器中通过 content_key 参数显式指定需要从中提取 page_content 值的记录中的键。

      # Define the metadata extraction function.
      def metadata_func(record: dict, metadata: dict) -> dict:metadata["sender_name"] = record.get("sender_name")metadata["timestamp_ms"] = record.get("timestamp_ms")return metadataloader = JSONLoader(file_path='./example_data/facebook_chat.json',jq_schema='.messages[]',content_key="content",metadata_func=metadata_func
      )data = loader.load()
      
    • metadata_func

      metadata_func 接受 JSONLoader 生成的默认元数据,这允许用户完全控制元数据的格式。

      例如,默认元数据包含sourceseq_num 键。但是,JSON 数据也可能包含这些键。然后,用户可以利用metadata_func 重命名默认键并使用JSON 数据中的键。

      下面的示例展示了如何修改源以仅包含相对于 langchain 目录的文件源信息:

      # Define the metadata extraction function.
      def metadata_func(record: dict, metadata: dict) -> dict:metadata["sender_name"] = record.get("sender_name")metadata["timestamp_ms"] = record.get("timestamp_ms")if "source" in metadata:source = metadata["source"].split("/")source = source[source.index("langchain"):]metadata["source"] = "/".join(source)return metadataloader = JSONLoader(file_path='./example_data/facebook_chat.json',jq_schema='.messages[]',content_key="content",metadata_func=metadata_func
      )data = loader.load()
      
    • 具有 jq 模式的常见 JSON 结构

      下面的列表提供了对可能的 jq_schema 的引用,用户可以使用它根据结构从 JSON 数据中提取内容。

      JSON        -> [{"text": ...}, {"text": ...}, {"text": ...}]
      jq_schema   -> ".[].text"JSON        -> {"key": [{"text": ...}, {"text": ...}, {"text": ...}]}
      jq_schema   -> ".key[].text"JSON        -> ["...", "...", "..."]
      jq_schema   -> ".[]"
      
  5. Markdown

    from langchain_community.document_loaders import UnstructuredMarkdownLoadermarkdown_path = "../../../../../README.md"
    loader = UnstructuredMarkdownLoader(markdown_path)
    data = loader.load()
    
    • Retain Elements

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

      loader = UnstructuredMarkdownLoader(markdown_path, mode="elements")
      data = loader.load()
      
  6. PDF

    • PyPDF

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

      pip install pypdffrom langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader("example_data/layout-parser-paper.pdf")
      pages = loader.load_and_split()
      

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

      from langchain_community.vectorstores import FAISS
      from langchain_openai import OpenAIEmbeddingsfaiss_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])
      
      • 提取图像(Extracting images)

        使用rapidocr-onnxruntime包可以将图像提取为文本:

        pip install rapidocr-onnxruntimeloader = PyPDFLoader("https://arxiv.org/pdf/2103.15348.pdf", extract_images=True)
        pages = loader.load()
        pages[4].page_content
        
    • MathPix

      from langchain_community.document_loaders import MathpixPDFLoader
      loader = MathpixPDFLoader("example_data/layout-parser-paper.pdf")
      
    • Unstructured

      from langchain_community.document_loaders import UnstructuredPDFLoader
      loader = UnstructuredPDFLoader("example_data/layout-parser-paper.pdf")
      
      • Retain Elements

        loader = UnstructuredPDFLoader("example_data/layout-parser-paper.pdf", mode="elements")
        
      • 使用非结构化获取远程 PDF

        将在线 PDF 加载为我们可以在下游使用的文档格式

        其他 PDF 加载器也可用于获取远程 PDF,但 OnlinePDFLoader 是一个遗留函数,专门与 UnstructedPDFLoader 配合使用。

        from langchain_community.document_loaders import OnlinePDFLoader
        loader = OnlinePDFLoader("https://arxiv.org/pdf/2302.03803.pdf")
        
    • PyPDFium2

      from langchain_community.document_loaders import PyPDFium2Loader
      loader = PyPDFium2Loader("example_data/layout-parser-paper.pdf")
      
    • PDFMiner

      from langchain_community.document_loaders import PDFMinerLoader
      loader = PDFMinerLoader("example_data/layout-parser-paper.pdf")
      
      • 使用 PDFMiner 生成 HTML 文本

        这有助于将文本在语义上分块为多个部分,因为输出的 html 内容可以通过 BeautifulSoup 进行解析,以获得有关字体大小、页码、PDF 页眉/页脚等的更结构化和丰富的信息。

    • PyMuPDF

      最快的 PDF 解析选项,包含有关 PDF 及其页面的详细元数据,并且每页返回一个文档。

      from langchain_community.document_loaders import PyMuPDFLoader
      loader = PyMuPDFLoader("example_data/layout-parser-paper.pdf")
      

      此外,您可以在加载调用中将 PyMuPDF 文档中的任何选项作为关键字参数传递,并将其传递给 get_text() 调用。

    • PyPDF Directory

      从目录加载 PDF

      from langchain_community.document_loaders import PyPDFDirectoryLoaderloader = PyPDFDirectoryLoader("example_data/")
      
    • PDFPlumber

      与 PyMuPDF 一样,输出文档包含有关 PDF 及其页面的详细元数据,并每页返回一个文档。

      from langchain_community.document_loaders import PDFPlumberLoader
      loader = PDFPlumberLoader("example_data/layout-parser-paper.pdf")
      
    • AmazonTextractPDFParser

      AmazonTextractPDFLoader 调用Amazon Textract Service将 PDF 转换为文档结构。该加载程序目前执行纯 OCR,并根据需求计划提供更多功能,例如布局支持。支持最多 3000 页和 512 MB 大小的单页和多页文档。

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

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

相关文章

Unsafe的CAS操作及线程park与unpark

如下是一个参照AQS进行的一个加锁及解锁的简单实现: 多线程并发进行同步业务操作;加锁:尝试进行cas 0->1操作;如果加锁成功则进行业务处理,然后进行锁释放 1->0,然后将列头的线程进行唤醒&#xff1…

GDAL中的地理坐标系、投影坐标系及其相互转换

目录 地理坐标系 国内常用地理坐标系 投影坐标系 国内常用投影坐标系(不推荐使用) 坐标转换 地理坐标转为投影坐标 投影坐标转为地理坐标 地理坐标系 原理参考这篇文章:地理坐标系与投影坐标系区别与联系 https://yunxingluoyun.blog.…

webserver如何从零开始?

我们要做一个项目,过程是怎么样的呢?git clone ...部署,测试,然后开始写么,这样你大概率会“猪脑过载”,对一个项目的每个部分都没有清晰认识,能写出什么来?写之前当然需要测试每个功…

Linux网络协议栈从应用层到内核层③

文章目录 1、write源码剖析2、vfs层进行数据传输3、socket层进行数据传输4、tcp层进行数据传输5、ip层进行数据传输6、网络设备层进行数据传输7、网卡驱动层进行数据传输8、数据传输的整个流程 1、write源码剖析 系统调用原型 ssize_t write(int fildes, const void *buf, si…

Linux 在线yum安装: PostgreSQL 15.6数据库

Linux 在线yum安装: PostgreSQL 15.6数据库 1、PostgreSQL数据库简介2、在线安装PostgreSQL15.63、配置 PostgreSQL的环境变量4、使用默认用户登录PostgreSQL5、配置 PostgreSQL 允许远程登录6、修改 PostgreSQL 默认端口7、创建数据库和表、远程用户zyl8、pgAdmin远…

MATLAB环境下基于离散小波变换和主成分平均的医学图像融合方法

随着计算机技术和生物影像工程的日趋成熟,医学图像为医疗诊断提供的信息越来越丰富。目前,由于医学成像的设备种类繁多,导致医生获得的图像信息差异较大。如何把这些信息进行整合供医生使用成为当务之急。基于此,医学图像融合技术…

Rust 实战练习 - 8. 内存,ASM,外挂 【重磅】

目标&#xff1a; C写一个Demo版本的游戏由浅入深&#xff0c;了解外挂原理Linux/Android下实现内存读取ptrace实现内存修改&#xff08;依赖第三方库&#xff09; 先准备一个C写的小游戏 #include <stdio.h> #include <string.h>struct Role {float pos_x; // …

vue3+vite配置环境变量

1、创建环境变量文件&#xff1a;首先在vue3项目根目录创建.env.development 和 .env.prodution两个文件&#xff0c;分别为开发和生产环境&#xff08;必须.env.开头&#xff0c;需要额外环境&#xff0c;配置自定义的文件名称即可&#xff09; 2、在环境变量文件分别写对应…

Android内存优化项目经验分享 兼顾效率与性能

背景 项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率&#xff0c;做了内存优化和下载导出优化&#xff0c;具体效果如最后的一节的表格所示。 下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍&#xff1a; 一.拍摄前预览页面优化 预览效果问题 存在…

试试前端自动化测试(基础篇)

众所周知的原因&#xff0c;前端作为一种特殊的 GUI 软件&#xff0c;做自动化测试困难重重。在快速迭代&#xff0c;UI 变动大的业务中&#xff0c;自动化测试想要落地更是男上加男 &#x1f436;。 近期的学习过程中&#xff0c;翻阅了众多前端自动化测试相关的文章&#xf…

【兆易创新GD32H759I-EVAL开发板】 关于LVGL 的内存配置

【兆易创新GD32H759I-EVAL开发板】拥有外部32MB的 SDRAM 在使用LVGL时 可以随意分配大小 但是我们也应该明白 所定义的内存大小的 的一些概念 LVGL中 有单独的 定义 LV_MEM_SIZE 定义内存大小 LVLG 中 在定义 显示程序 接口时 还需要用到 lv_disp_draw_buf_init() 分配显存…

MyBatis框架解析与优化

MyBatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 什么是 MyBatis&#xff1f; MyBatis 是一个半…

【3D reconstruction 学习笔记】

三维重建 3D reconstruction 1. 相机几何针孔相机摄像机几何 2. 相机标定线性方程组的解齐次线性方程组的解非线性方程组的最小二乘解透镜相机标定带畸变的相机标定 3. 单视图重建2D平面上的变换3D空间上的变换单视测量无穷远点 无穷远线 无穷远平面影消点 影消线单视重构 4. 三…

天艺制盖邀您参观2024第七届世界燕窝及天然滋补品博览会

2024第七届世界燕窝及天然滋补品博览会 2024年8月7-9日| 上海新国际博览中心 上海燕博会 世界燕窝及天然滋补品展览会暨世界滋补产业生态发展大会&#xff08;简称上海燕博会&#xff09;&#xff0c;2017年创办于中国上海&#xff0c;是一年一度的世界燕窝滋补品行业盛会。…

宁波中墙建材施工过程中,如何确保陶粒复合砌块的垂直度和水平度符合要求?

宁波中墙建材陶粒复合砌块如何使用 确保陶粒复合砌块施工质量的建议&#xff1a; 基层处理&#xff1a;在施工前&#xff0c;确保基层干净、平整、坚固&#xff0c;去除表面的杂物和油污等。 砌块质量&#xff1a;选择质量好、尺寸规格一致的陶粒复合砌块&#xff0c;避免使用有…

【串口开发】android 智能设备开发 知识笔记

1.一般的波特率选择115200,自己玩的可以用9600等随便的 2.为了android方便操作,引入了 implementation com.licheedev:android-serialport:2.1.3包。 不然就得手写了,比如像这样 ,打开串口监听 // 打开串口boolean openSerialPort = mSerialPortManager.setOnOpenSerial…

每天一个数据分析题(二百二十八)

在超参数调参的各种方法中&#xff0c;贝叶斯优化搜索(Bayesian Optimization)是一种非常有效的方法。请问在贝叶斯搜索中&#xff0c;用于估计目标函数并为下一次迭代提供建议的模型是什么&#xff1f; A. 线性回归 B. 随机森林 C. 高斯过程 D. 神经网络 题目来源于CDA模…

vue js有哪些优点和缺点

Vue.js 是一个流行的前端 JavaScript 框架&#xff0c;用于构建用户界面和单页面应用。以下是 Vue.js 的一些主要优点和缺点&#xff1a; 优点&#xff1a; 轻量级和简洁&#xff1a;Vue.js 的核心库专注于视图层&#xff0c;并且非常轻量&#xff0c;这使得它可以很容易地与其…

java算法题每日多道六

138. 随机链表的复制 题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对…

JS异步操作

点击按钮触发onScan函数&#xff0c;函数调用扫描二维码这个异步操作后&#xff0c;需要扫描二维码的函数返回结果&#xff0c;可以用Promise来实现。Promise对象状态变为resolved&#xff08;成功&#xff09;或rejected&#xff08;失败&#xff09;&#xff0c;然后将解决&a…