Freigeben über


Schnellstart: Generative Suche (RAG) mit Erdungsdaten aus Azure KI-Suche

In diesem Schnellstart erfahren Sie, wie Sie über Ihre indizierten Inhalte in Azure KI-Suche einfache und komplexe Abfragen an ein großes Sprachmodell (LLM) senden, um eine Sucherfahrung im Unterhaltungsstil zu erhalten. Sie richten die Ressourcen mithilfe des Azure-Portal ein und führen dann Python-Code aus, um die APIs aufzurufen.

Voraussetzungen

Herunterladen einer Datei

Laden Sie ein Jupyter-Notebook von GitHub herunter, um die Anforderungen in diesem Schnellstart zu senden. Weitere Informationen finden Sie unter Herunterladen von Dateien von GitHub.

Sie können auch eine neue Datei auf Ihrem lokalen System anlegen und die Abfragen manuell anhand der Anleitung in diesem Artikel erstellen.

Konfigurieren des Zugriffs

Anforderungen an den Suchendpunkt müssen authentifiziert und autorisiert werden. Sie können für diese Aufgabe API-Schlüssel oder Rollen verwenden. Schlüssel sind für ein Einstieg einfacher, Rollen sind jedoch sicherer. In diesem Schnellstart werden Rollen vorausgesetzt.

Sie richten zwei Clients ein, daher benötigen Sie Berechtigungen für beide Ressourcen.

Azure KI-Suche empfängt die Abfrageanforderung von Ihrem lokalen System. Weisen Sie sich selbst die Rolle Suchindexdatenleser für diese Aufgabe zu. Wenn Sie auch den Hotelbeispielindex erstellen und laden, fügen Sie die Rollen Suchdienstmitwirkender und Mitwirkender an Suchindexdaten hinzu.

Azure OpenAI empfängt die Zeichenfolge (Abfrage) „Kannst du ein paar Hotels empfehlen“ von Ihrem lokalen System und die Suchergebnisse (Quelle) vom Suchdienst. Weisen Sie sich und dem Suchdienst die Rolle Cognitive Services OpenAI-Benutzer zu.

  1. Melden Sie sich beim Azure-Portal an.

  2. Konfigurieren Sie Azure KI-Suche so, dass eine systemseitig zugewiesene verwaltete Identität verwendet wird, damit Sie dieser Rollen zuweisen können:

    1. Suchen Sie im Azure-Portal nach Ihrem Suchdienst.

    2. Wählen Sie im linken Menü Einstellungen>Identität aus.

    3. Legen Sie auf der Registerkarte „Systemseitig zugewiesen“ den Status auf Ein fest.

  3. Konfigurieren von Azure KI-Suche für rollenbasierten Zugriff:

    1. Suchen Sie im Azure-Portal nach Ihrem Azure KI-Suchdienst.

    2. Wählen Sie im linken Menü Einstellungen>Schlüsselaus, und wählen Sie dann entweder die Option Rollenbasierte Zugriffssteuerung oder Beides aus.

  4. Zuweisen von Rollen:

    1. Wählen Sie im linken Menü Zugriffssteuerung (IAM) aus.

    2. Stellen Sie in Azure KI-Suche sicher, dass Sie über Berechtigungen zum Erstellen, Laden und Abfragen eines Suchindex verfügen:

      • Suchindexdatenleser
      • Mitwirkender an Suchindexdaten
      • Mitwirkender von Suchdienst
    3. Wählen Sie in Azure OpenAI Zugriffssteuerung (IAM) aus, um sich selbst und der Suchdienstidentität Berechtigungen für Azure OpenAI zuzuweisen. Den Code für diese Schnellstartanleitung wird lokal ausgeführt. Anforderungen an Azure OpenAI stammen aus Ihrem System. Außerdem werden Suchergebnisse aus der Suchmaschine an Azure OpenAI übergeben. Aus diesen Gründen benötigen sowohl Sie als auch der Suchdienst Berechtigungen für Azure OpenAI.

      • Cognitive Services OpenAI-Benutzer

