Udostępnij za pośrednictwem


Szybki start: wyszukiwanie generowania (RAG) z danymi uziemienia z usługi Azure AI Search

W tym przewodniku Szybki start pokazano, jak wysyłać podstawowe i złożone zapytania do modelu dużego języka (LLM) w celu wyszukiwania konwersacyjnego na podstawie indeksowanej zawartości w usłudze Azure AI Search. Za pomocą witryny Azure Portal skonfigurujesz zasoby, a następnie uruchom kod języka Python w celu wywołania interfejsów API.

Wymagania wstępne

Pobierz plik

Pobierz notes Jupyter z usługi GitHub, aby wysłać żądania w tym przewodniku Szybki start. Aby uzyskać więcej informacji, zobacz Pobieranie plików z usługi GitHub.

Możesz również uruchomić nowy plik w systemie lokalnym i ręcznie utworzyć żądania, korzystając z instrukcji w tym artykule.

Konfigurowanie dostępu

Żądania do punktu końcowego wyszukiwania muszą być uwierzytelnione i autoryzowane. W tym zadaniu można użyć kluczy interfejsu API lub ról. Klucze są łatwiejsze do rozpoczęcia od, ale role są bezpieczniejsze. W tym przewodniku Szybki start założono role.

Konfigurujesz dwóch klientów, więc potrzebujesz uprawnień do obu zasobów.

Usługa Azure AI Search odbiera żądanie zapytania z systemu lokalnego. Przypisz sobie przypisanie roli Czytelnik danych indeksu wyszukiwania dla tego zadania. Jeśli tworzysz i ładujesz przykładowy indeks hotelowy, dodaj także role Współautor usługi wyszukiwania i Współautor danych indeksu wyszukiwania.

Usługa Azure OpenAI otrzymuje (zapytanie) "Czy możesz polecić kilka hoteli" z systemu lokalnego, a także odbiera wyniki wyszukiwania (źródło) z usługi wyszukiwania. Przypisz sobie i usłudze wyszukiwania rolę użytkownika OpenAI usług Cognitive Services.

  1. Zaloguj się w witrynie Azure Portal.

  2. Skonfiguruj usługę Azure AI Search do używania tożsamości zarządzanej przypisanej przez system, aby można było nadać jej przypisania ról:

    1. W witrynie Azure Portal znajdź usługę wyszukiwania.

    2. W menu po lewej stronie wybierz pozycję Ustawienia>Tożsamość.

    3. Na karcie Przypisane przez system ustaw stan na Włączone.

  3. Konfigurowanie usługi Azure AI Search pod kątem dostępu opartego na rolach:

    1. W witrynie Azure Portal znajdź usługa wyszukiwania usługi Azure AI.

    2. W menu po lewej stronie wybierz pozycję Klucze ustawień>, a następnie wybierz pozycję Kontrola dostępu oparta na rolach lub Obie.

  4. Przypisywanie ról:

    1. W menu po lewej stronie wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami).

    2. W usłudze Azure AI Search upewnij się, że masz uprawnienia do tworzenia, ładowania i wykonywania zapytań względem indeksu wyszukiwania:

      • Czytnik danych indeksu wyszukiwania
      • Współautor danych indeksu wyszukiwania
      • Współautor usługi wyszukiwania
    3. W usłudze Azure OpenAI wybierz pozycję Kontrola dostępu (IAM), aby przypisać sobie i uprawnienia tożsamości usługi wyszukiwania w usłudze Azure OpenAI. Kod tego przewodnika Szybki start jest uruchamiany lokalnie. Żądania do usługi Azure OpenAI pochodzą z systemu. Ponadto wyniki wyszukiwania z aparatu wyszukiwania są przekazywane do usługi Azure OpenAI. Z tych powodów zarówno Ty, jak i usługa wyszukiwania potrzebują uprawnień w usłudze Azure OpenAI.

      • Użytkownik OpenAI usług Cognitive Services

