文章目录
Redis
本节将指导您设置RedisVectorStore,作为文档存储向量数据库,并执行相似性搜索。
什么是 Redis?
Redis 是一个开源(BSD 许可证),用作数据库、缓存、消息代理和流引擎的内存数据结构存储。Redis支持多种数据结构,包括字符串、哈希、列表、集合、带范围查询的有序集合、位图、hyperloglogs、地理空间索引和流。
Redis 向量搜索是什么?
Redis Search and Query 扩展了 Redis OSS 的核心功能,使您可以将 Redis 用作矢量数据库:
- 在哈希或 JSON 文档中存储向量和相关元数据
- 检索向量
- 执行向量搜索
先决条件
- EmbeddingClient实例,来计算文档嵌入向量。有几种选项可用:
- Transformers Embedding- 在您的本地环境中计算嵌入向量。请按照 ONNX Transformers Embedding 说明操作。
- OpenAI Embedding- 使用 OpenAI 嵌入端点。您需要在 OpenAI 注册并在 API Keys 生成 api-key 令牌。
- 您也可以使用Azure OpenAI Embedding。
- 一个 Redis Stack 实例 a. Redis Cloud (推荐) b. Docker 镜像 redis/redis-stack:latest
依赖项
将这些依赖项添加到您的项目中:
- Embedding Client boot starter ,用于计算嵌入。
- Transformers Embedding(本地),并按照 ONNX Transformers 嵌入向量说明操作。
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-transformers-spring-boot-starter</artifactId></dependency>
或使用 OpenAI(云)<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency>
> 请参阅 03. 开始章节 的 Dependency Management 部分,将 Spring AI BOM 添加到构建文件中您需要提供您的 OpenAI API 密钥。将其设置为环境变量,如下所示:exportSPRING_AI_OPENAI_API_KEY='Your_OpenAI_API_Key'
- 添加 Redis Vector Store 和 Jedis 依赖项
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.0</version></dependency>
请参阅 03. 开始章节 的 Dependency Management 部分,将 Spring AI BOM 添加到构建文件中
用法
创建一个连接到您的 Redis 数据库的 RedisVectorStore 实例:
@BeanpublicVectorStorevectorStore(EmbeddingClient embeddingClient){RedisVectorStoreConfig config =RedisVectorStoreConfig.builder().withURI("redis://localhost:6379")// Define the metadata fields to be used// in the similarity search filters..withMetadataFields(MetadataField.tag("country"),MetadataField.numeric("year")).build();returnnewRedisVectorStore(config, embeddingClient);}
更方便和推荐的做法是将 RedisVectorStore 创建为一个 Bean。但如果您决定手动创建它,则必须在设置属性之后并在使用客户端之前调用 RedisVectorStore#afterPropertiesSet() 。
您必须明确列出所有元数据字段名称和类型( TAG , TEXT 或 NUMERIC ),用于过滤表达式中使用的任何元数据字段。上面的 withMetadataFields 注册可过滤的元数据字段:类型为 TAG 的 country ,类型为 NUMERIC 的 year 。
然后在您的主代码中,创建一些文档:
List<Document> documents =List.of(newDocument("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!",Map.of("country","UK","year",2020)),newDocument("The World is Big and Salvation Lurks Around the Corner",Map.of()),newDocument("You walk forward facing the past and you turn back toward the future.",Map.of("country","NL","year",2023)));
现在将文档添加到您的向量存储中:
vectorStore.add(documents);
最后,检索与查询相似的文档:
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));
如果一切顺利,您应该能够检索包含文本“Spring AI rocks!!”的文档。
元数据过滤
您也可以利用通用、可移植的元数据过滤器与 RedisVectorStore。
例如,您可以使用文本表达语言:
vectorStore.similaritySearch(SearchRequest.query("The World").withTopK(TOP_K).withSimilarityThreshold(SIMILARITY_THRESHOLD).withFilterExpression("country in ['UK', 'NL'] && year >= 2020"));
或者使用表达式 DSL 进行编程:
FilterExpressionBuilder b =newFilterExpressionBuilder();
vectorStore.similaritySearch(SearchRequest.query("The World").withTopK(TOP_K).withSimilarityThreshold(SIMILARITY_THRESHOLD).withFilterExpression(b.and(
b.in("country","UK","NL"),
b.gte("year",2020)).build()));
可移植的过滤表达式会自动转换为 Redis 搜索查询。例如,以下可移植的过滤表达式:
country in ['UK', 'NL'] && year >= 2020
被转换为 Redis 查询:
@country:{UK | NL} @year:[2020 inf]
版权归原作者 小明同学的开发日常 所有, 如有侵权,请联系我们删除。