Langchain4j 文档处理实战:从加载到分割的完整流程解析

1. 为什么文档处理是AI应用的第一步?

如果你正在用大语言模型(LLM)构建一个智能应用,比如一个能回答公司内部文档问题的聊天机器人,或者一个能分析大量报告的工具,你可能会遇到一个最直接的问题:我的文档五花八门,有PDF、Word、网页,还有一堆TXT,怎么才能让AI“读懂”它们?

这就是文档处理要解决的核心问题。你可以把它想象成给AI准备一顿营养均衡的“大餐”。文档加载器是去菜市场买菜,解析器是洗菜、切菜、处理不同食材,而分割器则是把大块的肉切成适合入口的小块。如果这一步没做好,要么AI“消化不良”(处理不了大文件),要么“营养流失”(丢失关键上下文信息)。

我在实际项目中见过不少开发者,一上来就急着调模型API,结果发现效果很差,一问才知道,他们直接把好几兆的PDF原文扔给了模型。这就像让一个人一口吞下一个汉堡,不仅噎得慌,也尝不出味道。Langchain4j 为Java开发者提供了一套非常顺手的“厨房工具”,把文档加载、解析、分割这些脏活累活都封装好了,让我们能专注于烹饪(构建应用逻辑)。

这篇文章,我就以一个过来人的身份,带你完整走一遍这个流程。我会用大量代码示例和踩坑经验,告诉你每个环节怎么选、怎么用,目标是让你看完就能在自己的项目里用起来。

2. 第一步:把文档“搬”进来——文档加载器实战

文档加载器(Document Loader)的任务很简单:从各种地方把文档内容读进来,变成一个统一的 Document 对象。Langchain4j 提供了丰富的选择,覆盖了你可能遇到的大部分场景。

2.1 本地文件系统:最常用的起点

绝大多数项目都是从处理本地文件开始的。FileSystemDocumentLoader 是你的首选。但这里有个新手很容易踩的坑:它只认绝对路径

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import java.util.List;

public class FileSystemLoaderDemo {
    public static void main(String[] args) {
        // 错误示范:使用相对路径(会报错!)
        // Document doc = FileSystemDocumentLoader.loadDocument("./knowledge/ai.md");

        // 正确做法:使用绝对路径
        String absolutePath = "/Users/yourname/project/src/main/resources/knowledge/人工智能.md";
        Document document = FileSystemDocumentLoader.loadDocument(absolutePath);
        System.out.println("文档内容预览: " + document.text().substring(0, 100) + "...");

        // 加载单个文件并指定解析器(这里用纯文本解析器)
        Document txtDoc = FileSystemDocumentLoader.loadDocument(
            absolutePath.replace("人工智能.md", "科室信息.txt"),
            new TextDocumentParser()
        );

        // 加载一个目录下的所有文件
        String dirPath = "/Users/yourname/project/src/main/resources/knowledge";
        List<Document> allDocs = FileSystemDocumentLoader.loadDocuments(dirPath, new TextDocumentParser());
        System.out.println("共加载了 " + allDocs.size() + " 个文档");

        // 更灵活:使用PathMatcher过滤特定类型文件,比如所有.txt文件
        PathMatcher txtMatcher = FileSystems.getDefault().getPathMatcher("glob:*.txt");
        List<Document> txtDocsOnly = FileSystemDocumentLoader.loadDocuments(dirPath, txtMatcher, new TextDocumentParser());

        // 递归加载目录及其所有子目录下的文件
        List<Document> recursiveDocs = FileSystemDocumentLoader.loadDocumentsRecursively(dirPath, new TextDocumentParser());
    }
}

关键点FileSystemDocumentLoader 功能强大,支持过滤和递归加载,非常适合管理本地知识库。记得路径问题,在Windows上是 D:\\path\\to\\file,在Linux/macOS上是 /path/to/file

2.2 类路径资源:打包后也能用

当你的应用打包成JAR或WAR文件后,文件系统的绝对路径就失效了。这时你需要 ClassPathDocumentLoader,它专门用于加载打包在JAR内部的资源文件。

import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;

public class ClassPathLoaderDemo {
    public static void main(String[] args) {
        // 使用相对于classpath的路径,非常方便
        Document document = ClassPathDocumentLoader.loadDocument("knowledge/人工智能.md");
        System.out.println(document.text());

        // 同样支持目录加载和过滤
        List<Document> allClasspathDocs = ClassPathDocumentLoader.loadDocuments("knowledge", new TextDocumentParser());

        // 递归加载也是支持的
        List<Document> allRecursive = ClassPathDocumentLoader.loadDocumentsRecursively("knowledge", new TextDocumentParser());
    }
}

实测建议:在开发阶段,我通常用 FileSystemDocumen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值