Redis
本節將引導您設定 RedisVectorStore
來儲存文件 embedding 並執行相似度搜索。
Redis 是一個開源的(BSD 許可證)、記憶體資料結構儲存,用作資料庫、快取、訊息代理和流處理引擎。Redis 提供字串、雜湊、列表、集合、有序集合(帶範圍查詢)、點陣圖、HyperLogLogs、地理空間索引和流等資料結構。
Redis Search and Query 擴充套件了 Redis OSS 的核心功能,允許您將 Redis 用作向量資料庫
-
在雜湊或 JSON 文件中儲存向量及其關聯元資料
-
檢索向量
-
執行向量搜尋
先決條件
-
Redis Stack 例項
-
Redis Cloud (推薦)
-
Docker 映象 redis/redis-stack:latest
-
-
EmbeddingModel
例項,用於計算文件 embedding。有多種選項可用-
如果需要,EmbeddingModel 的 API 金鑰,用於生成由
RedisVectorStore
儲存的 embedding。
-
自動配置
Spring AI 自動配置、starter 模組的 artifact 名稱發生了重大變化。請參閱升級注意事項以獲取更多資訊。 |
Spring AI 為 Redis Vector Store 提供了 Spring Boot 自動配置。要啟用它,請將以下依賴新增到專案的 Maven pom.xml
檔案中
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>
或新增到 Gradle build.gradle
構建檔案中。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-redis'
}
請參閱依賴管理部分,將 Spring AI BOM 新增到您的構建檔案。 |
請參閱倉庫部分,將 Maven Central 和/或 Snapshot 倉庫新增到您的構建檔案。 |
向量儲存實現可以為您初始化所需的 schema,但您必須透過在適當的建構函式中指定 initializeSchema
布林值或在 application.properties
檔案中設定 …initialize-schema=true
來選擇啟用。
這是破壞性變更!在早期版本的 Spring AI 中,此 schema 初始化是預設發生的。 |
請查看向量儲存的配置引數列表,瞭解預設值和配置選項。
此外,您還需要一個配置好的 EmbeddingModel
bean。請參閱EmbeddingModel 部分了解更多資訊。
現在您可以在應用程式中將 RedisVectorStore
作為向量儲存自動注入。
@Autowired VectorStore vectorStore;
// ...
List <Document> documents = List.of(
new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
new Document("The World is Big and Salvation Lurks Around the Corner"),
new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));
// Add the documents to Redis
vectorStore.add(documents);
// Retrieve documents similar to a query
List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
配置屬性
要連線到 Redis 並使用 RedisVectorStore
,您需要提供例項的訪問詳情。可以透過 Spring Boot 的 application.yml
提供簡單的配置,
spring:
data:
redis:
url: <redis instance url>
ai:
vectorstore:
redis:
initialize-schema: true
index-name: custom-index
prefix: custom-prefix
對於 redis 連線配置,或者,可以透過 Spring Boot 的 application.properties 提供簡單的配置。
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.username=default
spring.data.redis.password=
以 spring.ai.vectorstore.redis.*
開頭的屬性用於配置 RedisVectorStore
屬性 | 描述 | 預設值 |
---|---|---|
|
是否初始化所需的 schema |
|
|
儲存向量的索引名稱 |
|
|
Redis 鍵的字首 |
|
元資料過濾
您也可以利用通用的、可移植的元資料過濾器來與 Redis 配合使用。
例如,您可以使用文字表示式語言
vectorStore.similaritySearch(SearchRequest.builder()
.query("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression("country in ['UK', 'NL'] && year >= 2020").build());
或使用 Filter.Expression
DSL 進行程式設計
FilterExpressionBuilder b = new FilterExpressionBuilder();
vectorStore.similaritySearch(SearchRequest.builder()
.query("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression(b.and(
b.in("country", "UK", "NL"),
b.gte("year", 2020)).build()).build());
這些(可移植的)過濾器表示式會自動轉換為Redis 搜尋查詢。 |
例如,這個可移植的過濾器表示式
country in ['UK', 'NL'] && year >= 2020
將轉換為 Redis 專有的過濾器格式
@country:{UK | NL} @year:[2020 inf]
手動配置
除了使用 Spring Boot 自動配置,您還可以手動配置 Redis 向量儲存。為此,您需要將 spring-ai-redis-store
新增到您的專案中
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-redis-store</artifactId>
</dependency>
或新增到 Gradle build.gradle
構建檔案中。
dependencies {
implementation 'org.springframework.ai:spring-ai-redis-store'
}
建立一個 JedisPooled
bean
@Bean
public JedisPooled jedisPooled() {
return new JedisPooled("<host>", 6379);
}
然後使用構建器模式建立 RedisVectorStore
bean
@Bean
public VectorStore vectorStore(JedisPooled jedisPooled, EmbeddingModel embeddingModel) {
return RedisVectorStore.builder(jedisPooled, embeddingModel)
.indexName("custom-index") // Optional: defaults to "spring-ai-index"
.prefix("custom-prefix") // Optional: defaults to "embedding:"
.metadataFields( // Optional: define metadata fields for filtering
MetadataField.tag("country"),
MetadataField.numeric("year"))
.initializeSchema(true) // Optional: defaults to false
.batchingStrategy(new TokenCountBatchingStrategy()) // Optional: defaults to TokenCountBatchingStrategy
.build();
}
// This can be any EmbeddingModel implementation
@Bean
public EmbeddingModel embeddingModel() {
return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("OPENAI_API_KEY")));
}
您必須明確列出在過濾器表示式中使用的任何元資料欄位的名稱和型別( |
訪問原生客戶端
Redis Vector Store 實現透過 getNativeClient()
方法提供了對底層原生 Redis 客戶端 (JedisPooled
) 的訪問
RedisVectorStore vectorStore = context.getBean(RedisVectorStore.class);
Optional<JedisPooled> nativeClient = vectorStore.getNativeClient();
if (nativeClient.isPresent()) {
JedisPooled jedis = nativeClient.get();
// Use the native client for Redis-specific operations
}
原生客戶端允許您訪問 Redis 特有的功能和操作,這些功能和操作可能不會透過 VectorStore
介面暴露。