《史上最简单的SpringAI+Llama3.x教程》-03-ETL pipeline解决RAG文件处理问题

news2024/9/17 9:22:06

在企业内部构建基于大型语言模型(LLM)的应用程序时,数据的提取、转换和加载(ETL)过程至关重要。Spring AI 提供了一个集成的框架,可以简化这一过程,特别是在使用 LLM 进行检索增强生成(RAG)时。以下是如何将 Spring AI 与 ETL 管道集成的基本步骤:

  1. 数据提取:使用 Spring AI 提供的 DocumentReader 来读取不同格式的文档,如文本、JSON、PDF 等。这些阅读器负责从原始数据源中提取内容,并将其转换为可以被 LLM 处理的格式。
  2. 数据转换DocumentTransformer 用于转换提取的数据,确保数据的格式统一,并进行必要的元数据增强。例如,可以使用 KeywordMetadataEnricherSummaryMetadataEnricher 来从文档中提取关键词和摘要,以增强检索能力。
  3. 数据加载:转换后的数据可以通过 DocumentWriter 加载到向量数据库中,以便 LLM 可以检索和使用这些数据来生成响应。VectorStore 是一个常用的实现,它支持存储向量数据,便于进行相似性搜索。

在实施 ETL 管道时,可以利用 Spring AI 提供的现成组件和工具,这些组件和工具经过设计,可以协同工作,简化数据处理流程。

此外,Spring AI 的模块化设计允许开发者根据具体需求选择合适的组件,并根据应用程序的规模进行扩展。

SpringAI ETL设计

ETL 管道主要有三个组件:

  • 文档加载DocumentReader实现Supplier<List<Document>>
  • 文档转换DocumentTransformer实现Function<List<Document>, List<Document>>
  • 写出数据DocumentWriter实现Consumer<List<Document>>

要构造简单的 ETL 管道,您可以将每种类型的实例链接在一起。

在这里插入图片描述

文档提取Loader

文档的加载在SpringAI中提供了多种文件加载工具,如下:

  • Json加载器:JsonReader
  • 文本加载器:TextReader
  • PDF加载器:PagePdfDocumentReader段落PdfDocumentReader
  • 三方工具:TikaDocumentReader

测试文件:【免费】易车实战学习Langchain开发配套文档附件资源

加载Json文件

可以使用此reader加载Json格式的文件,代码如下所示:

/**
 * 加载Json文档
 *
 * @return 文档内容
 */
@GetMapping("/json")
List<Document> loadJsonAsDocuments() {
    // 加载文件
    Resource resource = new ClassPathResource("etl.json");
    // 创建reader对象
    JsonReader jsonReader = new JsonReader(resource);
    // 获取内容
    return jsonReader.get();
}

加载文本

可以使用此reader加载txt格式的文件,代码如下所示:

/**
 * 加兹文本文件内容
 *
 * @return 文本内容
 */
@GetMapping("/text")
List<Document> loadText() {
    // 创建加载
    TextReader textReader = new TextReader(new ClassPathResource("etl.txt"));
    // 获取内容
    return textReader.read();
}

加载文件档(PDF, DOC/DOCX, PPT/PPTX, HTML

/**
 * 使用tika加载PDF, DOC/DOCX, PPT/PPTX, and HTML等文件
 * @return 文件内容
 */
@GetMapping("/file")
List<Document> loadFile() {
    TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new ClassPathResource("汽车销售话术.pdf"));
    return tikaDocumentReader.read();
}

文件转换Transform

在springai中所有的文件处理工具,都实现于DocumentTransformer接口,如下所示:

  • TokenTextSplitter:拆分文档,同时保留令牌级完整性。
  • ContentFormatTransformer(内容格式转换器):确保所有文档的内容格式统一。
  • KeywordMetadataEnricher(关键字MetadataEnricher):使用基本关键字元数据扩充文档。
  • SummaryMetadataEnricher(摘要元数据丰富):使用摘要元数据丰富文档,以增强检索能力。

在这里插入图片描述

基于上面提到的案例,文件加载之后,咱们继续使用transform工具对文件内容进行切分处理:

/**
 * 1. 加载PDF内容
 * 2. 文本进行切分
 *
 * @return
 */
@GetMapping("/file")
List<?> fileContentProcess() {
    TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new ClassPathResource("汽车销售话术.pdf"));
    List<Document> documentList = tikaDocumentReader.read();
    if (CollectionUtil.isEmpty(documentList)) {
        return Collections.EMPTY_LIST;
    }
    return new TokenTextSplitter().apply(documentList);
}

