Appearance
文档加载
文本文件加载
LangChain 4J 提供了多种文档加载器,用于加载不同类型的文件:
文本文件加载器
java
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.Document;
// 加载文本文件
FileSystemDocumentLoader loader = FileSystemDocumentLoader.builder()
.path("path/to/file.txt")
.build();
Document document = loader.load();
System.out.println("文档内容:" + document.content());
System.out.println("文档元数据:" + document.metadata());目录加载器
java
import dev.langchain4j.data.document.loader.DirectoryDocumentLoader;
import dev.langchain4j.data.document.Document;
// 加载目录中的所有文件
DirectoryDocumentLoader loader = DirectoryDocumentLoader.builder()
.directoryPath("path/to/directory")
.supportedFileExtensions(".txt", ".md")
.build();
List<Document> documents = loader.load();
System.out.println("加载的文档数量:" + documents.size());
for (Document document : documents) {
System.out.println("文档名称:" + document.metadata().get("file_name"));
}PDF 文档处理
PDF 加载器
java
import dev.langchain4j.data.document.loader.PdfDocumentLoader;
import dev.langchain4j.data.document.Document;
// 加载 PDF 文件
PdfDocumentLoader loader = PdfDocumentLoader.builder()
.path("path/to/file.pdf")
.build();
Document document = loader.load();
System.out.println("PDF 内容:" + document.content());高级 PDF 处理
java
import dev.langchain4j.data.document.loader.PdfDocumentLoader;
import dev.langchain4j.data.document.Document;
// 高级 PDF 加载配置
PdfDocumentLoader loader = PdfDocumentLoader.builder()
.path("path/to/file.pdf")
.includeTextFromImages(true) // 包含图像中的文本
.password("optional-password") // PDF 密码
.build();
Document document = loader.load();
System.out.println("PDF 内容:" + document.content());网页内容抓取
URL 加载器
java
import dev.langchain4j.data.document.loader.UrlDocumentLoader;
import dev.langchain4j.data.document.Document;
// 加载网页内容
UrlDocumentLoader loader = UrlDocumentLoader.builder()
.url("https://example.com")
.build();
Document document = loader.load();
System.out.println("网页内容:" + document.content());高级网页处理
java
import dev.langchain4j.data.document.loader.UrlDocumentLoader;
import dev.langchain4j.data.document.Document;
// 高级网页加载配置
UrlDocumentLoader loader = UrlDocumentLoader.builder()
.url("https://example.com")
.timeoutMs(10000) // 超时时间
.userAgent("Mozilla/5.0") // 用户代理
.build();
Document document = loader.load();
System.out.println("网页内容:" + document.content());数据库连接
JDBC 加载器
java
import dev.langchain4j.data.document.loader.JdbcDocumentLoader;
import dev.langchain4j.data.document.Document;
// 从数据库加载文档
JdbcDocumentLoader loader = JdbcDocumentLoader.builder()
.connectionUrl("jdbc:mysql://localhost:3306/database")
.username("username")
.password("password")
.sqlQuery("SELECT id, title, content FROM documents")
.contentColumn("content")
.metadataColumns("id", "title")
.build();
List<Document> documents = loader.load();
System.out.println("加载的文档数量:" + documents.size());MongoDB 加载器
java
import dev.langchain4j.data.document.loader.MongoDbDocumentLoader;
import dev.langchain4j.data.document.Document;
// 从 MongoDB 加载文档
MongoDbDocumentLoader loader = MongoDbDocumentLoader.builder()
.connectionString("mongodb://localhost:27017")
.databaseName("database")
.collectionName("documents")
.contentField("content")
.metadataFields("_id", "title")
.build();
List<Document> documents = loader.load();
System.out.println("加载的文档数量:" + documents.size());自定义文档加载器
您可以通过实现 DocumentLoader 接口来创建自定义文档加载器:
基本自定义加载器
java
import dev.langchain4j.data.document.loader.DocumentLoader;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.Metadata;
public class CustomDocumentLoader implements DocumentLoader {
private final String source;
public CustomDocumentLoader(String source) {
this.source = source;
}
@Override
public Document load() {
// 实现加载逻辑
String content = "从自定义源加载的内容";
Metadata metadata = Metadata.from("source", source);
return Document.from(content, metadata);
}
@Override
public List<Document> loadMany() {
return Collections.singletonList(load());
}
}高级自定义加载器
java
public class ApiDocumentLoader implements DocumentLoader {
private final String apiUrl;
private final String apiKey;
public ApiDocumentLoader(String apiUrl, String apiKey) {
this.apiUrl = apiUrl;
this.apiKey = apiKey;
}
@Override
public Document load() {
// 实现 API 调用逻辑
String content = callApi(apiUrl, apiKey);
Metadata metadata = Metadata.from(
"source", apiUrl,
"loaded_at", LocalDateTime.now().toString()
);
return Document.from(content, metadata);
}
@Override
public List<Document> loadMany() {
return Collections.singletonList(load());
}
private String callApi(String url, String key) {
// 实现 API 调用
return "API 响应内容";
}
}文档元数据
文档加载器会自动提取和添加元数据,您也可以自定义元数据:
元数据处理
java
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.Metadata;
// 加载文档
Document document = loader.load();
// 获取元数据
Metadata metadata = document.metadata();
System.out.println("文档元数据:" + metadata);
// 添加自定义元数据
Document documentWithCustomMetadata = Document.from(
document.content(),
metadata.copy()
.put("custom_key", "custom_value")
.put("processed_at", LocalDateTime.now().toString())
);
System.out.println("带自定义元数据的文档:" + documentWithCustomMetadata.metadata());最佳实践
选择合适的加载器:
- 根据文件类型选择相应的加载器
- 对于复杂格式,使用专门的加载器
处理大文件:
- 对于大文件,考虑分块加载
- 使用流式处理避免内存溢出
错误处理:
- 添加适当的错误处理
- 处理文件不存在、权限不足等情况
元数据管理:
- 合理使用元数据
- 添加有助于后续处理的元数据
性能优化:
- 对于批量加载,使用并行处理
- 缓存加载结果
安全性:
- 处理敏感信息
- 验证文件来源
- 避免加载恶意文件