【Spring AI】05. 向量数据库

server/2024/9/25 7:45:21/

文章目录

  • 向量数据库
    • 概述
    • 可用实现
    • 示例用法
    • 元数据过滤器
      • Filter String
      • Filter.Expression
    • 理解向量

向量数据库

向量数据库是一种在 AI 应用中发挥关键作用的特定类型的数据库
在向量数据库中,查询与传统关系数据库不同。它们不执行精确匹配,而是执行相似性搜索。当以向量作为查询时,向量数据库返回与查询向量“相似”的向量。有关如何在高层次计算此相似性的更多详细信息,请参阅 向量相似性
向量数据库用于将您的数据与 AI 模型集成。它们的使用的第一步是将您的数据加载到向量数据库中。然后,当用户查询要发送到 AI 模型时,首先检索一组相似的文档。然后,这些文档作为用户问题的上下文,并与用户的查询一起发送到 AI 模型。这种技术被称为检索增强生成(RAG)。
以下部分描述了 Spring AI 接口,用于使用多个向量数据库实现和一些高级示例用法。
最后一部分旨在揭示向量数据库中相似搜索的基本方法。

概述


本节作为 Spring AI 框架中VectorStore接口及其关联类的指南。
Spring AI 通过VectorStore接口为向量数据库交互提供了抽象化的 API。
这里是 VectorStore 接口的定义:

public interface VectorStore {void add(List<Document> documents);Optional<Boolean> delete(List<String> idList);List<Document> similaritySearch(String query);List<Document> similaritySearch(SearchRequest request);
}

和相关的 SearchRequest 构建器:

public class SearchRequest {public final String query;private int topK = 4;private double similarityThreshold = SIMILARITY_THRESHOLD_ALL;private Filter.Expression filterExpression;public static SearchRequest query(String query) { return new SearchRequest(query); }private SearchRequest(String query) { this.query = query; }public SearchRequest withTopK(int topK) {...}public SearchRequest withSimilarityThreshold(double threshold) {...}public SearchRequest withSimilarityThresholdAll() {...}public SearchRequest withFilterExpression(Filter.Expression expression) {...}public SearchRequest withFilterExpression(String textExpression) {...}public String getQuery() {...}public int getTopK() {...}public double getSimilarityThreshold() {...}public Filter.Expression getFilterExpression() {...}
}

要将数据插入向量数据库,请将其封装在Document对象中。Document类封装来自数据源(如 PDF 或 Word 文档)的内容,并包含表示为字符串的文本。它还包含键值对形式的元数据,包括文件名等详细信息。
插入向量数据库时,文本内容会被转换为数值数组,或称为向量嵌入。嵌入模型,如 Word2Vec、GLoVE 和 BERT,或 OpenAI 的text-embedding-ada-002,将单词、句子或段落转换为这些向量嵌入。
向量数据库的作用是存储和促进这些嵌入的相似性搜索。它本身不生成嵌入向量。要创建嵌入向量,应该使用EmbeddingClient。
接口中的similaritySearch方法允许检索与给定查询字符串类似的文档。可以通过使用以下参数来对这些方法进行微调:

  • k:一个整数,指定要返回的相似文档的最大数量。这通常被称为“top K”搜索,或“K 最近邻”(KNN)。
  • threshold:一个从 0 到 1 范围的双精度值,值越接近 1 表示相似度越高。默认情况下,如果您设置了 0.75 的阈值,那么只有相似度高于此值的文档才会被返回。
  • Filter.Expression:用于传递类似于 SQL 中的“where”子句的流畅 DSL(领域特定语言)表达式的类,但它仅适用于Document的元数据键值对。
  • filterExpression:基于 ANTLR4 的外部 DSL,接受过滤表达式作为字符串。例如,对于像 country、year 和isActive这样的元数据键,您可以使用如下表达式:country == ‘UK’ && year >= 2020 && isActive == true.

在 Metadata Filters 部分查找有关Filter.Expression的更多信息。


可用实现


这些是VectorStore接口的可用实现:

  • Azure Vector Search - Azure 向量存储。
  • ChromaVectorStore - Chroma 向量存储。
  • MilvusVectorStore - Milvus 向量存储。
  • Neo4jVectorStore - Neo4j 向量存储。
  • PgVectorStore - PostgreSQL/PGVector 向量存储。
  • PineconeVectorStore - PineCone 向量存储。
  • QdrantVectorStore - Qdrant 向量存储。
  • RedisVectorStore - Redis 向量存储。
  • WeaviateVectorStore - Weaviate 向量存储。
  • SimpleVectorStore - 一个简单的持久化向量存储实现,适用于教育目的。
    未来版本可能支持更多的实现。
    如果您需要由 Spring AI 支持的向量数据库,请在 GitHub 上提出问题,或者更好地,提交一个实现的拉取请求。
    每个VectorStore实现的信息可以在本章的子章节中找到。

示例用法


