掌握 LangChain 文档处置处罚焦点:Document Loaders 与 Text Splitters 全解析

[复制链接]
发表于 2025-8-27 21:33:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

🐇明显跟你说过:个人主页

🏅个人专栏:《深度探秘:AI界的007》 🏅

🔖行路有良友,便是天国🔖

目录
一、引言
1、什么是LangChain
2、LangChain 在智能应用中的作用
二、Document Loaders 概述
1、什么是 Document Loader
2、常见的 Loader 范例
三、Text Splitters 概述
1、为什么需要 Text Splitter
2、常见的文本切分计谋
四、实战示例
1、利用 PDFLoader + RecursiveCharacterTextSplitter 构建文档块
2、多文档加载并批量切分


一、引言

1、什么是LangChain

想象一下,你正在和 ChatGPT 聊天,问它一个复杂的问题,好比:“我上传的这份 PDF 文档里,第三章说的谁人算法和第五章的原理有啥关系?”
这时候,你希望 AI 不光能看懂问题,还能读懂文档、记住上下文、把答案说清楚,对吧?😎
这,就是 LangChain 登场的地方!

🌟 简单一句话:
LangChain 是一个帮你构建 “更智慧的 AI 应用” 的框架。
🧩 它能做什么?
LangChain 像一个多才多艺的管家,替你打理 AI 应用的多个方面:
能力举个栗子 🌰📄 文档读取支持 PDF、Word、网页、Notion 等多种格式!✂️ 文本切分把长文章变成模子“能吃得下”的小块块📦 存储与检索把文档变成向量存在“影象库”里,方便快速查找🧠 调用大模子接入 OpenAI、Claude、Ollama 等模子对话🪜 工作流链条把多个步骤串成“智能流程”,好比 读取→提问→总结
🤔 举个真实的例子:
你只要这样做:

  • ✅ 用 LangChain 的 Document Loader 读取资料
  • ✂️ 用 Text Splitter 把文档切成合适的巨细
  • 📦 存到向量数据库中,好比 FAISS 或 Elasticsearch
  • 🤖 用户提问 → LangChain 帮你搜索相干文档片断
  • 💬 调用大模子回答问题,还能引用来源!
是不是有点小惊艳?✨

🛠️ 为什么开发者喜欢它?


  • 模块化:想换个模子、数据库?一行代码改完!
  • 机动性:适合快速搭建原型,也能打造企业级系统
  • 社区活跃:文档全、插件多,成长飞快!

🏁 总结
   LangChain = LLM 的超等助理工具箱🧰 + AI 应用的邪术管家🪄
  如果你想让 AI 不止聊天,还能 读文档、处置处罚流程、接数据源、当助手——LangChain 会是你的好搭档!
 


2、LangChain 在智能应用中的作用

在过去,我们想让 AI 做事,大多是“一个模子回答一个问题”——好比问 ChatGPT:“天气怎么样?”它会给你一个答案。
但当我们想让 AI 真正“工作起来”,好比:


  • 📄 阅读上百页的 PDF 文档
  • 📚 理解多个文件之间的关系
  • 🧠 记住用户的历史提问
  • ⚙️ 调用外部工具,好比数据库、搜索引擎、API
  • 🔁 串联多个步骤,像人一样完成一项任务
👉 光靠一个大模子可不够了!这时,就轮到 LangChain 登场了!

🧰 LangChain 的作用是什么?
可以简单理解为:
   LangChain 是毗连大模子(LLM)与真实天下的桥梁🌉,让你的 AI 应用更智慧、更有用、更像“工具人”。
  ✅ 它解决了哪些问题?
智能应用需求LangChain 帮你搞定 ✔️加载和处置处罚各种格式文档利用 Document Loaders将大文本拆分为小块供模子处置处罚利用 Text Splitters存储、检索知识片断集成向量数据库(如 FAISS、Chroma 等)联合上下文做连续对话支持 Memory 模块主动调用外部工具 / APIAgent + Tool 模块多步骤任务处置处罚流程利用 Chain(链式执行)机制
🧠 举个例子:
你要做一个 “AI 法律助手”,目标是能:

  • 📂 读取几十份法律文书
  • 🤔 回答用户关于具体条款的问题
  • 💡 根据上下文推荐可能适用的法规
  • 📬 主动天生答复邮件或草案
用 LangChain 的做法大致是这样:


  • 用 Document Loaders 加载文书内容 📄
  • 用 Text Splitters 切分成模子能处置处罚的小段 ✂️
  • 用 Embedding + 向量数据库 存储和快速检索 🧠
  • 用 LLM + Chain 回答用户提问,引用相干文档 💬
  • 用 Agent + Tool 主动天生邮件并发送 📧
是不是已经能脑补出整个系统架构了?😆


二、Document Loaders 概述

1、什么是 Document Loader

