Spring AI 学习之路 文档的提取、转换、加载

news/2025/3/11 13:49:41/文章来源:https://www.cnblogs.com/brother-four/p/18749904

在现代数据处理中,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>
  1. 读取文件。
    /*** 从输入流中读取文件。像后端接收前端文件时,就可以使用。* @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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LayerSkip: 使用自推测解码加速大模型推理

自推测解码是一种新颖的文本生成方法,它结合了推测解码 (Speculative Decoding) 的优势和大语言模型 (LLM) 的提前退出 (Early Exit) 机制。该方法出自论文 LayerSkip: Enabling Early-Exit Inference and Self-Speculative Decoding。它通过使用 同一个模型 的早期层来生成候…

2025年我用 Compose 写了一个 Todo App

标题党嫌疑犯实锤 序言 从2月12日到3月4日这整整三周时间里,我从零开始又学习了一次 Compose。 为什么说又,是因为这已经是我第二次学习这套课程了。 故事从 4 年前说起,2021 年在意外获悉扔物线朱凯老师准备发布一套名为 Compose 的新课程,意识到这是 Android 未来的方向,…

Ubuntu设置静态IP——NetworkManager方式

1、直接在系统界面上设置静态IP的方式,不再赘述 2、命令行方式查看已经有哪些工具#查看状态 sudo systemctl status Netplan sudo systemctl status NetworkManager sudo systemctl status systemd-networkd sudo systemctl status NetworkManager出现Active,说明电脑已经安装…

《Quick Start Kubernetes》读后感

一、 为什么选择这本书? 面试的时候经常被问到 kubernetes(下称 k8s),所以打算学习 k8s。看到《Quick Start Kubernetes》的作者对自己所写的书持续地更新,被这种认真打动了,外加这本书只有100多页,所以选择了这本书作为入门 k8s 的教材。 二、这本书写了什么? 这本书介绍…

正交实验法python实现

1.等水平正交表 每个条件下的种类一样多 例1: 这是一个7因子2状态 列表里内部每一个[]表示一个因子,然后每个因子都有2种类型 #7因子2状态 from allpairspy import AllPairs parameters = [["Chrome", "Firefox"],#因子1有"Chrome"或"Fir…

如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统

本文将提供一个详细的示例,展示如何调用 DeepSeek 的自然语言处理 API 接口。我们将以情感分析为例,演示如何发送请求、处理响应以及处理可能的错误。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线…

使用 Pixi.js 插件实现探险者小游戏(一)

什么是 Pixi Pixi 是一个非常快的 2D sprite 渲染引擎。使用它你可以轻松的利用 JavaScript 和其他 HTML5 技术制作游戏和应用程序。 Pixi 的官网地址:https://pixijs.com/ 本游戏使用的是 Pixi 的 V4.5.5 版本,官网最新版本更新到了 V8.x,两个版本 API 相差很大,建议大家学…

【设计模式】利用组合模式带你走进树形结构的世界

概述对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员…

20250311

1. 沪镍还有两个上涨波段

【设计模式】从智能音箱到软件设计:探索外观模式的实际应用案例

概述 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于…

PMC必须要懂的四个关键流程:生产、库存、交期全过程解析!

PMC(生产计划与物料控制)这个岗位,看起来就是三个字,但实际干起来,简直是让人上蹿下跳、手忙脚乱。一边要盯着生产线, 一边要和供应商、采购、销售对接,稍微一个环节没控好,就可能导致生产停滞、库存爆仓、交期延误,直接影响公司运营。 很多PMC天天在救火,但其实掌握…

JavaScript HTML DOM - 改变 HTML 功能 用法运用 详解

JavaScript中的HTML DOM提供了强大的功能来改变HTML文档的内容和结构。通过JavaScript,我们可以动态地更新网页上的文本、属性、样式以及整个HTML结构。以下是对这些功能的详细解释和用法示例: 一、改变HTML内容使用innerHTML:innerHTML属性用于获取或设置元素的HTML内容。这…