Es kann einige Minuten dauern, bis die Berechtigungen in Kraft treten.

Erstellen eines Index

Wir empfehlen den Index hotels-sample-index, der in Minuten erstellt und auf jeder Suchdienstebene ausgeführt werden kann. Dieser Index wird mit integrierten Beispieldaten erstellt.

  1. Suchen Sie im Azure-Portal nach Ihrem Suchdienst.

  2. Wählen Sie auf der Startseite Übersicht die Option Daten importieren aus, um den Assistenten zu starten.

  3. Wählen Sie auf der Seite Mit Ihren Daten verbinden die Option Beispiele aus der Dropdownliste aus.

  4. Wählen Sie das Beispiel hotels-sample aus.

  5. Wählen Sie auf den restlichen Seiten jeweils Weiter aus, und akzeptieren Sie die Standardwerte.

  6. Nachdem der Index erstellt wurde, wählen Sie im linken Menü Suchverwaltung>Indizes aus, um den Index zu öffnen.

  7. Wählen Sie JSON bearbeiten aus.

  8. Suchen Sie nach „Semantik“, um den Abschnitt im Index für eine Semantikkonfiguration zu finden. Ersetzen Sie die leere "semantic": {}-Zeile durch die folgende Semantikkonfiguration. In diesem Beispiel wird "defaultConfiguration" angegeben, was für die Ausführung dieses Schnellstarts wichtig ist.

    "semantic":{
       "defaultConfiguration":"semantic-config",
       "configurations":[
          {
             "name":"semantic-config",
             "prioritizedFields":{
                "titleField":{
                   "fieldName":"HotelName"
                },
                "prioritizedContentFields":[
                   {
                      "fieldName":"Description"
                   }
                ],
                "prioritizedKeywordsFields":[
                   {
                      "fieldName":"Category"
                   },
                   {
                      "fieldName":"Tags"
                   }
                ]
             }
          }
       ]
    },
    
  9. Speichern Sie die Änderungen.

  10. Führen Sie die folgende Abfrage im Such-Explorer aus, um den Index zu testen: complimentary breakfast.

    Die Ausgabe sollte etwa folgendem Beispiel entsprechen. Die Ergebnisse, die direkt von der Suchmaschine zurückgegeben werden, bestehen aus Feldern und deren wörtlichen Werten, zusammen mit Metadaten wie einem Suchergebnis und einem Ergebnis für das semantische Ranking sowie einer Beschriftung, wenn Sie den semantischen Sortierer verwenden. Wir haben eine Auswahlanweisung verwendet, um nur die Felder „HotelName“, „Beschreibung“ und „Tags“ zurückzugeben.

    {
    "@odata.count": 18,
    "@search.answers": [],
    "value": [
       {
          "@search.score": 2.2896252,
          "@search.rerankerScore": 2.506816864013672,
          "@search.captions": [
          {
             "text": "Head Wind Resort. Suite. coffee in lobby\r\nfree wifi\r\nview. The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a **complimentary continental breakfast** in the lobby, and free Wi-Fi throughout the hotel..",
             "highlights": ""
          }
          ],
          "HotelName": "Head Wind Resort",
          "Description": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a complimentary continental breakfast in the lobby, and free Wi-Fi throughout the hotel.",
          "Tags": [
          "coffee in lobby",
          "free wifi",
          "view"
          ]
       },
       {
          "@search.score": 2.2158256,
          "@search.rerankerScore": 2.288334846496582,
          "@search.captions": [
          {
             "text": "Swan Bird Lake Inn. Budget. continental breakfast\r\nfree wifi\r\n24-hour front desk service. We serve a continental-style breakfast each morning, featuring a variety of food and drinks. Our locally made, oh-so-soft, caramel cinnamon rolls are a favorite with our guests. Other breakfast items include coffee, orange juice, milk, cereal, instant oatmeal, bagels, and muffins..",
             "highlights": ""
          }
          ],
          "HotelName": "Swan Bird Lake Inn",
          "Description": "We serve a continental-style breakfast each morning, featuring a variety of food and drinks. Our locally made, oh-so-soft, caramel cinnamon rolls are a favorite with our guests. Other breakfast items include coffee, orange juice, milk, cereal, instant oatmeal, bagels, and muffins.",
          "Tags": [
          "continental breakfast",
          "free wifi",
          "24-hour front desk service"
          ]
       },
       {
          "@search.score": 0.92481667,
          "@search.rerankerScore": 2.221315860748291,
          "@search.captions": [
          {
             "text": "White Mountain Lodge & Suites. Resort and Spa. continental breakfast\r\npool\r\nrestaurant. Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings..",
             "highlights": ""
          }
          ],
          "HotelName": "White Mountain Lodge & Suites",
          "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings.",
          "Tags": [
          "continental breakfast",
          "pool",
          "restaurant"
          ]
       },
       . . .
    ]}
    

