【spring ai】java 实现RAG检索增强,超快速入门

rag结果

rag 需求产生的背景介绍:

在使用大模型时,一个常见的问题是模型会产生幻觉(即生成的内容与事实不符),同时由于缺乏企业内部数据的支持,导致其回答往往不够精准和具体,偏向于泛泛而谈。这些问题限制了大模型直接应用于特定业务场景的效果。通过引入RAG (Retrieval-Augmented Generation)机制,可以结合外部知识库或私有数据源来提高生成内容的准确性和相关性,有效缓解上述问题。

基于spring ai来做rag的优势介绍

我们使用了Spring AI来做检索增强,因为过去用Java写AI应用时面临的主要困境是没有标准的封装。现在Spring推出了Spring AI,它提供了一套可以兼容市面上主要生成任务的接口,极大地方便了开发工作。Spring AI不仅支持阿里云的通义大模型等服务,还能够通过简单的配置切换不同的AI提供商,使得开发者可以更加专注于业务逻辑而无需过多关注底层实现细节。这种标准化和模块化的设计,让Spring AI成为了构建AI应用程序的理想选择。

Spring AI alibaba介绍

Spring AI Alibaba 是一个针对 Spring AI 的实现,基于阿里云百炼系列云产品提供大模型接入。它主要支持包括对话、文生图、文生语音等在内的多种生成式AI功能,并且能够兼容市面上大部分基于流的机器人模型。通过使用 Spring AI Alibaba,开发者可以轻松地将这些强大的AI能力集成到自己的Java应用程序中。其核心优势在于提供了统一且标准化的接口来访问不同的AI服务提供商(如OpenAI、Azure和阿里云),从而减少了因切换不同服务商而带来的开发工作量。此外,Spring AI Alibaba 还支持通过简单的配置即可调整使用的具体模型,比如用于绘画或图像生成的通义万象模型,极大简化了AI应用开发流程。

检索增强的后端代码编写

为了通过检索增强的方式读取一个阿里巴巴的财务报表PDF,并对外提供服务,基于提供的知识内容,首先需要理解RAG(检索增强生成)的基本概念和技术实现。这里采用的是阿里云百炼平台与Spring AI Alibaba集成的技术栈来完成这个需求。下面将详细介绍具体的配置和代码实现步骤。

一、环境准备

  1. 确保JDK版本:必须使用JDK 17或更高版本。
  2. Spring Boot版本:项目应基于Spring Boot 3.3.x 版本。
  3. 获取API Key:访问阿里云百炼页面,按照指引开通“百炼大模型推理”服务后创建并保存好API key。
  4. 设置环境变量:在你的开发环境中设置AI_DASHSCOPE_API_KEY为刚才获得的API key值。
  5. 项目依赖配置
    • 添加额外的Maven仓库以支持spring ai alibaba starter 的引入。
    • 在pom.xml中加入spring ai alibaba starter以及指定Spring Boot的父级项目。
<repositories><repository><id>sonatype-snapshots</id><url>https://oss.sonatype.org/content/repositories/snapshots</url><snapshots><enabled>true</enabled></snapshots></repository><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository>
</repositories><dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M2.1</version></dependency><!-- Spring Boot Parent --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version></parent>...other dependencies...
</dependencies>

二、服务端代码实现

根据上述配置完成后,接下来是具体的服务端逻辑编写,主要包括构建索引和查询两个部分。

1. 构建索引

此步骤用于从给定的PDF文件中提取文档数据并将其转换为向量存储到VectorStore中。只需要首次运行时调用一次。

public String buildIndex() {String filePath = "/path/to/your/alibaba_financial_report.pdf";DocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);List<Document> documentList = reader.get();vectorStore.add(documentList);return "SUCCESS";
}
2. 提供查询接口

客户端可通过GET请求向/ai/steamChat发送消息参数input,服务器将返回基于上下文信息生成的回答。

@GetMapping("/steamChat")
public Flux<String> generate(@RequestParam("input") String message, HttpServletResponse httpResponse) {StreamResponseSpec chatResponse = ragService.queryWithDocumentRetrieval(message);httpResponse.setCharacterEncoding("UTF-8");return chatResponse.content();
}

三、启动应用并测试

完成以上步骤后,启动Spring Boot应用。第一次运行时,请先访问http://localhost:8080/ai/buildIndex来初始化索引。之后就可以通过访问http://localhost:8080/ai/steamChat?input=您的问题来进行问答了。

这样,我们就完成了基于RAG技术对阿里巴巴财务报告PDF文件的处理,并且能够通过简单的HTTP接口进行交互式问答。

检索增强的前端代码编写

基于我了解的信息中的内容,我们将使用React构建一个前端项目,该项目能够通过流式方式从前端向后端发送请求,并接收后端返回的flux<String>数据。根据题目要求,后端接口URL为http://localhost:8080/ai/steamChat?input=…,该接口会返回基于检索增强生成的内容。

