<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 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应用程序。废话少说,直接进入正题,让我们直接开始吧!
先决条件- JDK — Java开发工具包(JDK) 17 或更高版本
- Oracle Database Free Release 23ai — 容器版本
- Oracle JDBC 驱动程序 23ai (23.4.0.24.05) — Maven 中央仓库
- 您喜欢的 Java IDE — Eclipse,, IntelliJ,, VS Code
- Apache Maven
如果你查看下载链接,你会看到它作为一个 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.java和PdfDataExtractor.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等。敬请关注!
参考文献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 免费层!
共同学习,写下你的评论
评论加载中...
作者其他优质文章