在之前学习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 ?
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