Spring AI 文檔的提取、轉(zhuǎn)換、加載功能實(shí)現(xiàn)
在現(xiàn)代數(shù)據(jù)處理中,ETL(Extract, Transform, Load)管道是一個非常重要的概念。它允許我們從不同的數(shù)據(jù)源中提取數(shù)據(jù),進(jìn)行必要的轉(zhuǎn)換,然后將數(shù)據(jù)加載到目標(biāo)存儲系統(tǒng)中。本文將介紹如何使用 Spring AI 和 Apache Tika 構(gòu)建一個簡單的 ETL 管道,特別是如何利用 spring-ai-tika-document-reader
依賴來處理和轉(zhuǎn)換文檔數(shù)據(jù)。
1. 框架介紹
1.1 Spring AI 簡介
Spring AI 是一個基于 Spring 生態(tài)系統(tǒng)的框架,旨在簡化人工智能和機(jī)器學(xué)習(xí)模型的集成。它提供了豐富的工具和庫,幫助開發(fā)者快速構(gòu)建智能應(yīng)用。Spring AI 不僅支持常見的機(jī)器學(xué)習(xí)任務(wù),還提供了與各種數(shù)據(jù)源的集成能力,使得數(shù)據(jù)處理變得更加高效。
1.2 Apache Tika 簡介
Apache Tika 是一個內(nèi)容分析工具包,能夠從各種文檔格式(如 PDF、Word、Excel 等)中提取文本和元數(shù)據(jù)。Tika 提供了一個簡單的 API,使得開發(fā)者可以輕松地將文檔內(nèi)容提取并轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)。
1.3 spring-ai-tika-document-reader 依賴
spring-ai-tika-document-reader
是 Spring AI 提供的一個擴(kuò)展庫,它集成了 Apache Tika 的功能,使得在 Spring 應(yīng)用中處理文檔變得更加簡單。通過這個依賴,我們可以輕松地將文檔內(nèi)容提取并轉(zhuǎn)換為 Spring AI 可以處理的格式。
2. 轉(zhuǎn)換文檔
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(); } /** * 從網(wǎng)絡(luò)資源讀取文件。 * @param filePath 從網(wǎng)絡(luò)資源讀取文件地址 * @return */ @GetMapping("etl/read/url-file") public String readUrl(@RequestParam String filePath) { // 從網(wǎng)絡(luò)資源讀取文件。 Resource resource = new UrlResource(filePath); List<Document> documents = new TikaDocumentReader(resource) .get(); return documents.get(0).getContent(); }
2.2 轉(zhuǎn)換文檔
Document對象是ETL Pipeline的核心對象,它包含了文檔的元數(shù)據(jù)和內(nèi)容。
內(nèi)容轉(zhuǎn)換器:
TokenTextSplitter:可以把內(nèi)容切割成更小的塊方便RAG的時候提升響應(yīng)速度節(jié)省Token。
ContentFormatTransformer:可以把元數(shù)據(jù)的內(nèi)容變成鍵值對字符串。
元數(shù)據(jù)轉(zhuǎn)換器:
SummaryMetadataEnricher:使用大模型總結(jié)文檔。會在元數(shù)據(jù)里面增加一個summary字段。
KeywordMetadataEnricher:使用大模型提取文檔關(guān)鍵詞。可以在元數(shù)據(jù)里面增加一個keywords字段。
/** * 將文本內(nèi)容劃分成更小的塊。 * @param file 附件信息 * @return */ @SneakyThrows @PostMapping("etl/transform/split") public List<String> split(@RequestParam MultipartFile file) { // 從IO流中讀取文件 TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream())); // 將文本內(nèi)容劃分成更小的塊 List<Document> splitDocuments = new TokenTextSplitter() .apply(tikaDocumentReader.get()); return splitDocuments.stream().map(Document::getContent).toList(); }
在這個例子中,split
方法會將每個 Document
對象的內(nèi)容切割成更小的塊,并返回一個新的 Document
對象列表。
2.2 存儲文檔
根據(jù)以上步驟,就將文檔切割各個塊,然后就可以將其存儲到向量數(shù)據(jù)庫中了
/** * 嵌入文件 * * @param file 待嵌入的文件 * @return 是否成功 */ @PostMapping("save/file/vectorStore") public Boolean saveFileVectorStore(@RequestParam MultipartFile file) { // 從IO流中讀取文件 TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream())); // 將文本內(nèi)容劃分成更小的塊 List<Document> splitDocuments = new TokenTextSplitter() .apply(tikaDocumentReader.get()); // 存入向量數(shù)據(jù)庫,這個過程會自動調(diào)用embeddingModel,將文本變成向量再存入。 elasticVectorStore.add(splitDocuments); return true; }
到此這篇關(guān)于Spring AI 文檔的提取、轉(zhuǎn)換、加載的文章就介紹到這了,更多相關(guān)Spring AI 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java隨機(jī)驗(yàn)證碼生成實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了java隨機(jī)驗(yàn)證碼生成實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05在Java的Struts框架中ONGL表達(dá)式的基礎(chǔ)使用入門
這篇文章主要介紹了深入解析在Java的Struts框架中ONGL表達(dá)式的基礎(chǔ)使用入門,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11Java設(shè)計(jì)模式之原型模式詳細(xì)解讀
這篇文章主要介紹了Java設(shè)計(jì)模式之原型模式詳細(xì)解讀,原型模式屬于創(chuàng)建型設(shè)計(jì)模式,用于創(chuàng)建重復(fù)的對象,且同時又保證了性能,該設(shè)計(jì)模式的好處是將對象的創(chuàng)建與調(diào)用方分離,需要的朋友可以參考下2023-12-12兩萬字詳解Java Sring String的常見操作以及StringBuffer StringBuilder的區(qū)別
本篇文章帶你認(rèn)識Sring、String的常見操作和StringBuffer 與StringBuilder的區(qū)別(字符串詳解),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09