mcpField
L
langchain4j-vector-stores-configuration

langchain4j-vector-stores-configuration

github.com/giuseppe-trisciuoglioデータ・データベース3653.7k 回インストール7 週間前に更新
リポジトリ

langchain4j-vector-stores-configuration について

Java アプリ開発者向けの LangChain4J ベクトルストア設定スキルです。複数のストア実装、メタデータフィルター、本番環境向けの接続と監視設定を扱い、セマンティック検索や RAG アプリに利用できます。

主な機能

  1. 01複数のベクトルストア設定
  2. 02メタデータフィルターとハイブリッド検索
  3. 03ドキュメント分割と一括登録
  4. 04コネクションプールとヘルスチェック

活用シーン

  1. 01RAG アプリの埋め込みストレージ設定
  2. 02メタデータによるセマンティック検索結果の絞り込み
  3. 03本番環境向けの接続プールと監視の設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill langchain4j-vector-stores-configuration

インストール後、Claude Code で/langchain4j-vector-stores-configurationを入力して読み込まれたか確認します。

同梱ファイルreferences/api-reference.mdreferences/examples.md

詳細

LangChain4J ベクトルストアの設定

LangChain4J を使用して、検索拡張生成アプリケーション向けのベクトルストアを設定します。

概要

LangChain4J は、ビルダーを使用した設定、メタデータフィルタリング、ハイブリッド検索をサポートする、ベクトルストア(PostgreSQL/pgvector、Pinecone、MongoDB Atlas、Milvus、Neo4j)向けの統一された抽象化を提供します。

使用する場面

  • セマンティック検索や RAG アプリケーション向けにベクトルストアを設定する場合
  • メタデータフィルタリングとハイブリッド検索に対応した埋め込みの保存を設定する場合
  • 本番環境の AI ワークロード向けにベクトルデータベースのパフォーマンスを最適化する場合

手順

基本的なベクトルストアを設定する

ベクトル操作用の埋め込みストアを設定します。

@Bean
public EmbeddingStore<TextSegment> embeddingStore() {
    return PgVectorEmbeddingStore.builder()
        .host("localhost")
        .port(5432)
        .database("vectordb")
        .user("username")
        .password("password")
        .table("embeddings")
        .dimension(1536) // OpenAI embedding dimension
        .createTable(true)
        .useIndex(true)
        .build();
}
検証ワークフロー

ベクトルストアが正しく設定されていることを確認するには、次のワークフローに従います。

  1. 設定:必要な次元数と接続パラメーターを指定して、埋め込みストアを構築します
  2. 接続をテスト:データを取り込む前に、ヘルスチェックでストアへの接続を確認します
  3. 次元数を検証:埋め込みモデルの次元数がストアの設定と一致することを確認します
  4. テストデータを取り込む:少量のテストドキュメントを追加して、データを取り込めることを確認します
  5. テストクエリを実行:サンプルのセマンティック検索を実行して、検索精度を確認します
  6. 本番環境に進む:すべての手順を通過した後にのみ、すべてのデータの取り込みに進みます
複数のベクトルストアを設定する

用途に応じて異なるストアを使用します。

@Configuration
public class MultiVectorStoreConfiguration {

    @Bean
    @Qualifier("documentsStore")
    public EmbeddingStore<TextSegment> documentsEmbeddingStore() {
        return PgVectorEmbeddingStore.builder()
            .table("document_embeddings")
            .dimension(1536)
            .build();
    }

    @Bean
    @Qualifier("chatHistoryStore")
    public EmbeddingStore<TextSegment> chatHistoryEmbeddingStore() {
        return MongoDbEmbeddingStore.builder()
            .collectionName("chat_embeddings")
            .build();
    }
}
ドキュメントの取り込みを実装する

EmbeddingStoreIngestor を使用して、ドキュメント処理を自動化します。

@Bean
public EmbeddingStoreIngestor embeddingStoreIngestor(
        EmbeddingStore<TextSegment> embeddingStore,
        EmbeddingModel embeddingModel) {

    return EmbeddingStoreIngestor.builder()
        .documentSplitter(DocumentSplitters.recursive(
            300,  // maxSegmentSizeInTokens
            20,   // maxOverlapSizeInTokens
            new OpenAiTokenizer(GPT_3_5_TURBO)
        ))
        .embeddingModel(embeddingModel)
        .embeddingStore(embeddingStore)
        .build();
}
メタデータフィルタリングを設定する

メタデータに基づくフィルタリング機能を設定します。

// MongoDB with metadata field mapping
IndexMapping indexMapping = IndexMapping.builder()
    .dimension(1536)
    .metadataFieldNames(Set.of("category", "source", "created_date", "author"))
    .build();

// Search with metadata filters
EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
    .queryEmbedding(queryEmbedding)
    .maxResults(10)
    .filter(and(
        metadataKey("category").isEqualTo("technical_docs"),
        metadataKey("created_date").isGreaterThan(LocalDate.now().minusMonths(6))
    ))
    .build();
本番環境向けの設定を行う

コネクションプーリングとモニタリングを実装します。

@Bean
public EmbeddingStore<TextSegment> optimizedPgVectorStore() {
    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setJdbcUrl("jdbc:postgresql://localhost:5432/vectordb");
    hikariConfig.setUsername("username");
    hikariConfig.setPassword("password");
    hikariConfig.setMaximumPoolSize(20);
    hikariConfig.setMinimumIdle(5);
    hikariConfig.setConnectionTimeout(30000);

    DataSource dataSource = new HikariDataSource(hikariConfig);

    return PgVectorEmbeddingStore.builder()
        .dataSource(dataSource)
        .table("embeddings")
        .dimension(1536)
        .useIndex(true)
        .build();
}
ヘルスチェックを実装する

