【无标题】

一份简单的代码,来展示如何解析一个txt文件,将其变为document。
解析一个文件,必须要有的就是loader和splitter。

import os
from pathlib import Path
from langchain.schema import Document
from utils import get_loader, make_text_splitter  # 确保你有这些函数

# === 配置参数 ===
file_path = "your_text_file.txt"  # 替换成你的 txt 文件路径
loader_name = "UnstructuredFileLoader"  # txt 文件推荐用这个 loader
splitter_name = "RecursiveCharacterTextSplitter"
chunk_size = 300
chunk_overlap = 50

# === 加载文件为 Document ===
loader = get_loader(loader_name=loader_name, file_path=file_path)
docs = loader.load()  # List[Document]
print(f" 原始文档数:{len(docs)}")
print(f" 原文示例:\n{docs[0].page_content[:300]}...\n")

# === 创建切分器并切分 ===
splitter = make_text_splitter(splitter_name=splitter_name,
                               chunk_size=chunk_size,
                               chunk_overlap=chunk_overlap)
chunks = splitter.split_documents(docs)

# === 打印结果 ===
print(f"✂️ 切分后的 chunk 数量:{len(chunks)}")
for i, chunk in enumerate(chunks[:5]):
    print(f"\n--- Chunk {i+1} ---")
    print(chunk.page_content)

这段代码定义了两个核心函数:

  1. get_loader(...)根据文件类型和加载器名称动态选择文档加载器(DocumentLoader)
  2. make_text_splitter(...)根据参数选择合适的文本切分器(TextSplitter),用于将文档分割为适合大语言模型处理的 chunks

一、get_loader(loader_name, file_path, loader_kwargs)

功能说明:

根据指定的 loader_namefile_path,返回一个文档加载器对象(如 PDFLoader、CSVLoader 等),并支持自定义参数传入

参数说明:

参数 类型 描述
loader_name str 指定使用的文档加载器类名(如 "PDFMinerLoader"
file_path str 文件路径(如 "data/量子计算.pdf"
loader_kwargs Dict 可选参数字典,用于传递给加载器构造函数

⚙️ 工作流程详解:

  1. 尝试从自定义模块中加载特定加载器

    • 如果是特殊加载器(如 "RapidOCRPDFLoader"),优先使用用户自定义的 document_loaders 模块
    • 否则使用标准的 langchain.document_loaders
  2. 动态导入模块 & 获取类

    document_loaders_module = importlib.import_module('langchain.document_loaders')
    DocumentLoader = getattr(document_loaders_module, loader_name)
    
  3. 对某些加载器设置默认参数

    • UnstructuredFileLoader: 设置自动识别编码
    • CSVLoader: 自动检测 CSV 文件编码
    • JSONLoader / JSONLinesLoader: 设置默认解析 schema
  4. 实例化加载器

    loader = DocumentLoader(file_path, **loader_kwargs)
    

二、make_text_splitter(...)

功能说明:

根据传入的分词器名称、chunk 大小等参数,生成一个合适的文本切分器(TextSplitter)

这个函数的作用是:根据配置自动选择最合适的文本切分方式,例如:

  • 使用 tiktoken(OpenAI 的 tokenizer)
  • 使用 HuggingFace Tokenizer
  • 使用默认的 RecursiveCharacterTextSplitter

参数说明:

参数 类型 默认值 描述
splitter_name str TEXT_SPLITTER_NAME 分词器名称(如 "RecursiveCharacterTextSplitter"
chunk_size int CHUNK_SIZE 每个 chunk 的最大 token 数或字符数
chunk_overlap int OVERLAP_SIZE 相邻 chunk 的重叠长度
llm_model str LLM_MODELS[0] 当前 LLM 模型名(用于适配 tokenizer)

⚙️ 工作流程详解:

1. 判断是否使用 Markdown 特殊切分器

if splitter_name == "MarkdownHeaderTextSplitter":
    headers_to_split_on = text_splitter_dict[splitter_name]['headers_to_split_on']
    text_splitter = langchain.text_splitter.MarkdownHeaderTextSplitter(...)
  • 对 Markdown 文件按标题层级进行切分,保持结构完整性

2. 优先使用用户自定义的 TextSplitter

text_splitter_module = importlib.import_module('text_splitter')
TextSplitter = getattr(text_splitter_module, splitter_name)
  • 支持用户自定义分词器,提升扩展性

3. 否则使用 LangChain 内置的 TextSplitter

text_splitter_module = importlib.import_module('langchain.text_splitter')

4. 根据分词器来源设置不同初始化方式

a. 来自 tiktoken(OpenAI)
TextSplitter.from_tiktoken_encoder(encoding_name="cl100k_base", ...)
  • 适用于 GPT-3、GPT-4、Qwen、LLaMA 等使用 tiktoken 编码的模型
b. 来自 HuggingFace
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
TextSplitter.from_huggingface_tokenizer(tokenizer, chunk_size=..., chunk_overlap=...)
  • 适用于基于 BERT、ChatGLM、Qwen 等使用 HuggingFace tokenizer 的模型
c. 通用字符切分器
TextSplitter(chunk_size=250, chunk_overlap=50)
  • 默认使用 RecursiveCharacterTextSplitter,按字符切分(如 \n\n, \n,

5. 异常处理机制

如果找不到对应分词器,则回退到 RecursiveCharacterTextSplitter 并使用默认参数

text_splitter = RecursiveCharacterTextSplitter(chunk_size=250, chunk_overlap=50)

✅ 示例调用:

from text_splitter import ChineseTextSplitter

text_splitter = make_text_splitter("ChineseTextSplitter", chunk_size=200, chunk_overlap=20)
chunks = text_splitter.split_text(long_text)

三、典型应用场景

场景 函数用途
PDF 文档导入 get_loader("PDFMinerLoader", "文件路径")
CSV 表格导入 get_loader("CSVLoader", "数据.csv")
JSON 数据导入 get_loader("JSONLoader", "数据.json")
切分长文本 make_text_splitter("RecursiveCharacterTextSplitter", chunk_size=512)
️ 中文切分优化 make_text_splitter("ChineseTextSplitter")
Markdown 结构保留 make_text_splitter("MarkdownHeaderTextSplitter")

你可能感兴趣的:(RAG系统开发指南,深度学习,人工智能,语言模型,自然语言处理)