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中的.concat()方法实例详解

    Java中的.concat()方法实例详解

    concat()方法用于将指定的字符串参数连接到字符串上,.concat()方法是一种连接两个字符串的简单方法,可以帮助我们在Java中处理字符串,对java .concat()方法用法感兴趣的朋友一起看看吧
    2024-01-01
  • lombok的@EqualsAndHashcode注解详解

    lombok的@EqualsAndHashcode注解详解

    这篇文章主要介绍了lombok的@EqualsAndHashcode注解的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java实现下载文件的6种方式

    Java实现下载文件的6种方式

    本文主要介绍了Java实现下载文件的6种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java中的Pair详细

    Java中的Pair详细

    这篇文章主要介绍Java中的很有意思的Pair,下面文章会以Pair用法展开,感兴趣的小伙伴可以参考下面文章的具体内容
    2021-10-10
  • springboot多环境(dev、test、prod)配置详解

    springboot多环境(dev、test、prod)配置详解

    这篇文章主要介绍了springboot多环境(dev、test、prod)配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Maven依赖冲突的几种有效解决方法总结

    Maven依赖冲突的几种有效解决方法总结

    在项目开发中使用Maven管理Jar包时,常常会遇到Jar包依赖冲突,所以本文就给大家总结了几种解决Maven依赖冲突的有效方法,需要的朋友可以参考下
    2023-07-07
  • java版微信公众平台消息接口应用示例

    java版微信公众平台消息接口应用示例

    这篇文章主要介绍了java版微信公众平台消息接口应用,结合实例形式对比分析了PHP与java应用微信公众平台接口的相关调用与操作技巧,需要的朋友可以参考下
    2017-07-07
  • 如何基于LoadingCache实现Java本地缓存

    如何基于LoadingCache实现Java本地缓存

    这篇文章主要介绍了如何基于LoadingCache实现Java本地缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java解析JSON的六种方案

    Java解析JSON的六种方案

    这篇文章介绍了 6 种 JSON 解析方案,包括 Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点及适用场景,感兴趣的小伙伴跟着小编一起来看看吧
    2025-01-01
  • SpringBoot自定义请求前缀的代码步骤

    SpringBoot自定义请求前缀的代码步骤

    在web开发中,自定义路径是非常重要的,它可以更容易的区分不同服务和不同的功能模块,使后端服务接口变得更加有序,SpringBoot经常用于web开发,这篇文章就是记录如何在SpringBoot中进行自定义接口路径的开发,需要的朋友可以参考下
    2025-10-10

最新评论