DocumentByParagraphSplitter:LangChain4j中文本处理的“智能切割刀”
DocumentByParagraphSplitter:LangChain4j中文本处理的“智能切割刀”
一、概念与重要性
DocumentByParagraphSplitter 是 LangChain4j 中用于按段落分割长文本的核心组件,其核心价值在于将非结构化的长网页(如PDF、网页、合同)转化为适合大模型处理的语义化文本块。在 RAG(检索增强生成)、问答系统、内容摘要等场景中,该工具通过以下方式提升处理效率与效果:
- 语义完整性:以段落为单位分割,避免因字符/单词切割导致语义断裂(如关键结论被拆分到不同块中)。
- 上下文保留:通过默认的段落分隔符(如空行或特定标签),保留段落间的逻辑关联,便于下游任务(如问答)理解全局信息。
- 性能优化:将长文本拆分为可控大小的块,适配大模型输入窗口限制(如GPT-4的32K上下文),减少内存消耗。
二、使用方式详解
1. 基础配置
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
package com.wind.rag;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.Metadata;
import dev.langchain4j.data.document.splitter.DocumentByParagraphSplitter;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.Tokenizer;
import dev.langchain4j.model.openai.OpenAiTokenizer;
import java.util.List;
/**
* @author wind
* @version 1.0
* @description: 文本分割器示例
* @date 2025/3/18 20:23
*/
public class splitter {
public static void main(String[] args) {
// 示例文本 - 《红楼梦》简介
String text = "待分割文本";
// 调用文本分割方法并打印结果
splitAndPrintText(text);
}
/**
* 文本分割方法
* @param text 待分割的文本
*/
private static void splitAndPrintText(String text) {
// 创建 OpenAI 分词器实例
Tokenizer tokenizer = new OpenAiTokenizer();
// 创建文档分割器,设置最大分段大小为 1024 个 token
DocumentByParagraphSplitter splitter = new DocumentByParagraphSplitter(
1024, // maxSegmentSize: 每个分段最大token数
0, // maxOverlap: 段落间重叠token数
tokenizer
);
// 创建文档对象,添加元数据
Document document = Document.from(text, Metadata.from("文档类型", "红楼梦简介"));
// 执行文本分割
List<TextSegment> segments = splitter.split(document);
for (TextSegment segment : segments) {
System.out.println("分割后的段落:" + segment.text());
}
}
}
三、与其他分割工具的对比
工具 | 适用场景 | 优势 | 局限性 |
---|---|---|---|
CharacterTextSplitter | 基于字符的分割(如按字数切割) | 灵活控制字符长度 | 容易破坏语义完整性 |
DocumentByParagraphSplitter | 按段落分割 | 保留语义上下文 | 需预定义段落分隔符 |
RegexTextSplitter | 正则表达式自定义分割 | 支持复杂模式(如按标题层级切割) | 正则编写复杂度高 |
五、总结
DocumentByParagraphSplitter 是 LangChain4j 中处理长文本的“瑞士军刀”,其语义化分割能力与灵活配置使其成为 RAG、智能问答等场景的必备组件。开发者需根据具体需求平衡分割粒度与上下文保留,并善用元数据增强处理效果。未来随着多模态应用的普及,该工具的扩展性将进一步释放(如支持表格/代码块的分割)。