メインコンテンツまでスキップ
バージョン: 3.16

ScalarDB Cluster でベクトル検索をはじめよう

注記

このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。

ScalarDB Cluster は、アプリケーションがベクトルストアと統一された方法で対話できるように、ベクトルストアの抽象化を提供します。このページでは、この機能の概要と、それがユーザーにとってなぜ有益であるかについて説明します。

ベクトルストアの抽象化とは何ですか?

ScalarDB Cluster は、リレーショナルデータベース、NoSQL データベース、NewSQL データベースを含むさまざまなデータベースを抽象化するのと同様に、さまざまなベクトルストアを抽象化します。このベクトルストアの抽象化を使用すると、特定のベクトルストアの実装に依存せず、移植性を確保しながら、ベクトルストアと統一された方法で対話するアプリケーションを開発できます。さらに、ベクトルストアの統合が ScalarDB Cluster に組み込まれているため、アプリケーションはそのスケーラビリティを活用できます。

ベクトルストアの抽象化の現在の実装は LangChain4j を活用し、次のベクトルストアと埋め込みモデルをサポートしています。

ベクトルストア:

  • In-memory
  • OpenSearch
  • Azure Cosmos DB NoSQL
  • Azure AI Search
  • pgvector

埋め込みモデル:

  • In-process
  • Amazon Bedrock
  • Azure OpenAI
  • Google Vertex AI
  • OpenAI

ベクトルストアの抽象化を使用する理由

生成 AI の時代において、大規模言語モデル (LLM) を導入する際に組織が直面する課題の1つは、これらのモデルが企業データを理解できるようにすることです。検索拡張生成 (RAG) は、特定の企業知識で LLM を強化するために使用される重要な手法です。たとえば、LLM を搭載したチャットボットが正確で適切な応答を提供できるようにするために、企業は RAG を使用してユーザーマニュアルやサポートドキュメントからドメイン固有の情報を統合します。

RAG はベクトルストアに依存しています。ベクトルストアは通常、データベースからデータを抽出し、そのデータをベクトルに変換してから、それらのベクトルをロードすることによって作成されます。ScalarDB Cluster でベクトルストアとデータベースの抽象化を使用すると、プロセス全体をシームレスに実装できます。このアプローチにより、ワークフローとコードが大幅に簡素化され、特定のベクトルストアとデータベースに依存する複雑なアプリケーションを作成する必要がなくなります。

チュートリアル

このチュートリアルでは、ScalarDB Cluster でベクトル検索を実行する方法を説明します。

前提条件

注記

このチュートリアルは Eclipse Temurin の OpenJDK でテストされています。ただし、ScalarDB 自体はさまざまなベンダーの JDK ディストリビューションでテストされています。ScalarDB の要件、互換性のある JDK ディストリビューションを含む詳細については、要件 を参照してください。

警告

ScalarDB Cluster を使用するには、ライセンスキー (試用ライセンスまたは商用ライセンス) が必要です。ライセンスキーをお持ちでない場合は、お問い合わせください。

1. ScalarDB Cluster の設定ファイルを作成する

以下の設定ファイルを scalardb-cluster-node.properties として作成し、<YOUR_LICENSE_KEY><LICENSE_CHECK_CERT_PEM> を ScalarDB ライセンスキーとライセンスチェック証明書の値に置き換えてください。ライセンスキーと証明書の詳細については、製品ライセンスキーの設定方法を参照してください。

scalar.db.transaction.enabled=false

# Enable the standalone mode
scalar.db.cluster.node.standalone_mode.enabled=true

# Enable the embedding feature
scalar.db.embedding.enabled=true

# License key configurations
scalar.db.cluster.node.licensing.license_key=<YOUR_LICENSE_KEY>
scalar.db.cluster.node.licensing.license_check_cert_pem=<LICENSE_CHECK_CERT_PEM>

さらに、使用する埋め込みストアと埋め込みモデルに応じて、設定ファイルにプロパティを追加する必要があります。

使用する埋め込みストアを選択し、それに応じた設定手順に従ってください。

インメモリ埋め込みストアは基本的なインメモリ実装です。この埋め込みストアは、迅速なプロトタイピングやシンプルなユースケースに役立ちます。

インメモリ埋め込みストアを使用するには、設定ファイルに次のプロパティを追加します。

scalar.db.embedding.store.type=in-memory

使用する埋め込みモデルを選択し、それに応じた設定手順に従ってください。

In-process 埋め込みモデルは、ONNX runtime によって提供され、ScalarDB Cluster プロセス内で実行されるローカル埋め込みモデルです。この埋め込みモデルは、迅速なプロトタイピングやシンプルなユースケースに役立ちます。

In-process 埋め込みモデルを使用するには、設定ファイルに次のプロパティを追加します。

scalar.db.embedding.model.type=in-process

2. Docker Compose ファイルを作成する

以下の設定ファイルを docker-compose.yaml として作成してください。

services:

