AzureAISearchRetriever
Azure AI Search (formerly known as Azure Cognitive Search) 是微软云搜索服务,为开发者提供基础设施、API 和工具,用于大规模的向量、关键词和混合查询的信息检索。
AzureAISearchRetriever 是一个集成模块,用于从非结构化查询中返回文档。它基于 BaseRetriever 类,并针对 2023-11-01 稳定版的 Azure AI Search REST API 版本,这意味着它支持向量索引和查询。
这本指南将帮助您入门 Azure AI Search 提取器。有关所有 AzureAISearchRetriever 功能和配置的详细文档,请参阅 API 参考。
AzureAISearchRetriever 替代 AzureCognitiveSearchRetriever,后者即将弃用。我们建议切换到基于最新稳定版搜索API的较新版本。
集成细节
| 检索器 | Self-host | 云开发解决方案 | 包 |
|---|---|---|---|
| AzureAISearchRetriever | ❌ | ✅ | langchain_community |
设置
要使用此模块,您需要:<br>
-
Azure AI搜索服务。如果您注册了Azure试用,可以免费创建一个。免费服务的配额较低,但足以运行本笔记本中的代码。
-
已有向量字段的现有索引。可以使用 向量存储模块 创建一个,或者 尝试使用 Azure AI 搜索 REST API。
-
API密钥或Azure AD令牌。
- API密钥在创建搜索服务时生成。如果您只是查询索引,可以使用查询API密钥;否则,请使用管理员API密钥。请参阅查找您的API密钥获取详情。
- Azure AD Token 可以与 Azure 管理身份一起使用。请参阅 连接您的应用到 Azure AI 搜索 (使用标识) 以获取详细信息。
我们随后可以设置搜索服务名称、索引名称和API密钥作为环境变量(或者,您也可以将它们作为参数传递给AzureAISearchRetriever)。搜索索引提供了可搜索的内容。
使用 API 密钥
import os
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>"
使用 Azure AD 令牌
import os
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_AD_TOKEN"] = "<YOUR_AZURE_AD_TOKEN>"
如果您想要从单个查询中获取自动跟踪,您也可以通过取消注释下方代码来设置您的LangSmith API密钥:
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"
安装
这个检索器位于langchain-community包中。我们还需要一些额外的依赖项:
%pip install --upgrade --quiet langchain-community
%pip install --upgrade --quiet langchain-openai
%pip install --upgrade --quiet azure-search-documents>=11.4
%pip install --upgrade --quiet azure-identity
Instantiation
对于AzureAISearchRetriever,请提供一个index_name、content_key和top_k的设置,将其设置为您希望检索的结果数量。将top_k设为零(默认值)将返回所有结果。
from langchain_community.retrievers import AzureAISearchRetriever
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?")
使用在链中
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template(
"""Answer the question based only on the context provided.
Context: {context}
Question: {question}"""
)
llm = ChatOpenAI(model="gpt-4o-mini")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
chain.invoke("does the president have a plan for covid-19?")
API 参考
详细文档请参阅所有AzureAISearchRetriever功能和配置的API参考。