构建并配置React项目

首先,确保你的开发环境已经安装了Node.js和npm(或yarn)。然后按照以下步骤创建一个新的React应用:

npx create-react-app frontend
cd frontend
npm install

此命令将帮助你快速搭建起基础的React项目结构,并自动安装所有必需的依赖项。

接下来,在public/index.html中保持默认设置即可,因为这个文件主要用于定义基本HTML文档结构。

修改关键组件

src/App.js中引入我们即将编写的聊天组件ChatComponent

import React from 'react';
import ChatComponent from './components/ChatComponent';function App() {return (<div className="App"><ChatComponent /></div>);
}export default App;

然后,我们需要重点实现src/components/ChatComponent.js,这是整个交互的核心所在。在这个组件里,我们将实现输入框、发送消息按钮以及展示从服务器接收到的消息的功能。

import React, { useState } from 'react';function ChatComponent() {const [input, setInput] = useState('');const [messages, setMessages] = useState('');const handleInputChange = (event) => {setInput(event.target.value);};const handleSendMessage = async () => {if (!input.trim()) return; // 确保不发送空消息try {const response = await fetch(`http://localhost:8080/ai/steamChat?input=${encodeURIComponent(input)}`);if (!response.ok) throw new Error('Network response was not ok');const reader = response.body.getReader();const decoder = new TextDecoder('utf-8');let done = false;while (!done) {const { value, done: readerDone } = await reader.read();done = readerDone;const chunk = decoder.decode(value, { stream: true });setMessages((prevMessages) => prevMessages + chunk);}// 请求完成后添加换行符以区分不同对话setMessages((prevMessages) => prevMessages + '\n\n=============================\n\n');} catch (error) {console.error('Failed to fetch', error);} finally {setInput(''); // 清除输入框}};const handleClearMessages = () => {setMessages('');};return (<div><inputtype="text"value={input}onChange={handleInputChange}placeholder="Enter your message"/><button onClick={handleSendMessage}>Send</button><button onClick={handleClearMessages}>Clear</button><div><h3>Messages:</h3><pre>{messages}</pre></div></div>);
}export default ChatComponent;

这里的关键点在于如何处理流式响应。我们使用了fetchAPI来发起请求,并利用TextDecoder解码每个读取的数据块。每次获取到新数据时,我们都更新状态变量messages,以便于实时显示最新消息。

运行项目

最后,启动你的React应用程序:

npm start

这将打开本地开发服务器,默认监听端口3000。你可以通过浏览器访问http://localhost:3000查看效果。

小结

上述过程展示了如何利用现代Web技术栈结合Spring AI Alibaba提供的流式接口功能,快速构建一个简单的支持流输出的聊天应用程序。用户界面非常直观,允许用户输入文本并通过点击“Send”按钮发送给后端进行处理,而前端则负责动态地展示接收到的信息。这样的设计非常适合需要即时反馈的应用场景,比如在线客服系统或智能助手等。

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

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

相关文章

STM32 实现 TCP 服务器与多个设备通信

目录 一、引言 二、硬件准备 三、软件准备 四、LWIP 协议栈的配置与初始化 五、创建 TCP 服务器 1.创建 TCP 控制块 2.绑定端口 3. 进入监听状态 4.设置接收回调函数 六、处理多个客户端连接 七、数据处理与通信管理 八、错误处理与资源管理 九、总结 一、引…

【C++】:工厂模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 简单工厂模什么是简单工厂模式&#xff1f;如何实现简单工厂模式&#xff1f; 工厂方法抽象工厂模式总结简单工厂模式工厂方法抽象工厂「Abstract Factory」 简单工厂模 什么是简单工厂模式&#xf…

ps提示不能使用移动工具,因为目标通道被隐藏的解决办法

解决&#xff1a;按F7&#xff0c;或者从窗口把图层打开 按图示找到快速蒙版图层。它可能被隐藏或以特殊图标显示。右键删除或者拖到右下角垃圾桶里

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

从融资烧钱到商业落地:中国AI大模型步入「实战期」

在AI还尚且未达到生产力工具的时候&#xff0c;没人能知道怎样的基础模型会是尽头&#xff0c;以及对付费客户而言&#xff0c;他们如何才能将这笔投入转化为真实营收。 而对于大模型究竟什么能盈利&#xff0c;目前国内的任何一家都未表过态。或者说&#xff0c;这不是一个当…

从0开始深度学习(11)——多层感知机

前面介绍了线性神经网络&#xff0c;但是线性模型是有可能出错的&#xff0c;因为线性模型意味着是单调假设&#xff0c;但是现实中往往很复杂。例如&#xff0c;我们想要根据体温预测死亡率。 对体温高于37摄氏度的人来说&#xff0c;温度越高风险越大。 然而&#xff0c;对体…

MySQL插入优化-性能对比

插入优化主要包括&#xff1a; 批量插入条数据&#xff0c;而不是单个记录逐条插入。手动提交事务&#xff0c;避免自动提交事务带来的额外开销。使用load命令从本地文件导入。 性能对比 创建数据库表 CREATE TABLE if not exists tb_sku ( id int(20) …

facefusion,使用CPU实现一键图片、视频换脸,无需显卡,无限时长(附下载即用的整合包)

FaceFusion 是一种利用人工智能技术将两张或多张人脸融合在一起的图像处理技术。这种技术通过面部特征的识别和重构&#xff0c;将不同的人脸混合成一张新的脸&#xff0c;生成的图像看起来像是这些人脸的融合体。 FaceFusion使用深度学习算法&#xff0c;来捕捉人脸的细节和特…

OpenCV答题卡识别

文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理&#xff08;1&#xff09;高斯模糊、边缘检测&#xff08;2&#xff09;轮廓检测&#xff08;3&#xff09;透视变换&#xff08;4&#xff09;阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

目标检测作为计算机视觉领域的一项核心任务&#xff0c;极大地推动了整个领域的发展。它不仅是其他许多视觉任务的基础工具&#xff0c;还在学术研究和实际应用之间架起了一座桥梁。目标检测的主要任务是识别和定位图像或视频中的特定对象&#xff0c;通常需要模型能同时处理多…

C++ | Leetcode C++题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; class Solution { public:int findComplement(int num) {int highbit 0;for (int i 1; i < 30; i) {if (num > (1 << i)) {highbit i;}else {break;} }int mask (highbit 30 ? 0x7fffffff : (1 << (hig…

【DBA Part01】国产Linux上安装Oracle进行数据迁移

内容如下&#xff1a; 1.1.生产环境RHEL/OEL Linux8Oracle11gR2安装配置 1.2.国产麒麟操作系统Oracle11gR2安装配置 1.3.国产麒麟操作系统Oracle11gR2 RAC集群安装配置 1.4.Oracle11gR2迁移到国产麒麟操作系统&#xff08;单机/RAC&#xff09; 本阶段课程项目需求说明&am…

零一万物 Yi-Lightning:超越 GPT-4o 冲击全球榜单;阿里国际 Marco 翻译大模型发布丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 …

CEEMDAN +组合预测模型(Transformer - BiLSTM + ARIMA)

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现&#xff08;一&#xff09;EMD-CSDN博客 EMD、EEM…

具备技术二:正则表达式

一、C正则库 regex 用于报文的解析。 使用接口&#xff1a;bool regex_match(const string &src, smatch &matches, regex &e); src&#xff1a;要解释的字符串。 smatch&#xff1a;一个类似于数组的结构&#xff0c;用于存储一个个解释之后的字符串。 matche…

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议&#xff0c;提供了可靠、有序的数据传输&#xff0c;是多个广泛使用的表示层协议的运行基础&#xff0c;相对于UDP来说&#xff0c;TCP需要经过三次握手后才能建立连接&#xff0c;建立连接后才能进行数据传输&#xff0c;所以效率差了…

Android -- [SelfView] 多动画效果图片播放器

Android – [SelfView] 多动画效果图片播放器 效果&#xff08;录制的有点卡&#xff09; 1. 引用&#xff1a; <com.nepalese.virgolib.widget.image.BaseImageViewandroid:id"id/base_image"android:layout_width"match_parent"android:layout_heigh…

AD画图的使用

一、新建工程 二、绘制原理图 1、原理图搜索方法&#xff1a; https://www.ti.com/lit/ds/symlink/tlv1117.pdf?ts1729143086540&ref_urlhttps%253A%252F%252Fwww.mouser.tw%252F www.alldatasheet.com 2、绘图步骤&#xff1a; 注&#xff1a;管脚四点朝外

2024软考网络工程师笔记 - 第5章.无线通信网

文章目录 移动通信与 5G1️⃣移动通信2️⃣移动通信制式3️⃣5G 应用场景与关键技术 &#x1f551;WLAN 通信技术1️⃣WLAN 通信技术 &#x1f552;WLAN 频谱与信道&#xff08;高频考点&#xff09;1️⃣WLAN 网络分类2️⃣ISM频段3️⃣不重叠信道&#xff08;重点&#xff09…

uniapp 省、市、区、乡镇 数据层级选择插件 Ba-DataPicker

Ba-DataPicker 是一款uniapp数据层级选择弹窗插件。支持省市区乡四级&#xff1b;支持自定义数据。 支持省、市、区、乡镇四级支持自定义数据支持字母检索 截图展示 支持定制、本地包、源码等&#xff0c;有建议和需要&#xff0c;请点击文章结尾“Uniapp插件开发”联系我&am…