Azure AI Service

本节将指导您设置 AzureVectorStore 以存储文档嵌入,并使用 Azure AI 搜索服务执行相似度搜索。 Azure AI Search 是作为 Microsoft 更大 AI 平台的一部分的多功能云托管云信息检索系统。除了其他功能外,它还允许用户使用基于向量的存储和检索来查询信息。

Prerequisites

  1. Azure 订阅:你需要 Azure subscription 才能使用任何 Azure 服务。

  2. Azure AI 搜索服务:创建一个 AI Search service.服务创建好后,从 Settings 下的 Keys 部分获取管理员 apiKey,并从 Overview 部分下的 Url 字段获取终结点。

  3. (可选)Azure OpenAI 服务:创建一个 Azure OpenAI service. NOTE: 你可能需要填写一份单独的表单才能获得对 Azure Open AI 服务的访问权限。服务创建好后,从 Resource Management 下的 Keys and Endpoint 部分获取终结点和 apiKey。

Configuration

在启动时,AzureVectorStore 将尝试在您的 AI 搜索服务实例内新建一个索引。或者,您可以手动创建索引。

要设置 AzureVectorStore,您需要从上述先决条件中检索到的设置以及您的索引名称:

  • Azure AI Search Endpoint

  • Azure AI Search Key

  • (可选)Azure OpenAI API 端点

  • (可选)Azure OpenAI API 密钥

您可以将这些值作为操作系统环境变量提供。

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)

您可以用支持 Embeddings 接口的任何有效的 OpenAI 实现替换 Azure Open AI 实现。例如,您可以使用 Spring AI 的 Open AI 或 TransformersEmbedding 实现作为嵌入,而不是 Azure 实现。

Dependencies

将这些依赖项添加到你的项目中:

1. Select an Embeddings interface implementation. You can choose between:

  • OpenAI Embedding:

<dependency>
   <groupId>org.springframework.ai</groupId>
   <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
  • Or Azure AI Embedding:

<dependency>
 <groupId>org.springframework.ai</groupId>
 <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
</dependency>
  • 或本地句子转换器嵌入:

<dependency>
 <groupId>org.springframework.ai</groupId>
 <artifactId>spring-ai-transformers-spring-boot-starter</artifactId>
</dependency>

2. Azure (AI Search) Vector Store

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-azure-vector-store</artifactId>
</dependency>
  1. 参见 Dependency Management 部分,将 Spring AI BOM 添加到你的构建文件中。

Sample Code

要在您的应用程序中配置 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,以及由 Spring AI 库提供的实现了所需 Embeddings 接口的 EmbeddingClient

@Bean
public VectorStore vectorStore(SearchIndexClient searchIndexClient, EmbeddingClient embeddingClient) {
  return new AzureVectorStore(searchIndexClient, embeddingClient,
    // Define the metadata fields to be used
    // in the similarity search filters.
    List.of(MetadataField.text("country"),
            MetadataField.int64("year"),
            MetadataField.bool("active")));
}

您必须明确列出筛选表达式中使用的任何元数据键的所有元数据字段名称和类型。上述列表注册了可筛选的元数据字段:类型为 TEXTcountry、类型为 INT64year、类型为 BOOLEANactive。 如果可过滤元数据字段通过新条目展开,则必须使用此元数据(重新)上传/更新文档。

在你的主代码中,创建一些文档:

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(List.of(document));

最后,检索与查询类似的文档:

List<Document> results = vectorStore.similaritySearch(
    SearchRequest
      .query("Spring")
      .withTopK(5));

如果一切都顺利,你应该检索包含文本 “Spring AI rocks!!” 的文档。

Metadata filtering

您也可以将通用的、可移植的 metadata filters 与 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()));

可移植筛选器表达式会自动转换成 Microsoft Azure Search 专有的 OData filters。例如,以下可移植筛选器表达式:

country in ['UK', 'NL'] && year >= 2020

会转换成以下 Azure OData filter expression

$filter search.in(meta_country, 'UK,NL', ',') and meta_year ge 2020