Abrufen von Dienstendpunkten

In den verbleibenden Abschnitten richten Sie API-Aufrufe für Azure OpenAI und die Azure KI-Suche ein. Rufen Sie die Dienstendpunkte ab, damit Sie sie als Variablen im Code bereitstellen können.

  1. Melden Sie sich beim Azure-Portal an.

  2. Suchen Sie Ihren Suchdienst.

  3. Sie finden die URL auf der Startseite Übersicht. Ein Beispiel für einen Endpunkt ist https://example.search.windows.net.

  4. Suchen Sie Ihren Azure OpenAI-Dienst.

  5. Wählen Sie auf der Startseite Übersicht den Link aus, um die Endpunkte anzuzeigen. Kopieren Sie die URL. Ein Beispiel für einen Endpunkt ist https://example.openai.azure.com/.

Einrichten des Abfrage- und Chatthreads

In diesem Abschnitt werden Visual Studio Code und Python verwendet, um die Chatvervollständigungs-APIs in Azure OpenAI aufzurufen.

  1. Starten Sie Visual Studio Code, und öffnen Sie die IPYNB-Datei oder erstellen Sie eine neue Python-Datei.

  2. Installieren Sie die folgenden Python-Pakete.

    ! pip install azure-search-documents==11.6.0b5 --quiet
    ! pip install azure-identity==1.16.1 --quiet
    ! pip install openai --quiet
    ! pip install aiohttp --quiet
    ! pip install ipykernel --quiet
    
  3. Legen Sie die folgenden Variablen fest, und ersetzen Sie dabei die Platzhalter durch die Endpunkte, die Sie im vorigen Schritt gesammelt haben.

     AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
     AZURE_OPENAI_ACCOUNT: str = "PUT YOUR AZURE OPENAI ENDPOINT HERE"
     AZURE_DEPLOYMENT_MODEL: str = "gpt-4o"
    
  4. Richten Sie Clients, Prompt, Abfrage und Antwort ein.

    Ändern Sie für die Azure Government-Cloud den API-Endpunkt des Tokenanbieters in "https://cognitiveservices.azure.us/.default".

    # Set up the query for generating responses
     from azure.identity import DefaultAzureCredential
     from azure.identity import get_bearer_token_provider
     from azure.search.documents import SearchClient
     from openai import AzureOpenAI
    
     credential = DefaultAzureCredential()
     token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
     openai_client = AzureOpenAI(
         api_version="2024-06-01",
         azure_endpoint=AZURE_OPENAI_ACCOUNT,
         azure_ad_token_provider=token_provider
     )
    
     search_client = SearchClient(
         endpoint=AZURE_SEARCH_SERVICE,
         index_name="hotels-sample-index",
         credential=credential
     )
    
     # This prompt provides instructions to the model
     GROUNDED_PROMPT="""
     You are a friendly assistant that recommends hotels based on activities and amenities.
     Answer the query using only the sources provided below in a friendly and concise bulleted manner.
     Answer ONLY with the facts listed in the list of sources below.
     If there isn't enough information below, say you don't know.
     Do not generate answers that don't use the sources below.
     Query: {query}
     Sources:\n{sources}
     """
    
     # Query is the question being asked. It's sent to the search engine and the LLM.
     query="Can you recommend a few hotels with complimentary breakfast?"
    
     # Set up the search results and the chat thread.
     # Retrieve the selected fields from the search index related to the question.
     search_results = search_client.search(
         search_text=query,
         top=5,
         select="Description,HotelName,Tags"
     )
     sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results])
    
     response = openai_client.chat.completions.create(
         messages=[
             {
                 "role": "user",
                 "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
             }
         ],
         model=AZURE_DEPLOYMENT_MODEL
     )
    
     print(response.choices[0].message.content)
    

    Die Ausgabe stammt aus Azure OpenAI und besteht aus Empfehlungen für mehrere Hotels. Hier sehen Sie ein Beispiel für eine mögliche Ausgabe:

    Sure! Here are a few hotels that offer complimentary breakfast:
    
    - **Head Wind Resort**
    - Complimentary continental breakfast in the lobby
    - Free Wi-Fi throughout the hotel
    
    - **Double Sanctuary Resort**
    - Continental breakfast included
    
    - **White Mountain Lodge & Suites**
    - Continental breakfast available
    
    - **Swan Bird Lake Inn**
    - Continental-style breakfast each morning with a variety of food and drinks 
     such as caramel cinnamon rolls, coffee, orange juice, milk, cereal, 
     instant oatmeal, bagels, and muffins
    

    Wenn Sie die Fehlermeldung Verboten erhalten, überprüfen Sie die Konfiguration für Azure KI-Suche, um sicherzustellen, dass der rollenbasierte Zugriff aktiviert ist.

    Wenn Sie die Fehlermeldung Autorisierung fehlgeschlagen erhalten, warten Sie einige Minuten, und versuchen Sie es erneut. Es kann mehrere Minuten dauern, bis Rollenzuweisungen betriebsbereit sind.

    Ändern Sie andernfalls um weiter zu experimentieren die Abfrage, und führen Sie den letzten Schritt erneut aus, um besser zu verstehen, wie das Modell mit den Groundingdaten funktioniert.

    Sie können auch den Prompt ändern, um den Ton oder die Struktur der Ausgabe zu ändern.

    Sie können die Abfrage auch ohne semantische Rangfolge ausprobieren, indem Sie use_semantic_reranker=False im Abfrageparameterschritt festlegen. Die semantische Rangfolge kann die Relevanz von Abfrageergebnissen und die Fähigkeit des LLM, nützliche Informationen zurückzugeben, deutlich verbessern. Durch Experimentieren können Sie herausfinden, ob es für Ihre Inhalte einen Unterschied macht.

