使用LangChain框架加载与解析txt,markdown,pdf,jpg格式文档

本文介绍了如何在LangChain中通过document_loaders类加载txt、markdown、pdf和jpg格式的文档,并针对大语言模型的特点,处理文档分割以适应模型的输入限制。详细步骤包括文件加载、文档格式处理以及文本分割方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. LangChain 中的文档加载

大型语言模型(LLMs)存在数据实时性的问题。即使是像 GPT-4 这样强大的模型也对最近的事件一无所知。

在 LLMs 看来,世界是静止的。它们只知道通过它们的训练数据所呈现的世界。因此我们可以将最新的一些知识文档添加到LLMs中,来补充LLMs模型的知识。

在Langchain 中的通过提示文档加载类(document_loaders)来实现文档的加载,本文将详细介绍如何通过document_loaders实现txt、markdown、pdf、jpg格式文档的加载。

2. 加载文档

langchain提供了很多文档加载的类,以便进行不同的文件加载,这些类都通过 langchain.document_loaders 引入。

例如:UnstructuredFileLoader(txt文件读取)、UnstructuredFileLoader(word文件读取)、MarkdownTextSplitter(markdown文件读取)、UnstructuredPDFLoader(PDF文件读取)

本文准备了四种格式的文件进行加载测试,文件默认放在docs目录下,大家也可以直接打开查看。

2.1 导入对应的langchain库

from langchain.text_splitter import CharacterTextSplitter,MarkdownTextSplitter
from langchain.document_loaders import UnstructuredFileLoader,UnstructuredMarkdownLoader
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.document_loaders import UnstructuredImageLoader
from rapidocr_onnxruntime import RapidOCR

这里的RapidOCR是专门针对图像格式文档加载处理的,要使用下列命令下载对应的依赖:

%pip install rapidocr_onnxruntime pdf2image pdfminer.six -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 加载文档

加载txt文档
#加载txt文件
def load_txt_file(txt_file):    
    loader = UnstructuredFileLoader(os.path.join(work_dir, txt_file))
    docs = loader.load()
    print(docs[0].page_content[:100])
    return docs
加载md文档
#加载md文件
def load_md_file(md_file):    
    loader = UnstructuredMarkdownLoader(os.path.join(work_dir, md_file))
    docs = loader.load()
    print(docs[0].page_content[:100])
    return docs
加载pdf文档
#加载pdf文件
def load_pdf_file(pdf_file):    
    loader = UnstructuredPDFLoader(os.path.join(work_dir, pdf_file))
    docs = loader.load()
    print('pdf:\n',docs[0].page_content[:100])
    return docs
加载jpg文档
#加载jpg文件
def load_jpg_file(jpg_file):
    ocr = RapidOCR()
    result,_ = ocr(os.path.join(work_dir,jpg_file))
    docs = ""
    if result:
        ocr_result = [line[1] for line in result]
        docs += "\n".join(ocr_result)
        print('jpg:\n',docs[:100])
    return docs
从docs_path路径加载文件
#从docs_path路径加载文件
for doc in os.listdir(docs_path):
    doc_path = f'{docs_path}/{doc}'
    if doc_path.endswith('.txt'):
        load_txt_file(doc_path)
    elif doc_path.endswith('.md'):
        load_md_file(doc_path)
    elif doc_path.endswith('.pdf'):
        load_pdf_file(doc_path)
    elif doc_path.endswith('.jpg'):
        load_jpg_file(doc_path)
结果展示:

在这里插入图片描述

2.3 文档分割

对于大语言模型,往往单次传入的token长度是有限的。因此在加载完成后,还需要对文件进行分割,这样才能更准确的被模型所理解。

分割默认有两个关键参数:chunk_size:每个分割段的最大长度;chunk_overlap:相邻两个分割段之间的重叠token数量。这两个参数可以根据实际需要来配置。

