MongoDB Atlas

このセクションでは、Spring AI で使用するベクトルストアとして MongoDB Atlas を設定する手順について説明します。

MongoDB Atlas とは何ですか ?

MongoDB Atlas (英語) は、AWS、Azure、GCP で利用できる MongoDB の完全マネージド型クラウドデータベースです。Atlas は、MongoDB ドキュメントデータに対するネイティブベクトル検索と全文検索をサポートしています。

MongoDB Atlas ベクトル検索 (英語) を使用すると、MongoDB ドキュメントに埋め込みを保存し、ベクトル検索インデックスを作成し、近似最近傍アルゴリズム (階層型ナビゲート可能なスモールワールド) を使用して KNN 検索を実行できます。MongoDB 集計ステージで $vectorSearch 集計演算子を使用して、ベクトル埋め込みの検索を実行できます。

前提条件

  • An Atlas cluster running MongoDB version 6.0.11, 7.0.2, or later. To get started with MongoDB Atlas, you can follow the instructions here (英語) . Ensure that your IP address is included in your Atlas project ’ s https://www.mongodb.com/docs/atlas/security/ip-access-list/#std-label-access-list[access list].

  • ドキュメントの埋め込みを計算するための EmbeddingModel インスタンス。いくつかのオプションが利用可能です。詳細については、EmbeddingModel セクションを参照してください。

  • Java アプリケーションをセットアップして実行するための環境。

自動構成

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

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mongodb-atlas-store-spring-boot-starter</artifactId>
</dependency>

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-mongodb-atlas-store-spring-boot-starter'
}

ベクトルストアの実装では必要なスキーマを初期化できますが、適切なコンストラクターで initializeSchema ブール値を指定するか、application.properties ファイルで …​initialize-schema=true を設定することによってオプトインする必要があります。

Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。
マイルストーンおよび / またはスナップショットリポジトリをビルドファイルに追加するには、リポジトリセクションを参照してください。

スキーマの初期化

ベクトルストアの実装では必要なスキーマを初期化できますが、適切なコンストラクターで initializeSchema ブール値を指定するか、application.properties ファイルで spring.ai.vectorstore.mongodb.initialize-schema=true を設定することによってオプトインする必要があります。

これは重大な変更です。Spring AI の以前のバージョンでは、このスキーマの初期化はデフォルトで行われていました。

initializeSchema を true に設定すると、次のアクションが自動的に実行されます。

  • Collection Creation : ベクトルを格納するために指定されたコレクションがまだ存在しない場合は作成されます。

  • Search Index Creation : 構成プロパティに基づいて検索インデックスが作成されます。

フリー層または共有層のクラスターを実行している場合は、Atlas UI、Atlas 管理 API、または Atlas CLI を使用してインデックスを個別に作成する必要があります。

springai_test.vector_store collection に vector_index という既存の Atlas Vector Search インデックスがある場合、Spring AI は追加のインデックスを作成しません。このため、既存のインデックスが、異なる次元数などの互換性のない設定で構成されている場合、後でエラーが発生する可能性があります。

インデックスが次の構成になっていることを確認します。

{
  "fields": [
    {
      "numDimensions": 1536,
      "path": "embedding",
      "similarity": "cosine",
      "type": "vector"
    }
  ]
}

さらに、設定済みの 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")));
}

構成プロパティ

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

...
spring.data.mongodb.uri=<connection string>
spring.data.mongodb.database=<database name>

spring.ai.vectorstore.mongodb.collection-name=vector_store
spring.ai.vectorstore.mongodb.initialize-schema=true
spring.ai.vectorstore.mongodb.path-name=embedding
spring.ai.vectorstore.mongodb.indexName=vector_index
プロパティ 説明 デフォルト値

spring.ai.vectorstore.mongodb.collection-name

ベクトルを保存するコレクションの名前。

vector_store

spring.ai.vectorstore.mongodb.initialize-schema

バックエンドスキーマを初期化するかどうか

false

spring.ai.vectorstore.mongodb.path-name

ベクトルを保存するパスの名前。

embedding

spring.ai.vectorstore.mongodb.indexName

