跳到主要内容

YugabyteDB

YugabyteDB は、PostgreSQL 互換性を備え、複数リージョンにわたる水平スケーラビリティと高可用性を提供する分散 SQL データベースです。pgvector 拡張によるネイティブなベクトル検索機能により、分散環境でのベクトル埋め込みの保存とクエリに適しています。

Maven 依存関係

备注

YugabyteDB サポートは langchain4j-community の一部であるため、バージョン 1.18.1-beta28 以降で利用可能になります。

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-yugabytedb</artifactId>
<version>1.18.1-beta28</version>
</dependency>

API

YugabyteDB 統合は主に次の 3 つのクラスを提供します。

YugabyteDBEmbeddingStore

ベクトル埋め込みの保存と検索を行うメインのインターフェースです。LangChain4j の EmbeddingStore インターフェースを実装し、次のメソッドを提供します。

  • 埋め込みの追加(単一またはバッチ)
  • 類似埋め込みの検索
  • 埋め込みの削除
  • メタデータによるフィルタリング

YugabyteDBEngine

HikariCP を使用してデータベース接続とコネクションプーリングを管理します。このクラスは次を行います。

  • JDBC 接続設定の処理
  • コネクションプール設定の管理(最大プールサイズ、タイムアウトなど)
  • PostgreSQL JDBC ドライバーと YugabyteDB Smart Driver の両方をサポート
  • SSL/TLS 設定オプションの提供

YugabyteDBSchema

次を含むデータベーススキーマ設定を定義します。

  • テーブル名とカラム名
  • ベクトルインデックスの種類(HNSW または NoIndex)
  • 距離メトリクス(COSINE、EUCLIDEAN、DOT_PRODUCT)
  • メタデータ保存設定
  • テーブル作成設定

使用例

基本的な YugabyteDBEmbeddingStore

YugabyteDBEmbeddingStore インスタンスの作成方法は次のとおりです。

YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.<builderParameters>
.build();

<builderParameters> には dimensionengine が必須で、その他はオプションです。

パラメータ概要

YugabyteDBEngine パラメータ

パラメータ説明デフォルト値必須/オプション
hostYugabyteDB サーバーのホスト名localhostengine builder 使用時は必須
portYugabyteDB サーバーのポート番号5433engine builder 使用時は必須
database接続するデータベース名yugabyteengine builder 使用時は必須
usernameデータベース認証用ユーザー名yugabyteengine builder 使用時は必須
passwordデータベース認証用パスワード""(空)engine builder 使用時は必須
schemaデータベーススキーマ名publicオプション
usePostgreSQLDriverYugabyteDB Smart Driver の代わりに PostgreSQL JDBC ドライバーを使用falseオプション
useSslデータベース接続で SSL/TLS を有効化falseオプション
sslModeSSL モード設定disableオプション
maxPoolSizeプール内の最大接続数10オプション
minPoolSizeプール内の最小アイドル接続数5オプション
connectionTimeout接続タイムアウト(ミリ秒)10000オプション
idleTimeoutアイドルタイムアウト(ミリ秒)300000オプション
maxLifetime接続の最大生存時間(ミリ秒)900000オプション
applicationName接続識別用のアプリケーション名langchain4j-yugabytedbオプション

YugabyteDBEmbeddingStore パラメータ

パラメータ説明デフォルト値必須/オプション
engineデータベース接続用の YugabyteDBEngine インスタンスなし必須
dimension埋め込みベクトルの次元数。使用する埋め込みモデルと一致させる必要があります。動的に設定するには embeddingModel.dimension() を使用します。なし必須
tableName埋め込み保存用のデータベーステーブル名langchain4j_embeddingsオプション
schemaNameデータベーススキーマ名publicオプション
idColumnID カラム名idオプション
contentColumnコンテンツ/テキストカラム名contentオプション
embeddingColumn埋め込みベクトルカラム名embeddingオプション
metadataColumnメタデータカラム名metadataオプション
metricType類似度検索の距離メトリクス:COSINEEUCLIDEAN、または DOT_PRODUCTCOSINEオプション
vectorIndexベクトルインデックス設定(下記のインデックス設定を参照)デフォルト設定の HNSWIndexオプション
createTableIfNotExists埋め込みテーブルを自動作成するかどうかtrueオプション
metadataStorageConfig埋め込みに関連するメタデータ処理用の設定オブジェクト。次の 3 つの保存モードをサポートします:
COMBINED_JSONB:クエリ最適化向けに JSONB 形式で動的メタデータを保存(推奨)
COMBINED_JSON:JSON として動的メタデータを保存
COLUMN_PER_KEY:メタデータキーを事前に把握している場合の静的メタデータ向け
COMBINED_JSONBオプション

インデックス設定

HNSW インデックスパラメータ

パラメータ説明デフォルト値必須/オプション
mレイヤーあたりの最大接続数。値が高いほど再現率が上がりますが、メモリ使用量も増えます16オプション
efConstruction構築時の動的候補リストのサイズ。値が高いほどインデックス品質が上がりますが、構築は遅くなります64オプション
metricType距離メトリクス:COSINEEUCLIDEAN、または DOT_PRODUCTCOSINEオプション
nameカスタムインデックス名自動生成オプション

NoIndex

インデックスなしのシーケンシャルスキャンには new NoIndex() を使用します。小規模データセット(< 10,000 ベクトル)や正確な結果が必要な場合に最適です。

基本的な使い方

// Create engine first
YugabyteDBEngine engine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.usePostgreSQLDriver(true) // Use PostgreSQL JDBC driver
.build();

// Minimal configuration
YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(384)
.build();

// Custom configuration
YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(768)
.tableName("my_embeddings")
.metricType(MetricType.EUCLIDEAN)
.build();

