向量数据库是AI系统中常用的工具,主要用来存储文档片段及进行语义相似度查找

与传统数据库不同,它执行的是相似度查找而不是精确匹配

最小化样例

首先在application.properties中,根据所用Embedding模型,添加一个嵌入式模型型号的配置

spring.ai.zhipuai.embedding.options.model=embedding-3

然后需要声明一个VectorStore的bean,需要传入的EmbeddingModel(ZhiPuAiEmbeddingModel)在自动化配置包中已经声明过了(参见ZhiPuAiEmbeddingAutoConfiguration)

@Configuration
public class Config {

    @Bean
    public VectorStore vectorStore(EmbeddingModel embeddingModel) {
        return SimpleVectorStore.builder(embeddingModel).build();
    }
}

之后就可以装配使用了,样例中使用add方法添加了一个Document,然后使用similaritySearch进行语义相近搜索,并返回结果文本

    @Autowired
    VectorStore vectorStore;

    void save(){
        //目前仅提供JsonReader和TextReader
        Document document = new Document("kitty is a cat");
        vectorStore.add(List.of(document));
    }

    @GetMapping("/ai/vector")
    String generation(String userInput)
    {
        save();
        return this.vectorStore.similaritySearch(userInput).get(0).getText();
    }

在实际生产中,一般分为两步使用:

数据预处理:将信息资料(比如一些规章制度或其他领域的文件,包括docx、pdf等格式)加载到VectorStore中

处理用户查询:搜索与用户问题语义相近的片段,之后一起传递给大模型,由大模型综合搜索结果进行回答

进阶知识

了解了如何使用,我们来看一下其内部原理和相关接口及实现类,以及如何进行技术选型 

作用原理

VectorStore中内置一个嵌入式大模型,数据预处理阶段加载到向量数据库中的每个文档片段,会由EmbeddingModel加工为一个浮点数数组(即多维向量)

在处理用户查询时,EmbeddingModel同样先将用户查询的文本加工为一个多维向量,然后向量数据库将其与库内每个多维向量进行匹配,得到相似度数值,相似度越接近0越不相关,越接近1越相关。

相关接口及实现

接口

VectorStore

BatchingStrategy
方法

void add(List<Document> docs);

List<Document> similaritySearch(SearchRequest request);

List<List<Document>> batch(List<Document docs);
实现类

AbstractObservationVectorStore

SimpleVectorStore

TokenCountBatchingStrategy

VectorStore接口:向量数据库接口,主要方法即add和similaritySearch,分别对应数据预处理和相似性查找

AbstractObservationVectorStore:VectorStore的抽象实现类,内部包含EmbeddingModel和BatchingStrategy,分别用来将Document向量化和Document分组,同时负责可观测性Observation相关的处理

SimpleVectorStore:一个简单的向量数据库实现,不建议用在生产,适合用来进行教学,内部实现了一个EmbeddingMath,用来计算两个向量的相似度

Document:相似性查找的结果对象,文档或文档片段,内部包含id、文档文本、得分等属性

SearchRequest:相似性查找请求对象,内部包含请求文本query,结果最大条数topK,最低相似度阈值similarityThreshold,筛选表达式filterExpression等

BatchingStrategy接口:文档分批策略接口,提供batch方法,将一系列文本按单次最大可处理token数划分批次,适合在进行文档向量化时使用,防止批量将文档片段向量化时超出嵌入式模型的最大token数

TokenCountBatchingStrategy:按token个数对Document进行分组

其他框架的相关功能

spring-ai的VectorStore实际已经涉及了RAG(检索增强生成)的各个方面,例如文档切分、向量化、存储、相似性查找等功能

在这些环节,有许多可以提高最终效果的优化方案

例如langchain的切分策略,除了按token个数进行切分,还可以按字符切分,比如按【换行符,句号,分号,逗号】的顺序对文档切分,这样能更好的保持语义完整性。

而spring-ai由于起步较晚,此类扩展相对还比较少。

相关优化方案会在后续RAG篇进阶知识中进行详细的说明。

向量数据库选型

spring-ai支持的向量数据库:

可以参考VectorStoreProvider枚举类,目前该枚举类已经有21种向量数据库

选型时需要考虑的因素:

是否开源:这是相对来说首先需要考虑的一个方面,因为它决定了很多其他因素,开源一般都伴随着这些属性——免费、社区活跃、可以进行定制化改造、维护难度相对较高、需要有自己的研发人员,而闭源则一般伴随着这些属性——收费、易用、由厂家提供维护等。

数据规模:其次需要考虑的就是数据规模,因为它也决定了许多其他因素,如果数据量较大,向量维度较高,则需要考虑向量数据库是否支持大规模或超大规模,是否支持分布式,是否支持索引,搜索性能如何等。

其他因素:如是否国产、云上还是云下、是否需要结合其他检索如全文搜索、与现有系统的兼容性、易用性等

学习时可以直接使用spring-ai自带的SimpleVectorStore或者FAISS、Chroma

更多推荐