要为向量数据库计算嵌入向量,您需要选择与 AI 模型相匹配的嵌入向量模型。
例如,使用OpenAI的ChatGPT,我们使用OpenAiEmbeddingClient和名称为text-embedding-ada-002的模型。
Spring Boot starter 的自动配置可以在 Spring 应用程序上下文中生成一个EmbeddingClient的实现,以便进行依赖注入。
一般通过类似批处理作业的方法将数据加载到向量存储中,首先将数据加载到 Spring AI 的Document类中,然后调用save方法。
给定一个指向我们要加载到向量数据库中的数据 JSON 文件的源文件的 String 引用,我们使用 Spring AI 的 JsonReader 来加载 JSON 中的特定字段,将它们拆分成小块,然后将这些小块传递给向量存储实现。 VectorStore 实现计算嵌入向量并将 JSON 和嵌入向量存储在向量数据库中:

  @AutowiredVectorStore vectorStore;void load(String sourceFile) {JsonReader jsonReader = new JsonReader(new FileSystemResource(sourceFile),"price", "name", "shortDescription", "description", "tags");List<Document> documents = jsonReader.get();this.vectorStore.add(documents);}

然后,当用户问题传递到 AI 模型时,会进行相似性搜索以检索类似的文档,然后将这些文档“填充”到提示中,作为用户问题的上下文。

   String question = <question from user>List<Document> similarDocuments = store.similaritySearch(question);

可以将附加选项参数传递到similaritySearch方法中,以定义要检索多少个文档以及相似性搜索的阈值。

元数据过滤器

本节描述了您可以针对查询结果使用的各种过滤器。

Filter String

您可以将类似于 SQL 的过滤表达式作为String传递给其中一个similaritySearch重载类。
请参考以下示例:

* "country == 'BG'"
* "genre == 'drama' && year >= 2020"
* "genre in ['comedy', 'documentary', 'drama']"

Filter.Expression

您可以使用流式 API 的 FilterExpressionBuilder 创建 Filter.Expression 的实例。一个简单的示例如下:

FilterExpressionBuilder b = new FilterExpressionBuilder();
Expression expression = b.eq("country", "BG").build();

您可以通过使用以下运算符来构建复杂的表达式:

EQUALS: '=='
MINUS : '-'
PLUS: '+'
GT: '>'
GE: '>='
LT: '<'
LE: '<='
NE: '!='

您可以通过使用以下运算符来组合表达式:

AND: 'AND' | 'and' | '&&';
OR: 'OR' | 'or' | '||';

考虑以下示例:

Expression exp = b.and(b.eq("genre", "drama"), b.gte("year", 2020)).build();

您还可以使用以下运算符:

IN: 'IN' | 'in';
NIN: 'NIN' | 'nin';
NOT: 'NOT' | 'not';

考虑以下例子(官方给的例子不是很匹配运算符):

Expression exp = b.and(b.eq("genre", "drama"), b.gte("year", 2020)).build();

理解向量

请参考 100. 理解向量 章节


http://www.ppmy.cn/server/23327.html

相关文章

Gone框架介绍6 - 如何使用gone开发web服务

文章目录 1.安装gone辅助工具2.创建一个web项目并运行代码项目结构3.Router4.Controller5.Service 我在两年前实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff0c;自己觉得还挺好用的&#xff1b;之前一直没有时间写文…

nginx--安装

yum安装 官方包链接&#xff1a;nginx: Linux packages 官方yum源链接&#xff1a;nginx: Linux packages 配置yum源 [rootlocalhost ~]# yum install -y nginx [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gp…

fofa 是一个什么样的工具

FOFA (Fingerprint of Full Asset) 是一个基于网络的搜索引擎&#xff0c;主要用于信息安全领域&#xff0c;特别是在网络空间资产发现和安全漏洞研究方面。这个工具可以帮助安全研究人员和企业安全团队发现并分析互联网上的设备、服务器、网站和其他相关资产的公开信息。 FOF…

STM32-TIM的输入捕获功能

1.熟练掌握TIM的参数配置&#xff0c; 2.熟练掌握输入通道的参数配置。 3.深刻理解输入捕获的原理和应用范畴。 4.理解输入捕获的原理。 一 什么是输入捕获功能 定时器输入捕获功能&#xff08; input capture &#xff09;是利用定时器的精准计数特性&#xff0c;实现对于…

什么是面向对象?

谈到面向对象&#xff0c;我们不得不说到面向过程。因为面向对象就是从面向过程过渡而来的。 面向过程&#xff1a;就是将一个大的任务分成一条条小的步骤&#xff0c;这些步骤由一个个函数来完成。 而面向对象呢&#xff0c;更加注重这个任务中的参与者&#xff0c;需求里有…

区块链钱包开发——专业区块链开发

随着区块链技术的发展&#xff0c;钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性&#xff0c;分析当前面临的挑战&#xff0c;并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

【EMQX】使用websocket订阅EMQX数据

需求&#xff1a;某平台希望通过 websocket 来订阅 EMQX平台上的某些 Topic数据进行处理 1、EMQX 服务配置 前提是EMQX服务正常安装运行了&#xff0c;如果EMQX服务未安装的话&#xff0c;详见以下文章关于如何安装部署服务&#xff1a; 搭建自己的MQTT服务器、实现设备上云(W…

在Linux中eth0旁边的lo是什么

2024年4月24日&#xff0c;周三晚上 在Linux中&#xff0c;eth0 和 lo 分别代表不同的网络接口。 eth0 通常是指计算机上的以太网接口&#xff0c;用于连接到局域网或互联网。eth0 可能是通过以太网线连接到路由器或交换机的网络接口&#xff0c;用于进行网络通信。lo 是指本地…