为了账号安全,请及时绑定邮箱和手机立即绑定

基于Spring AI、Oracle Database 23ai和OpenAI的检索增强生成(RAG)应用详解

<a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/index.html" title="Oracle数据库23AI">Oracle Database 23AI</a>

分享自 Juarez Junior

介绍

正如你可能已经听说的那样,Oracle 发布了 Oracle 23ai 数据库,这是一个免费且功能齐全的 Oracle 数据库,同时也是业界领先的产品。

Oracle Database 23c 现包含使用 AI 向量的语义搜索功能。该功能集称为 Oracle AI 向量搜索,包括一个新的向量数据类型、向量索引以及向量搜索 SQL 操作符,使 Oracle Database 能够将文档、图像及其他非结构化数据的语义内容存储为向量,并利用这些向量快速创建 生成式 AI 应用程序。

这些新功能还支持一种叫做“检索增强生成(RAG)”的技术,这项技术是一种突破性的生成式AI技术,它结合了大型语言模型(LLMs)和业务数据,从而能提供更准确的答案来回答自然语言提出的业务问题。

Oracle Database 23ai

请查看这篇博客文章,了解更多关于为什么Oracle AI向量检索如此强大的内容。更多详情请参阅《什么是向量搜索?终极指南》。

Spring AI(一个与Spring相关的AI项目) 是 Spring 框架生态系统中的一个令人兴奋的新成员。它提供了一个强大的 API,并且封装了与诸如 OpenAI、Cohere 等各种 GenAI 提供商交互的复杂性,以解决如聊天、文本转图像和嵌入模型等常见问题。

使用 Spring AI 时,保持了 Spring 生态系统的设计原则,即可移植性和模块化设计这一点,并将普通的Java对象(POJO)作为AI应用程序中的构建块推广。这样,普通的Java对象(POJO)被推广为AI应用程序中的构建块。

最后但肯定不是最不重要的,OpenAI就不用介绍了。基本上人人都知道OpenAI和它的热门产品ChatGPT。我会教你如何用Spring AI与OpenAI的模型互动——例如一个聊天模型(gpt-4o)和一个嵌入模型(text-embedding-3-small),这些模型会用来生成向量嵌入和聊天回复。

这篇博客文章提供了一个快速入门,介绍如何使用Spring AI、Oracle数据库23AI及其JDBC驱动程序、OpenAI构建RAG应用程序。废话少说,直接进入正题,让我们直接开始吧!

先决条件 Oracle数据库2023AI

如果你查看下载链接,你会看到它作为一个 Linux x64 RPM包(OL8 或 RHEL8)提供。所以,如果你是一名使用 Windows 或 macOS 的 Java 开发者,你可能在想如何试用一下它。

好消息是,该容器镜像也可以在 Oracle 容器注册表 (OCIR) 上找到,你可以用它来安装并测试其强大的功能。让我们在 Windows 上快速轻松地试一试。首先,请运行以下的 docker pull 命令:

    docker pull container-registry.oracle.com/database/free:latest

下载Oracle数据库免费版本的最新镜像