scalardb-cluster-standalone:
container_name: "scalardb-cluster-node"
image: "ghcr.io/scalar-labs/scalardb-cluster-node-byol-premium:3.16.0"
ports:
- 60053:60053
- 9080:9080
volumes:
- ./scalardb-cluster-node.properties:/scalardb-cluster/node/scalardb-cluster-node.properties

3. ScalarDB Cluster を起動する

以下のコマンドを実行して、スタンドアロンモードで ScalarDB Cluster を起動します。

docker compose up -d

ScalarDB Cluster が完全に起動するまで数分かかる場合があります。

4. 埋め込みストア抽象化用の Java Client SDK をプロジェクトに追加する

ScalarDB Cluster Embedding Java Client SDK ライブラリは Maven Central Repository で利用可能です。Gradle または Maven を使用してアプリケーションにライブラリをビルド依存関係として追加できます。

ビルドツールを選択し、ScalarDB Cluster Embedding Java Client SDK をアプリケーションに追加する手順に従ってください。

ScalarDB Cluster Embedding Java Client SDK のビルド依存関係を Gradle を使用して追加するには、アプリケーションの build.gradle に次の内容を追加します。

dependencies {
implementation 'com.scalar-labs:scalardb-cluster-embedding-java-client-sdk:3.16.0'
}

5. サンプルコードを実行する

新しい Java クラスを作成し、以下のコードを追加してサンプルコードを実行してください。

try (ScalarDbEmbeddingClientFactory scalarDbEmbeddingClientFactory =
ScalarDbEmbeddingClientFactory.builder()
.withProperty("scalar.db.embedding.client.contact_points", "indirect:localhost")
.build()) {
// Create an embedding store and an embedding model.
EmbeddingStore<TextSegment> scalarDbEmbeddingStore =
scalarDbEmbeddingClientFactory.createEmbeddingStore();
EmbeddingModel scalarDbEmbeddingModel = scalarDbEmbeddingClientFactory.createEmbeddingModel();

// Add embeddings to the embedding store.
TextSegment segment1 = TextSegment.from("I like football.");
Embedding embedding1 = scalarDbEmbeddingModel.embed(segment1).content();
scalarDbEmbeddingStore.add(embedding1, segment1);

TextSegment segment2 = TextSegment.from("The weather is good today.");
Embedding embedding2 = scalarDbEmbeddingModel.embed(segment2).content();
scalarDbEmbeddingStore.add(embedding2, segment2);

// Search for embeddings.
Embedding queryEmbedding =
scalarDbEmbeddingModel.embed("What is your favourite sport?").content();
EmbeddingSearchResult<TextSegment> result =
scalarDbEmbeddingStore.search(
EmbeddingSearchRequest.builder()
.queryEmbedding(queryEmbedding)
.maxResults(1)
.build());

// Print the search result.
List<EmbeddingMatch<TextSegment>> matches = result.matches();
EmbeddingMatch<TextSegment> embeddingMatch = matches.get(0);
System.out.println(embeddingMatch.embedded().text());
System.out.println(embeddingMatch.score());
}

このサンプルコードは、埋め込みストアと埋め込みモデルを作成し、埋め込みを埋め込みストアに追加し、埋め込みを検索する方法を示しています。

コードの埋め込みストアと埋め込みモデルを作成する部分を除いて、使用方法は LangChain4j と同じです。LangChain4j の詳細については、以下を参照してください:

ScalarDbEmbeddingClientFactory について

コードスニペットに示されているように、ScalarDbEmbeddingClientFactory クラスはファクトリのインスタンスを作成するためのビルダーを提供します。ビルダーを使用すると、ファクトリのプロパティを設定できます。この例では、withProperty() メソッドを使用して、以下のようにファクトリの接続ポイントを設定しています:

ScalarDbEmbeddingClientFactory scalarDbEmbeddingClientFactory = ScalarDbEmbeddingClientFactory.builder()
.withProperty("scalar.db.embedding.client.contact_points", "indirect:localhost")
.build();

また、withPropertiesFile() メソッドを使用してプロパティファイルを設定することもできます。

その後、以下のようにファクトリを使用して埋め込みストアと埋め込みモデルを作成できます:

EmbeddingStore<TextSegment> scalarDbEmbeddingStore =
scalarDbEmbeddingClientFactory.createEmbeddingStore();
EmbeddingModel scalarDbEmbeddingModel = scalarDbEmbeddingClientFactory.createEmbeddingModel();

これらのクラスのメソッドは内部的に ScalarDB Cluster に接続し、設定で指定された埋め込みストアと埋め込みモデルを使用して対話します。

アプリケーション内でベクトルストアと対話するには、scalarDbEmbeddingStorescalarDbEmbeddingModel のインスタンスを再利用する必要があります。

注記

ScalarDbEmbeddingClientFactory インスタンスは、使用後に接続を解放するために閉じる必要があります。

追加の詳細

ベクター検索機能は現在、プライベートプレビュー中です。詳細については、お問い合わせいただくか、この機能が将来のバージョンで一般公開されるまでお待ちください。