艾体宝案例 | 使用Redis和Spring Ai构建rag应用程序

随着AI技术的不断进步,开发者面临着如何有效利用现有工具和技术来加速开发过程的挑战。Redis与Spring AI的结合为Java开发者提供了一个强大的平台,以便快速构建并部署响应式AI应用。探索这一整合如何通过简化的开发流程,让开发者能够更专注于创新而非底层实现。

一、Spring AI简介

由大型语言模型(LLM)驱动的应用程序中,向量数据库常作为人工智能应用程序的核心存储技术。此类数据库需要支持语义搜索,并为LLM提供相关的上下文环境。

在此之前,通过Spring和Redis来构建人工智能应用程序的选项还相对有限。而最近,Redis作为一种高性能的向量数据库方案,现已引起广泛关注。Spring社区推出了一个名为Spring AI的新项目,旨在简化人工智能应用程序特别是那些涉及向量数据库的应用的开发流程。

下面将介绍如何使用Redis作为向量数据库构建一个Spring AI应用程序,实现检索增强生成(RAG)工作流。

二、检索增强生成

检索增强生成(RAG)是一种结合数据与人工智能模型的技术方法。在RAG工作流中,首先需要将数据加载入向量数据库(例如Redis)。接收到用户查询后,向量数据库会检索出一组与查询相似的文档。这些文档将作为解答用户问题的上下文,并结合用户的查询,通常通过人工智能模型来生成响应。

本例中,我们将利用一个包含各类啤酒信息的数据集进行演示,数据集中包含啤酒的名称、酒精含量(ABV)、国际苦味单位(IBU)和描述等属性。该数据集将被加载到Redis中,以展示RAG工作流的实际应用。

三、代码和依赖关系

可以在GitHub上找到Spring AI和Redis演示的全部代码。

本项目使用了Spring Boot作为Web应用程序的启动依赖项,并结合了Azure OpenAI和Spring AI Redis。

四、数据加载

我们的应用程序将采用提供啤酒信息的JSON文档作为数据来源。每个文档的结构如下:

{"id": "00gkb9","name": "Smoked Porter Ale","description": "The Porter Pounder Smoked Porter is a dark rich flavored ale that is made with 5 malts that include smoked and chocolate roasted malts. It has coffee and mocha notes that create a long finish that ends clean with the use of just a bit of dry hopping","abv": 8,"ibu": 36
}

为了将啤酒数据集加载到 Redis 中,我们将使用 RagDataLoader 类。该类包含一个方法,在应用程序启动时执行。在该方法中,我们使用一个 JsonReader 来解析数据集,然后使用自动连接的 VectorStore 将文档插入 Redis。

// Create a JSON reader with fields relevant to our use case
JsonReader loader = new JsonReader(file, "name", "abv", "ibu", "description");
// Use the autowired VectorStore to insert the documents into Redis
vectorStore.add(loader.get());

至此,我们得到了一个包含约 22,000 种啤酒及其相应嵌入的数据集。

五、RAG Service

RagService 类实现了 RAG 工作流程。当收到用户提示时,会调用 retrieve 方法,执行以下步骤:

  1. 计算用户提示的向量
  2. 查询 Redis 数据库,检索最相关的文档
  3. 使用检索到的文档和用户提示构建一个提示信息
  4. 使用提示调用聊天客户端以生成响应
public Generation retrieve(String message) {SearchRequest request = SearchRequest.query(message).withTopK(topK);// Query Redis for the top K documents most relevant to the input messageList<Document> docs = store.similaritySearch(request);Message systemMessage = getSystemMessage(docs);UserMessage userMessage = new UserMessage(message);// Assemble the complete prompt using a templatePrompt prompt = new Prompt(List.of(systemMessage, userMessage));// Call the autowired chat client with the promptChatResponse response = client.call(prompt);return response.getResult();
}

六、Controller

现在我们已经实现了 RAG 服务,可以将其封装在 HTTP 端点中。

RagController 类将服务作为 POST 端点公开:

@PostMapping("/chat/{chatId}")
@ResponseBody
public Message chatMessage(@PathVariable("chatId") String chatId, @RequestBody Prompt prompt) {// Extract the user prompt from the body and pass it to the autowired RagServiceGeneration generation = ragService.retrieve(prompt.getPrompt());// Reply with the generated messagereturn Message.of(generation.getOutput().getContent());
}

七、用户界面 

在用户界面方面,创建一个简单的 React 前端,允许用户提出有关啤酒的问题。前端通过向 /chat/{chatId} 端点发送 HTTP 请求并显示响应来与 Spring 后端交互。

仅通过简单的几个类,我们就用 Spring AI 和 Redis 实现了一个 RAG 应用程序。

若要更进一步,我们建议您查看 Github 上的示例代码。将 Redis 的高效和易用性与 Spring AI 提供的便捷抽象相结合,Java 开发人员使用 Spring 构建响应式 AI 应用程序将变得更加容易。

有关向量数据库的更多信息,欢迎与我们沟通交流~

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

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

相关文章

大核注意力 LKA | Visual Attention Network

论文名称&#xff1a;《Visual Attention Network》 论文地址&#xff1a;2202.09741 (arxiv.org) 尽管最初是为自然语言处理任务而设计的&#xff0c;但自注意力机制最近在各个计算机视觉领域迅速崭露头角。然而&#xff0c;图像的二维特性给计算机视觉中的自注意力应用带来了…

