AzureAISearchRetriever
Azure AI 搜尋 (先前稱為 Azure Cognitive Search
) 是 Microsoft 雲端搜尋服務,為開發人員提供基礎架構、API 和工具,以大規模檢索向量、關鍵字和混合查詢的資訊。
AzureAISearchRetriever
是一個整合模組,可從非結構化查詢傳回文件。它基於 BaseRetriever 類別,目標是 Azure AI 搜尋的 2023-11-01 穩定 REST API 版本,這表示它支援向量索引和查詢。
本指南將協助您開始使用 Azure AI 搜尋檢索器。如需所有 AzureAISearchRetriever
功能和組態的詳細文件,請前往API 參考。
AzureAISearchRetriever
取代了 AzureCognitiveSearchRetriever
,後者即將被棄用。我們建議切換到基於最新穩定版本搜尋 API 的較新版本。
整合詳細資訊
檢索器 | 自行託管 | 雲端服務 | 套件 |
---|---|---|---|
AzureAISearchRetriever | ❌ | ✅ | langchain_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_name
、content_key
和 top_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 參考。