重要真相
LangChain‑Python 有 RecursiveCharacterTextSplitter;但 LangChain4j(Java)1.8.x 没有叫这个名字的公开类!
我前面犯了错误,误以为Java有同名类,实际Java没有对外暴露
RecursiveCharacterTextSplitter这个public类。Java里面对应的递归分割能力:
DocumentSplitters.recursive(maxSize, overlap),返回接口DocumentSplitter。
对应关系
| Python langchain | Java langchain4j 1.8.x |
|---|---|
RecursiveCharacterTextSplitter |
DocumentSplitters.recursive(chunk_size, chunk_overlap) 返回 DocumentSplitter 接口对象 |
chunk_size |
第一个参数,最大字符数 |
chunk_overlap |
第二个参数,重叠字符 |
⚠️Java的递归分割不对外暴露builder,不能自定义 separators、keepSeparator,这是langchain4j设计限制,底层实现类是包私有(default访问权限),你在代码里不能直接new、不能import。
底层实现类名字确实叫
RecursiveCharacterTextSplitter,但是不是public,在包内私有,外部代码访问不到,所以你写代码import就报红找不到类。
所以,复刻你Python测试代码,Java只能这样写(可直接运行)
Python:
splitter = RecursiveCharacterTextSplitter(
chunk_size=20,
chunk_overlap=4,
separators=["\n\n", "\n", " ", ""],
keep_separator=False
)
Java(1.8.x,只能使用工厂方法,不能自定义分隔符、不能关闭keepSeparator)
package com.yh.ai;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.segment.TextSegment;
import java.util.List;
public class SplitterDemo {
public static void main(String[] args) {
String text = """
I Love English hello world, how about you? If you're looking to get started with chat models, vector stores, or other LangChain components from a specific provider, check out our supported integrations
""";
Document doc = Document.from(text);
// Java等价递归分割,注意:不能自定义separators、keepSeparator!
DocumentSplitter splitter = DocumentSplitters.recursive(20, 4);
List<TextSegment> chunks = splitter.split(doc);
System.out.printf("分割后共 %d 块:%n", chunks.size());
for (int i = 0; i < chunks.size(); i++) {
TextSegment seg = chunks.get(i);
String chunkText = seg.text();
System.out.printf("块%d(长度:%d):%s%n",
(i+1),
chunkText.length(),
chunkText
);
}
}
}
关键限制(面试容易踩坑)
- Java
DocumentSplitters.recursive(20,4)内部递归逻辑和Python大体一样,优先段落、换行、空格切割; - 但是Java API没有开放修改
separators和keepSeparator的能力,使用内置固定分隔符,分隔符会保留到片段内,无法配置关闭; - 底层
RecursiveCharacterTextSplitter类是包私有,只能在它自己的package里面访问,业务代码无法导入、无法new,IDE提示找不到类。
如果我一定要完全复刻Python(自定义separators,keep_separator=false)?
两个选择:
- 升级更高版本langchain4j,看新版本是否开放builder;
- 自己手动抄一份Python版
RecursiveCharacterTextSplitter算法,写一个Java自定义分割器,实现DocumentSplitter接口。
总结
- ❌不要写:
RecursiveCharacterTextSplitter.builder(),编译报错,类不是public。 - ✅正确写法:
DocumentSplitter splitter = DocumentSplitters.recursive(20,4); - Java和Python功能大体等价,但参数灵活性上Java的langchain4j弱于Python‑langchain。
课堂作业写RAG,直接用
DocumentSplitters.recursive(xxx,xxx)就足够。如果考试,记住:Java没有公开的RecursiveCharacterTextSplitter类,入口是DocumentSplitters.recursive()工厂方法。