如果想要控制切分的Chunk size和分隔符的话,可以在创建TokenTextSplitter进行设置。

public class TokenTextSplitter extends TextSplitter {
    // The target size of each text chunk in tokens
    private int defaultChunkSize = 800;
    // The minimum size of each text chunk in characters
    private int minChunkSizeChars = 350;
    // Discard chunks shorter than this
    private int minChunkLengthToEmbed = 5;
    // The maximum number of chunks to generate from a text
    private int maxNumChunks = 10000;
    private boolean keepSeparator = true;

    public TokenTextSplitter(int defaultChunkSize, int minChunkSizeChars, int minChunkLengthToEmbed, int maxNumChunks,
          boolean keepSeparator) {
       this.defaultChunkSize = defaultChunkSize;
       this.minChunkSizeChars = minChunkSizeChars;
       this.minChunkLengthToEmbed = minChunkLengthToEmbed;
       this.maxNumChunks = maxNumChunks;
       this.keepSeparator = keepSeparator;
    }
    // ...
}

文件向量化存储

此部分内容,下节详细说明。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman 接口测试工具简易使用指南

一、Postman是什么? 我通过kimi问了这样一个问题&#xff0c;它给我的回答是这样的: 它的回答也算比较中规中矩&#xff0c;简单的说postman实际上就是一款接口测试工具&#xff0c;同时它还可以编写对应的测试脚本以及自动生成对应的API文档&#xff0c;结合我的习惯来说&am…

Springboot处理跨域请求

文章目录 概要同源策略跨域问题复现解决跨域方法1方法2方法3 jwt拦截器验证token防止请求存在缓存 概要 跨域请求&#xff08;Cross-Origin Requests&#xff09;指的是在一个网页中加载的资源来自与当前网页不同的域、协议或端口。浏览器出于安全考虑&#xff0c;默认会限制这…

Mybatis超级方便操作数据方式(注解+封装mapper接口)!!!

Mybatis作为一个流行的持久层框架&#xff0c;其优化了Java程序与数据库的交互过程。它的核心在于使用Mapper接口与XML映射文件或注解绑定来实现对数据库的操作。这种方式不仅简化了数据库操作&#xff0c;还提升了开发效率&#xff0c;使得开发者可以从繁琐的JDBC代码中解放出…

索引排序以及explain

标题 explain函数typekeyextrarows 索引排序 前言&#xff0c;如无特殊提醒&#xff0c;默认建立如下索引。 explain函数 type type列反映了访问类型。表示mysql如何找到数据。访问类型有很多种&#xff0c;从全表扫描到索引扫描、范围扫描、唯一索引查询、常数引用等。这里列…

Oracle <left> join on where 先过滤还是先join

一、left join onon条件是在生成临时表时使用的条件&#xff0c;它不管on中的条件是否为真&#xff0c;都会返回左边表中的记录。 二、left join on and&#xff08;1&#xff09;如果and语句是对左表进行过滤的&#xff0c;那么不管真假都不起任何作用。&#xff08;2&#x…

视频剪辑免费素材哪里能找到?

在创作视频时&#xff0c;素材的选择至关重要。为了让您的项目更具吸引力和专业性&#xff0c;我整理了8个剪辑必备素材网站&#xff0c;它们提供了丰富多样的资源&#xff0c;从高清视频到优质音乐&#xff0c;应有尽有。让我们一起探索这些资源丰富、质量上乘的平台&#xff…

倍思开放式耳机佩戴舒服吗?南卡、倍思、QCY三款热门产品测评!

​放式蓝牙耳机已然成为年轻族群的新风尚&#xff0c;就连不少中老年朋友也偏爱在公园漫步时佩戴它们。这些耳机在娱乐、学习、健身、办公等多元化场景中展现出强大的实用性。作为一名数码博主和耳机狂热粉&#xff0c;我最近一直收到不少小伙伴的私信&#xff0c;想让我测评一…

reaConverter(图片格式转换工具) Pro v7.819 中文授权版

reaConverter是一款图片文件格式转换工具&#xff0c;它支持480多种不同的文件格式。使用reaConverter可以轻松的转换一批图片文件&#xff0c;也可以对其进行编辑和优化。 软件功能&#xff1a; 1. 图片文件格式转换&#xff1a;支持将JPEG、PNG、GIF、TIFF、BMP等格式的图片…