在构建 AI 应用时,我们经常会遇到这样的任务:
   “把一份 PDF 文档、网页、Markdown 文件、乃至 Notion 页面内容,喂给大模子,让它理解并回答问题。”
  问题来了:这些内容格式五花八门,模子又只接受纯文本或结构化数据,我们该怎么办?🤔
这时,LangChain 提供的 Document Loader(文档加载器) 就派上用场啦!

Document Loader 就像一个“格式转换器”+“文件导入助手”,负责把各种各样的文档 👉 变成大模子能理解的“纯文本+元信息”结构。
📦 一个典型的加载效果长这样:
  1. {
  2.   "page_content": "这里是文档的正文内容……",
  3.   "metadata": {
  4.     "source": "my_file.pdf",
  5.     "page": 2
  6.   }
  7. }
复制代码
这个结构非常适合后续切分、嵌入向量、检索和问答等操作。

📚 支持哪些格式?
LangChain 内置或扩展支持的 Document Loaders 非常多,几乎覆盖常见的全部数据源:
范例举例📄 文件类.txt, .pdf, .docx, .md, .csv 等🌐 网络类网页、博客、RSS、Sitemap📋 协作类Notion、Google Docs、Slack、Confluence🗃️ 数据类JSON、SQL、Elasticsearch、MongoDB 等🧩 其他自定义 Loader,只要你能解析,都能加!   Document Loader 是智能应用中第一个“入口守门员”👮‍♂️,它帮你把“各种格式的知识”变成“模子可读的文本”。
  没有它,大模子就只能瞪着 PDF 干瞪眼了 😂


2、常见的 Loader 范例

1️⃣ 本地文件加载器(File Loaders)
这些 Loader 适用于你电脑里的各种文档,好比:
格式Loader 名称阐明.txtTextLoader加载纯文本文件.pdfPyPDFLoader, PDFMinerLoader 等支持按页加载 PDF 文档.docxUnstructuredWordDocumentLoader解析 Word 文件.mdUnstructuredMarkdownLoader加载 Markdown 文件.csvCSVLoader逐行加载 CSV 文件内容 📌 提示:PDF 支持的 Loader 有多个,可按需选择,好比:


  • PyPDFLoader: 按页加载,保留分页信息
  • PDFPlumberLoader: 更适合带复杂格式的 PDF

2️⃣ 网络内容加载器(Web Loaders)
想让 AI 看网页、博客、Sitemap?这些 Loader 派上用场:
数据源Loader 名称阐明网页WebBaseLoader读取网页内容(可自定义解析器)RSSRSSFeedLoader加载 RSS 订阅内容SitemapSitemapLoader扫描整站结构并加载页面内容
3️⃣ 协作平台加载器(SaaS & Cloud Docs)
适用于当代团队的“云端知识库”,好比:
平台Loader 名称阐明NotionNotionDBLoader加载 Notion 数据库中的页面Google DocsGoogleDriveLoader加载 Google 文档、表格等GitHubGitHubRepoLoader加载 GitHub 堆栈中的代码文件或文档SlackSlackLoader加载 Slack 聊天记录  📝 很适适用于构建企业内部知识问答系统!

4️⃣ 数据库 / 数据源加载器(DB/Data Source)
当你的知识存储在结构化数据库或其他系统中时:
数据源Loader 名称阐明SQL 数据库SQLDatabaseLoader毗连数据库并提取数据ElasticsearchElasticsearchLoader加载已有索引中的数据MongoDBMongoDBLoader读取 MongoDB 集合内容JSONJSONLoader加载本地或长途 JSON 文件 🔗 有些数据库 Loader 可与 ORM / SQLAlchemy 联合利用。

5️⃣ 自定义/非结构化内容加载器
当你遇到“杂七杂八”的文档,好比 HTML、扫描图像、邮件正文……也不用怕:
范例Loader 名称阐明恣意文本块UnstructuredFileLoader主动辨认结构,适配多种格式(PDF, HTML, EML等)邮件UnstructuredEmailLoader提取 EML/MSG 邮件内容图片UnstructuredImageLoaderOCR 图像并提取文字内容(需 Tesseract) 🧠 “Unstructured” 系列 Loader 是 LangChain 的机密武器,适配面非常广!

✅ 总结一张图:Loader 范例一览表
   📁 本地文件类     → Text, PDF, Word, Markdown, CSV
🌐 网络页面类     → HTML 网页, RSS, Sitemap
☁️ 协作平台类     → Notion, Google Docs, GitHub, Slack
🗃️ 数据源/数据库类 → SQL, MongoDB, Elasticsearch, JSON
🌀 非结构化类     → Email, HTML, OCR 图片, 多格式文档
  


三、Text Splitters 概述

1、为什么需要 Text Splitter

