【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>
      <input
        type="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.mfbz.cn/a/890700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Selenium实现滑动滑块验证码验证!

背景&#xff1a;在部分的登录中有滑动验证码的验证&#xff0c;由于滑动验证码的缺块是随机的就导致实现起来比较困难&#xff01; 01、实现方案 模板匹配 通过openCV分析两个图片的相似度&#xff0c;获取两个相似度很高图片的坐标&#xff0c;从而计算两个图片的距离。 轮…

基础sql

在执行删除操作之前&#xff0c;建议先运行一个 SELECT 查询来确认你要删除的记录。这可以帮助你避免误删数据。 删除字段id默认值为空字符串的所有数据 delete from users where id ; 删除字段id默认值为null的所有数据 delete from users where id is null; 删除字段upd…

数据容器(序列)的切片

1.数据容器&#xff1a;列表&#xff0c;元组&#xff0c;字符串 2..切片可以提取序列中的片段或整个序列 ##切片的格式为&#xff1a;变量名[ 起始位置:停止位置&#xff1a;步数] #起始位置为序列首位时可省略不写&#xff0c;停止位置为序列尾部时也如此&#xff0c;##停止…

多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量

一、背景 由于不同项目对jdk版本的要求不同&#xff0c;有些是要求jdk11&#xff0c;有些只需要jdk8即可。 而linux机器上安装jdk的方式又多种多样&#xff0c;最后导致jenkins打包到底使用的是哪个jdk&#xff0c;比较混乱。 1、java在哪 > whereis java java: /usr/bin/…

sql实战解析-sum()over(partition by xx order by xx)

该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 从简单开始一步一步讲&#xff0c; 1、sum( )over( ) 对所有行进行求和 2、sum(…

第二十五:IP网络层的数据,IP数据报

在数据链路层传输的数据叫帧&#xff0c;帧是数据链路层的传输单元。 那么在IP网络层的数据也有一个叫法IP数据报。 IP数据报 IP数据报首部 数据。 数据是传输层传递过来的报文&#xff1b;IP数据报首部格式如下&#xff1a; IP 报头的最小长度为 20 字节&#xff0c;上图…

打造爆款店铺:eBay、Temu、亚马逊卖家如何借助测评提升流量转销量?

无论是eBay还是在亚马逊、沃尔玛、Temu、速卖通、敦煌网、shopee、lazada平台上&#xff0c;流量是店铺获得曝光和销售的关键因素之一。提高店铺流量意味着能够吸引更多的买家浏览和关注&#xff0c;从而增加销售机会。那么&#xff0c;在eBay、Temu、亚马逊店铺中如何有效地提…

大模型还能让我们望梅止渴多久?

大模型梦碎的时间点似乎越来越近。过去一周&#xff0c;有关人工智能的消息糟糕多于积极。 周初&#xff0c;诺贝尔物理学奖和化学奖接连砸向时下正热的人工智能领域。这些奖项出人意料且鼓舞人心&#xff0c;意味着人工智能的确已经根本性地改变了我们生活和科学体系的方方面…

这是我见过最全LLM大模型基础知识学习汇总,建议收藏!

关于如何入门LLM&#xff0c;大多数回答都提到了调用API、训练微调和应用。但是大模型更新迭代太快&#xff0c;这个月发布的大模型打榜成功&#xff0c;仅仅过了一个月就被其他模型超越。训练微调也已经不是难事&#xff0c;有大量开源的微调框架&#xff08;llamafactory、fi…

大模型本地部署教程 | 搭建本地AI问答系统

前言 大家好&#xff0c;因为对AI大模型很感兴趣&#xff0c;相信很多兄弟们跟我一样&#xff0c;所以最近花时间了解了一些&#xff0c;有一些总结&#xff0c;分享给大家&#xff0c;希望对各位有所帮助。 本文将讲解如何在本地搭建一个简易的AI问答系统&#xff0c;主要用j…

【网络】【Linux】多路转接技术

多路转接技术 文章目录 1.select1.1select系统调用及参数介绍1.2select基本工作流程1.3select技术实现echo服务器1.4select优缺点1.5select的适用场景 2.poll&#xff08;了解&#xff09;2.1poll系统调用及参数介绍2.2poll技术实现echo服务器2.3poll优缺点 3.epoll3.1epoll系…

探索 ES6 生成器 ( Generator ) 的异步编程应用

一. 前言 在之前的文章中&#xff0c;我们介绍了生成器函数的基本概念和常见应用&#xff0c;包括异步操作的顺序执行、控制异步流程等&#xff0c;同时也了解到 Promise 和生成器结合的应用可以帮助我们更方便地处理异步操作。详细了解请参考之前的文章&#xff1a; 学习 ES…

前端Vue3字体优化三部曲(webFont、font-spider、spa-font-spider-webpack-plugin)

前端Vue字体优化三部曲&#xff08;webFont、font-spider、spa-font-spider-webpack-plugin&#xff09; 引言 最近前端引入了UI给的思源黑体字体文件&#xff0c;但是字体文件过于庞大&#xff0c;会降低页面首次加载的速度&#xff0c;目前我的项目中需要用到如下三个字体文…

Java 8 的内存结构

Java8内存结构图 虚拟机内存与本地内存的区别 Java虚拟机在执行的时候会把管理的内存分配成不同的区域&#xff0c;这些区域被称为虚拟机内存&#xff0c;同时&#xff0c;对于虚拟机没有直接管理的物理内存&#xff0c;也有一定的利用&#xff0c;这些被利用却不在虚拟机内存…

每天3分钟,彻底弄懂神经网络的优化器(十)Nadam

1. Nadam算法的提出 Nadam&#xff08;Nesterov-accelerated Adaptive Moment Estimation&#xff09;算法是由Tim Salimans et al. 在2016年提出的。这一算法结合了Adam算法和Nesterov Accelerated Gradient&#xff08;NAG&#xff09;算法的优点&#xff0c;旨在提高优化算…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后&#xff0c;需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后&#xff0c;运行git push origin main&#xff0c;发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

MySQL中表的约束

1&#xff0c;概念 表中一定要有各种约束&#xff0c;通过约束&#xff0c;让我们来插入数据库中的数据是符合预期的。 约束本质是通过技术手段&#xff0c;倒逼程序员插入正确的数据&#xff1b;反过来&#xff0c;站在MySQL的角度来单&#xff0c;内部已经插进来的数据&…

即插即用hilo注意力机制,捕获低频高频特征

题目&#xff1a;Fast Vision Transformers with HiLo Attention 论文地址: https://arxiv.org/abs/2205.13213 创新点 HiLo自注意力机制&#xff1a;作者提出了一种新的自注意力机制&#xff0c;称为HiLo注意力&#xff0c;旨在同时捕捉图像中的高频和低频信息。该方法通过…

通信工程学习:什么是SPI串行外设接口

SPI&#xff1a;串行外设接口 SPI&#xff0c;即串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种由Motorola公司首先在其MC68HCXX系列处理器上定义的同步串行接口技术。SPI接口主要用于微控制器&#xff08;MCU&#xff09;与外部设备之间…

1. 到底什么是架构

1. 什么是架构 定义&#xff1a;架构&#xff0c;又名软件架构&#xff0c;是有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各个方面的设计优秀架构的特点&#xff1a;优秀的性能、超强的TPS/QPS的承载能力、高可用决定了你能够支撑多少PV的流量 2. 什么…