Freigeben über


Erstellen und Verwenden eines Indexes mithilfe von Code

Wichtig

Die in diesem Artikel markierten Elemente (Vorschau) sind aktuell als öffentliche Vorschau verfügbar. Diese Vorschauversion wird ohne Vereinbarung zum Servicelevel bereitgestellt und sollte nicht für Produktionsworkloads verwendet werden. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Zusätzliche Nutzungsbestimmungen für Microsoft Azure-Vorschauen.

In diesem Artikel erfahren Sie, wie Sie einen Index erstellen und mit Code nutzen. Verwenden Sie das promptflow-rag-Paket, um einen Index lokal zu erstellen. Für das Erstellen eines Remoteindexes in der Cloud wird das azure-ai-ml-Paket verwendet. Die Indizes werden mithilfe von langchain genutzt.

Voraussetzungen

Sie benötigen Folgendes:

  • KI Studio-Hub und ein Projekt.

  • Eine Verbindung mit dem Dienst „Azure KI-Suche“, um die Beispielproduktdaten und -kundendaten zu indizieren. Wenn Sie kein Instanz des Diensts „Azure KI-Suche“ haben, können Sie eine über das Azure-Portal erstellen oder sich diese Anweisungen ansehen.

  • Modelle zum Einbetten:

    • Sie können ein ada-002-Einbettungsmodell aus Azure OpenAI verwenden. Anweisungen zum Bereitstellen finden Sie hier.
    • ODER: Sie können ein beliebiges anderes Einbettungsmodell verwenden, das in Ihrem KI Studio-Projekt bereitgestellt wird. In diesem Beispiel wird die mehrsprachige Cohere-Einbettung verwendet. Die Anweisungen zum Bereitstellen dieses Modells finden Sie hier.

Lokales Erstellen und Verwenden eines Indexes

Sie können einen Index lokal erstellen und verwenden.

Erforderliche Pakete für lokale Indexvorgänge

Installieren Sie die folgenden Pakete, die für die lokale Indexerstellung erforderlich sind.

pip install promptflow-rag langchain langchain-openai

Konfigurieren der KI-Suche für die lokale Verwendung

Die Azure KI-Suche wird als Indexspeicher verwendet. Richten Sie zunächst den Dienst für die Azure KI-Suche mithilfe des folgenden Codes ein:

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"

Lokales Erstellen eines Indexes mithilfe von Azure OpenAI-Einbettungen

Da Sie einen Index erstellen möchten, der Azure OpenAI-Einbettungen verwendet, konfigurieren Sie Umgebungsvariablen, um eine Verbindung mit dem Modell herzustellen.

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/"

Erstellen Sie nun den Index mithilfe der build_index-Funktion.

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
)

Der obige Code erstellt einen Index lokal. Dabei werden Umgebungsvariablen verwendet, um den Dienst für die KI-Suche abzurufen und auch eine Verbindung mit dem Azure OpenAI-Einbettungsmodell herzustellen.

Lokales Erstellen eines Indexes mithilfe anderer Einbettungsmodelle, die in Ihrem KI Studio-Projekt bereitgestellt werden

Konfigurieren Sie wie im Folgenden gezeigt die Verbindung mit dem Modell mithilfe von ConnectionConfig, um einen Index zu erstellen, der ein in Ihrem KI Studio-Projekt bereitgestelltes Einbettungsmodell verwendet. subscription, resource_group und workspace beziehen sich auf das Projekt, in dem das Einbettungsmodell installiert ist. connection_name bezieht sich auf den Verbindungsnamen für das Modell, das auf der Seite mit den Azure KI Studio-Projekteinstellungen zu finden ist.

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>"
    )

Erstellen Sie nun den Index mithilfe der build_index-Funktion.

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
)

Der obige Code erstellt einen Index lokal. Dabei werden Umgebungsvariablen verwendet, um den Dienst für die KI-Suche und die Verbindungskonfiguration zum Herstellen einer Verbindung mit dem Einbettungsmodell abzurufen.

Verwenden eines lokalen Indexes

Der erstellte lokale Index kann als LangChain-Retriever für Suchabfragen verwendet werden.

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>")

Registrieren des Indexes in Ihrem KI Studio-Projekt (optional)

Optional können Sie den Index in Ihrem KI Studio-Projekt registrieren, damit Sie oder andere Personen, die Zugriff auf Ihr Projekt haben, den Index über die Cloud verwenden können. Bevor Sie fortfahren, sollten Sie die erforderlichen Pakete für Remotevorgänge installieren.

Herstellen einer Verbindung mit dem Projekt

