一份简单的代码,来展示如何解析一个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)
这段代码定义了两个核心函数:
get_loader(...)
:根据文件类型和加载器名称动态选择文档加载器(DocumentLoader)make_text_splitter(...)
:根据参数选择合适的文本切分器(TextSplitter),用于将文档分割为适合大语言模型处理的 chunksget_loader(loader_name, file_path, loader_kwargs)
根据指定的
loader_name
和file_path
,返回一个文档加载器对象(如 PDFLoader、CSVLoader 等),并支持自定义参数传入
参数 | 类型 | 描述 |
---|---|---|
loader_name |
str | 指定使用的文档加载器类名(如 "PDFMinerLoader" ) |
file_path |
str | 文件路径(如 "data/量子计算.pdf" ) |
loader_kwargs |
Dict | 可选参数字典,用于传递给加载器构造函数 |
尝试从自定义模块中加载特定加载器
"RapidOCRPDFLoader"
),优先使用用户自定义的 document_loaders
模块langchain.document_loaders
动态导入模块 & 获取类
document_loaders_module = importlib.import_module('langchain.document_loaders')
DocumentLoader = getattr(document_loaders_module, loader_name)
对某些加载器设置默认参数
UnstructuredFileLoader
: 设置自动识别编码CSVLoader
: 自动检测 CSV 文件编码JSONLoader
/ JSONLinesLoader
: 设置默认解析 schema实例化加载器
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) |
if splitter_name == "MarkdownHeaderTextSplitter":
headers_to_split_on = text_splitter_dict[splitter_name]['headers_to_split_on']
text_splitter = langchain.text_splitter.MarkdownHeaderTextSplitter(...)
text_splitter_module = importlib.import_module('text_splitter')
TextSplitter = getattr(text_splitter_module, splitter_name)
text_splitter_module = importlib.import_module('langchain.text_splitter')
TextSplitter.from_tiktoken_encoder(encoding_name="cl100k_base", ...)
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
TextSplitter.from_huggingface_tokenizer(tokenizer, chunk_size=..., chunk_overlap=...)
TextSplitter(chunk_size=250, chunk_overlap=50)
RecursiveCharacterTextSplitter
,按字符切分(如 \n\n
, \n
,
)如果找不到对应分词器,则回退到 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") |