Spring AI 文档的提取、转换、加载功能实现

 更新时间:2025年04月07日 14:05:49   作者:brother_four  
Spring AI 是一个基于 Spring 生态系统的框架,旨在简化人工智能和机器学习模型的集成,本文将介绍如何使用 Spring AI 和 Apache Tika 构建一个简单的 ETL 管道,特别是如何利用 spring-ai-tika-document-reader 依赖来处理和转换文档数据,感兴趣的朋友一起看看吧

在现代数据处理中,ETL(Extract, Transform, Load)管道是一个非常重要的概念。它允许我们从不同的数据源中提取数据,进行必要的转换,然后将数据加载到目标存储系统中。本文将介绍如何使用 Spring AI 和 Apache Tika 构建一个简单的 ETL 管道,特别是如何利用 spring-ai-tika-document-reader 依赖来处理和转换文档数据。

1. 框架介绍

1.1 Spring AI 简介

Spring AI 是一个基于 Spring 生态系统的框架,旨在简化人工智能和机器学习模型的集成。它提供了丰富的工具和库,帮助开发者快速构建智能应用。Spring AI 不仅支持常见的机器学习任务,还提供了与各种数据源的集成能力,使得数据处理变得更加高效。

1.2 Apache Tika 简介

Apache Tika 是一个内容分析工具包,能够从各种文档格式(如 PDF、Word、Excel 等)中提取文本和元数据。Tika 提供了一个简单的 API,使得开发者可以轻松地将文档内容提取并转换为结构化数据。

1.3 spring-ai-tika-document-reader 依赖

spring-ai-tika-document-reader 是 Spring AI 提供的一个扩展库,它集成了 Apache Tika 的功能,使得在 Spring 应用中处理文档变得更加简单。通过这个依赖,我们可以轻松地将文档内容提取并转换为 Spring AI 可以处理的格式。

2. 转换文档

2.1 添加依赖

首先,我们需要在 pom.xml 中添加 spring-ai-tika-document-reader 依赖:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-tika-document-reader</artifactId>
    <version>1.0.0-M5</version>
</dependency>
  • 读取文件。
    /**
     * 从输入流中读取文件。像后端接收前端文件时,就可以使用。
     * @param file 附件信息
     * @return
     */
    @PostMapping("etl/read/multipart-file")
    public String readMultipartFile(@RequestParam MultipartFile file) {
        // 从IO流中读取文件
        Resource resource = new InputStreamResource(file.getInputStream());
        List<Document> documents = new TikaDocumentReader(resource)
                .get();
        return  documents.get(0).getContent();
    }
		/**
     * 从本地文件读取文件。
     * @param filePath 本地文件地址
     * @return
     */
    @GetMapping("etl/read/local-file")
    public String readFile(@RequestParam String filePath) {
        // 从本地文件读取文件
        Resource resource = new FileSystemResource("C:\\Users\\augjm\\Desktop\\note.txt");
        List<Document> documents = new TikaDocumentReader(resource)
                .get();
        return  documents.get(0).getContent();
    }
		    /**
     * 从网络资源读取文件。
     * @param filePath 从网络资源读取文件地址
     * @return
     */
    @GetMapping("etl/read/url-file")
    public String readUrl(@RequestParam String filePath) {
        // 从网络资源读取文件。
        Resource resource = new UrlResource(filePath);
        List<Document> documents = new TikaDocumentReader(resource)
                .get();
        return  documents.get(0).getContent();
    }

2.2 转换文档

Document对象是ETL Pipeline的核心对象,它包含了文档的元数据和内容。
内容转换器:

TokenTextSplitter:可以把内容切割成更小的块方便RAG的时候提升响应速度节省Token。
ContentFormatTransformer:可以把元数据的内容变成键值对字符串。
元数据转换器:

SummaryMetadataEnricher:使用大模型总结文档。会在元数据里面增加一个summary字段。
KeywordMetadataEnricher:使用大模型提取文档关键词。可以在元数据里面增加一个keywords字段。

    /**
     * 将文本内容划分成更小的块。
     * @param file 附件信息
     * @return
     */
    @SneakyThrows
    @PostMapping("etl/transform/split")
    public List<String> split(@RequestParam MultipartFile file) {
        // 从IO流中读取文件
        TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
        // 将文本内容划分成更小的块
        List<Document> splitDocuments = new TokenTextSplitter()
                .apply(tikaDocumentReader.get());
        return splitDocuments.stream().map(Document::getContent).toList();
    }

在这个例子中,split 方法会将每个 Document 对象的内容切割成更小的块,并返回一个新的 Document 对象列表。

2.2 存储文档

根据以上步骤,就将文档切割各个块,然后就可以将其存储到向量数据库中了

/**
     * 嵌入文件
     *
     * @param file 待嵌入的文件
     * @return 是否成功
     */
    @PostMapping("save/file/vectorStore")
    public Boolean saveFileVectorStore(@RequestParam MultipartFile file) {
        // 从IO流中读取文件
        TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
        // 将文本内容划分成更小的块
        List<Document> splitDocuments = new TokenTextSplitter()
                .apply(tikaDocumentReader.get());
        // 存入向量数据库,这个过程会自动调用embeddingModel,将文本变成向量再存入。
        elasticVectorStore.add(splitDocuments);
        return true;
    }

到此这篇关于Spring AI 文档的提取、转换、加载的文章就介绍到这了,更多相关Spring AI 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java随机验证码生成实现实例代码

    java随机验证码生成实现实例代码

    这篇文章主要介绍了java随机验证码生成实现实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • 在Java的Struts框架中ONGL表达式的基础使用入门

    在Java的Struts框架中ONGL表达式的基础使用入门

    这篇文章主要介绍了深入解析在Java的Struts框架中ONGL表达式的基础使用入门,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-11-11
  • Java 运算符详情

    Java 运算符详情

    这篇文章主要介绍了Java 运算符,Java 中的运算符与 C 语言基本一致。下面文章就围绕Java 中的运算符的相关资料展开内容,需要的朋友可以参考一下
    2021-11-11
  • window下安装和配置maven环境

    window下安装和配置maven环境

    这篇文章主要为大家详细介绍了window下安装和配置maven环境的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Java设计模式之原型模式详细解读

    Java设计模式之原型模式详细解读

    这篇文章主要介绍了Java设计模式之原型模式详细解读,原型模式属于创建型设计模式,用于创建重复的对象,且同时又保证了性能,该设计模式的好处是将对象的创建与调用方分离,需要的朋友可以参考下
    2023-12-12
  • Spring整合Junit的使用详解

    Spring整合Junit的使用详解

    这篇文章主要介绍了Spring整合Junit的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 爬虫技术详解

    爬虫技术详解

    本文全面的介绍了爬虫的原理、技术现状、以及目前仍面临的问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 如何使用hutool做本地缓存的工具类

    如何使用hutool做本地缓存的工具类

    这篇文章主要介绍了如何使用hutool做本地缓存的工具类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java核心技术之反射

    Java核心技术之反射

    本文非常详细的讲解了java反射的相关资料,java反射在现今的使用中很频繁,希望此文可以帮大家解答疑惑,可以帮助大家理解
    2021-11-11
  • 两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    本篇文章带你认识Sring、String的常见操作和StringBuffer 与StringBuilder的区别(字符串详解),对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论