Skapa och använda ett index med hjälp av kod
Viktigt!
Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.
I den här artikeln får du lära dig hur du skapar ett index och använder det från kod. För att skapa ett index lokalt använder vi paketet promptflow-rag
. För att skapa ett fjärrindex i molnet använder vi paketet azure-ai-ml
. Vi använder indexen med .langchain
Förutsättningar
Du måste ha:
En Azure AI Foundry-hubb och ett projekt.
En Azure AI-tjänsten Search anslutning för att indexering av exempelprodukt- och kunddata. Om du inte har någon Azure AI-tjänsten Search kan du skapa en från Azure Portal eller se anvisningarna här.
Modeller för inbäddning:
- Du kan använda en ada-002-inbäddningsmodell från Azure OpenAI. Instruktionerna för att distribuera finns här.
- Eller så kan du använda en annan inbäddningsmodell som distribuerats i ditt Azure AI Foundry-projekt. I det här exemplet använder vi samtidig flerspråkig inbäddning. Instruktionerna för att distribuera den här modellen finns här.
Skapa och använda ett index lokalt
Vi kan skapa och använda ett index lokalt.
Nödvändiga paket för lokala indexåtgärder
Installera följande paket som krävs för att skapa lokala index.
pip install promptflow-rag langchain langchain-openai
Konfigurera AI Search för lokal användning
Vi använder Azure AI Search som indexarkiv. För att komma igång kan vi konfigurera Azure AI-tjänsten Search med hjälp av följande kod:
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"
Skapa ett index lokalt med Azure OpenAI-inbäddningar
För att skapa ett index som använder Azure OpenAI-inbäddningar konfigurerar vi miljövariabler för att ansluta till modellen.
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/"
Nu ska vi skapa indexet med hjälp av build_index
funktionen .
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
)
Koden ovan skapar ett index lokalt. Den använder miljövariabler för att hämta AI-tjänsten Search och även för att ansluta till Inbäddningsmodellen för Azure OpenAI.
Skapa ett index lokalt med andra inbäddningsmodeller som distribuerats i ditt Azure AI Foundry-projekt
För att skapa ett index som använder en inbäddningsmodell som distribuerats i ditt Azure AI Foundry-projekt konfigurerar vi anslutningen till modellen med hjälp av en ConnectionConfig
som visas nedan. och subscription
resource_group
workspace
refererar till projektet där inbäddningsmodellen är installerad. connection_name
Refererar till anslutningsnamnet för modellen, som finns på sidan för Azure AI Foundry-projektinställningar.
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>"
)
Nu ska vi skapa indexet med hjälp av build_index
funktionen .
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
)
Koden ovan skapar ett index lokalt. Den använder miljövariabler för att hämta AI-tjänsten Search och anslutningskonfigurationen för att ansluta till inbäddningsmodellen.
Använda ett lokalt index
Det lokala index som skapats kan användas som en langchain retriever för att använda det för sökfrågor.
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>")
Registrera indexet i ditt Azure AI Foundry-projekt (valfritt)
Du kan också registrera indexet i ditt Azure AI Foundry-projekt så att du eller andra som har åtkomst till projektet kan använda det från molnet. Innan du fortsätter installerar du de paket som krävs för fjärråtgärder.
Ansluta till projektet
# connect to the Azure AI Foundry 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>"
)
Koden subscription
, resource_group
och workspace
i ovanstående refererar till det projekt som du vill ansluta till.
Registrera indexet
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")
)
Kommentar
Miljövariabler är avsedda för enkelhetens skull i en lokal miljö. Men om du registrerar ett lokalt index som skapats med hjälp av miljövariabler kanske indexet inte fungerar som förväntat eftersom hemligheter från miljövariabler inte överförs till molnindexet. För att åtgärda det här problemet kan du använda en ConnectionConfig
eller connection_id
för att skapa ett lokalt index innan du registrerar dig.
Skapa ett index (via fjärranslutning) i ditt Azure AI Foundry-projekt
Vi skapar ett index i molnet i ditt Azure AI Foundry-projekt.
Nödvändiga paket för fjärrindexåtgärder
Installera följande paket som krävs för att skapa fjärrindex.
pip install azure-ai-ml promptflow-rag langchain langchain-openai
Ansluta till Azure AI Foundry-projektet
För att komma igång ansluter vi till projektet. resource_group
workspace
Och subscription
i koden nedan refererar till det projekt som du vill ansluta till.
# connect to the Azure AI Foundry 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>"
)
Hämta AI-tjänsten Search-anslutningen
Det här projektet bör ha en anslutning till AI-tjänsten Search. Vi hämtar informationen från projektet.
ai_search_connection = client.connections.get("<ai_search_connection>")
Ansluta till inbäddningsmodellerna
Du kan ansluta till Azure OpenAI med hjälp av Microsoft Entra-ID-anslutningar eller API-nyckelbaserade anslutningar.
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")
Du kan ansluta till inbäddningsmodellen som distribuerats i ditt Azure AI Foundry-projekt (inte Azure OpenAI-modeller) med hjälp av den serverlösa anslutningen.
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)
Välj indata för att skapa indexet
Du kan skapa indexet från följande typer av indata:
- Lokala filer och mappar
- GitHub-lagringsplatser
- Azure Storage
Vi kan använda följande kodexempel för att använda någon av dessa källor och konfigurera vår 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}"
Skapa indexet i molnet
Nu kan vi skapa indexet med hjälp av ai_search_connection
, embeddings_model_config
och input_source
. Vi använder build_index
funktionen. Om du använder en Azure Storage-URL som indatakälla måste du också ange en 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
)
Beroende på storleken på dina indatakälldata kan ovanstående steg ta lite tid att slutföra. När jobbet är klart kan du hämta indexobjektet.
my_index=client.indexes.get(name="<index_name>", label="latest")
Använda ett registrerat index från projektet
Om du vill använda ett registrerat index från projektet måste du ansluta till projektet och hämta indexet. Det hämtade indexet kan användas som en langhcain retriever för att använda det. Du kan ansluta till projektet med en client
som visas här.
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>")
En fråge- och svarsfunktion för att använda indexet
Vi har sett hur du skapar ett index lokalt eller i molnet. Med det här indexet skapar vi en QnA-funktion som accepterar en användarfråga och ger ett svar från indexdata. Låt oss först hämta indexet som en langchain_retriever som visas här. Nu använder vi detta retriever
i vår funktion. Den här funktionen använder LLM enligt definitionen i AzureChatOpenAI
konstruktorn. Det använder indexet som en langchain_retriever för att köra frågor mot data. Vi skapar en promptmall som accepterar en kontext och en fråga. Vi använder langchain's RetrievalQA.from_chain_type
för att sätta ihop alla dessa och ge oss svaren.
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"]]),
}
Låt oss ställa en fråga för att se till att vi får ett svar.
result = qna("<your question>")
print(result["answer"])