Oracle 数据库 23ai - AI 矢量搜索
Oracle Database 23ai(23.4+)的 AI 矢量搜索功能作为 Spring AI 版本提供VectorStore帮助你存储文档嵌入并进行相似性搜索。当然,其他所有功能也都可用。
| Run Oracle Database 23ai 本地附录展示了如何用轻量级 Docker 容器启动数据库。 |
自动配置
|
春季AI自动配置、起始模块的工件名称发生了重大变化。 更多信息请参阅升级说明。 |
首先,将Oracle Vector Store启动启动依赖添加到你的项目中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-oracle</artifactId>
</dependency>
或者去你的Gradlebuild.gradle构建文件。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-oracle'
}
如果你需要这个向量存储来初始化模式,那么你需要通过 true来初始化模式在相应构造函数中设置布尔参数,或通过设置…initialize-schema=true在application.properties文件。
| 这是一个颠覆性的变革!在早期版本的 Spring AI 中,这种模式初始化是默认的。 |
向量存储还需要嵌入模型实例用于计算文档的嵌入。
你可以选择其中一种可用的嵌入模型实现。
例如,要使用 OpenAI EmbeddingModel,可以在你的项目中添加以下依赖关系:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
或者去你的Gradlebuild.gradle构建文件。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-openai'
}
连接并配置OracleVectorStore你需要为你的数据库提供访问权限。
可以通过 Spring Boot 提供简单的配置application.yml
spring:
datasource:
url: jdbc:oracle:thin:@//localhost:1521/freepdb1
username: mlops
password: mlops
ai:
vectorstore:
oracle:
index-type: IVF
distance-type: COSINE
dimensions: 1536
| 查看配置参数列表,了解默认值和配置选项。 |
现在你可以自动接线OracleVectorStore在你的申请中并加以利用:
@Autowired VectorStore vectorStore;
// ...
List<Document> documents = List.of(
new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
new Document("The World is Big and Salvation Lurks Around the Corner"),
new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));
// Add the documents to Oracle Vector Store
vectorStore.add(documents);
// Retrieve documents similar to a query
List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
配置属性
你可以在 Spring Boot 配置中使用以下属性来自定义OracleVectorStore.
| 属性 | 描述 | 默认值 |
|---|---|---|
|
最近邻搜索索引类型。选项包括 |
没有 |
|
搜索距离类型 注意:如果矢量已归一化,你可以使用 |
余弦 |
|
允许在插入前和相似性搜索前启用向量归一化(如果为真)。 注意:将此设置为 true 是允许搜索请求相似度阈值的必要条件。 注意:如果矢量已归一化,你可以使用 |
false |
|
嵌入维度。如果没有明确指定,OracleVectorStore 将允许的最大值为:65535。尺寸在创建表时设置为嵌入列。如果你更改了尺寸,也得重新创建表格。 |
65535 |
|
启动时会丢弃现有的表格。 |
false |
|
是否初始化所需的模式。 |
false |
|
在索引存在时,表示请求的准确目标。默认为禁用。你需要提供一个整数,范围为[1,100]以覆盖默认索引精度(95)。使用较低的准确率可以实现近似相似性搜索,在速度与准确性之间进行权衡。 |
-1 ( |
元数据过滤
你可以利用通用的、可移植的元数据过滤器OracleVectorStore.
例如,你可以使用以下文本表达式语言:
vectorStore.similaritySearch(
SearchRequest.builder()
.query("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression("author in ['john', 'jill'] && article_type == 'blog'").build());
或者程序化地使用滤波。表达DSL:
FilterExpressionBuilder b = new FilterExpressionBuilder();
vectorStore.similaritySearch(SearchRequest.builder()
.query("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression(b.and(
b.in("author","john", "jill"),
b.eq("article_type", "blog")).build()).build());
这些滤波表达式被转换为等价的OracleVectorStore过滤器。 |
手动配置
你可以手动配置OracleVectorStore.
为此你需要添加Oracle JDBC驱动,Jdbc模板对你的项目进行自动配置依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-oracle-store</artifactId>
</dependency>
| 请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。 |
要配置OracleVectorStore在你的应用中,你可以采用以下设置:
@Bean
public VectorStore vectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel embeddingModel) {
return OracleVectorStore.builder(jdbcTemplate, embeddingModel)
.tableName("my_vectors")
.indexType(OracleVectorStoreIndexType.IVF)
.distanceType(OracleVectorStoreDistanceType.COSINE)
.dimensions(1536)
.searchAccuracy(95)
.initializeSchema(true)
.build();
}
本地运行Oracle Database 23ai
docker run --rm --name oracle23ai -p 1521:1521 -e APP_USER=mlops -e APP_USER_PASSWORD=mlops -e ORACLE_PASSWORD=mlops gvenzl/oracle-free:23-slim
然后你可以通过以下方式连接到数据库:
sql mlops/mlops@localhost/freepdb1
访问本地客户端
Oracle 向量存储实现提供了对底层原生 Oracle 客户端的访问(OracleConnection)通过getNativeClient()方法:
OracleVectorStore vectorStore = context.getBean(OracleVectorStore.class);
Optional<OracleConnection> nativeClient = vectorStore.getNativeClient();
if (nativeClient.isPresent()) {
OracleConnection connection = nativeClient.get();
// Use the native client for Oracle-specific operations
}
原生客户端允许你访问Oracle 专属的功能和作,这些可能不会通过VectorStore接口。