当前位置: 首页 > news >正文

spring-ai 1.0.0 学习(十四)——向量数据库

向量数据库是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

http://www.lqws.cn/news/503731.html

相关文章:

  • 【机器学习深度学习】反向传播机制
  • 使用argparse封装python程序为命令行工具
  • C++ 第二阶段:模板编程 - 第一节:函数模板与类模板
  • Linux线程概念及常用接口(1)
  • 数据分箱:科学分类的简单指南
  • 轻量级小程序自定义tabbar组件封装的实现与使用
  • MediaMarktSaturn EDI 对接指南:欧洲零售卖场的数字化协同范例
  • 火山引擎向量数据库 Milvus 版正式开放
  • 竹云受邀出席华为开发者大会,与华为联合发布海外政务数字化解决方案
  • 【MATLAB代码】基于MVC的EKF和经典EKF对三维非线性状态的滤波,提供滤波值对比、误差对比,应对跳变的观测噪声进行优化
  • 安全报告:LLM 模型在无显性攻击提示下的越狱行为分析
  • SSE和Kafka应用场景对比
  • taro小程序,tailwindcss的bg-x-x,背景颜色不生效,只有自定义的写法颜色才生效
  • Qt面试题汇总
  • 在微服务中使用 Sentinel
  • PYTHON从入门到实践3-变量
  • LayUI的table实现行上传图片+mvc
  • JavaEE初阶第四期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(二)
  • 在 .NET Core WebAPI 项目中,执行文件(.exe)方式运行并指定端口
  • Python实例题:Web 爬虫与数据可视化
  • 《AI大模型核心技术揭秘与商业落地实战》学习内容系统总结
  • Android APP内切换语言无感重启到当前界面
  • Jenkins+Jmeter+Ant接口持续集成
  • 6.24_JAVA_微服务_Elasticsearch搜索
  • Temporal Join,一探究竟
  • 【服务器】教程 — Linux上如何挂载服务器NAS
  • GitHub Actions 的深度解析与概念介绍
  • 智能制造——解读基于AI框架的智能工厂设计思路【附全文阅读】
  • 【论文阅读 | CVPRW 2023 |CSSA :基于通道切换和空间注意力的多模态目标检测】
  • CSS 实现文本溢出省略号(三种主流方式,适配单行 多行)