news 2026/7/15 20:53:13

HoRain云--LangChain 文档加载与切分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--LangChain 文档加载与切分

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

Document Loader——加载文档

实例

Text Splitter——文档切分

实例

切分参数设置指南

完整流程:加载 → 切分 → 向量化

实例


之前的文章我们手动输入文本,但在实际项目中,文档可能来自 PDF、网页、Markdown 文件等。

本节介绍如何使用 Document Loader 加载各类文档,以及如何用 Text Splitter 将文档切分成适合检索的小块。


Document Loader——加载文档

LangChain 提供了数十种文档加载器,覆盖常见文件格式:

Loader来源安装包
TextLoader.txt 文件langchain(内置)
PyPDFLoaderPDF 文件langchain-community + pypdf
WebBaseLoader网页 URLlangchain-community + beautifulsoup4
CSVLoaderCSV 文件langchain-community
UnstructuredMarkdownLoaderMarkdown 文件langchain-community + unstructured

实例

# 加载文本文件(内置,无需额外安装)
from langchain_community.document_loaders import TextLoader

loader = TextLoader("knowledge.txt", encoding="utf-8")
docs = loader.load()

print(f"加载了 {len(docs)} 个文档")
print(f"内容预览: {docs[0].page_content[:150]}...")

# 加载网页
# pip install langchain-community beautifulsoup4
from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://www.runoob.com/python/python-tutorial.html")
docs = loader.load()
print(f"\n网页内容: {docs[0].page_content[:150]}...")


Text Splitter——文档切分

文档通常太长,需要切分成小块(chunk)才能有效检索。切分策略直接影响 RAG 效果:

实例

from langchain_text_splitters import RecursiveCharacterTextSplitter

# 创建切分器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块最多 500 个字符
chunk_overlap=50, # 块之间重叠 50 个字符
separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""],
# 优先按段落分割,然后是句子,最后是字符
)

# 示例文档
long_text = """菜鸟教程(RUNOOB)是一个免费的编程学习平台。

平台提供了丰富的编程语言教程,包括但不限于:
- Python 教程:从基础语法到数据分析
- Java 教程:面向对象编程到 Spring 框架
- 前端教程:HTML、CSS、JavaScript 及其框架

所有教程都配有详细的代码示例和在线运行环境。
学习者可以通过边学边练的方式快速掌握编程技能。"""

# 切分文档
chunks = text_splitter.split_text(long_text)

print(f"原文长度: {len(long_text)} 字")
print(f"切分后: {len(chunks)} 块\n")

for i, chunk in enumerate(chunks):
print(f"--- 块 {i+1} ({len(chunk)} 字) ---")
print(chunk)
print()

运行结果:

原文长度: 153 字 切分后: 3 块 --- 块 1 (54 字) --- 菜鸟教程(RUNOOB)是一个免费的编程学习平台。 平台提供了丰富的编程语言教程,包括但不限于: --- 块 2 (49 字) --- - Python 教程:从基础语法到数据分析 - Java 教程:面向对象编程到 Spring 框架 --- 块 3 (50 字) --- - 前端教程:HTML、CSS、JavaScript 及其框架 所有教程都配有详细的代码示例和在线运行环境。

chunk_overlap 很重要。如果块之间没有重叠,一个完整的句子可能被切成两半,导致检索时遗漏关键信息。50-100 字符的重叠是常见的设置。


切分参数设置指南

场景chunk_sizechunk_overlap原因
FAQ 问答200~50020~50问答对较短,小块即可
技术文档500~100050~100技术内容需要更多上下文
长文章/论文1000~2000100~200需要保留段落完整性
代码库500~15000~50函数/类作为自然边界

完整流程:加载 → 切分 → 向量化

实例

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
# from langchain_community.document_loaders import TextLoader


# 流程 1:加载
# loader = TextLoader("runoob_knowledge.txt", encoding="utf-8")
# docs = loader.load()

# 为演示直接使用示例文本
docs = [
"菜鸟教程(RUNOOB)是一个免费的编程学习网站。",
"网站提供 Python、Java、HTML 等多种编程语言的教程。",
"Python3 基础教程共 30 章,适合零基础入门学习。",
"HTML 基础教程共 25 章,包含表单、多媒体等内容。",
"菜鸟教程的所有基础教程都是免费的。",
]

# 流程 2:切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
)
chunks = text_splitter.create_documents(docs)

# 流程 3:向量化存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./runoob_db",
)

print(f"已建立索引:{len(chunks)} 个文档块")

# 流程 4:检索
results = vector_store.similarity_search("Python 教程有多少章?", k=2)
for doc in results:
print(f"检索结果: {doc.page_content}")

运行结果:

已建立索引:5 个文档块 检索结果: Python3 基础教程共 30 章,适合零基础入门学习。 检索结果: 菜鸟教程(RUNOOB)是一个免费的编程学习网站。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 20:51:51

【Springboot毕设全套源码+文档】基于JAVA的无人机销售平台的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/15 20:51:27

菜鸟教程学习笔记——html(六)

form表单 收集用户的输入信息 <form action"/" method"post"> <!-- action&#xff1a;目标url&#xff0c;method&#xff1a;提交数据的http方法&#xff08;默认为get&#xff09; --> <!-- post&#xff1a;内容会包在表单体内 get&am…

作者头像 李华
网站建设 2026/7/15 20:48:02

Modbus-RTU协议(从零到一实战篇)

1. Modbus-RTU协议基础认知 第一次接触工业通信协议时&#xff0c;我被各种专业术语绕得头晕眼花。直到用温度传感器做灌溉系统时&#xff0c;才发现Modbus-RTU就像快递员——它用串口线当运输车&#xff08;物理层&#xff09;&#xff0c;按固定路线&#xff08;协议规则&am…

作者头像 李华
网站建设 2026/7/15 20:46:38

深入解析TI CC2640R2F三核架构与低功耗蓝牙5.1开发实战

1. 项目概述&#xff1a;深入解析CC2640R2F这颗无线MCU的“芯”价值在物联网设备开发的江湖里&#xff0c;选对一颗“芯”往往决定了整个项目的成败。是功耗、性能、成本还是开发便利性&#xff1f;从业十多年&#xff0c;我经手过不少无线项目&#xff0c;从早期的蓝牙2.0到现…

作者头像 李华
网站建设 2026/7/15 20:44:52

反激变换器设计实战:从理论计算到磁芯与气隙的工程权衡

1. 反激变换器设计基础 反激变换器作为开关电源中的"万金油"&#xff0c;在中低功率领域&#xff08;2W-100W&#xff09;有着不可替代的地位。它的核心秘密在于那个特殊的变压器——不仅能实现电压转换&#xff0c;还能在输入输出之间建立电气隔离。我设计过的74W多…

作者头像 李华