Redis

本節將引導您設定 RedisVectorStore 以儲存文件嵌入並執行相似性搜尋。

Redis 是一個開源(BSD 許可)、記憶體中的資料結構儲存,用作資料庫、快取、訊息代理和流媒體引擎。Redis 提供字串、雜湊、列表、集合、帶範圍查詢的有序集合、點陣圖、HyperLogLogs、地理空間索引和流等資料結構。

Redis 搜尋和查詢擴充套件了 Redis OSS 的核心功能,並允許您將 Redis 用作向量資料庫

  • 將向量和關聯的元資料儲存在雜湊或 JSON 文件中

  • 檢索向量

  • 執行向量搜尋

先決條件

  1. Redis Stack 例項

  2. EmbeddingModel 例項用於計算文件嵌入。有幾個選項可用。

    • 如果需要,需要為EmbeddingModel 提供 API 金鑰,以生成由 RedisVectorStore 儲存的嵌入。

自動配置

Spring AI 自動配置、啟動模組的工件名稱發生了重大變化。請參閱 升級說明 以獲取更多資訊。

Spring AI 為 Redis 向量儲存提供了 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 新增到您的構建檔案中。
請參閱Artifact Repositories(工件倉庫)部分,將 Maven Central 和/或 Snapshot Repositories 新增到您的構建檔案中。

向量儲存實現可以為您初始化所需的模式,但您必須透過在相應的建構函式中指定 initializeSchema 布林值或在 application.properties 檔案中設定 ...initialize-schema=true 來選擇啟用。

這是一個重大更改!在早期版本的 Spring AI 中,此模式初始化是預設發生的。

請查看向量儲存的配置引數列表,瞭解預設值和配置選項。

此外,您還需要一個配置的 `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

財產 描述 預設值

spring.ai.vectorstore.redis.initialize-schema

是否初始化所需的模式

spring.ai.vectorstore.redis.index-name

儲存向量的索引名稱

spring-ai-index

spring.ai.vectorstore.redis.prefix

Redis 鍵的字首

embedding

元資料過濾

您也可以利用通用、可移植的元資料過濾器與 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")));
}

您必須顯式列出所有在過濾表示式中使用的元資料欄位名稱和型別(TAGTEXTNUMERIC)。上面的 metadataFields 註冊了可過濾的元資料欄位:型別為 TAGcountry,型別為 NUMERICyear

訪問原生客戶端

Redis 向量儲存實現透過 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
}

原生客戶端允許您訪問 VectorStore 介面可能未公開的 Redis 特定功能和操作。

© . This site is unofficial and not affiliated with VMware.