Partager via


Démarrage rapide : Recherche générative (RAG) avec des données de fondement à partir de Recherche Azure AI

Ce guide de démarrage rapide montre comment envoyer des requêtes de base et complexes à un modèle de langage volumineux (LLM) pour une expérience de recherche conversationnelle sur votre contenu indexé sur Recherche Azure AI. Vous utilisez le portail Azure pour configurer les ressources, puis exécutez du code Python pour appeler les API.

Prérequis

Télécharger un fichier

Téléchargez un notebook Jupyter à partir de GitHub pour envoyer les requêtes mentionnées dans ce guide de démarrage rapide. Si vous souhaitez obtenir plus d’informations, consultez Téléchargement de fichiers à partir de GitHub.

Vous pouvez également démarrer un nouveau fichier sur votre système local et créer des requêtes manuellement en tirant parti des instructions contenues dans cet article.

Configurer l’accès

Les demandes effectuées au point de terminaison de recherche doivent être authentifiées et autorisées. Vous pouvez utiliser des clés d’API ou des rôles pour cette tâche. Les clés sont plus faciles à utiliser, mais les rôles sont plus sécurisés. Ce guide de démarrage rapide part du principe que vous disposez de certains rôles.

Vous configurez deux clients. Vous avez donc besoin d’autorisations pour les deux ressources.

La Recherche Azure AI reçoit la demande de requête de votre système local. Attribuez-vous le rôle de Lecteur de données d’index de recherche pour cette tâche. Si vous créez et chargez également l’index d’échantillon d’hôtel, ajoutez également les rôles de Contributeur du service de recherche et Contributeur de données d’index de recherche.

Azure OpenAI reçoit la (requête) « Peux-tu recommander quelques hôtels » à partir de votre système local, ainsi que sa réception des résultats de recherche (source) du service de recherche. Attribuez-vous et au service de recherche le rôle d’Utilisateur OpenAI Cognitive Services.

  1. Connectez-vous au portail Azure.

  2. Configurez la Recherche Azure AI pour utiliser une identité managée affectée par le système afin de pouvoir lui attribuer des rôles :

    1. Dans le portail Azure, recherchez votre service de recherche.

    2. Dans le menu de gauche, sélectionnez Paramètres>Identité.

    3. Sous l’onglet Attribuée par le système, définissez l’état sur Activé.

  3. Configurez Recherche Azure AI pour l’accès en fonction du rôle :

    1. Dans le portail Azure, recherchez votre service Recherche Azure AI.

    2. Dans le menu de gauche, sélectionnez Paramètres>Clés, puis sélectionnez Contrôle d’accès en fonction du rôle ou Les deux.

  4. Attribuer des rôles :

    1. Dans le menu de gauche, sélectionnez Contrôle d’accès (IAM).

    2. Pour Recherche Azure AI, vérifiez que vous disposez des autorisations nécessaires pour créer, charger et interroger un index de recherche :

      • Contributeur de données d’index de la Recherche
      • Contributeur du service de recherche
    3. Pour Azure OpenAI, sélectionnez Contrôle d’accès (IAM) pour vous affecter à vous-même et à l’identité de service de recherche les autorisations sur Azure OpenAI. Le code de ce démarrage rapide s’exécute localement. Les demandes adressées à Azure OpenAI proviennent de votre système. En outre, les résultats de recherche du moteur de recherche sont passés à Azure OpenAI. Pour ces raisons, vous et le service de recherche avez besoin d’autorisations sur Azure OpenAI.

      • Utilisateur OpenAI Cognitive Services

La prise en compte des autorisations peut prendre plusieurs minutes.

Création d'un index

Nous vous recommandons d’utiliser hotels-sample-index, qui peut être créé en quelques minutes et s’exécute sur n’importe quel niveau de service de recherche. Cet index est créé à l’aide d’exemples de données intégrés.

  1. Dans le portail Azure, recherchez votre service de recherche.

  2. Dans la page d’accueil Vue d’ensemble, sélectionnez Importer des données pour démarrer l’Assistant.

  3. Dans la page Connexion à vos données, sélectionnez Exemples dans la liste déroulante.

  4. Choisissez hotels-sample.

  5. Sélectionnez Suivant dans les pages restantes, en acceptant les valeurs par défaut.

  6. Une fois l’index créé, sélectionnez Gestion de la recherche> Index dans le menu de gauche pour ouvrir l’index.

  7. Sélectionnez Modifier le fichier JSON.

  8. Recherchez « semantic » pour accéder à la section dans l’index pour une configuration sémantique. Remplacez la ligne "semantic": {} vide par la configuration sémantique suivante. Cet exemple spécifie un "defaultConfiguration", qui est important pour l’exécution de ce guide de démarrage rapide.

    "semantic":{
       "defaultConfiguration":"semantic-config",
       "configurations":[
          {
             "name":"semantic-config",
             "prioritizedFields":{
                "titleField":{
                   "fieldName":"HotelName"
                },
                "prioritizedContentFields":[
                   {
                      "fieldName":"Description"
                   }
                ],
                "prioritizedKeywordsFields":[
                   {
                      "fieldName":"Category"
                   },
                   {
                      "fieldName":"Tags"
                   }
                ]
             }
          }
       ]
    },
    
  9. Enregistrez les changements apportés.

  10. Exécutez la requête suivante dans l’Explorateur de recherche pour tester votre index : complimentary breakfast.

    Vous devez obtenir un résultat semblable à l’exemple qui suit. Les résultats retournés directement à partir du moteur de recherche se composent de champs et de leurs valeurs détaillées, ainsi que des métadonnées telles qu’un score de recherche et une note de classement sémantique et une légende si vous utilisez le classeur sémantique. Nous avons utilisé une instruction sélectionner pour retourner uniquement les champs HotelName, Description et 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"
          ]
       },
       . . .
    ]}
    