ベクトルストアへの接続を監視します。

@Component
public class VectorStoreHealthIndicator implements HealthIndicator {

    private final EmbeddingStore<TextSegment> embeddingStore;

    @Override
    public Health health() {
        try {
            embeddingStore.search(EmbeddingSearchRequest.builder()
                .queryEmbedding(new Embedding(Collections.nCopies(1536, 0.0f)))
                .maxResults(1)
                .build());

            return Health.up()
                .withDetail("store", embeddingStore.getClass().getSimpleName())
                .build();
        } catch (Exception e) {
            return Health.down()
                .withDetail("error", e.getMessage())
                .build();
        }
    }
}

例

基本的な RAG アプリケーションのセットアップ
@Configuration
public class SimpleRagConfig {

    @Bean
    public EmbeddingStore<TextSegment> embeddingStore() {
        return PgVectorEmbeddingStore.builder()
            .host("localhost")
            .database("rag_db")
            .table("documents")
            .dimension(1536)
            .build();
    }

    @Bean
    public ChatLanguageModel chatModel() {
        return OpenAiChatModel.withApiKey(System.getenv("OPENAI_API_KEY"));
    }
}
セマンティック検索サービス
@Service
public class SemanticSearchService {

    private final EmbeddingStore<TextSegment> store;
    private final EmbeddingModel embeddingModel;

    public List<String> search(String query, int maxResults) {
        Embedding queryEmbedding = embeddingModel.embed(query).content();

        EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
            .queryEmbedding(queryEmbedding)
            .maxResults(maxResults)
            .minScore(0.75)
            .build();

        return store.search(request).matches().stream()
            .map(match -> match.embedded().text())
            .toList();
    }
}
モニタリングを備えた本番環境のセットアップ
@Configuration
public class ProductionVectorStoreConfig {

    @Bean
    public EmbeddingStore<TextSegment> vectorStore(
            @Value("${vector.store.host}") String host,
            MeterRegistry meterRegistry) {

        EmbeddingStore<TextSegment> store = PgVectorEmbeddingStore.builder()
            .host(host)
            .database("production_vectors")
            .useIndex(true)
            .indexListSize(200)
            .build();

        return new MonitoredEmbeddingStore<>(store, meterRegistry);
    }
}

ベストプラクティス

適切なベクトルストアを選ぶ

開発環境向け:

  • ローカルでの開発やテストには InMemoryEmbeddingStore を使用します
  • セットアップが速く、外部依存関係がありません
  • アプリケーションの再起動時にデータが失われます

本番環境向け:

  • PostgreSQL + pgvector:既存の PostgreSQL 環境に最適です
  • Pinecone:マネージドサービスで、迅速なプロトタイピングに適しています
  • MongoDB Atlas:既存の MongoDB アプリケーションとの統合に適しています
  • Milvus/Zilliz:大規模なデプロイで高いパフォーマンスを発揮します
適切なインデックスタイプを設定する

パフォーマンス要件に応じてインデックスタイプを選択します。

// For high recall requirements
.indexType(IndexType.FLAT)  // Exact search, slower but accurate

// For balanced performance
.indexType(IndexType.IVF_FLAT)  // Good balance of speed and accuracy

// For high-speed approximate search
.indexType(IndexType.HNSW)  // Fastest, slightly less accurate
ベクトルの次元数を最適化する

埋め込みの次元数をモデルに合わせます。

// OpenAI text-embedding-3-small
.dimension(1536)

// OpenAI text-embedding-3-large
.dimension(3072)

// Sentence Transformers
.dimension(384)  // all-MiniLM-L6-v2
.dimension(768)  // all-mpnet-base-v2
バッチ処理を実装する

パフォーマンスを高めるためにバッチ処理を使用します。

@Service
public class BatchEmbeddingService {

    private static final int BATCH_SIZE = 100;

    public void addDocumentsBatch(List<Document> documents) {
        for (List<Document> batch : Lists.partition(documents, BATCH_SIZE)) {
            List<TextSegment> segments = batch.stream()
                .map(doc -> TextSegment.from(doc.text(), doc.metadata()))
                .collect(Collectors.toList());

            List<Embedding> embeddings = embeddingModel.embedAll(segments)
                .content();

            embeddingStore.addAll(embeddings, segments);
        }
    }
}
セキュアな設定

機密性の高い設定情報を保護します。

// Use environment variables
@Value("${vector.store.api.key:#{null}}")
private String apiKey;

// Validate configuration
@PostConstruct
public void validateConfiguration() {
    if (StringUtils.isBlank(apiKey)) {
        throw new IllegalStateException("Vector store API key must be configured");
    }
}

参考資料

包括的なドキュメントや高度な設定については、以下を参照してください。

制約と警告

  • ベクトルの次元数は埋め込みモデルと一致している必要があります。一致しない場合はエラーが発生します。
  • 大規模なベクトルコレクションで許容できる検索パフォーマンスを得るには、適切なインデックス設定が必要です。
  • 埋め込みの生成にはコストがかかる場合があります。バッチ処理とキャッシュの戦略を実装してください。
  • ベクトルストアによってサポートする距離尺度が異なります。互換性を確認してください。
  • 本番環境へのデプロイでは、接続の枯渇を防ぐためにコネクションプーリングが不可欠です。
  • メタデータフィルタリングの機能は、ベクトルストアの実装によって異なります。
  • ベクトルストアは大量のメモリを消費します。本番環境でリソース使用量を監視してください。
  • ベクトルストアプロバイダー間の移行では、すべてのドキュメントを再度埋め込む必要がある場合があります。
  • バッチ処理は、単一ドキュメントの処理より効率的です。
  • 起動時に必ず設定を検証し、問題を迅速に検出できるようにしてください。

コメント