Senden einer komplexen RAG-Abfrage

Azure KI-Suche unterstützt komplexe Typen für geschachtelte JSON-Strukturen. Im Hotelbeispielindex ist Address ein Beispiel für einen komplexen Typ, bestehend aus Address.StreetAddress, Address.City, Address.StateProvince, Address.PostalCode und Address.Country. Der Index verfügt auch über eine komplexe Sammlung von Rooms für jedes Hotel.

Wenn Ihr Index komplexe Typen aufweist, kann Ihre Abfrage diese Felder bereitstellen, wenn Sie die Ausgabe der Suchergebnisse zuerst in JSON konvertieren und dann das JSON an das LLM übergeben. Im folgenden Beispiel werden der Anforderung komplexe Typen hinzugefügt. Die Formatierungsanweisungen enthalten eine JSON-Spezifikation.

import json

# Query is the question being asked. It's sent to the search engine and the LLM.
query="Can you recommend a few hotels that offer complimentary breakfast? 
Tell me their description, address, tags, and the rate for one room that sleeps 4 people."

# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
selected_fields = ["HotelName","Description","Address","Rooms","Tags"]
search_results = search_client.search(
    search_text=query,
    top=5,
    select=selected_fields,
    query_type="semantic"
)
sources_filtered = [{field: result[field] for field in selected_fields} for result in search_results]
sources_formatted = "\n".join([json.dumps(source) for source in sources_filtered])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model=AZURE_DEPLOYMENT_MODEL
)

print(response.choices[0].message.content)