Może upłynąć kilka minut, aby uprawnienia zaczęły obowiązywać.

Tworzenie indeksu

Zalecamy użycie indeksu hotels-sample, który można utworzyć w ciągu kilku minut i jest uruchamiany w dowolnej warstwie usługi wyszukiwania. Ten indeks jest tworzony przy użyciu wbudowanych przykładowych danych.

  1. W witrynie Azure Portal znajdź usługę wyszukiwania.

  2. Na stronie głównej Przegląd wybierz pozycję Importuj dane, aby uruchomić kreatora.

  3. Na stronie Łączenie z danymi wybierz pozycję Przykłady z listy rozwijanej.

  4. Wybierz przykład hotels-sample.

  5. Wybierz pozycję Dalej na pozostałych stronach, akceptując wartości domyślne.

  6. Po utworzeniu indeksu wybierz pozycję Indeksy zarządzania wyszukiwaniem>z menu po lewej stronie, aby otworzyć indeks.

  7. Wybierz pozycję Edytuj kod JSON.

  8. Wyszukaj ciąg "semantyczny", aby znaleźć sekcję w indeksie dla konfiguracji semantycznej. Zastąp pusty "semantic": {} wiersz następującą konfiguracją semantyczną. W tym przykładzie określono element "defaultConfiguration", który jest ważny dla uruchamiania tego przewodnika Szybki start.

    "semantic":{
       "defaultConfiguration":"semantic-config",
       "configurations":[
          {
             "name":"semantic-config",
             "prioritizedFields":{
                "titleField":{
                   "fieldName":"HotelName"
                },
                "prioritizedContentFields":[
                   {
                      "fieldName":"Description"
                   }
                ],
                "prioritizedKeywordsFields":[
                   {
                      "fieldName":"Category"
                   },
                   {
                      "fieldName":"Tags"
                   }
                ]
             }
          }
       ]
    },
    
  9. Zapisz swoje zmiany.

  10. Uruchom następujące zapytanie w Eksploratorze wyszukiwania, aby przetestować indeks: complimentary breakfast.

    Dane wyjściowe powinny wyglądać podobnie do poniższego przykładu. Wyniki zwracane bezpośrednio z aparatu wyszukiwania składają się z pól i ich wartości dosłownych, wraz z metadanymi, takimi jak wynik wyszukiwania i semantyczny wynik klasyfikacji i podpis, jeśli używasz semantycznego rangi. Użyliśmy instrukcji select, aby zwrócić tylko pola HotelName, Description i Tags.

    {
    "@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"
          ]
       },
       . . .
    ]}
    

Uzyskiwanie punktów końcowych usługi

W pozostałych sekcjach skonfigurujesz wywołania interfejsu API do usług Azure OpenAI i Azure AI Search. Pobierz punkty końcowe usługi, aby udostępnić je jako zmienne w kodzie.

  1. Zaloguj się w witrynie Azure Portal.

  2. Znajdź usługę wyszukiwania.

  3. Na stronie głównej Przegląd skopiuj adres URL. Przykładowy punkt końcowy może wyglądać podobnie jak https://example.search.windows.net.

  4. Znajdź usługę Azure OpenAI.

  5. Na stronie głównej Przegląd wybierz link, aby wyświetlić punkty końcowe. Skopiuj adres URL. Przykładowy punkt końcowy może wyglądać podobnie jak https://example.openai.azure.com/.

Konfigurowanie zapytania i wątku czatu