YugabyteDBEngine の使用

接続設定をより細かく制御するには、YugabyteDBEngine を使用します。

// Create engine with custom settings
YugabyteDBEngine engine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.maxPoolSize(20)
.minPoolSize(5)
.connectionTimeout("30000")
.idleTimeout("300000")
.maxLifetime("900000")
.useSsl(false)
.usePostgreSQLDriver(false) // Use YugabyteDB Smart Driver
.build();

// Use engine in embedding store
YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(384)
.tableName("embeddings")
.build();

ベクトルインデックス設定

YugabyteDB は類似度検索の最適化のため、異なるベクトルインデックスタイプをサポートします。

HNSW インデックス(推奨)

// Create engine
YugabyteDBEngine engine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.build();

// HNSW index with custom parameters
HNSWIndex hnswIndex = HNSWIndex.builder()
.m(16) // Maximum connections per layer
.efConstruction(64) // Construction quality
.metricType(MetricType.COSINE)
.name("my_hnsw_index")
.build();

YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(384)
.vectorIndex(hnswIndex)
.build();

インデックスなし(シーケンシャルスキャン)

// Create engine
YugabyteDBEngine engine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.build();

// No index for exact search (slower but exact)
YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(384)
.vectorIndex(new NoIndex()) // Sequential scan
.build();

埋め込みの追加と検索

// Create engine first
YugabyteDBEngine engine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.build();

// Create embedding store
YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(384)
.build();

// Add embeddings
TextSegment segment1 = TextSegment.from("YugabyteDB is a distributed SQL database");
Embedding embedding1 = embeddingModel.embed(segment1).content();
String id1 = store.add(embedding1, segment1);

TextSegment segment2 = TextSegment.from("PostgreSQL compatibility with horizontal scalability");
Embedding embedding2 = embeddingModel.embed(segment2).content();
String id2 = store.add(embedding2, segment2);

// Search embeddings
Embedding queryEmbedding = embeddingModel.embed("What is YugabyteDB?").content();
EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
.queryEmbedding(queryEmbedding)
.maxResults(5)
.minScore(0.7)
.build();

List<EmbeddingMatch<TextSegment>> matches = store.search(request).matches();
matches.forEach(match -> {
System.out.println("Score: " + match.score());
System.out.println("Text: " + match.embedded().text());
});

メタデータ保存設定

YugabyteDB は異なるメタデータ保存モードをサポートします。

// Create engine
YugabyteDBEngine engine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.build();

// JSONB storage (recommended for PostgreSQL compatibility)
MetadataStorageConfig jsonbConfig = MetadataStorageConfig.builder()
.storageMode(MetadataStorageMode.COMBINED_JSONB)
.build();

// JSON storage
MetadataStorageConfig jsonConfig = MetadataStorageConfig.builder()
.storageMode(MetadataStorageMode.COMBINED_JSON)
.build();

// Column-per-key storage
MetadataStorageConfig columnConfig = MetadataStorageConfig.builder()
.storageMode(MetadataStorageMode.COLUMN_PER_KEY)
.build();

YugabyteDBEmbeddingStore store = YugabyteDBEmbeddingStore.builder()
.engine(engine)
.dimension(384)
.metadataStorageConfig(jsonbConfig)
.build();

ドライバー設定

YugabyteDB は PostgreSQL JDBC ドライバーと YugabyteDB Smart Driver の両方をサポートします。

// PostgreSQL JDBC Driver (standard SQL compatibility)
YugabyteDBEngine postgresEngine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.usePostgreSQLDriver(true)
.build();

YugabyteDBEmbeddingStore postgresStore = YugabyteDBEmbeddingStore.builder()
.engine(postgresEngine)
.dimension(384)
.build();

// YugabyteDB Smart Driver (advanced distributed features)
YugabyteDBEngine smartEngine = YugabyteDBEngine.builder()
.host("localhost")
.port(5433)
.database("yugabyte")
.username("yugabyte")
.password("")
.usePostgreSQLDriver(false) // Default: use Smart Driver
.build();

YugabyteDBEmbeddingStore smartStore = YugabyteDBEmbeddingStore.builder()
.engine(smartEngine)
.dimension(384)
.build();

インデックスタイプ

HNSW(ybhnsw)— 推奨

  • 最適な用途:ほとんどのユースケース、特に大規模データセット
  • パフォーマンス:高い再現率を伴う高速な近似類似度検索
  • パラメータ
    • m(デフォルト:16):レイヤーあたりの最大接続数
    • efConstruction(デフォルト:64):構築品質

NoIndex — シーケンシャルスキャン

  • 最適な用途:小規模データセット(< 10,000 ベクトル)、または正確な結果が必要な場合
  • パフォーマンス:正確な検索ですが、データセットの成長に伴い遅くなります

既知の制限

  • ベクトル操作には YugabyteDB で pgvector 拡張を有効にする必要があります
  • 同一テーブル内のすべての埋め込みでベクトル次元は一致している必要があります
  • HNSW インデックスパラメータ(mefConstruction)はパフォーマンスとメモリ使用量の両方に影響します
  • シーケンシャルスキャン(NoIndex)は小規模データセット(< 10,000 ベクトル)にのみ推奨されます

パフォーマンスの考慮事項

  • HNSW インデックス:大規模データセットの本番利用に最適で、高速な近似検索を提供します
  • NoIndex:小規模データセット、または正確な結果が必要な場合にのみ適します
  • コネクションプーリング:ワークロードに応じて maxPoolSizeminPoolSize を設定してください
  • ドライバーの選択:互換性向上のため、YugabyteDB は PostgreSQL JDBC ドライバーを推奨しています