ベクトルを格納するインデックスの名前。

vector_index

手動構成プロパティ

MongoDB Atlas ベクトルストアを自動構成せずに手動で構成する場合は、MongoDBAtlasVectorStore とその依存関係を直接設定することで構成できます。

構成例

@Configuration
public class VectorStoreConfig {

    @Bean
    public MongoDBAtlasVectorStore vectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) {
        MongoDBVectorStoreConfig config = MongoDBVectorStoreConfig.builder()
            .withCollectionName("custom_vector_store")
            .withVectorIndexName("custom_vector_index")
            .withPathName("custom_embedding_path")
            .withMetadataFieldsToFilter(List.of("author", "year"))
            .build();

        return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, config, true);
    }
}

プロパティ

  • collectionName: ベクトルを保存するコレクションの名前。

  • vectorIndexName: ベクトルインデックスの名前。

  • pathName: ベクトルが保存されるパス。

  • metadataFieldsToFilter: A list of metadata fields to filter.

You can enable schema initialization by passing true as the last parameter in the MongoDBAtlasVectorStore constructor

Adding Documents

To add documents to the vector store, you need to convert your input documents into the Document type and call the addDocuments() method. This method will use the EmbeddingModel to compute the embeddings and save them to the MongoDB collection.

List<Document> docs = List.of(
	new Document("Proper tuber planting involves site selection, timing, and care. Choose well-drained soil and adequate sun exposure. Plant in spring, with eyes facing upward at a depth two to three times the tuber's height. Ensure 4-12 inch spacing based on tuber size. Adequate moisture is needed, but avoid overwatering. Mulching helps preserve moisture and prevent weeds.", Map.of("author", "A", "type", "post")),
	new Document("Successful oil painting requires patience, proper equipment, and technique. Prepare a primed canvas, sketch lightly, and use high-quality brushes and oils. Paint 'fat over lean' to prevent cracking. Allow each layer to dry before applying the next. Clean brushes often and work in a well-ventilated space.", Map.of("author", "A")),
	new Document("For a natural lawn, select the right grass type for your climate. Water 1 to 1.5 inches per week, avoid overwatering, and use organic fertilizers. Regular aeration helps root growth and prevents compaction. Practice natural pest control and overseeding to maintain a dense lawn.", Map.of("author", "B", "type", "post")) );

vectorStore.add(docs);

Deleting Documents

To delete documents from the vector store, use the delete() method. This method takes a list of document IDs and removes the corresponding documents from the MongoDB collection.

List<String> ids = List.of("id1", "id2", "id3"); // Replace with actual document IDs

vectorStore.delete(ids);

To perform a similarity search, construct a SearchRequest object with the desired query parameters and call the similaritySearch() method. This method will return a list of documents that match the query based on vector similarity.

List<Document> results = vectorStore.similaritySearch(
            SearchRequest
                    .query("learn how to grow things")
                    .withTopK(2)
    );

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

Metadata filtering allows for more refined queries by filtering results based on specified metadata fields. This feature uses the MongoDB Query API to perform filtering operations in conjunction with vector searches.

Filter Expressions

The MongoDBAtlasFilterExpressionConverter class converts filter expressions into MongoDB Atlas metadata filter expressions. The supported operations include:

  • $and

  • $or

  • $eq

  • $ne

  • $lt

  • $lte

  • $gt

  • $gte

  • $in

  • $nin

These operations enable filtering logic to be applied to metadata fields associated with documents in the vector store.

Example of a Filter Expression

Here ’ s an example of how to use a filter expression in a similarity search:

FilterExpressionBuilder b = new FilterExpressionBuilder();

List<Document> results = vectorStore.similaritySearch(
        SearchRequest.defaults()
                .withQuery("learn how to grow things")
                .withTopK(2)
                .withSimilarityThreshold(0.5)
                .withFilterExpression(b.eq("author", "A").build())
);

If you would like to try out Spring AI with MongoDB, see https://www.mongodb.com/docs/atlas/atlas-vector-search/ai-integrations/spring-ai/#std-label-spring-ai[Get Started with the Spring AI Integration].