向量数据库是AI系统中常用的工具,主要用来存储文档片段及进行语义相似度查找
与传统数据库不同,它执行的是相似度查找而不是精确匹配
最小化样例
首先在application.properties中,根据所用Embedding模型,添加一个嵌入式模型型号的配置
spring.ai.zhipuai.embedding.options.model=embedding-3
然后需要声明一个VectorStore的bean,需要传入的EmbeddingModel(ZhiPuAiEmbeddingModel)在自动化配置包中已经声明过了(参见ZhiPuAiEmbeddingAutoConfiguration)
@Configuration
public class Config {@Beanpublic VectorStore vectorStore(EmbeddingModel embeddingModel) {return SimpleVectorStore.builder(embeddingModel).build();}
}
之后就可以装配使用了,样例中使用add方法添加了一个Document,然后使用similaritySearch进行语义相近搜索,并返回结果文本
@AutowiredVectorStore vectorStore;void save(){//目前仅提供JsonReader和TextReaderDocument 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方法,将长文本切分为一系列的小文本
TokenCountBatchingStrategy:按token个数对Document进行切分
其他框架的相关功能
spring-ai的VectorStore实际已经涉及了RAG(检索增强生成)的各个方面,例如文档切分、向量化、存储、相似性查找等功能
在这些环节,有许多可以提高最终效果的优化方案
例如langchain的切分策略,除了按token个数进行切分,还可以按字符切分,比如按【换行符,句号,分号,逗号】的顺序对文档切分,这样能更好的保持语义完整性。
而spring-ai由于起步较晚,此类扩展相对还比较少。
相关优化方案会在后续RAG篇进阶知识中进行详细的说明。
向量数据库选型
spring-ai支持的向量数据库:
可以参考VectorStoreProvider枚举类,目前该枚举类已经有21种向量数据库
选型时需要考虑的因素:
是否开源:这是相对来说首先需要考虑的一个方面,因为它决定了很多其他因素,开源一般都伴随着这些属性——免费、社区活跃、可以进行定制化改造、维护难度相对较高、需要有自己的研发人员,而闭源则一般伴随着这些属性——收费、易用、由厂家提供维护等。
数据规模:其次需要考虑的就是数据规模,因为它也决定了许多其他因素,如果数据量较大,向量维度较高,则需要考虑向量数据库是否支持大规模或超大规模,是否支持分布式,是否支持索引,搜索性能如何等。
其他因素:如是否国产、云上还是云下、是否需要结合其他检索如全文搜索、与现有系统的兼容性、易用性等
学习时可以直接使用spring-ai自带的SimpleVectorStore或者FAISS、Chroma