langchain4j的RAG入门

重要真相

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
            );
        }
    }
}

关键限制(面试容易踩坑)

  1. Java DocumentSplitters.recursive(20,4) 内部递归逻辑和Python大体一样,优先段落、换行、空格切割;
  2. 但是Java API没有开放修改separators和keepSeparator的能力,使用内置固定分隔符,分隔符会保留到片段内,无法配置关闭;
  3. 底层RecursiveCharacterTextSplitter类是包私有,只能在它自己的package里面访问,业务代码无法导入、无法new,IDE提示找不到类。

如果我一定要完全复刻Python(自定义separators,keep_separator=false)?

两个选择:

  1. 升级更高版本langchain4j,看新版本是否开放builder;
  2. 自己手动抄一份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()工厂方法。

相关推荐
GlobalInfo7 小时前
全球及中国Sim-to-Real机器人平台行业研究报告(2026版):市场现状、行业前景与占有率分析
人工智能·ai·机器人
GitCode官方7 小时前
直播预告:华为云码道实战|Agentic DevOps 与昇腾 CANN 算子 AI 开发
人工智能·华为云·devops·atomgit
weixin_750330237 小时前
OPC一人公司AI服务商选型:智能体vs工具集合架构对比
人工智能·架构·opc一人公司
朱涛的自习室7 小时前
预算 1000 美金的开源软件,DeepSeek 只花 1 美金就做完了(Day 6)
android·前端·人工智能
johnsong7 小时前
陶哲轩的战争宣言:AI 能否改写数学的未来?
人工智能
桃西西呀7 小时前
我给网关加了计量埋点,才发现限流配错三个月,下游账单多烧了两倍
人工智能·llm·ai编程
学页官方7 小时前
把教培训答流程封装成 AI Skill:一次编写,全教研组复用
人工智能·ai
天空属于哈夫克37 小时前
企业微信 API 二次开发:如何搭建 AI 智能客服系统?
人工智能·企业微信
在所不辞兄7 小时前
为什么残差连接能够缓解深层神经网络的退化问题,而不仅仅是改善梯度传播?
人工智能·深度学习·神经网络·机器学习
燃烧的枫7 小时前
Windows 下 YOLO26 的 TensorRT C++ 部署
人工智能·pytorch·windows·计算机视觉·tensorrt·cuda·yolo26