当我们利用大语言模子(LLM)处置处罚文档时,好比问它:
   “请总结这份 200 页的产品白皮书”📄
  你可能会遇到👇这种“灵魂打击”:
   ❌ 模子回复:文本太长,我读不下去了!
  由于 大多数模子对输入长度是有限制的(好比 GPT-4 的上下文长度是几千到几万 token,不等于几万字)。文档太长会:


  • ❌ 超出 token 限制,直接报错
  • ❌ 信息太杂,模子难以理解上下文
  • ❌ 检索性能下降,影响回答质量
于是,LangChain 中的 “Text Splitter(文本切分器)” 就成了救场好汉 🦸‍♂️!

🧠 Text Splitter 是干嘛的?
通俗来说:
   Text Splitter 就是一个“智慧的剪刀 ✂️”,它把一整段大文本,裁剪成模子可以处置处罚的小段落,并尽量保留上下文逻辑。
  
✅ 为什么一定要切分?
原因举个例子 🌰📏 模子有输入长度限制一次最多只能看几千 token🔍 检索更精准小段落更容易关联关键词🧠 上下文更清晰避免模子迷失在长篇大论中🧪 后续处置处罚更机动每段可以独立做嵌入、摘要、问答等操作


2、常见的文本切分计谋

🧱 1. CharacterTextSplitter —— 纯文本切分砖头式 🧱
   📌 按固定字符数切分文本,最基础的计谋。
  

  • 长处:简单粗暴,适用于没有结构的纯文本
  • 缺点:容易在中间截断句子,影响上下文理解
 🧠 适合场景:纯文本日记、没有结构的长段文字

🧠 2. RecursiveCharacterTextSplitter —— 递归智能剪刀 ✂️
   📌 优先按段落 > 句子 > 单词 > 字符切分,保持最大完备性。
  

  • 长处:保留语义结构,尽可能避免堵截上下文
  • 缺点:略比 CharacterTextSplitter 慢一些,但更智能
🌟 这是 LangChain 默认推荐利用的切分器!
🧠 适合场景:通用文本、PDF、网页内容、问答任务等

🔡 3. TokenTextSplitter —— 模子视角的切分器 🔍
   📌 按 Token 数目切分文本,而不是字符数!
  

  • 长处:精确控制模子的输入上限,避免超出上下文窗口
  • 缺点:需要引入 Tokenizer(如 OpenAI 或 HuggingFace)
🔍 每个 token ≈ 0.75 个英文单词,适合多语言文本处置处罚 
🧠 适合场景:需要严格控制 token 长度(如 GPT-3.5/4)

📄 4. MarkdownTextSplitter —— Markdown 专用 ✍️
   📌 辨认标题、列表、代码块等 Markdown 结构,有结构感地切分。
  

  • 长处:支持 Markdown 语法,切分效果更有层次感
  • 缺点:不适合非 Markdown 文档
 🧠 适合场景:知识库、技能文档、博客文章

🧬 5. SpacyTextSplitter —— 语言学视角的切分器 📚
   📌 用 NLP 工具 Spacy 对文本按句子切分,更具语言理解力。
  

  • 长处:语义层面更精致,尤其适合天然语言句子
  • 缺点:依赖第三方库,处置处罚速度较慢
 🧠 适合场景:高质量问答、摘要、学术文章

🧾 一张表对比:快速选择适合的切分器 ✅
Splitter 名称切分方式长处适用场景CharacterTextSplitter按字符数切分简单快速纯文本RecursiveCharacterTextSplitter递归结构切分最推荐,保留语义通用文档、问答系统TokenTextSplitter按 token 数切分精准控制输入Token 限制敏感任务MarkdownTextSplitter辨认 Markdown 结构有层次感技能文档、博客SpacyTextSplitter按句子切分更符合语言逻辑NLP 高质量处置处罚


四、实战示例

1、利用 PDFLoader + RecursiveCharacterTextSplitter 构建文档块

🧠 系统目标
构建一个能同时处置处罚:


  • ✅ 文本内容(用于问答/摘要)
  • 🖼 图片内容(用于图文搜索、OCR 或视觉问答)
 🧱 系统组件架构
   [PDF 文档]
   │
   ├── PDF 文本块提取       ---> 文本切分(RecursiveCharacterTextSplitter)
   │                            ↓
   │                        文本文档块 (List[Document])
   │
   ├── PDF 图片提取         ---> 图片切片、OCR(可选)
                                ↓
                            图片数据块 (List[ImageDocument])
   │
   └── 图文融合文档构建      ---> 图文同一格式:带文本+图片的 Document
                                ↓
                        最终图文文档块 (List[FusedDocument])
  
✅ 第一步:提取文本块
  1. from langchain.document_loaders import PyPDFLoader
  2. from langchain.text_splitter import RecursiveCharacterTextSplitter
  3. # 加载 PDF 文本
  4. pdf_loader = PyPDFLoader("example.pdf")
  5. pages = pdf_loader.load()
  6. # 切分文本块
  7. splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
  8. text_chunks = splitter.split_documents(pages)
