Azure AI サービス
このセクションでは、AzureVectorStore
をセットアップしてドキュメントの埋め込みを保存し、Azure AI 検索サービスを使用して類似性検索を実行する手順を説明します。
Azure AI 検索 (英語) は、Microsoft の大規模な AI プラットフォームの一部である、多用途のクラウドホスト型クラウド情報検索システムです。他の機能の中でも特に、ユーザーはベクトルベースのストレージと検索を使用して情報をクエリできます。
前提条件
Azure サブスクリプション: Azure サービスを使用するには、Azure サブスクリプション (英語) が必要です。
Azure AI 検索サービス: AI 検索サービス (英語) を作成します。サービスが作成されたら、
Settings
のKeys
セクションから管理者 apiKey を取得し、Overview
セクションのUrl
フィールドからエンドポイントを取得します。(オプション) Azure OpenAI サービス: Azure OpenAI サービス (英語) を作成します。NOTE: Azure Open AI サービスにアクセスするには、別のフォームに記入する必要がある場合があります。サービスが作成されたら、
Resource Management
のKeys and Endpoint
セクションからエンドポイントと apiKey を取得します。
構成
起動時に、コンストラクターで関連する initialize-schema
boolean
プロパティを true
に設定するか、Spring Boot を使用している場合は application.properties
ファイルで …initialize-schema=true
を設定することでオプトインしている場合、AzureVectorStore
は AI 検索サービスインスタンス内に新しいインデックスを作成しようとします。
これは重大な変更です。Spring AI の以前のバージョンでは、このスキーマの初期化はデフォルトで行われていました。 |
あるいは、手動でインデックスを作成することもできます。
AzureVectorStore をセットアップするには、インデックス名とともに上記の前提条件から取得した設定が必要です。
Azure AI 検索エンドポイント
Azure AI 検索キー
(オプション) Azure OpenAI API エンドポイント
(オプション) Azure OpenAI API キー
これらの値は OS 環境変数として指定できます。
export AZURE_AI_SEARCH_API_KEY=<My AI Search API Key>
export AZURE_AI_SEARCH_ENDPOINT=<My AI Search Index>
export OPENAI_API_KEY=<My Azure AI API Key> (Optional)
Azure Open AI 実装は、Embeddings インターフェースをサポートする有効な OpenAI 実装に置き換えることができます。例: Azure 実装の代わりに、Spring AI の Open AI または |
依存関係
これらの依存関係をプロジェクトに追加します。
1. 埋め込みインターフェースの実装を選択します。次の中から選択できます。
OpenAI 埋め込み:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
または Azure AI 埋め込み:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
</dependency>
またはローカル文 Transformers の埋め込み:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-transformers-spring-boot-starter</artifactId>
</dependency>
2. Azure (AI 検索) ベクトルストア
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-store</artifactId>
</dependency>
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
プロパティの構成
Spring Boot 構成で次のプロパティを使用して、Azure ベクトルストアをカスタマイズできます。
プロパティ | デフォルト値 |
---|---|
| |
| |
| false |
| spring_ai_azure_vector_store |
| 4 |
| 0.0 |
| 埋め込み |
| spring-ai-document-index |
サンプルコード
アプリケーションで Azure SearchIndexClient
を構成するには、次のコードを使用できます。
@Bean
public SearchIndexClient searchIndexClient() {
return new SearchIndexClientBuilder().endpoint(System.getenv("AZURE_AI_SEARCH_ENDPOINT"))
.credential(new AzureKeyCredential(System.getenv("AZURE_AI_SEARCH_API_KEY")))
.buildClient();
}
ベクトルストアを作成するには、上記のサンプルで作成した SearchIndexClient
Bean と、目的の Embeddings インターフェースを実装する Spring AI ライブラリによって提供される EmbeddingModel
を挿入することで、次のコードを使用できます。
@Bean
public VectorStore vectorStore(SearchIndexClient searchIndexClient, EmbeddingModel embeddingModel) {
return new AzureVectorStore(searchIndexClient, embeddingModel,
// Define the metadata fields to be used
// in the similarity search filters.
List.of(MetadataField.text("country"),
MetadataField.int64("year"),
MetadataField.bool("active")));
}
フィルター式で使用されるメタデータキーのすべてのメタデータフィールド名と型を明示的にリストする必要があります。上記のリストには、フィルター可能なメタデータフィールド (型 フィルタリング可能なメタデータフィールドが新しいエントリで拡張された場合は、このメタデータを含むドキュメントを (再) アップロード / 更新する必要があります。 |
メインコードで、いくつかのドキュメントを作成します。
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", "BG", "year", 2020)),
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("country", "NL", "year", 2023)));
ドキュメントをベクトルストアに追加します。
vectorStore.add(documents);
最後に、クエリに似たドキュメントを取得します。
List<Document> results = vectorStore.similaritySearch(
SearchRequest
.query("Spring")
.withTopK(5));
すべてがうまくいけば、"Spring AI rocks!!" というテキストを含むドキュメントを取得する必要があります。
メタデータのフィルタリング
AzureVectorStore では、汎用の移植可能なメタデータフィルターを利用することもできます。
例: 次のいずれかのテキスト式言語を使用できます。
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()));
移植可能なフィルター式は、独自の Azure Search OData フィルター (英語) に自動的に変換されます。例: 次のポータブルフィルター式:
country in ['UK', 'NL'] && year >= 2020
は、次の Azure OData フィルター式 (英語) に変換されます。
$filter search.in(meta_country, 'UK,NL', ',') and meta_year ge 2020