如何使用程式碼建置及取用索引
重要
本文中標示為 (預覽) 的項目目前處於公開預覽狀態。 此預覽版本沒有服務等級協定,不建議將其用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
在本文中,您可了解如何建立索引,並從程式碼取用索引。 若要在本機建立索引,我們使用 promptflow-rag
套件。 若要在雲端建立遠端索引,我們使用 azure-ai-ml
套件。 我們使用 langchain
來取用索引。
必要條件
您必須有:
要編製範例產品和客戶資料索引的 Azure AI 搜尋服務連線。 如果您沒有 Azure AI 搜尋服務,您可以從 Azure 入口網站建立一個,或參閱這裡的指示。
內嵌的模型:
在本機建置及取用索引
我可以在本機建置及取用索引。
本機索引作業的必要套件
安裝建立本機索引所需的下列套件。
pip install promptflow-rag langchain langchain-openai
設定 AI 搜尋以供本機使用
我們會使用 Azure AI 搜尋作為索引存放區。 若要開始使用,我們可以使用下列程式碼來設定 Azure AI 搜尋服務:
import os
# set credentials to your Azure AI Search instance
os.environ["AZURE_AI_SEARCH_KEY"] = "<your-ai-search-key>"
os.environ["AZURE_AI_SEARCH_ENDPOINT"] = "https://<your-ai-search-service>.search.windows.net"
使用 Azure OpenAI 內嵌在本機建置索引
若要建立使用 Azure OpenAI 內嵌的索引,我們會設定環境變數以連線到模型。
import os
# set credentials to your Azure OpenAI instance
os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
os.environ["AZURE_OPENAI_API_KEY"] = "<your-azure-openai-api-key>"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://<your-azure-openai-service>.openai.azure.com/"
現在,讓我們使用 build_index
函式來建置索引。
from promptflow.rag.config import LocalSource, AzureAISearchConfig, EmbeddingsModelConfig
from promptflow.rag import build_index
local_index_aoai=build_index(
name="<your-index-name>" + "aoai", # name of your index
vector_store="azure_ai_search", # the type of vector store
embeddings_model_config=EmbeddingsModelConfig(
model_name="text-embedding-ada-002",
deployment_name="text-embedding-ada-002", # verify if your deployment name is same as model name
),
input_source=LocalSource(input_data="<path-to-your-local-files>"), # the location of your file/folders
index_config=AzureAISearchConfig(
ai_search_index_name="<your-index-name>" + "-aoai-store", # the name of the index store inside the azure ai search service
),
tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)
上述程式碼可在本機建置索引。 它會使用環境變數來取得 AI 搜尋服務,並連線到 Azure OpenAI 內嵌模型。
使用在 AI Studio 專案中部署的其他內嵌模型,在本機建置索引
若要建立使用 AI Studio 專案中所部署內嵌模型的索引,我們會使用 ConnectionConfig
來設定與模型的連線,如下所示。 subscription
、resource_group
和 workspace
是指安裝內嵌模型的專案。 connection_name
是指模型的連線名稱,您可在 AI Studio 專案設定頁面中找到該名稱。
from promptflow.rag.config import ConnectionConfig
my_connection_config=ConnectionConfig(
subscription_id="<subscription_id>",
resource_group_name="<resource_group_name>",
workspace_name="<ai_studio_project_name>",
connection_name="<serverless_connection_name>"
)
現在,讓我們使用 build_index
函式來建置索引。
from promptflow.rag.config import LocalSource, AzureAISearchConfig, EmbeddingsModelConfig
from promptflow.rag import build_index
local_index_cohere=build_index(
name="<your-index-name>" + "cohere", # name of your index
vector_store="azure_ai_search", # the type of vector store
embeddings_model_config=EmbeddingsModelConfig(
model_name="cohere-embed-v3-multilingual", # in this example we use cohere multi lingual embedding
connection_config=my_connection_config # created in previous step
),
input_source=LocalSource(input_data="<path-to-your-local-files>"), # the location of your file/folders
index_config=AzureAISearchConfig(
ai_search_index_name="<your-index-name>" + "cohere-store", # the name of the index store inside the azure ai search service
),
tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)
上述程式碼可在本機建置索引。 它會使用環境變數來取得 AI 搜尋服務和連線組態,以連線到內嵌模型。
取用本機索引
建立的本機索引可作為 langchain 擷取器,以使用於搜尋查詢。
from promptflow.rag import get_langchain_retriever_from_index
# Get the OpenAI embedded Index
retriever=get_langchain_retriever_from_index(local_index_aoai)
retriever.get_relevant_documents("<your search query>")
# Get the Cohere embedded Index
retriever=get_langchain_retriever_from_index(local_index_cohere)
retriever.get_relevant_documents("<your search query>")
在 AI Studio 專案中註冊索引 (選擇性)
您可以選擇性地在 AI Studio 專案中註冊索引,讓您或其他可存取您專案的人可從雲端使用該專案。 繼續安裝必要套件以進行遠端作業之前。
連線到專案
# connect to the AI Studio project
from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient
client=MLClient(
DefaultAzureCredential(),
subscription_id="<subscription_id>",
resource_group_name="<resource_group_name>",
workspace_name="<ai_studio_project_name>"
)
上述程式碼中的 subscription
、resource_group
和 workspace
是指您要連線的專案。
註冊索引
from azure.ai.ml.entities import Index
# register the index with Azure OpenAI embeddings
client.indexes.create_or_update(
Index(name="<your-index-name>" + "aoai",
path=local_index_aoai,
version="1")
)
# register the index with cohere embeddings
client.indexes.create_or_update(
Index(name="<your-index-name>" + "cohere",
path=local_index_cohere,
version="1")
)
注意
環境變數旨在達到本機環境的便利性。 不過,如果您註冊使用環境變數建立的本機索引,索引可能無法如預期般運作,因為環境變數的秘密不會傳輸至雲端索引。 若要解決此問題,您可使用 ConnectionConfig
或 connection_id
在註冊之前建立本機索引。
在 AI Studio 專案中建置索引 (遠端)
我們在您 AI Studio 專案中在雲端建置索引。
遠端索引作業的必要套件
安裝建立遠端索引所需的下列套件。
pip install azure-ai-ml promptflow-rag langchain langchain-openai
連線到 AI Studio 專案
若要開始使用,我們會連線到專案。 下列程式碼中的 subscription
、resource_group
和 workspace
是指您要連線的專案。
# connect to the AI Studio project
from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient
client=MLClient(
DefaultAzureCredential(),
subscription_id="<subscription_id>",
resource_group_name="<resource_group_name>",
workspace_name="<ai_studio_project_name>"
)
取得 AI 搜尋服務連線
此專案應該與 AI 搜尋服務建立連線。 我們會從專案擷取詳細資料。
ai_search_connection = client.connections.get("<ai_search_connection>")
連線到內嵌模型
您可使用 Microsoft Entra ID 連線或 API 金鑰型連線來連線到 Azure OpenAI。
from azure.ai.ml.entities import IndexModelConfiguration
## aoai connections - entra id
aoai_connection = client.connections.get("<your_aoai_entra_id_connection>")
embeddings_model_config = IndexModelConfiguration.from_connection(
aoai_connection,
model_name="text-embedding-ada-002",
deployment_name="text-embedding-ada-002") # verify if your deployment name is same as model name
## OR you can connect using API Key based connections
from azure.ai.ml.entities import IndexModelConfiguration
## aoai connections - API Key
aoai_connection = client.connections.get("<your_aoai_connection>", populate_secrets=True)
embeddings_model_config = IndexModelConfiguration.from_connection(
aoai_connection,
model_name="text-embedding-ada-002",
deployment_name="text-embedding-ada-002")
您可使用無伺服器連線,連線到在 AI Studio 專案 (非 Azure OpenAI 模型) 中部署的內嵌模型。
from azure.ai.ml.entities import IndexModelConfiguration
serverless_connection = client.connections.get("<my_embedding_model_severless_connection_name>")
embeddings_model_config = IndexModelConfiguration.from_connection(cohere_serverless_connection)
選取輸入資料以建置索引
您可以從下列輸入類型建置索引:
- 本機檔案和資料夾
- GitHub 存放庫
- Azure 儲存體
我們可使用下列程式碼範例,使用這些來源中的任何一個並設定我們的 input_source
:
# Local source
from azure.ai.ml.entities import LocalSource
input_source=LocalSource(input_data="<path-to-your-local-files>")
# GitHub repository
from azure.ai.ml.entities import GitSource
input_source=GitSource(
git_url="https://github.com/rust-lang/book.git", # connecting to the RUST repo as an example
git_branch_name="main",
git_connection_id="")
# Azure Storage
input_source_subscription = "<subscription>"
input_source_resource_group = "<resource_group>"
input_source_workspace = "<workspace>"
input_source_datastore = "<datastore_name>"
input_source_path = "path"
input_source = f"azureml://subscriptions/{input_source_subscription}/resourcegroups/{input_source_resource_group}/workspaces/{input_source_workspace}/datastores/{input_source_datastore}/paths/{input_source_path}"
在雲端建置索引
現在,我們可以使用 ai_search_connection
、embeddings_model_config
和 input_source
來建置索引。 我們使用 build_index
函式。 如果您使用 Azure 儲存體 URL 作為輸入來源,則也需要提供 UserIdentityConfiguration
。
# from azure.ai.ml.entities.credentials import UserIdentityConfiguration # user specified identity used to access the data. Required when using an azure storage URL
from azure.ai.ml.entities import AzureAISearchConfig
client.indexes.build_index(
name="<index_name>", # name of your index
embeddings_model_config=embeddings_model_config,
input_source=input_source,
# input_source_credential=UserIdentityConfiguration(), # user specified identity used to access the data. Required when using an azure storage URL
index_config=AzureAISearchConfig(
ai_search_index_name="<index_name>", # the name of the index store in AI search service
ai_search_connection_id=ai_search_connection.id,
),
tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)
視輸入來源資料的大小而定,上述步驟可能需要一些時間來完成。 作業完成後,您即可擷取索引物件。
my_index=client.indexes.get(name="<index_name>", label="latest")
從您的專案取用已註冊的索引
若要從專案取用已註冊的索引,您必須連線到專案並擷取索引。 擷取的索引可用作為 langhcain 擷取器來取用它。 您可使用 client
連線到專案,如下所示。
from promptflow.rag import get_langchain_retriever_from_index
my_index=client.indexes.get(
name="<registered_index_name>",
label="latest")
index_langchain_retriever=get_langchain_retriever_from_index(my_index.path)
index_langchain_retriever.get_relevant_documents("<your search query>")
要使用索引的問答函式
我們已了解如何在本機或雲端建置索引。 使用此索引,我們會建置 QnA 函式,以接受使用者問題並提供來自索引資料的解答。 首先,讓我們以 langchain_retriever 的形式取得索引,如這裡所示。 我們現在會在函式中使用這個 retriever
。 此函式會使用如 AzureChatOpenAI
建構函式中定義的 LLM。 它會使用索引作為 langchain_retriever 來查詢資料。 我們會建置可接受內容和問題的提示範本。 我們使用 langchain 的 RetrievalQA.from_chain_type
將這些全部放在一起並為我們提供答案。
def qna(question: str, temperature: float = 0.0, prompt_template: object = None) -> str:
from langchain import PromptTemplate
from langchain.chains import RetrievalQA
from langchain_openai import AzureChatOpenAI
llm = AzureChatOpenAI(
openai_api_version="2023-06-01-preview",
api_key="<your-azure-openai-api-key>",
azure_endpoint="https://<your-azure-openai-service>.openai.azure.com/",
azure_deployment="<your-chat-model-deployment>", # verify the model name and deployment name
temperature=temperature,
)
template = """
System:
You are an AI assistant helping users answer questions given a specific context.
Use the following pieces of context to answer the questions as completely,
correctly, and concisely as possible.
Your answer should only come from the context. Don't try to make up an answer.
Do not add documentation reference in the response.
{context}
---
Question: {question}
Answer:"
"""
prompt_template = PromptTemplate(template=template, input_variables=["context", "question"])
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=index_langchain_retriever,
return_source_documents=True,
chain_type_kwargs={
"prompt": prompt_template,
},
)
response = qa(question)
return {
"question": response["query"],
"answer": response["result"],
"context": "\n\n".join([doc.page_content for doc in response["source_documents"]]),
}
讓我們提出問題,以確保可得到解答。
result = qna("<your question>")
print(result["answer"])