Obtenir des points de terminaison de service

Dans les sections restantes, vous configurez des appels d’API vers Azure OpenAI et Recherche Azure AI. Obtenez les points de terminaison de service pour pouvoir les fournir en tant que variables dans votre code.

  1. Connectez-vous au portail Azure.

  2. Rechercher votre service de recherche.

  3. Dans la page d’accueil Vue d’ensemble, copiez l’URL. Voici un exemple de point de terminaison : https://example.search.windows.net.

  4. Recherchez votre service Azure OpenAI.

  5. Dans la page d’accueil Vue d’ensemble, sélectionnez le lien pour afficher les points de terminaison. Copiez l’URL. Voici un exemple de point de terminaison : https://example.openai.azure.com/.

Configurer la requête et le thread de conversation

Cette section utilise Visual Studio Code et Python pour appeler les API de conversation complètes sur Azure OpenAI.

  1. Démarrez Visual Studio Code et ouvrez le fichier .ipynb ou créez un fichier Python.

  2. Installez les packages Python suivants.

    ! 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. Définissez les variables suivantes, en remplaçant les espaces réservés par les points de terminaison que vous avez collectés à l’étape précédente.

     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. Configurez les clients, l’invite, la requête et la réponse.

    Pour le cloud Azure Government, modifiez le point de terminaison d’API sur le fournisseur de jetons en "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)
    

    Le résultat provient d’Azure OpenAI et se compose de recommandations pour plusieurs hôtels. Voici un exemple de ce à quoi la sortie peut ressembler :

    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
    

    Si vous recevez un message d’erreur Interdit, vérifiez la configuration de Recherche Azure AI pour vous assurer que l’accès en fonction du rôle est activé.

    Si vous recevez un message d’erreur Autorisation échouée, patientez quelques minutes, puis réessayez. Plusieurs minutes peuvent être nécessaires avant que les attributions de rôles soient opérationnelles.

    Si vous souhaitez expérimenter davantage, modifiez la requête et exécutez à nouveau la dernière étape afin de mieux comprendre comment le modèle fonctionne avec les données de base.

    Vous pouvez également modifier l’invite pour modifier le ton ou la structure du résultat.

    Vous pouvez également essayer la requête sans classement sémantique en définissant use_semantic_reranker=False à l’étape des paramètres de requête. Le classement sémantique ne peut pas améliorer de manière significative la pertinence des résultats de requête et la capacité du LLM à retourner des informations utiles. L’expérimentation peut vous aider évaluer son utilité pour votre contenu.

Envoyer une requête RAG complexe

Recherche Azure AI prend en charge les types complexes pour les structures JSON imbriquées. Dans l’hôtel-sample-index, Address est un exemple de type complexe, composé de Address.StreetAddress, Address.City, Address.StateProvince, Address.PostalCode et Address.Country. L’index a également une collection complexe de Rooms pour chaque hôtel.

Si votre index a des types complexes, votre requête peut fournir ces champs si vous convertissez d’abord les résultats de la recherche en JSON, puis le transmettez au LLM. L’exemple suivant ajoute des types complexes à la requête. Les instructions de mise en forme incluent une spécification 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)

La sortie provient d’Azure OpenAI et ajoute du contenu à partir de types complexes.

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.

Résolution des erreurs

Pour déboguer les erreurs d’authentification, insérez le code suivant avant l’étape qui appelle le moteur de recherche et le 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)

Réexécutez le script de requête. Vous devez maintenant obtenir des instructions INFO et DEBUG dans la sortie, qui fournissent plus de détails sur le problème.

Si vous voyez des messages de sortie liés à ManagedIdentityCredential et des échecs d’acquisition de jetons, vous avez peut-être plusieurs locataires et votre connexion Azure utilise un locataire qui ne dispose pas de votre service de recherche. Pour obtenir votre ID de locataire, recherchez « Propriétés du locataire » sur le Portail Azure ou exécutez az login tenant list.

Une fois que vous avez votre ID de locataire, exécutez az login --tenant <YOUR-TENANT-ID> dans une invite de commande, puis réexécutez le script.

Nettoyer

Lorsque vous travaillez dans votre propre abonnement, il est recommandé, à la fin de chaque projet, de déterminer si vous avez toujours besoin des ressources que vous avez créées. Les ressources laissées en cours d’exécution peuvent vous coûter de l’argent. Vous pouvez supprimer les ressources individuellement, ou supprimer le groupe de ressources pour supprimer l’ensemble des ressources.

Vous pouvez rechercher et gérer des ressources dans le portail Azure avec les liens Toutes les ressources ou Groupes de ressources situés dans le volet le plus à gauche.

Voir aussi