spring-ai-alibaba 1.0.0.2 学习(十一)——向量存储扩展包
摘要:Spring AI-Alibaba新增了四种阿里云向量存储(AnalyticDB、OceanBase、OpenSearch、Tair),以OceanBase为例展示了接入流程:1)添加依赖;2)配置数据库连接;3)通过@Autowired注入OceanBaseVectorStore调用add()和similaritySearch()方法。其实现包含配置属性类、自动装配类等核心组件,存储时先向
在之前学习spring-ai时,盘点过spring-ai相关向量存储包(spring-ai 1.0.0 学习(九)——jar包盘点_spring ai 1.0包-CSDN博客)
虽然spring-ai支持的向量存储有20+种,但是大多是国外比较流行的向量存储,所以spring-ai-alibaba新增了四个自家的向量存储jar包——analyticdb、oceanbase、opensearch、tair
简单样例
我们以oceanbase为例,看一下如何接入
第一步:添加依赖
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-store-oceanbase</artifactId>
</dependency>
第二步:启动数据库并添加配置
spring:
ai:
vectorstore:
oceanbase:
enabled: true
url: ${OCEANBASE_URL}
username: ${OCEANBASE_USERNAME}
password: ${OCEANBASE_PASSWORD}
tableName: table_name
enabled默认为false,需要设置为true才会开启
第三步:代码调用
@Autowired
private OceanBaseVectorStore oceanBaseVectorStore;
@GetMapping("/import")
public void importData() {
List<Document> documents = List.of(new Document("hello world"));
oceanBaseVectorStore.add(documents);
}
@GetMapping("/search")
public List<Document> search() {
return oceanBaseVectorStore.similaritySearch(SearchRequest
.builder()
.query("hello")
.topK(2)
.build());
}
常用方法即add和similaritySearch
内部原理及相关接口和实现类
spring-ai-alibaba-starter-store-oceanbase包
分为META-INF和java类两部分:
META-INF:pom依赖文件及配置项spring-configuration-metadata.json
java类:主要包括4个类
配置属性类:OceanbaseVectorStoreProperties,负责加载spring.ai.vectorstore.oceanbase相关配置
自动装配类:OceanbaseVectorStoreAutoConfiguration,自动装配了DataSource、BatchingStrategy、OceanbaseVectorStore三个bean
过滤表达式转换器:OceanbaseVectorFilterExpressionConverter,将筛选条件转换为数据库支持的筛选语句
VectorStore实现类:OceanbaseVectorStore
OceanbaseVectorStore
我们主要看一下OceanbaseVectorStore的内部逻辑
1. 构造器:创建Oceanbase时的必填参数是数据源DataSource,负责向量化的嵌入式模型EmbeddingModel,表名tableName,选填参数是默认相似度阈值和最大结果个数topK。
2. 初始化:OceanbaseVectorStore实现了InitializingBean接口的afterPropertiesSet方法,会在启动后判断对应表是否存在,不存在则创建包含id,vector,description,metadata字段的表:
CREATE TABLE IF NOT EXISTS %s (id varchar(100) PRIMARY KEY, vector VECTOR(384) NOT NULL, description text, metadata text)
3. 保存:保存文档时会先调用EmbeddingModel将文档向量化,然后保存到库中
INSERT INTO %s (id, vector, description, metadata) VALUES (?, ?, ?, ?)
4. 相似性搜索:其实跟我们平时用关系型数据库没多少区别,仅仅只是调用了l2_distance和vector_distance来计算向量距离大小
SELECT id, vector, description, metadata, l2_distance(vector,?) as distance FROM %s ORDER BY vector_distance(vector, ?) ASC LIMIT ?
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)