【Vue】组件化编程

定义 实现应用中局部功能代码和资源的集合 为什么要用组件化编程? 传统方式编写:依赖关系混乱,不好维护,且代码复用率不高 模块化编写:只关注解决js,复用js,简化js的编写与效率 组件方式编写:好维护、复用率更高、提高运行效率 在组件出现之前,我们开发基本都是用htm…

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

修复所有 bug 并不能解决所有问题

原文&#xff1a;jeffpsherman - 2024.04.08 在软件领域&#xff0c;如同在制造业&#xff0c;有些问题是由于 bug 或“特殊原因”引发的&#xff0c;而有些则是“常见原因”&#xff0c;这是由于系统设计和实现的性质所导致的。修复 bug 就是移除特殊原因&#xff0c;消除 bu…

基于SpringBoot的合家云社区物业管理平台 - 项目介绍

合家云社区物业管理平台 2.合家云需求&设计 2.1 项目概述 2.1.1 项目介绍 合家云社区物业管理平台是一个全新的 ”智慧物业解决方案“&#xff0c;是一款互联网的专业社区物业管理系统。平台通过社区资产管理、小区管理、访客管理、在线报修、意见投诉等多种功能模块&a…

指针笔试题模拟

题目一 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 1*&#xff08;a1&#xff09;可以等价于a[1],即第一个打印的是数组第二个下标的元素&#xff1a;2 2 而ptr拿到的是整个数组的地…

C语言之详细讲解文件操作

什么是文件 与普通文件载体不同&#xff0c;文件是以硬盘为载体存储在计算机上的信息集合&#xff0c;文件可以是文本文档、图片、程序等等。文件通常具有点三个字母的文件扩展名&#xff0c;用于指示文件类型&#xff08;例如&#xff0c;图片文件常常以KPEG格式保存并且文件…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

C#利用IDbCommand实现通用数据库脚本执行程序

目录 关于 ExecuteNonQuery 数据库脚本程序的执行流程 范例运行环境 通用类的设计 引用 DAL类 实现代码 小结 关于 ExecuteNonQuery 在.net 应用中&#xff0c;在数据库中执行脚本程序是经常用到的功能&#xff0c;如数据操作&#xff08;新增、修改、删除等&#xff0…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

github two-factor authentication是个啥?

最近在逛github时&#xff0c;总是时不时会弹出一下界面&#xff0c;很烦 看到红框里的文字&#xff0c;这明显是强制要求做这个认证&#xff0c;如果不认证4天后账号将不可访问&#xff0c;所以今天花点时间看看怎么做这个认证&#xff0c;点“Enable 2FA now”进入这个界面&a…

普通用户执行source报错,sudo: source:找不到命令的解决方案

一、问题描述 当修改/etc/profile文件&#xff08;环境变量&#xff09;后&#xff0c;想让该环境变量立刻生效。需要执行source命令。命令如下&#xff1a; sudo source /etc/profile 执行这个后&#xff0c;不像别人的执行成功&#xff0c;反而报错了。错误信息如下&#…

linux下安装anaconda

顺手点个关注吧&#xff0c;谢谢&#xff01; 一、下载安装包 https://repo.anaconda.com/archive/ 或者使用命令 wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh2.赋予权限并安装 # 给文件执行权限 chmod 777 Anaconda3-5.3.1-Linux-x86_64.sh# 执…

商汤研究院招大模型实习生

商汤研究院招大模型实习生&#xff0c;base上海、北京&#xff0c;400/day。福利&#xff1a;每天50租房补贴&#xff0c;20的餐补。晚上8点之后回去有额外的25元晚餐餐补&#xff0c;10点之后回去可以免费用滴滴。 组内的大模型工作大概分两个方向&#xff1a; 1.3B、3B等小…

基于opencv的单目相机标定

openCv版本&#xff1a;4.4.0 从源码处拷贝标定代码出来使用&#xff0c;需要拷贝samples/cpp/tutorial_code/calib3d/camera_calibration 需要的文件如下&#xff1a; -rw-rw-r-- 1 rog rog 28490 Jul 18 2020 camera_calibration.cpp -rw-rw-r-- 1 rog rog 3152 Jul 18 …

判断前端入参是否空否则提示前端写法

vue2中 前端先声明一个变量&#xff0c;用于alert判断 在templeat中定义一个提示语句 然后在点击事件时判断一下是否展示

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

python数据可视化:集中趋势统计堆叠柱状图barplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 集中趋势统计 堆叠柱状图 barplot() [太阳]选择题 请问关于以下代码表述错误的选项是&#xff1f; import seaborn as sns import matplotlib.pyplot as plt im…

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library

pip install cx_Oracleimport cx_Oracle 再导入该模块进行数据库连接的时候报错 这个错误表明您的Python环境是64位的&#xff0c;但是您尝试使用的Oracle客户端库&#xff08;oci.dll&#xff09;是32位的 根据官方给出的文档进行查看 cx_Oracle 8 Installation — cx_Ora…

Rancher 应用商店离线环境使用

前言 Rancher (v2.5 ) 应用商店可以方便的安装 Helm3 构建的应用&#xff0c;并且支持私有 helm 应用仓库&#xff0c;方便了内网离线环境下的使用。本文以内网离线环境为前提、以 MySQL 5.7.43 版本为应用举例&#xff0c;从零开始手把手教你如何制作并应用。 1、环境准备 1.…