W tej sekcji użyto programu Visual Studio Code i języka Python do wywoływania interfejsów API uzupełniania czatu w usłudze Azure OpenAI.

  1. Uruchom program Visual Studio Code i otwórz plik ipynb lub utwórz nowy plik języka Python.

  2. Zainstaluj następujące pakiety języka Python.

    ! 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. Ustaw następujące zmienne, podstawiając symbole zastępcze punktami końcowymi zebranymi w poprzednim kroku.

     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. Skonfiguruj klientów, monit, zapytanie i odpowiedź.

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

    Dane wyjściowe pochodzą z usługi Azure OpenAI i składają się z zaleceń dla kilku hoteli. Oto przykład tego, jak mogą wyglądać dane wyjściowe:

    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
    

    Jeśli zostanie wyświetlony komunikat o błędzie Zabronione, sprawdź konfigurację usługi Azure AI Search, aby upewnić się, że dostęp oparty na rolach jest włączony.

    Jeśli zostanie wyświetlony komunikat o błędzie Autoryzacja nie powiodła się, zaczekaj kilka minut i spróbuj ponownie. Wykonywanie przypisań ról może potrwać kilka minut.

    W przeciwnym razie w celu dalszego eksperymentowania zmień zapytanie i ponownie uruchom ostatni krok, aby lepiej zrozumieć, jak działa model z danymi uziemienia.

    Można również zmodyfikować monit, aby zmienić ton lub strukturę danych wyjściowych.

    Możesz również wypróbować zapytanie bez semantycznego klasyfikowania, ustawiając je use_semantic_reranker=False w kroku parametrów zapytania. Klasyfikacja semantyczna nie może poprawić istotności wyników zapytań i możliwości funkcji LLM zwracania przydatnych informacji. Eksperymentowanie może pomóc w podjęciu decyzji, czy ma ona wpływ na zawartość.

Wysyłanie złożonego zapytania RAG

Usługa Azure AI Search obsługuje złożone typy dla zagnieżdżonych struktur JSON. W pliku hotels-sample-index Address jest przykładem typu złożonego składającego Address.StreetAddresssię z elementów , Address.City, Address.StateProvince, Address.PostalCodei Address.Country. Indeks zawiera również złożoną Rooms kolekcję dla każdego hotelu.

Jeśli indeks zawiera złożone typy, zapytanie może podać te pola, jeśli najpierw przekonwertujesz dane wyjściowe wyników wyszukiwania na format JSON, a następnie przekażesz kod JSON do modułu LLM. W poniższym przykładzie dodano złożone typy do żądania. Instrukcje formatowania obejmują specyfikację JSON.

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)

Dane wyjściowe pochodzą z usługi Azure OpenAI i dodaje zawartość z typów złożonych.

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.

Rozwiązywanie problemów

Aby debugować błędy uwierzytelniania, wstaw następujący kod przed krokiem, który wywołuje wyszukiwarkę i llM.

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)

Uruchom ponownie skrypt zapytania. Teraz w danych wyjściowych powinny zostać wyświetlone instrukcje INFO i DEBUG, które zawierają więcej szczegółów na temat problemu.

Jeśli zobaczysz komunikaty wyjściowe związane z błędami zarządzaniaIdentityCredential i pozyskiwania tokenów, może to oznaczać, że masz wiele dzierżaw, a logowanie platformy Azure korzysta z dzierżawy, która nie ma usługi wyszukiwania. Aby uzyskać identyfikator dzierżawy, wyszukaj w witrynie Azure Portal ciąg "właściwości dzierżawy" lub uruchom polecenie az login tenant list.

Po utworzeniu identyfikatora dzierżawy uruchom polecenie az login --tenant <YOUR-TENANT-ID> w wierszu polecenia, a następnie uruchom ponownie skrypt.

Czyszczenie

Jeśli pracujesz w ramach własnej subskrypcji, dobrym pomysłem po zakończeniu projektu jest sprawdzenie, czy dalej potrzebujesz utworzonych zasobów. Uruchomione zasoby mogą generować koszty. Zasoby możesz usuwać pojedynczo lub jako grupę zasobów, usuwając cały zestaw zasobów.

Zasoby można znaleźć w portalu i zarządzać nimi, korzystając z linku Wszystkie zasoby lub Grupy zasobów w okienku po lewej stronie.

Zobacz też