Die Ausgabe stammt aus Azure OpenAI und fügt Inhalte aus komplexen Typen hinzu.

Here are a few hotels that offer complimentary breakfast and have rooms that sleep 4 people:

1. **Head Wind Resort**
   - **Description:** The best of old town hospitality combined with views of the river and 
   cool breezes off the prairie. Enjoy a complimentary continental breakfast in the lobby, 
   and free Wi-Fi throughout the hotel.
   - **Address:** 7633 E 63rd Pl, Tulsa, OK 74133, USA
   - **Tags:** Coffee in lobby, free Wi-Fi, view
   - **Room for 4:** Suite, 2 Queen Beds (Amenities) - $254.99

2. **Double Sanctuary Resort**
   - **Description:** 5-star Luxury Hotel - Biggest Rooms in the city. #1 Hotel in the area 
   listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso 
   in room. Offers continental breakfast.
   - **Address:** 2211 Elliott Ave, Seattle, WA 98121, USA
   - **Tags:** View, pool, restaurant, bar, continental breakfast
   - **Room for 4:** Suite, 2 Queen Beds (Amenities) - $254.99

3. **Swan Bird Lake Inn**
   - **Description:** Continental-style breakfast featuring a variety of food and drinks. 
   Locally made caramel cinnamon rolls are a favorite.
   - **Address:** 1 Memorial Dr, Cambridge, MA 02142, USA
   - **Tags:** Continental breakfast, free Wi-Fi, 24-hour front desk service
   - **Room for 4:** Budget Room, 2 Queen Beds (City View) - $85.99

4. **Gastronomic Landscape Hotel**
   - **Description:** Known for its culinary excellence under the management of William Dough, 
   offers continental breakfast.
   - **Address:** 3393 Peachtree Rd, Atlanta, GA 30326, USA
   - **Tags:** Restaurant, bar, continental breakfast
   - **Room for 4:** Budget Room, 2 Queen Beds (Amenities) - $66.99
...
   - **Tags:** Pool, continental breakfast, free parking
   - **Room for 4:** Budget Room, 2 Queen Beds (Amenities) - $60.99

Enjoy your stay! Let me know if you need any more information.

Behebung von Fehlern

Um Authentifizierungsfehler zu beheben, fügen Sie den folgenden Code vor dem Schritt ein, der die Suchmaschine und das LLM aufruft.

import sys
import logging # Set the logging level for all azure-storage-* libraries
logger = logging.getLogger('azure.identity') 
logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler(stream=sys.stdout)
formatter = logging.Formatter('[%(levelname)s %(name)s] %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

Führen Sie das Abfrageskript erneut aus. Sie sollten nun INFO- und DEBUG- Meldungen in der Ausgabe erhalten, die mehr Details über das Problem liefern.

Wenn Sie Ausgabemeldungen im Zusammenhang mit ManagedIdentityCredential und dem fehlgeschlagenen Token-Erwerb sehen, könnte es sein, dass Sie mehrere Mandanten haben und Ihre Azure-Anmeldung über einen Mandanten erfolgt, der nicht über Ihren Suchdienst verfügt. Um Ihre Mandanten-ID zu erhalten, suchen Sie im Azure-Portal nach „Mandanteneigenschaften“, oder führen Sie az login tenant list aus.

Wenn Sie über eine Mandanten-ID verfügen, führen Sie an einer Eingabeaufforderung az login --tenant <YOUR-TENANT-ID> aus, und führen Sie dann das Skript erneut aus.

Bereinigen

Wenn Sie in Ihrem eigenen Abonnement arbeiten, sollten Sie sich am Ende eines Projekts überlegen, ob Sie die erstellten Ressourcen noch benötigen. Ressourcen, die weiterhin ausgeführt werden, können Sie Geld kosten. Sie können einzelne Ressourcen oder die gesamte Ressourcengruppe mit allen darin enthaltenen Ressourcen löschen.

Ressourcen können im Portal über den Link Alle Ressourcen oder Ressourcengruppen im linken Navigationsbereich gesucht und verwaltet werden.

Siehe auch