向量數據庫是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