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

Retrieval

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

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

在这里插入图片描述

Documents loaders

  • 文档加载器

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

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

from langchain_community.document_loaders import TextLoader

loader = TextLoader("./index.md")
loader.load()
  1. CSV

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

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

      from langchain_community.document_loaders.csv_loader import CSVLoader
      
      
      loader = 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 TextLoader
      
      loader = DirectoryLoader('../', glob="**/*.md", loader_cls=TextLoader)
      docs = loader.load()
      

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

      from langchain_community.document_loaders import PythonLoader
      
      loader = 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 UnstructuredHTMLLoader
    
    loader = UnstructuredHTMLLoader("example_data/fake-content.html")
    data = loader.load()
    
    • 使用 BeautifulSoup4 加载 HTML

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

      from langchain_community.document_loaders import BSHTMLLoader
      
      loader = 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 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())
    
    • 使用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 metadata
      
      
      loader = 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 metadata
      
      
      loader = 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 UnstructuredMarkdownLoader
    
    markdown_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 pypdf
      
      from langchain_community.document_loaders import PyPDFLoader
      
      loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
      pages = loader.load_and_split()
      

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

      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])
      
      • 提取图像(Extracting images)

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

        pip install rapidocr-onnxruntime
        
        loader = 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 PyPDFDirectoryLoader
      
      loader = 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 大小的单页和多页文档。

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

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

相关文章

探索设计模式的魅力:精准、快速、便捷:游标尺模式在软件设计中的三大优势

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 精准、快速、便捷:游标尺模式在软件设计中的三大优势 文章目录 一、案例场景&…

黑马程序员:C++核心编程——3.函数提高

目录 1.函数默认参数 2.函数占位数 3.函数重载* 1.函数默认参数 形参列表中可以有默认值。 注意:如果某个位置有默认值,那么这个位置之后的都要有。如果函数声明有默认值了,函数实现的时候就不能有默认值(防止默认值不同而导…

蓝桥杯第十五届抱佛脚(二)竞赛中的数据结构

蓝桥杯第十五届抱佛脚(二)内置数据结构 文章目录 蓝桥杯第十五届抱佛脚(二)内置数据结构在竞赛中常见的数据结构数组(Array)链表(Linked List)栈(Stack)队列(Queue)树(Tree)映射(Map) 内置数据结构的快速使用迭代器(It…

综合知识篇20-基于中间件的开发新技术考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

强化学习之父Richard Sutton:通往AGI的另一种可能

2019年,强化学习之父、阿尔伯塔大学教授Richard Sutton发表了后来被AI领域奉为经典的The Bitter lesson,这也是OpenAI研究员的必读文章。 在这篇文章中,Richard指出,过去 70 年来,AI 研究的一大教训是过于重视人类既有…

Python学习从0到1 day18 Python可视化基础综合案例 1.折线图

我默记这段路的酸楚,等来年春暖花开之时再赏心阅读 —— 24.3.24 python基础综合案例 数据可视化 — 折线图可视化 一、折线图案例 1.json数据格式 2.pyecharts模块介绍 3.pyecharts快速入门 4.数据处理 5.创建折线图 1.json数据格式 1.什么是json 2.掌握如何使用js…

用kimichat炒股:查找比亚迪、特斯拉等电动车产业链相关股票

kimichat可以联网检索,搜索结果更加准确、智能。 在kimichat中输入提示词:找出同时在比亚迪产业链和特斯拉产业链的企业 根据您提供的搜索结果中的信息,我们可以找出同时在比亚迪产业链和特斯拉产业链中的企业。以下是从搜索结果中提取的相关…

【动态规划】Leetcode 70. 爬楼梯

【动态规划】Leetcode 70. 爬楼梯 解法1 ---------------🎈🎈题目链接🎈🎈------------------- 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 输入…

先进电机技术 —— 长线缆驱动电机面临哪些问题?

一、长线驱动问题简述 电机变频驱动器(VFD)输出侧采用长线缆驱动电机运行时,将会面对多种问题,主要包括但不限于: 此图片来源于网络 1. **电压降**: - 长线缆的电阻会导致电压降增大,当电…

智能优化算法 | Matlab实现牛顿-拉夫逊优化算法Newton-Raphson-based optimize(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现牛顿-拉夫逊优化算法Newton-Raphson-based optimize(内含完整源码) 源码设计 % ------------------------------------------------------------------------------------------------…

UNI-APP读取本地JSON数据

首先要把json文件放在static文件夹下 然后在要读取数据的页面导入 import data from ../../static/data.json读取数据: onLoad() {console.log(data, data)}, 打印出来的就是JSON文件里的数据了

【SQL】1527. 患某种疾病的患者(like;通配符)

前述 知识点回顾: MySQL 使用OR在LIKE查询中比较多个字段 %:表示任意字符(包括0个或多个)_:表示任意单个字符匹配空格:直接用空格就行,例如,% DIAB1%可以匹配字符串ACNE DIAB100 …

利用免费 GPU 部署体验大型语言模型推理框架 vLLM

vLLM简介 vLLM 是一个快速且易于使用的 LLM(大型语言模型)推理和服务库。 vLLM 之所以快速,是因为: 最先进的服务吞吐量 通过 PagedAttention 高效管理注意力键和值内存 连续批处理传入请求 使用 CUDA/HIP 图快速模型执行 量…

瑞芯微RK3576|触觉智能:开启科技新篇章

更多产品详情可关注深圳触觉智能官网! “瑞芯微,创新不止步!”——全新芯片RK3576即将震撼登场。指引科技风潮,创造未来无限可能!这款芯片在瑞芯微不断创新和突破的道路上,不仅是对过往成就的完美延续&…

Python爬虫-批量爬取星巴克全国门店

前言 本文是该专栏的第22篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以星巴克为例,通过Python实现批量爬取目标城市的门店数据以及全国的门店数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM…

基于python+vue电影院订票信息管理系统flask-django-php-nodejs

根据此问题,研发一套电影院订票信息管理系统,既能够大大提高信息的检索、变更与维护的工作效率,也能够方便信息系统的管理运用,从而减少信息管理成本,提高效率。 该电影院订票信息管理系统采用B/S架构、前后端分离以及…

Nacos部署(二)Linux部署Nacos2.3.x集群环境

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: Nacos部署(二)Linux部署Nacos2.3.x集群环境 ⏱️…

隐私计算实训营第四讲-SecretFlow 环境安装与部署

SecretFlow 环境安装与部署 SecretFlow环境的安装和部署指南,包括仿真模式和生产模式的配置方法。 1. 环境安装 要安装SecretFlow环境,请按照以下步骤操作: 1.1 创建并激活Conda环境 创建名为 sf 的新Conda环境,并指定Python版…

#Linux(SSH软件安装及简单使用)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)终端键入(root权限)安装 apt-get install openssh-server 安装时遇到报错 E: Could not get lock /var/lib/dpkg/…

LeetCode---389周赛

题目列表 3083. 字符串及其反转中是否存在同一子字符串 3084. 统计以给定字符开头和结尾的子字符串总数 3085. 成为 K 特殊字符串需要删除的最少字符数 3086. 拾起 K 个 1 需要的最少行动次数 一、字符串及其反转中是否存在同一子字符串 直接暴力枚举即可,代码…