分割txt文件
#分割txt文件
def load_txt_splitter(txt_file, chunk_size=200, chunk_overlap=20):
    docs = load_txt_file(txt_file)
    text_splitter = CharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
    split_docs = text_splitter.split_documents(docs)
    #默认展示分割后第一段内容
    print('split_docs[0]: ', split_docs[0])
    return split_docs
分割md文件
#分割md文件
def load_md_splitter(md_file, chunk_size=200, chunk_overlap=20):
    docs = load_md_file(md_file)
    text_splitter = MarkdownTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
    split_docs = text_splitter.split_documents(docs)
    #默认展示分割后第一段内容
    print('split_docs[0]: ', split_docs[0])
    return split_docs
分割pdf文件
#分割pdf文件
def load_pdf_splitter(pdf_file, chunk_size=200, chunk_overlap=20):
    docs = load_pdf_file(pdf_file)
    text_splitter = CharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
    split_docs = text_splitter.split_documents(docs)
    #默认展示分割后第一段内容
    print('split_docs[0]: ', split_docs[0])
    return split_docs
分割jpg文件
#分割jpg文件
def load_jpg_splitter(jpg_file, chunk_size=200, chunk_overlap=20):
    docs = load_jpg_file(jpg_file)
    text_splitter = CharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
    split_docs = text_splitter.create_documents([docs])
    #默认展示分割后第一段内容
    print('split_docs[0]: ', split_docs[0])
    return split_docs
从docs_path目录读取文件并进行分割
for doc in os.listdir(docs_path):
    doc_path = f'{docs_path}/{doc}'
    if doc_path.endswith('.txt'):
        load_txt_splitter(doc_path)
    elif doc_path.endswith('.md'):
        load_md_splitter(doc_path)
    elif doc_path.endswith('.pdf'):
        load_pdf_splitter(doc_path)
    elif doc_path.endswith('.jpg'):
        load_jpg_splitter(doc_path)
效果展示

在这里插入图片描述

总结

使用LangChain库进行文档加载,对于txt,md,pdf格式的文档,都可以用LangChain类加载,UnstructuredFileLoader(txt文件读取)、UnstructuredFileLoader(word文件读取)、MarkdownTextSplitter(markdown文件读取)、UnstructuredPDFLoader(PDF文件读取),对于jpg格式的文档,我这里提供了一种思路。

源代码文件地址:document_loader.ipynb

### 使用 LangChain Loader 加载 PDF 文件 LangChain 提供了一系列工具来处理不同类型的文档,其中包括加载 PDF 文件的功能。为了实现这一目标,通常会使用 `PyPDFLoader` 类,该类专门用于解析和提取 PDF 文档中的文本内容。 下面是一个简单的 Python 代码示例,展示了如何利用 LangChain 的 PyPDFLoader 来读取并处理 PDF 文件: ```python from langchain.document_loaders import PyPDFLoader # 创建一个 PyPDFLoader 实例,并指定要加载PDF 文件路径 loader = PyPDFLoader("example.pdf") # 调用 loader.load() 方法获取文档对象列表 pages = loader.load() # 遍历每一页的内容 for page in pages: print(page.page_content) # 输出页面上的文字内容 ``` 上述代码片段通过创建 `PyPDFLoader` 对象指定了待加载PDF 文件名 `"example.pdf"` 。调用其 `.load()` 方法可以返回包含各页数据的对象集合,进而允许开发者逐页访问或进一步操作这些信息[^1]。 值得注意的是,在实际应用过程中可能还需要考虑更多细节配置选项以及异常情况下的错误处理机制等问题。因此建议查阅官方提供的最新版 API 参考手册以获得最全面的帮助和支持[^2]。 #### 安装依赖库 如果尚未安装必要的 Python 库,则可以通过 pip 工具轻松完成安装过程: ```bash pip install pypdf-langchain ``` 此命令将会下载并设置好所有必需组件以便顺利运行上面给出的例子程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

STRUGGLE_xlf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值