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

    文章

    30072

    浏览量

    268331
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14307
  • Redis
    +关注

    关注

    0

    文章

    371

    浏览量

    10843
收藏 人收藏

    评论

    相关推荐

    使用OpenVINO和LlamaIndex构建Agentic-RAG系统

    RAG 系统的全称是 Retrieval-augmented Generation,本质上是 Prompt Engineering,通过在 Prompt 中注入检索得到的外部数据,可以有效地
    的头像 发表于 10-12 09:59 193次阅读
    使用OpenVINO和LlamaIndex<b class='flag-5'>构建</b>Agentic-<b class='flag-5'>RAG</b>系统

    使用OpenVINO GenAI API在C++中构建AI应用程序

    许多桌面应用程序是使用 C++ 开发的,而将生成式AI(GenAI)功能集成到这些应用程序中可能会很具有挑战性,尤其是因为使用像 Hugging Face 这样的 Python 库的复杂性。C++
    的头像 发表于 10-12 09:36 294次阅读
    使用OpenVINO GenAI API在C++中<b class='flag-5'>构建</b><b class='flag-5'>AI</b><b class='flag-5'>应用程序</b>

    英特尔软硬件构建模块如何帮助优化RAG应用

    软硬件构建模块如何帮助优化RAG应用,在简化部署和支持扩展的同时,增强其上下文感知能力和实时响应性能。 1 为您的应用量身定制GenAI ChatGPT的面世改变了AI的发展格局。企业争相利用这项新技术
    的头像 发表于 07-24 15:12 379次阅读
    英特尔软硬件<b class='flag-5'>构建</b>模块如何帮助优化<b class='flag-5'>RAG</b>应用

    什么是RAGRAG学习和实践经验

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

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

    点击“蓝字”关注我们数以千计的企业和数以百万计的开发人员Redis开源版来构建应用程序。但随着用户数量、数据量和地区性的增加,成本、可扩展性、运营和可用性等问题也随之而来。Redis
    的头像 发表于 04-04 08:04 944次阅读
    <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 805次阅读
    用<b class='flag-5'>Redis</b>为LangChain定制<b class='flag-5'>AI</b>代理——OpenGPTs

    如何构建linux开发环境和编译软件工程、应用程序

    前文介绍了如何使用官方提供的镜像文件启动开发板,本文将说明如何构建linux开发环境和编译软件工程、应用程序
    的头像 发表于 01-03 12:31 1923次阅读
    如何<b class='flag-5'>构建</b>linux开发环境和编译软件工程、<b class='flag-5'>应用程序</b>

    redis容器内怎么查看redis日志

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

    redis容器部署并用编程演示sb整合

    Redis,并通过编程演示 Spring Boot 如何整合 RedisRedis 容器部署 Redis 可以通过容器部署,我们可以使
    的头像 发表于 12-05 10:08 381次阅读

    redis和rabbitMQ的区别

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

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

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

    springboot自动配置的原理介绍

    Spring Boot是一个开源的Java框架,用于构建独立的、基于微服务的应用程序。它的最大特点是自动配置,能够根据应用程序的依赖库和配置文件,智能地自动配置
    的头像 发表于 12-03 15:12 888次阅读

    Spring MVC的工作原理

    Spring MVC是一种基于Java的Web应用程序框架,它采用了Model-View-Controller(MVC)设计模式来分离应用程序的不同方面。Spring MVC的工作原理
    的头像 发表于 12-03 11:49 743次阅读

    springboot和springmvc区别

    Spring Boot和Spring MVC是两个相关但又不同的概念。Spring MVC是Spring框架中用于构建Web
    的头像 发表于 11-22 17:06 2267次阅读

    Spring依赖注入的方式

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