跳到主要內容

AzureAISearchRetriever

Azure AI 搜尋 (先前稱為 Azure Cognitive Search) 是 Microsoft 雲端搜尋服務,為開發人員提供基礎架構、API 和工具,以大規模檢索向量、關鍵字和混合查詢的資訊。

AzureAISearchRetriever 是一個整合模組,可從非結構化查詢傳回文件。它基於 BaseRetriever 類別,目標是 Azure AI 搜尋的 2023-11-01 穩定 REST API 版本,這表示它支援向量索引和查詢。

本指南將協助您開始使用 Azure AI 搜尋檢索器。如需所有 AzureAISearchRetriever 功能和組態的詳細文件,請前往API 參考

AzureAISearchRetriever 取代了 AzureCognitiveSearchRetriever,後者即將被棄用。我們建議切換到基於最新穩定版本搜尋 API 的較新版本。

整合詳細資訊

檢索器自行託管雲端服務套件
AzureAISearchRetrieverlangchain_community

設定

若要使用此模組,您需要

  • Azure AI 搜尋服務。如果您註冊 Azure 試用版,可以免費建立一個。免費服務的配額較低,但足以在本筆記本中執行程式碼。

  • 具有向量欄位的現有索引。有多種方法可以建立索引,包括使用向量儲存庫模組。或者,試用 Azure AI 搜尋 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>"

如果您想要從個別查詢取得自動化追蹤,您也可以透過取消註解下方內容來設定您的 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

例項化

對於 AzureAISearchRetriever,請提供 index_namecontent_keytop_k,並將 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 個 token 區塊,且沒有重疊。最後,文件會以嵌入形式新增至向量儲存庫。

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 參考


此頁面是否對您有幫助?