现在你可以运行以下 docker images 命令来确认它被正确拉取。如下所示:
``docker images```

Oracle Database 23ai—容器镜像

然后,在 Windows 命令行(CMD)运行以下命令。

docker run -d -p 1521:1521 -e ORACLE_PWD=<your_password> -v oracle-volume:/opt/oracle/oradata container-registry.oracle.com/database/free:latest
注释:此命令用于启动一个Docker容器,运行Oracle数据库的免费版本。通过 -d 参数使容器在后台运行, -p 1521:1521 参数映射端口, -e ORACLE_PWD=<your_password> 参数设置Oracle数据库的密码环境变量, -v oracle-volume:/opt/oracle/oradata 参数挂载数据卷。请将 <your_password> 替换为实际的密码。
提示:确保将 <your_password> 替换为实际的密码。

请将上述的 < your password> 替换为你选择的实际密码。此命令会启动一个新的持久化数据库容器,数据将在容器的整个生命周期内保存。

如果一切正常,你可以运行命令 docker ps -al 来检查你的容器实例是否正常启动。

容器状态:正在启动中

请留意,当 STATUS 字段显示为 'healthy' 时,Oracle Database 23ai 即可开始使用,如下。

容器状态:正常

如果您想通过配置环境变量来支持连接信息(例如用户名、密码等变量),还有些额外的选项配置。您还可以查看可能想要使用的特定数据库用户身份(如_SYS、SYSTEM、PDBADMIN)的详细信息。

如果你想探索这些选择,请访问Oracle 容器注册表(OCIR)的相关容器镜像页面。

现在你的数据库已经安装好了!我们接下来可以从这两个工具SQL Developer和Java来访问它。

连接到 Oracle 数据库 23c 吧

下一步是连接到Oracle Database 23ai并执行所需的DDL命令。请参阅此博客文章,了解如何操作。该文章详细介绍了如何使用IntelliJ IDEA工具完成此操作。

另外,您还可以使用Oracle SQL Developer这款免费工具,它能简化Oracle数据库在传统和云环境下的开发和管理,或者使用任何其他您偏好的工具。

SQL: DDL脚本

只要一切配置正确,现在你可以连接到你的Oracle Database 23ai实例上,并执行下面的SQL DDL 脚本。请注意占位符 _<YOUR_DBPASSWORD>,并用我们的数据库密码将其替换。

    -- 管理员   
    创建用户 VECTOR_USER 由 <YOUR_DB_PASSWORD> 身份验证 在 USERS 上分配无限制的配额;    
    授予 VECTOR_USER DB_DEVELOPER_ROLE 权限;    
    授予 VECTOR_USER 创建会话的权限;    
    授予 VECTOR_USER 在 SCHEMA VECTOR_USER 上选择任何表的权限;    
    将当前模式设置为 VECTOR_USER;    
    -- 作为 VECTOR_USER  
    创建表 VECTOR_USER.VECTOR_STORE (ID VARCHAR2(64) 主键, METADATA VARCHAR(256), CONTENT CLOB, VECTOR_DATA VECTOR(1536, FLOAT64));

你可以用描述信息的命令查看表的详细信息,如下:

查看VECTOR_USER的VECTOR_STORE。

春季AI应用

现在,我将介绍与GenAI相关的几个基本概念,让Java开发人员能够利用Oracle数据库、Oracle AI向量搜索、Spring AI和OpenAI模型来实现一个具体的GenAI相关用例,正如本篇博客开篇所述。

你将学会如何通过实现RAG(检索增强生成)系统,增强现有大型语言模型(LLM)的上下文信息,并为你的应用程序添加相关的业务内容。

这篇文章不会教你所有关于Spring AI的知识,因为官方文档非常详尽,而且还有详细的Javadoc文档可以参考。

不过,我们将探索应用程序的基本组件,并为每个组件提供最重要的细节,以及相应的代码片段

这些细节将使您了解应该期望 RAG 应用执行什么操作,以及其他关于配置 Spring AI 应用程序的细节,包括 Oracle Database 23ai 和 OpenAI 的连接设置。

下面,我们来看看我们的application.properties (应用程序配置文件)文件,这个文件是用来配置Spring应用的。

application.properties

上面提到的部分包含了OpenAI的API密钥,它将允许Spring AI与OpenAI的模型进行交互。获取API密钥的说明在这里:这里。请注意,我在Windows上把它设置成了环境变量。

第二个部分包含通常的Oracle数据库连接信息,包括JDBC URL和凭证(同样,凭证已配置为环境变量)以及用于使用UCP(通用连接池)并替换HikariCP的额外属性。更多详情请参阅我之前写的一篇博客文章

第三个特性是关于使用Java虚拟线程的,这是一项有趣的功能,因为它可以帮助你优化应用程序及其资源利用率。

再次查看这篇博客以了解更多关于JDBC中的Virtual Threads的信息,以及Broadcom Spring团队列出的几篇相关博客文章,了解Spring框架中轻量级Virtual Threads的相关内容。

用虚拟线程可能是一个唾手可得的机会,但看你具体的应用程序情况,你得看看它是否真的可行。

可以在这里找到SpringAiOracleDb23aiRag.java (保留原名为 "SpringAiOracleDb23aiRag.java")文件:

这里没有花招哦,这个类拥有一个主要的入口点,用来从Java主方法启动并运行Spring应用程序,就像平时一样。

SpringAiOracleDb23aiRag.java

OracleDatabaseVectorStoreConfig.java // Oracle数据库向量存储配置文件文件

再次地,这是一个带有另一个典型Spring 配置注解的简单类。不过要注意,它创建了一个自定义的向量存储器实例,即 OracleDatabaseVectorStore.java

这样的自定义实现遵循了 Spring AI 中由 org.springframework.ai.vectorstore.VectorStore 接口定义的约定,该接口定义了向量数据库中的文档管理和查询操作。关于这种实现的更多内容将在接下来的章节中介绍。

OracleDatabaseVectorStoreConfig.java

Oracle数据库控制器(OracleDatabaseController) (Oracle数据库控制器Java文件)

一个控制器类,它提供了一个REST接口,该接口带有类似于(_/_ragpage)这样的URI,用于展示一个简单的页面来收集用户输入提示,然后调用相应的向量搜索接口方法,该方法再由其相应的服务方法来处理调用。

OracleDatabaseController.java

OracleDatabaseVectorService.java "Oracle数据库向量服务Java文件"

具有RAG交互实现功能的服务类实现,包含启动执行相似度搜索的方法以及输入提示。

OracleDatabaseVectorService.java

OracleDatabaseVectorStore.java 该文件是一个用于存储向量数据的Oracle数据库存储库实现。

这个类实现了一个自定义的Spring AI的VectorStore接口,实际向量存储实现是基于Oracle数据库23ai提供的Oracle AI向量搜索功能,并提供了支持向量和相似性搜索的核心功能。

工具类

最后,有两个辅助类支持自定义向量存储实现:RAG 内容提取步骤中的辅助类和向量搜索功能的辅助类。它们分别是OracleDistanceType.javaPdfDataExtractor.java。前者定义了 Oracle 距离度量,这些度量支持相似性搜索;后者帮助从样本 PDF 文件中提取非结构化数据内容。

运行 Spring AI 应用

切换到你的项目根目录,并像平常一样运行下面的 Maven 命令行,如下所示。下面是一个例子。

请在命令行中输入以下命令:

    cd **<您的WORKSPACE根目录路径>**\spring-ai-oracle-rag-oai  
    mvn clean package   
    mvn spring-boot:run

注意:mvn spring-boot:run 是一个特定的 Maven 命令,用于启动 Spring Boot 应用程序。

您会看到Spring AI应用记录的一些消息,这些消息指示PDF文档处理步骤,并且最后会有一条信息意味着您的应用启动成功。

mvn spring-boot:run

要确认这一点,你可以运行下面的 SQL 语句,来查看实际的向量表示是否符合预期。

从VECTOR_USER数据库的VECTOR_STORE表中选择VECTOR_DATA

现在你可以进行最后一步了,试试应用吧!

测试应用——输入提示信息

我们首先通过直接调用OpenAI来测试应用程序,也就是说,我们将直接与目标大规模语言模型(聊天)进行交互,而不涉及RAG及其通常提供的增强信息上下文。打开您的浏览器,使用此URL访问应用程序 http://localhost/direct

你会看到下面的页面,提供 Oracle 作为数据库,输入问题 Oracle Database 23ai 是什么?,点击 Ask Now! 按钮。

直接访问 — SpringAI + OpenAI(无RAG)— [http://localhost/direct]

你将会被引导到一个页面,上面是LLM的回答;但是请注意,它提到的是Oracle Database 23c而不是23ai。这是因为LLM通常无法实时跟进最新的信息,所以GPT-4o模型还不知道Oracle Database 23ai的发布情况,当时给出的答案是关于23c的,这在某种程度上是有些不准确的。

LLM关于Oracle Database 23c(而不是Oracle Database 23ai)的回答:

现在,让我们来进行一个涉及RAG(检索增强生成)的互动,并利用我们导入的PDF文档来增强互动的背景以及相关的聊天内容。

再打开你的网页浏览器,输入网址 http://localhost/**ragpage** 访问应用程序,主页面就会显示出来。

RAG(PDF)调用 — SpringAI(Oracle数据库向量存储) + OpenAI + Oracle数据库23ai http://localhost/ragpage

再次提交关于提供的样本PDF文件中内容的问题。现在要使用的问题是 Oracle Database 23ai 对 Java 开发者来说有什么新功能或内容? - 请注意,这个问题现在特别针对 Oracle Database 23ai。再次点击 Ask Now! 按钮。

我们现在得到了一个非常有意义且与Oracle Database 23 AI相关的答案,如下所示。

为了验证这一点,让我们选择其中一个返回的主题,比如 OJVM 对 FIPS 的支持(如前所述),打开这个 PDF 文件,其位于 /src/main/resources/pdf/Whats in OracleDB23ai for Java Developers.pdf,并查找相关的技术内容。

你会看到它确实也是PDF文件中包含的话题之一。

关于 Oracle JavaVM 支持 FIPS 的内容,请参阅《Whats-in-OracleDB23ai-for-Java-Developers.pdf》。

另外需要注意的是,你在使用页面时得到的答案也会以日志消息的形式显示在终端中。

日志信息 — OpenAI 的回复

收尾

就这样。现在你可以使用Spring的人工智能服务、OpenAI、JDBC和Oracle Database 23来创建应用程序了!

希望你喜欢这篇博客。很快我就会分享更多使用其他GenAI库和框架的例子,比如LangChain4J等。敬请关注!

参考文献

Spring AI

Oracle AI 向量搜索(Vector Search).

Oracle Database 23ai 的文档页面

Oracle Database Free Release 23ai — 容器镜像
链接地址: https://container-registry.oracle.com/ords/ocr/ba/database/free

Oracle®数据库JDBC Java API参考,版本号23ai

Oracle JDBC 驱动 23 (23.4.0.24.05) — Maven 中央

开发指南:Oracle JDBC的Maven Central指南

开发使用Oracle数据库的Java应用(https://www.oracle.com/database/technologies/appdev/jdbc.html)

Oracle 开发人员和 Oracle OCI 免费层级

加入我们的Oracle Developers频道在Slack,一起讨论Java、JDK、JDBC、GraalVM、使用Spring Boot、Helidon、Quarkus、Micronaut的微服务、响应式流、云、DevOps、基础设施即代码(IaC)和其他相关话题!

在 Oracle 云上构建、测试和部署您的应用程序,免费!免费获取 OCI 免费层

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消