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 vous montre comment envoyer des requêtes à un modèle de complétion de conversation pour une expérience de recherche conversationnelle avec 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

Pour répondre à l’exigence de région identique, commencez par passer en revue les régions pour le modèle de conversation que vous voulez utiliser. Une fois que vous avez identifié une région, vérifiez que Recherche Azure AI est disponible dans la même région.

Assurez-vous que vous connaissez le nom du modèle déployé et que vous avez sous la main les points de terminaison pour les deux ressources Azure. Vous fournirez ces informations dans les étapes qui suivent.

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 l’attribution de rôle Lecteur de données de l’index de recherche si l’exemple d’index des hôtels existe déjà. S’il n’existe pas, attribuez-vous les rôles Contributeur service Search et Contributeur de données d’index de recherche afin de pouvoir créer et interroger l’index.

Azure OpenAI reçoit la requête et les résultats de recherche de votre système local. Attribuez-vous le rôle Utilisateur OpenAI Cognitive Services sur Azure OpenAI.

  1. Connectez-vous au portail Azure.

  2. 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.

  3. Attribuer des rôles :

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

    2. Dans Recherche Azure AI, sélectionnez ces rôles pour créer, charger et interroger un index de recherche, puis affectez-les à votre identité d’utilisateur Microsoft Entra ID :

      • Contributeur de données d’index de la Recherche
      • Contributeur du service de recherche
    3. Dans Azure OpenAI, sélectionnez Contrôle d’accès (IAM) pour vous attribuer ce rôle sur Azure OpenAI :

      • Utilisateur OpenAI Cognitive Services

La prise en compte des autorisations peut prendre plusieurs minutes.

Création d'un index

Un index de recherche fournit des données ancrées dans le réel pour le modèle de conversation. 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. Faites défiler l’index jusqu’à la fin, où vous pouvez trouver des espaces réservés pour les constructions qui peuvent être ajoutées à un index.

    "analyzers": [],
    "tokenizers": [],
    "tokenFilters": [],
    "charFilters": [],
    "normalizers": [],
    
  9. Sur une nouvelle ligne après les « normaliseurs », collez 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"
                   }
                ]
             }
          }
       ]
    },
    
  10. Enregistrez les changements apportés.

  11. 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/.

Créer un environnement virtuel

Dans cette étape, revenez à votre système local et Visual Studio Code. Nous vous recommandons de créer un environnement virtuel pour pouvoir installer les dépendances en isolation.

  1. Dans Visual Studio Code, ouvrez le dossier contenant Quickstart-RAG.ipynb.

  2. Appuyez sur Ctrl+Maj+P pour ouvrir la palette de commandes, recherchez « Python : Créer un environnement », puis sélectionnez Venv pour créer un environnement virtuel dans l’espace de travail actuel.

  3. Sélectionnez Quickstart-RAG\requirements.txt pour les dépendances.

La création de l'environnement prend quelques minutes. Une fois l’environnement prêt, passez à l’étape suivante.

Connexion à Azure

Vous utilisez Microsoft Entra ID et des attributions de rôle pour la connexion. Vérifiez que vous êtes connecté au même locataire et au même abonnement que Recherche Azure AI et Azure OpenAI. Vous pouvez utiliser Azure CLI sur la ligne de commande pour afficher les propriétés actuelles, modifier ses propriétés et vous connecter. Pour plus d’informations, consultez Se connecter sans clés.

Exécutez chacune des commandes suivantes en séquence.

az account show

az account set --subscription <PUT YOUR SUBSCRIPTION ID HERE>

az login --tenant <PUT YOUR TENANT ID HERE>

Vous devez maintenant être connecté à Azure depuis votre appareil local.

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 chat model
     query="Can you recommend a few hotels with complimentary breakfast?"
    
     # Search results are created by the search client
     # Search results are composed of the top 5 results and the fields selected from the search index
     # Search results include the top 5 matches to your query
     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])
    
     # Send the search results and the query to the LLM to generate a response based on the prompt.
     response = openai_client.chat.completions.create(
         messages=[
             {
                 "role": "user",
                 "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
             }
         ],
         model=AZURE_DEPLOYMENT_MODEL
     )
    
     # Here is the response from the chat 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 obtenez un message d’erreur Ressource introuvable, vérifiez les URI des ressources et si la version de l’API sur le modèle de conversation est valide.

    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 que vous passez le JSON au modèle de conversation. 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