Skip to content

文档加载

文本文件加载

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());

最佳实践

  1. 选择合适的加载器

    • 根据文件类型选择相应的加载器
    • 对于复杂格式,使用专门的加载器
  2. 处理大文件

    • 对于大文件,考虑分块加载
    • 使用流式处理避免内存溢出
  3. 错误处理

    • 添加适当的错误处理
    • 处理文件不存在、权限不足等情况
  4. 元数据管理

    • 合理使用元数据
    • 添加有助于后续处理的元数据
  5. 性能优化

    • 对于批量加载,使用并行处理
    • 缓存加载结果
  6. 安全性

    • 处理敏感信息
    • 验证文件来源
    • 避免加载恶意文件