🐇明明跟你說過:個人主頁
🏅個人專欄:《深度探秘: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 等模型對話 |
🪜 工作流鏈條 | 把多個步驟串成“智能流程”,比如 讀取→提問→總結 |
🤔 舉個真實的例子:
你想構建一個 智能客服機器人,它能自動讀取你的公司文檔、PDF 手冊、產品說明書,并且回答用戶的問題。
你只要這樣做:
-
? 用 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 模塊 |
自動調用外部工具 / API | Agent + 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 就像一個“格式轉換器”+“文件導入助手”,負責把各種各樣的文檔 👉 變成大模型能理解的“純文本+元信息”結構。
📦 一個典型的加載結果長這樣:
{"page_content": "這里是文檔的正文內容……","metadata": {"source": "my_file.pdf","page": 2}
}
這個結構非常適合后續切分、嵌入向量、檢索和問答等操作。
📚 支持哪些格式?
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 名稱 | 說明 |
---|---|---|
.txt | TextLoader | 加載純文本文件 |
.pdf | PyPDFLoader , PDFMinerLoader 等 | 支持按頁加載 PDF 文檔 |
.docx | UnstructuredWordDocumentLoader | 解析 Word 文件 |
.md | UnstructuredMarkdownLoader | 加載 Markdown 文件 |
.csv | CSVLoader | 逐行加載 CSV 文件內容 |
📌 提示:PDF 支持的 Loader 有多個,可按需選擇,比如:
-
PyPDFLoader
: 按頁加載,保留分頁信息 -
PDFPlumberLoader
: 更適合帶復雜格式的 PDF
2?? 網絡內容加載器(Web Loaders)
想讓 AI 看網頁、博客、Sitemap?這些 Loader 派上用場:
數據源 | Loader 名稱 | 說明 |
---|---|---|
網頁 | WebBaseLoader | 讀取網頁內容(可自定義解析器) |
RSS | RSSFeedLoader | 加載 RSS 訂閱內容 |
Sitemap | SitemapLoader | 掃描整站結構并加載頁面內容 |
3?? 協作平臺加載器(SaaS & Cloud Docs)
適用于現代團隊的“云端知識庫”,比如:
平臺 | Loader 名稱 | 說明 |
---|---|---|
Notion | NotionDBLoader | 加載 Notion 數據庫中的頁面 |
Google Docs | GoogleDriveLoader | 加載 Google 文檔、表格等 |
GitHub | GitHubRepoLoader | 加載 GitHub 倉庫中的代碼文件或文檔 |
Slack | SlackLoader | 加載 Slack 聊天記錄 |
?📝 很適合用于構建企業內部知識問答系統!
4?? 數據庫 / 數據源加載器(DB/Data Source)
當你的知識存儲在結構化數據庫或其他系統中時:
數據源 | Loader 名稱 | 說明 |
---|---|---|
SQL 數據庫 | SQLDatabaseLoader | 連接數據庫并提取數據 |
Elasticsearch | ElasticsearchLoader | 加載已有索引中的數據 |
MongoDB | MongoDBLoader | 讀取 MongoDB 集合內容 |
JSON | JSONLoader | 加載本地或遠程 JSON 文件 |
🔗 有些數據庫 Loader 可與 ORM / SQLAlchemy 結合使用。
5?? 自定義/非結構化內容加載器
當你遇到“雜七雜八”的文檔,比如 HTML、掃描圖像、郵件正文……也不用怕:
類型 | Loader 名稱 | 說明 |
---|---|---|
任意文本塊 | UnstructuredFileLoader | 自動識別結構,適配多種格式(PDF, HTML, EML等) |
郵件 | UnstructuredEmailLoader | 提取 EML/MSG 郵件內容 |
圖片 | UnstructuredImageLoader | OCR 圖像并提取文字內容(需 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])
? 第一步:提取文本塊
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加載 PDF 文本
pdf_loader = PyPDFLoader("example.pdf")
pages = pdf_loader.load()# 切分文本塊
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
text_chunks = splitter.split_documents(pages)
第二步:提取圖片塊 + 可選切分/OCR
import fitz # PyMuPDF
from PIL import Image
from io import BytesIOimage_chunks = []doc = fitz.open("example.pdf")for page_num, page in enumerate(doc):images = page.get_images(full=True)for img_index, img in enumerate(images):xref = img[0]base_image = doc.extract_image(xref)image_bytes = base_image["image"]image_ext = base_image["ext"]image = Image.open(BytesIO(image_bytes))# 可選:切分圖片或運行 OCRimage_chunk = {"page": page_num + 1,"index": img_index + 1,"image": image,"description": f"第{page_num+1}頁的圖片{img_index+1}"}image_chunks.append(image_chunk)
💡 OCR 可選:可結合
pytesseract
提取圖片中的文字以增強圖文問答。
🔗 第三步:圖文融合文檔塊
我們把圖像信息整合進 LangChain 的 Document 中(或自定義類):
from langchain.schema import Documentfused_documents = []# 文本塊先入
for chunk in text_chunks:fused_documents.append(chunk)# 圖片塊轉為 Document(注意可自定義內容結構)
for image_data in image_chunks:doc = Document(page_content=f"[圖像] {image_data['description']}",metadata={"type": "image","page": image_data["page"],"image_obj": image_data["image"]})fused_documents.append(doc)
📌 建議:將圖像保存為本地路徑或上傳后使用 URL,再嵌入 metadata。
🤖 最終用途(示例)
構建向量索引(僅文本內容 + OCR 圖像文字):
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings# 只索引文本文檔
vectorstore = FAISS.from_documents(text_chunks, OpenAIEmbeddings())
問答應用(圖文支持):
-
用戶提問時,匹配文本塊
-
如果命中含圖文 metadata 的塊,可聯動前端展示圖片
-
圖片塊也可通過關鍵詞 OCR 搜索檢索
2、多文檔加載并批量切分
要實現 多 PDF 文檔的批量加載 + 切分(支持后續統一向量化、入庫),我們可以使用 PyPDFLoader
或 UnstructuredPDFLoader
,配合 RecursiveCharacterTextSplitter
進行統一處理。
下面是完整且實用的代碼示例 ?
🧠 完整代碼邏輯:
import os
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 設置你的 PDF 文件夾路徑
pdf_folder = "./docs"# 初始化空列表收集所有文檔
all_documents = []# 遍歷目錄下所有 PDF 文件
for filename in os.listdir(pdf_folder):if filename.endswith(".pdf"):file_path = os.path.join(pdf_folder, filename)# 加載當前 PDFloader = PyPDFLoader(file_path)documents = loader.load()# 添加文檔元信息(可選)for doc in documents:doc.metadata["source_file"] = filenameall_documents.extend(documents)print(f"總共加載了 {len(all_documents)} 個頁面 📝")# 切分文檔塊
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
split_docs = splitter.split_documents(all_documents)print(f"切分后文檔塊數: {len(split_docs)} ?")
📌 輸出樣例:
總共加載了 85 個頁面 📝
切分后文檔塊數: 431 ?
🧰 補充建議
功能 | 方法 |
---|---|
📌 元信息添加 | 用于記錄文件名、頁碼等,方便溯源 |
🧠 多格式支持 | 用 UnstructuredLoader 支持 Word、HTML、TXT 等 |
💾 存入向量庫 | 用 FAISS.from_documents() 或 Chroma.from_documents() |
🔐 大模型向量化 | 使用 OpenAIEmbeddings 、HuggingFaceEmbeddings 等 |
💕💕💕每一次的分享都是一次成長的旅程,感謝您的陪伴和關注。希望這些文章能陪伴您走過技術的一段旅程,共同見證成長和進步!😺😺😺
🧨🧨🧨讓我們一起在技術的海洋中探索前行,共同書寫美好的未來!!!???