复制代码
第二步:提取图片块 + 可选切分/OCR
  1. import fitz  # PyMuPDF
  2. from PIL import Image
  3. from io import BytesIO
  4. image_chunks = []
  5. doc = fitz.open("example.pdf")
  6. for page_num, page in enumerate(doc):
  7.     images = page.get_images(full=True)
  8.     for img_index, img in enumerate(images):
  9.         xref = img[0]
  10.         base_image = doc.extract_image(xref)
  11.         image_bytes = base_image["image"]
  12.         image_ext = base_image["ext"]
  13.         image = Image.open(BytesIO(image_bytes))
  14.         # 可选:切分图片或运行 OCR
  15.         image_chunk = {
  16.             "page": page_num + 1,
  17.             "index": img_index + 1,
  18.             "image": image,
  19.             "description": f"第{page_num+1}页的图片{img_index+1}"
  20.         }
  21.         image_chunks.append(image_chunk)
复制代码
  💡 OCR 可选:可联合 pytesseract 提取图片中的文字以加强图文问答。
  🔗 第三步:图文融合文档块
我们把图像信息整合进 LangChain 的 Document 中(或自定义类):
  1. from langchain.schema import Document
  2. fused_documents = []
  3. # 文本块先入
  4. for chunk in text_chunks:
  5.     fused_documents.append(chunk)
  6. # 图片块转为 Document(注意可自定义内容结构)
  7. for image_data in image_chunks:
  8.     doc = Document(
  9.         page_content=f"[图像] {image_data['description']}",
  10.         metadata={
  11.             "type": "image",
  12.             "page": image_data["page"],
  13.             "image_obj": image_data["image"]
  14.         }
  15.     )
  16.     fused_documents.append(doc)
复制代码
  📌 建议:将图像保存为本地路径或上传后利用 URL,再嵌入 metadata。
  🤖 最终用途(示例)
构建向量索引(仅文本内容 + OCR 图像文字):
  1. from langchain.vectorstores import FAISS
  2. from langchain.embeddings import OpenAIEmbeddings
  3. # 只索引文本文档
  4. vectorstore = FAISS.from_documents(text_chunks, OpenAIEmbeddings())
复制代码
问答应用(图文支持):


  • 用户提问时,匹配文本块
  • 如果掷中含图文 metadata 的块,可联动前端展示图片
  • 图片块也可通过关键词 OCR 搜索检索


2、多文档加载并批量切分

要实现 多 PDF 文档的批量加载 + 切分(支持后续同一直量化、入库),我们可以利用 PyPDFLoader 或 UnstructuredPDFLoader,配合 RecursiveCharacterTextSplitter 进行同一处置处罚。
下面是完备且实用的代码示例 ✅
🧠 完备代码逻辑:
  1. import os
  2. from langchain.document_loaders import PyPDFLoader
  3. from langchain.text_splitter import RecursiveCharacterTextSplitter
  4. # 设置你的 PDF 文件夹路径
  5. pdf_folder = "./docs"
  6. # 初始化空列表收集所有文档
  7. all_documents = []
  8. # 遍历目录下所有 PDF 文件
  9. for filename in os.listdir(pdf_folder):
  10.     if filename.endswith(".pdf"):
  11.         file_path = os.path.join(pdf_folder, filename)
  12.         # 加载当前 PDF
  13.         loader = PyPDFLoader(file_path)
  14.         documents = loader.load()
  15.         # 添加文档元信息(可选)
  16.         for doc in documents:
  17.             doc.metadata["source_file"] = filename
  18.         all_documents.extend(documents)
  19. print(f"总共加载了 {len(all_documents)} 个页面 📝")
  20. # 切分文档块
  21. splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
  22. split_docs = splitter.split_documents(all_documents)
  23. print(f"切分后文档块数: {len(split_docs)} ✅")
复制代码
📌 输出样例:
  1. 总共加载了 85 个页面 📝
  2. 切分后文档块数: 431 ✅
复制代码

🧰 补充建议
功能方法📌 元信息添加用于记录文件名、页码等,方便溯源🧠 多格式支持用 UnstructuredLoader 支持 Word、HTML、TXT 等💾 存入向量库用 FAISS.from_documents() 或 Chroma.from_documents()🔐 大模子向量化利用 OpenAIEmbeddings、HuggingFaceEmbeddings 等

   💕💕💕每一次的分享都是一次成长的路程,感谢您的陪伴和关注。希望这些文章能陪伴您走过技能的一段路程,共同见证成长和进步!😺😺😺
  
  🧨🧨🧨让我们一起在技能的海洋中探索前行,共同誊写美好的未来!!!   
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表