java多线程, 该如何处理异常?

目录 如何处理线程运行时异常 UncaughtExceptionHandler 没有注入 未捕捉异常处理器, 线程是如何处理异常的? 看的时候, 希望自己能在idea中跟着ctrl 鼠标左键, 点一遍. . . 如何处理线程运行时异常 先来了解一下java的异常: 在Java中&#xff0c;异常&#xff08;Excep…

fastjson-流程分析

参考视频&#xff1a;fasfjson反序列化漏洞1-流程分析 分析版本 fastjson1.2.24 JDK 8u65 分析过程 新建Person类 public class Person {private String name;private int age;public Person() {System.out.println("constructor_0");}public Person(String na…

API调度

API调度 什么是API什么是HTTP请求如何使用影刀API流程创建密钥获取token启动应用 如何通过代码调用影刀API下载requests库准备工作搭建框架获取token&#xff08;鉴权&#xff09;转换请求为json调用函数按照键名进行提取 获取应用查询状态结束流程 什么是API 什么是HTTP请求 如…

[极客大挑战 2019]Http1

打开题目 鼠标右键查看源码看看有外部链接 点击氛围&#xff0c;弹出新页面 修改请求头 得到flag 说只读&#xff0c;然后改

Java 反射(reflex)

反射理解 反射解析 Java 的反射机制是指在运行状态中。对于任意一个类&#xff0c;都能知道这个类的属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它的任意一个方法&#xff1b; 这种动态获取信息以及动态调用对象方法的功能称为 java 的反射机制。 正射…

Python .whl 独立安装和全部依赖安装命令

以安装 Flask 为例&#xff1a; 1. 独立安装 pip install whl_files/Flask-1.1.2-py2.py3-none-any.whl 2. 安装 Flask 全部依赖包和自己 cd /path/to/flask/1.0 pip install --no-index --find-links/path/to/downloaded/files Flask1.1.2 cd /path/to/flask/2.0 pip install …

55533

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月20日 最后&#xff1a; 十分感谢你可以耐着性子把它读完和我可以坚持写到这里&#xff0c;送几句话&#xff0c;对你&#xff0c;也对我&#xff1a; 1.一个冷知识&#xff1a; …

mysql数据和备份

mysql备份和恢复和日志管理&#xff08;配置文件当中的设置&#xff09; 备份的目的是什么 备灾 在生产环境中&#xff0c;数据的安全性非常重要 造成数据丢失的原因 1、程序出错 2、人为问题 3、磁盘故障。 备份的分类 物理备份&#xff1a;对磁盘或者文件直接进行备…

敢不敢跟我一起搭建一个Agent!不写一行代码,10分钟搞出你的智能体!纯配置也能真正掌握AI最有潜力的技术?AI圈内人必备技能

说一千道一万&#xff0c;不如实地转一转。学了那么久的AI Agent的概念了&#xff0c;是时候该落地一个Agent看看自己的掌握程度了对不对&#xff0c;我们都理解大脑是自动节能的&#xff0c;但是知识的确需要倒逼自己一把才能真的掌握&#xff0c;不瞒大家说&#xff0c;笔者对…

植物精灵大战僵尸(合体版),一款塔防+合体玩法的游戏

一款塔防合体玩法的游戏&#xff0c;本作在原先经典植物战僵尸玩法的基础上&#xff0c; 完美加入合体进化玩法。完美破解&#xff0c;支持飞行模式&#xff0c; 理论上支持所有运营商&#xff0c;进入付费页面直接点确定或者返回就能完成破解&#xff0c; 移动卡真机测试&a…

Vue3+TypeScript+printjs 实现标签批量打印功能

前言&#xff1a;临时性需求没怎么接触过前端&#xff0c;代码实现有问题及优化点希望大佬可以留言告知一下 开发工具&#xff1a;VS CODE 界面开发&#xff1a;Vue3TypeScriptElementPlus 打印组件&#xff1a;Print-JS 前端打印入口图&#xff1a; 标签页面&#xff1a; …

电气数字化能为企业带来哪些助力?

本文主要从“电气行业概况” 和 “电气数字化核心价值”2个方面&#xff0c;为大家全方位解答“电气数字化能为企业带来哪些助力&#xff1f;” 一、电气行业概况 总体而言&#xff0c;我国电气行业是规模体量巨大的基础产业&#xff0c;目前存在平均效益不高、生产及交易效率…