Skip to main content

Azure AI 搜索

Azure AI 搜索(以前称为 Azure Cognitive Search)是微软的云搜索服务,为开发人员提供基础架构、API 和工具,用于大规模检索向量、关键字和混合查询的信息。

AzureAISearchRetriever 是一个集成模块,用于从非结构化查询中返回文档。它基于 BaseRetriever 类,并针对 Azure AI 搜索的 2023-11-01 稳定 REST API 版本,这意味着它支持向量索引和查询。

要使用此模块,您需要:

  • 一个 Azure AI 搜索服务。您可以免费创建一个,如果您注册 Azure 试用账户。免费服务有较低的配额,但足以运行本笔记本中的代码。

  • 具有向量字段的现有索引。有几种创建索引的方法,包括使用向量存储模块。或者,尝试 Azure AI 搜索 REST API

  • 一个 API 密钥。在创建搜索服务时生成 API 密钥。如果只是查询索引,可以使用查询 API 密钥,否则使用管理员 API 密钥。有关详细信息,请参阅查找您的 API 密钥

AzureAISearchRetriever 取代了 AzureCognitiveSearchRetriever,后者将很快被弃用。我们建议切换到基于最新稳定版本搜索 API 的新版本。

安装软件包

使用 azure-documents-search 软件包 11.4 或更高版本。

%pip install --upgrade --quiet langchain
%pip install --upgrade --quiet langchain-openai
%pip install --upgrade --quiet azure-search-documents
%pip install --upgrade --quiet azure-identity

导入所需库

import os
from langchain_community.retrievers import (
AzureAISearchRetriever,
)

配置搜索设置

将搜索服务名称、索引名称和 API 密钥设置为环境变量(或者,您可以将它们作为参数传递给 AzureAISearchRetriever)。搜索索引提供可搜索的内容。

os.environ["AZURE_AI_SEARCH_SERVICE_NAME"] = "<YOUR_SEARCH_SERVICE_NAME>"
os.environ["AZURE_AI_SEARCH_INDEX_NAME"] = "<YOUR_SEARCH_INDEX_NAME>"
os.environ["AZURE_AI_SEARCH_API_KEY"] = "<YOUR_API_KEY>"

创建检索器

对于 AzureAISearchRetriever,提供一个 index_namecontent_keytop_k,设置为您想要检索的结果数量。将 top_k 设置为零(默认值)将返回所有结果。

retriever = AzureAISearchRetriever(
content_key="content", top_k=1, index_name="langchain-vector-demo"
)

现在您可以使用它从 Azure AI 搜索中检索文档。

这是您调用的方法。它将返回与查询相关的所有文档。

retriever.invoke("here is my unstructured query string")

示例

本节演示在内置示例数据上使用检索器。如果您的搜索服务已经具有向量索引,则可以跳过此步骤。

首先提供端点和密钥。由于我们在此步骤中创建一个向量索引,指定一个文本嵌入模型以获得文本的向量表示。此示例假定使用 Azure OpenAI,并部署了 text-embedding-ada-002。因为此步骤创建索引,请确保为您的搜索服务使用管理员 API 密钥。

import os
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain_community.retrievers import AzureAISearchRetriever
from langchain_community.vectorstores import AzureSearch
from langchain_openai import AzureOpenAIEmbeddings, OpenAIEmbeddings
from langchain_text_splitters import TokenTextSplitter
os.environ["AZURE_AI_SEARCH_SERVICE_NAME"] = "<YOUR_SEARCH_SERVICE_NAME>"
os.environ["AZURE_AI_SEARCH_INDEX_NAME"] = "langchain-vector-demo"
os.environ["AZURE_AI_SEARCH_API_KEY"] = "<YOUR_SEARCH_SERVICE_ADMIN_API_KEY>"
azure_endpoint: str = "<YOUR_AZURE_OPENAI_ENDPOINT>"
azure_openai_api_key: str = "<YOUR_AZURE_OPENAI_API_KEY>"
azure_openai_api_version: str = "2023-05-15"
azure_deployment: str = "text-embedding-ada-002"

我们将使用 Azure OpenAI 的嵌入模型将我们的文档转换为存储在 Azure AI 搜索向量存储中的嵌入。我们还将将索引名称设置为 langchain-vector-demo。这将创建一个与该索引名称关联的新向量存储。

embeddings = AzureOpenAIEmbeddings(
model=azure_deployment,
azure_endpoint=azure_endpoint,
openai_api_key=azure_openai_api_key,
)
vector_store: AzureSearch = AzureSearch(
embedding_function=embeddings.embed_query,
azure_search_endpoint=os.getenv("AZURE_AI_SEARCH_SERVICE_NAME"),
azure_search_key=os.getenv("AZURE_AI_SEARCH_API_KEY"),
index_name="langchain-vector-demo",
)

接下来,我们将把数据加载到我们新创建的向量存储中。在这个示例中,我们加载 state_of_the_union.txt 文件。我们将把文本分割成400个标记的块,没有重叠。最后,将这些文档作为嵌入添加到我们的向量存储中。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../how_to/state_of_the_union.txt", encoding="utf-8")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=400, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
vector_store.add_documents(documents=docs)

接下来,我们将创建一个检索器。当前的 index_name 变量是上一步中的 langchain-vector-demo。如果你跳过了向量存储的创建,可以在参数中提供你的索引名称。在这个查询中,返回顶部结果。

retriever = AzureAISearchRetriever(
content_key="content", top_k=1, index_name="langchain-vector-demo"
)

现在我们可以从我们上传的文档中检索与我们查询相关的数据。

retriever.invoke("does the president have a plan for covid-19?")

Was this page helpful?


You can leave detailed feedback on GitHub.