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()工厂方法。

相关推荐
一只爱撸猫的程序猿42 分钟前
我看着一个 AI 引擎在 14 天里,从"记忆"走进了"搜索"
人工智能·后端·架构
我登哥MVP1 小时前
DeepSeek-Harness-Super-Agent-学习笔记
人工智能·深度学习·神经网络·机器学习·自然语言处理·agent
LucianaiB1 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
冬奇Lab3 小时前
一天一个开源项目(第256篇):Anatomy —— 让 Claude 为技术概念「发明一台机器」,画成可交互的等距插画
人工智能·开源
孟郎郎3 小时前
打造一切(Craft Anything)——克隆构造世间万物
人工智能·ai·github·软件构建·开源软件
Martina_03213 小时前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
master3364 小时前
AI领域常用名词的系统梳理
人工智能·ai
Spidermanbaout4 小时前
Prompt-Engineering实战-2026年11月2日
人工智能·机器学习·ai·chatgpt·ai编程
阿里云大数据AI技术5 小时前
EMR Serverless StarRocks + DLF Paimon 多模态数据湖检索
人工智能