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


3457

被折叠的 条评论
为什么被折叠?



