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

相关推荐
CallFay云起未来1 小时前
AI客服上线后多久才能回本?从TCO到ROI的完整测算方法
java·大数据·人工智能·架构·文心一言
Funny_AI_LAB1 小时前
重构 Coding Agent:当 LLM 没有 KV Cache 时,上下文工程该怎么做?
人工智能·经验分享·语言模型·重构
GISMagic1 小时前
AI 时代的软件工程与架构能力提升路线
人工智能·架构·软件工程
中伟视界2 小时前
化工检修作业新规明日施行,边缘AI如何守好现场?
人工智能
OpenCSG2 小时前
OpenCSG Agentic-27B 正式开源:27B Dense 模型,Agent 执行能力实现全面跃升
人工智能·开源·opencsg
Elastic 中国社区官方博客2 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·lucene
雪兽软件2 小时前
AI爆改学术研究?
人工智能·学术研究
合调于形2 小时前
Rengong zhzzneng 《人工智能》词条汉语拼音字母标调拼写实测案例
人工智能·自然语言处理·人机交互·语音识别·学习方法
cg50172 小时前
大模型 SFT(监督微调)该怎么做?(实践版)
人工智能·深度学习·机器学习