0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Redis和Spring Ai构建rag应用程序

虹科网络可视化技术 2024-04-29 08:04 次阅读

随着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 caseJsonReader loader = new JsonReader(file, "name", "abv", "ibu", "description");// Use the autowired VectorStore to insert the documents into RedisvectorStore.add(loader.get());

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

五、RAGService

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

计算用户提示的向量

查询Redis数据库,检索最相关的文档

使用检索到的文档和用户提示构建一个提示信息

使用提示调用聊天客户端以生成响应

public Generation retrieve(String message) { SearchRequest request = SearchRequest.query(message).withTopK(topK); // Query Redis for the top K documents most relevant to the input message List docs = store.similaritySearch(request); Message systemMessage = getSystemMessage(docs); UserMessage userMessage = new UserMessage(message); // Assemble the complete prompt using a template Prompt prompt = new Prompt(List.of(systemMessage, userMessage)); // Call the autowired chat client with the prompt ChatResponse response = client.call(prompt); return response.getResult();}

六、Controller

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

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

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

七、用户界面

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

036c3cec-05bc-11ef-9118-92fbcf53809c.png

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AI
    AI
    +关注

    关注

    87

    文章

    27442

    浏览量

    265122
  • spring
    +关注

    关注

    0

    文章

    334

    浏览量

    14205
  • Redis
    +关注

    关注

    0

    文章

    366

    浏览量

    10553
收藏 人收藏

    评论

    相关推荐

    什么是RAGRAG学习和实践经验

    高级的RAG能很大程度优化原始RAG的问题,在索引、检索和生成上都有更多精细的优化,主要的优化点会集中在索引、向量模型优化、检索后处理等模块进行优化
    的头像 发表于 04-24 09:17 312次阅读
    什么是<b class='flag-5'>RAG</b>,<b class='flag-5'>RAG</b>学习和实践经验

    Redis开源版与Redis企业版,怎么选用?

    点击“蓝字”关注我们数以千计的企业和数以百万计的开发人员Redis开源版来构建应用程序。但随着用户数量、数据量和地区性的增加,成本、可扩展性、运营和可用性等问题也随之而来。Redis
    的头像 发表于 04-04 08:04 380次阅读
    <b class='flag-5'>Redis</b>开源版与<b class='flag-5'>Redis</b>企业版,怎么选用?

    Redis为LangChain定制AI代理——OpenGPTs

    OpenAI最近推出了OpenAIGPTs——一个构建定制化AI代理的无代码“应用商店”,随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一款低代码的开源框架,专用
    的头像 发表于 01-13 08:03 653次阅读
    用<b class='flag-5'>Redis</b>为LangChain定制<b class='flag-5'>AI</b>代理——OpenGPTs

    redis容器内怎么查看redis日志

    redis是一款流行的开源内存数据库,常用于缓存、消息队列、任务管理等场景。在使用redis时,了解如何查看redis日志对于排查问题、监控性能和分析应用程序行为非常重要。在本文中,我
    的头像 发表于 12-05 10:10 1930次阅读

    redis的哨兵和集群有什么区别

    Redis是一个开源的内存数据库,被广泛用于构建高性能和可扩展的应用程序。在使用Redis时,有两种常见的架构模式:哨兵和集群。虽然这两种模式都有助于提高可用性和性能,但它们在设计和实
    的头像 发表于 12-04 14:53 2120次阅读

    redis和rabbitMQ的区别

    Redis和RabbitMQ是两个流行的开源消息传递技术,用于构建高可靠、可扩展和可扩展的应用程序。虽然它们都用于实现消息传递机制,但它们在设计和运作方式上存在一些不同之处。在本文中,我们将详细讨论
    的头像 发表于 12-04 14:48 547次阅读

    如何在Spring Boot应用程序中整合ZXing库

    在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序中整合ZXing库,以创建和解析QR码。
    的头像 发表于 12-03 17:39 814次阅读

    Spring依赖注入的方式

    Spring 是一个开源的轻量级框架,可以用于构建企业级应用程序。其最重要的特性之一是依赖注入(Dependency Injection,DI),这是一种设计模式,它可以帮助我们解耦代码、提高
    的头像 发表于 11-22 15:12 305次阅读

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解决方案,用于构建分布式系统。它提供了一系列的组件和模块,可以帮助开发人员轻松地构建可扩展、高可用、高性能的分布式
    的头像 发表于 11-16 10:58 463次阅读

    Spring布能用来搭建基础架构吗

    Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它利用 Spring 框架的强大功能,使得基础架构的搭建变得更加简单、轻量级、易于维护。在本文中,我们将详细讨
    的头像 发表于 11-16 10:56 261次阅读

    Spring Boot 的设计目标

    Spring 框架复杂的XML配置。使用 Spring Boot 可以很容易创建一个独立运行的、基于 Spring 的生产级应用程序,而且Spri
    的头像 发表于 10-13 14:56 409次阅读
    <b class='flag-5'>Spring</b> Boot 的设计目标

    Spring Boot Actuator快速入门

    使用的框架基本上都要升级到 2.x了吧。 什么是 Actuator ? 从本质上讲, Spring Boot Actuator 为我们的应用程序带来了生产就绪的功能。监控我们的应用程序,收集指标,了解流量,或者是
    的头像 发表于 10-09 17:11 427次阅读

    Gradle构建的多模块Spring Boot项目

    0. 前言 相比起 Maven 的 XML 配置方式,Gradle 提供了一套简明的 DSL 用于构建Java 项目,使我们就像编写程序一样编写项目构建脚本。 本文将从无到有创建一个用 Gradle
    的头像 发表于 09-25 14:46 1388次阅读
    Gradle<b class='flag-5'>构建</b>的多模块<b class='flag-5'>Spring</b> Boot项目

    创建端到端零售愿景AI应用程序

    使用 NVIDIA DeepStream 和 NVIDIA TAO 工具包构建端到端零售分析应用程序
    的头像 发表于 07-05 16:30 296次阅读
    创建端到端零售愿景<b class='flag-5'>AI</b><b class='flag-5'>应用程序</b>

    构建一个移动应用程序

    电子发烧友网站提供《构建一个移动应用程序.zip》资料免费下载
    发表于 07-04 14:33 0次下载
    <b class='flag-5'>构建</b>一个移动<b class='flag-5'>应用程序</b>