# 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 und workspace im obigen Code verweisen auf das Projekt, mit dem Sie eine Verbindung herstellen möchten.

Registrieren des Indexes

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")
          )

Hinweis

Umgebungsvariablen sind zur Vereinfachung in einer lokalen Umgebung vorgesehen. Wenn Sie jedoch einen lokalen Index registrieren, der mit Umgebungsvariablen erstellt wurde, funktioniert der Index möglicherweise nicht wie erwartet, da Geheimnisse aus Umgebungsvariablen nicht in den Cloudindex übertragen werden. Um dieses Problem zu beheben, können Sie vor der Registrierung ConnectionConfig oder connection_id verwenden, um einen lokalen Index zu erstellen.

Erstellen eines Indexes in Ihrem KI Studio-Projekt (per Remotezugriff)

Sie erstellen einen Index in der Cloud in Ihrem KI Studio-Projekt.

Erforderliche Pakete für Remoteindexvorgänge

Installieren Sie die folgenden Pakete, die für die Remoteindexerstellung erforderlich sind.

pip install azure-ai-ml promptflow-rag langchain langchain-openai

Herstellen einer Verbindung mit dem KI Studio-Projekt

Um zu beginnen, stellen Sie eine Verbindung mit dem Projekt her. subscription, resource_group und workspace im folgenden Code beziehen sich auf das Projekt, mit dem Sie eine Verbindung herstellen möchten.

# 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>"
    )

Abrufen der Verbindung mit dem Dienst für die Azure KI-Suche

Für dieses Projekt sollte eine Verbindung mit dem Dienst für die Azure KI-Suche hergestellt werden. Rufen Sie die Details aus dem Projekt ab.

ai_search_connection = client.connections.get("<ai_search_connection>")

Herstellen einer Verbindung mit den Einbettungsmodellen

Mithilfe von Microsoft Entra ID-Verbindungen oder auf API-Schlüsseln basierenden Verbindungen können Sie eine Verbindung mit Azure OpenAI herstellen.

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")

Unter Verwendung einer serverlosen Verbindung können Sie eine Verbindung mit dem in Ihrem KI Studio-Projekt (Nicht-Azure OpenAI-Modelle) bereitgestellten Einbettungsmodell herstellen.

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)

Auswählen von Eingabedaten zum Erstellen des Indexes

Sie können einen Index aus den folgenden Eingabetypen erstellen:

  • Lokale Dateien und Ordner
  • GitHub-Repositorys
  • Azure Storage

Sie können das folgende Codebeispiel verwenden, um eine dieser Quellen zu nutzen und input_source zu konfigurieren:

# 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}"

Erstellen des Indexes in der Cloud

Jetzt können Sie den Index mithilfe von ai_search_connection, embeddings_model_config und input_source erstellen. Sie verwenden die build_index-Funktion. Wenn Sie eine Azure Storage-URL als Eingabequelle verwenden, müssen Sie auch eine UserIdentityConfiguration bereitstellen.

# 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
)

Je nach Größe der Eingabequellendaten kann es einige Zeit dauern, bis die obigen Schritte abgeschlossen sind. Nach Abschluss des Auftrags können Sie das Indexobjekt abrufen.

my_index=client.indexes.get(name="<index_name>", label="latest")

Verwenden eines registrierten Indexes aus Ihrem Projekt

Um einen registrierten Index aus Ihrem Projekt zu nutzen, müssen Sie eine Verbindung mit dem Projekt herstellen und den Index abrufen. Der abgerufene Index kann als LangChain-Retriever verwendet werden. Wie im Folgenden gezeigt können Sie mit client eine Verbindung mit dem Projekt herstellen.

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>")

Q&A-Funktion zur Verwendung des Indexes

Sie haben erfahren, wie Sie einen Index lokal oder in der Cloud erstellen. Mit diesem Index erstellen Sie eine Q&A-Funktion, die eine Benutzerfrage akzeptiert und eine Antwort aus den Indexdaten bereitstellt. Verwenden Sie den Index wie hier gezeigt als langchain_retriever. Verwenden Sie retriever nun in der Funktion. Diese Funktion verwendet das LLM wie im AzureChatOpenAI-Konstruktor definiert. Sie verwendet den Index als langchain_retriever zum Abfragen der Daten. Sie erstellen eine Promptvorlage, die einen Kontext und eine Frage akzeptiert. Sie verwenden RetrievalQA.from_chain_type von LangChain, um alle Elemente zusammenzufügen und die Antworten abzurufen.

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"]]),
    }

Stellen Sie nun eine Frage, um sicherzustellen, dass Sie eine Antwort erhalten.

result = qna("<your question>")
print(result["answer"])