Skip to content

LangChain文本分割

文本分割

文本分割

LangChain 的文本分割(Text Splitters) 是指将大段文本拆分为更小、更易管理的“块”(chunks)的过程。这些块通常需要满足两个核心目标:

  • 适配语言模型的上下文窗口限制(例如,不超过 4096 或 8192 个 token);
  • 保留语义完整性与上下文连贯性,以便在检索增强生成(RAG)、问答系统等下游任务中表现良好。

文本分割策略

LangChain 文本分割策略主要分为三类:参考文档

场景推荐 splitter
通用文本(文章、PDF、网页)RecursiveCharacterTextSplitter (最常用)
需严格控制 token 数(如调用 GPT)CharacterTextSplitter.from_tiktoken_encoder()
Markdown / HTML / JSON / 代码对应结构化 splitter

文本分割长度

不同的嵌入模型,最佳文本分割长度不同

特性BGE-large-zh-v1.5BGE-M3
最大输入长度512 token8192 token
分块关键严格确保不超过512 token,需精细控制分块字符数。可利用长上下文优势,采用更大的分块以保持语义完整。
推荐分块策略使用ChineseTextSplitter,字符分块大小约500-800进行调试。可根据文档特点,灵活采用较大的分块(如千字以上),或按章节等自然段落分割。
适用场景适合处理短文本或需要被精细切分的标准文档。特别适合处理长文档、书籍、技术手册等,减少不必要的切分。

基于文本结构的分割(Text structure-based)

这是最常用且推荐的默认策略,尤其适用于普通自然语言文本(如文章、书籍、网页内容等)。

  • 核心实现:RecursiveCharacterTextSplitter
  • 工作原理:
    • 首先尝试按段落(\n\n)切分;
    • 如果段落仍超过 chunk_size,则退回到按句子(.?! 等)切分;
    • 若句子仍太大,则进一步按单词甚至字符切分。
  • 优点:
    • 尽可能保留自然语言边界;
    • 在保持语义连贯的同时控制块大小。

安装

shell
pip install -U langchain-text-splitters -i https://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com

示例

python
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50  # 重叠部分有助于上下文衔接
)

# 分割字符
splits = text_splitter.split_text(texts)
# 分割文档
splits = text_splitter.split_documents(docs)

基于长度的分割(Length-based)

这种策略不考虑语义或结构,仅依据字符数或 token 数进行硬性切割。

  • 适用场景:对性能要求高、或文本无明显结构(如日志、代码片段)。
  • 两种子类型:
    • 字符级(Character-based):按字符数量切分;
    • Token 级(Token-based):使用 tokenizer(如 TikToken)计算 token 数量后切分,更贴合 LLM 实际输入。
python
from langchain_text_splitters import CharacterTextSplitter

text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base",  # 适用于 GPT-3.5/4
    chunk_size=100,
    chunk_overlap=0
)
splits = text_splitter.split_text(texts)

基于文档结构的分割(Document structure-based)

针对具有明确结构的文档格式(如 Markdown、HTML、JSON、代码等),利用其语法结构进行智能切分。

  • 优势:
    • 保留逻辑单元(如 Markdown 标题下的全部内容);
    • 提升检索相关性和生成质量。
  • 典型用例与工具:
    • Markdown:按 #, ## 等标题层级切分 → MarkdownHeaderTextSplitter
    • HTML:按 <div>, <p> 等标签切分 → HTMLHeaderTextSplitter
    • JSON:递归切分嵌套对象 → RecursiveJsonSplitter
    • 代码:按函数、类划分 → CodeSplitter

文本加载与分割综合示例

示例

python
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

def load_md():
    """加载markdown文件"""
    file_path = "./data/md/热门专业top20.md"
    loader = UnstructuredMarkdownLoader(
        file_path,
        mode="single",
        strategy="fast",
    )
    docs = loader.load()
    # print(len(docs))
    # print(type(docs[0]))
    # print(docs[0])
    return docs


def split_text(docs):
    """对文档进行文本分割"""
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    splits = text_splitter.split_documents(docs)
    # print(len(splits))
    # print(type(splits[0]))
    # print(splits[0])
    return splits


# 得到分割后的文档
splits = split_text(load_md())