Typesense

このセクションでは、ドキュメントの埋め込みを保存し、類似性検索を実行するための TypesenseVectorStore のセットアップについて説明します。

Typesense (英語) Typesense は、直感的な開発者エクスペリエンスを提供しながら、50 ミリ秒未満の即時検索に最適化されている、オープンソースの型ミス耐性のある検索エンジンです。

前提条件

  1. Typesense インスタンス

  2. EmbeddingModel インスタンスを使用してドキュメントの埋め込みを計算します。いくつかのオプションが利用可能です:

    • 必要に応じて、EmbeddingModel が TypesenseVectorStore によって保存される埋め込みを生成するための API キー。

自動構成

Spring AI は、Typesense Vector Sore の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml ファイルに次の依存関係を追加します。

<dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-typesense-spring-boot-starter</artifactId>
</dependency>

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-typesense-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。
マイルストーンおよび / またはスナップショットリポジトリをビルドファイルに追加するには、リポジトリセクションを参照してください。

さらに、設定済みの EmbeddingModel Bean が必要です。詳細については、"EmbeddingModel" セクションを参照してください。

必要な Bean の例を次に示します。

@Bean
public EmbeddingModel embeddingModel() {
    // Can be any other EmbeddingModel implementation.
    return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
}

Typesense に接続するには、インスタンスのアクセス詳細を提供する必要があります。簡単な設定は、Spring Boot の application.yml を介して提供できます。

spring:
  ai:
    vectorstore:
      typesense:
          collectionName: "vector_store"
          embeddingDimension: 1536
          client:
              protocl: http
              host: localhost
              port: 8108
              apiKey: xyz

デフォルト値と構成オプションについては、ベクトルストアの構成パラメーターのリストを参照してください。

これで、Typesense ベクトルストアをアプリケーションに自動接続して使用できるようになりました。

@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 Typesense
vectorStore.add(documents);

// Retrieve documents similar to a query
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));

構成プロパティ

Spring Boot 構成で次のプロパティを使用して、Typesense ベクトルストアをカスタマイズできます。

プロパティ 説明 デフォルト値

spring.ai.vectorstore.typesense.client.protocol

HTTP プロトコル

http

spring.ai.vectorstore.typesense.client.host

ホスト名

localhost

spring.ai.vectorstore.typesense.client.port

ポート

8108

spring.ai.vectorstore.typesense.client.apiKey

ApiKey

xyz

spring.ai.vectorstore.typesense.initialize-schema

必要なスキーマを初期化するかどうか

false

spring.ai.vectorstore.typesense.collection-name

コレクション名

vector_store

spring.ai.vectorstore.typesense.embedding-dimension

埋め込みディメンション

1536

メタデータのフィルタリング

TypesenseVectorStore では、汎用的でポータブルなメタデータフィルターも活用できます。

例: 次のいずれかのテキスト式言語を使用できます。

vectorStore.similaritySearch(
   SearchRequest
      .query("The World")
      .withTopK(TOP_K)
      .withSimilarityThreshold(SIMILARITY_THRESHOLD)
      .withFilterExpression("country in ['UK', 'NL'] && year >= 2020"));

または、プログラムで DSL という式を使用します。

FilterExpressionBuilder b = new FilterExpressionBuilder();

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()));

移植可能なフィルター式は自動的に Typesense 検索フィルター (英語) に変換されます。例: 次のポータブルフィルター式:

country in ['UK', 'NL'] && year >= 2020

Typesense フィルターに変換されます:

country: ['UK', 'NL'] && year: >=2020

手動構成

自動構成を使用しない場合は、Typesense ベクトルストアを手動で構成できます。Typesense ベクトルストアと Jedis の依存関係を追加します。

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-typesense</artifactId>
</dependency>
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

次に、Spring 構成で TypesenseVectorStore Bean を作成します。

@Bean
public VectorStore vectorStore(Client client, EmbeddingModel embeddingModel) {

    TypesenseVectorStoreConfig config = TypesenseVectorStoreConfig.builder()
        .withCollectionName("test_vector_store")
        .withEmbeddingDimension(embeddingModel.dimensions())
        .build();

    return new TypesenseVectorStore(client, embeddingModel, config);
}

@Bean
public Client typesenseClient() {
    List<Node> nodes = new ArrayList<>();
    nodes
        .add(new Node("http", typesenseContainer.getHost(), typesenseContainer.getMappedPort(8108).toString()));

    Configuration configuration = new Configuration(nodes, Duration.ofSeconds(5), "xyz");
    return new Client(configuration);
}

TypesenseVectorStore を Bean として作成する方が便利であり、推奨されます。ただし、手動で作成する場合は、プロパティを設定した後、クライアントを使用する前に TypesenseVectorStore#afterPropertiesSet() を呼び出す必要があります。

次に、メインコードでいくつかのドキュメントを作成します。

List<Document> documents = List.of(
   new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("country", "UK", "year", 2020)),
   new Document("The World is Big and Salvation Lurks Around the Corner", Map.of()),
   new Document("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!!" というテキストを含むドキュメントを取得する必要があります。

ドキュメントが期待どおりの順序で取得されない場合、または検索結果が期待どおりでない場合は、使用している埋め込みモデルを確認してください。

埋め込みモデルは検索結果に大きな影響を与える可能性があります (つまり、データがスペイン語の場合は、スペイン語または多言語の埋め込みモデルを使用するようにしてください)。