Partager via


Tutoriel : rechercher vos données à l’aide d’un modèle de conversation (RAG dans Recherche Azure AI)

La caractéristique de définition d’une solution RAG sur Recherche Azure AI envoie des requêtes à un grand modèle de langage (LLM) et fournit une expérience de recherche conversationnelle sur votre contenu indexé. Cela peut être étonnamment facile si vous implémentez uniquement les informations de base.

Dans ce tutoriel, vous allez :

  • Configurer des clients
  • Écrire des instructions pour le LLM
  • Fournir une requête conçue pour les entrées LLM
  • Passer en revue les résultats et explorer les étapes suivantes

Ce tutoriel repose sur les tutoriels précédents. Il part du principe que vous disposez d’un index de recherche créé par le pipeline d’indexation.

Prérequis

Télécharger l’exemple

Vous utilisez le même notebook que celui du tutoriel précédent sur le pipeline d’indexation. Les scripts d’interrogation du LLM suivent les étapes de création de pipeline. Si vous n’avez pas encore le notebook, téléchargez-le à partir de GitHub.

Configurer des clients pour l’envoi de requêtes

Le modèle RAG dans Recherche Azure AI est une série synchronisée de connexions à un index de recherche pour obtenir les données de base, suivie d’une connexion à un LLM pour formuler une réponse à la question de l’utilisateur. La même chaîne de requête est utilisée par les deux clients.

Vous configurez deux clients. Vous avez donc besoin de points de terminaison et d’autorisations pour les deux ressources. Ce tutoriel suppose que vous configurez des attributions de rôles pour les connexions autorisées, mais vous devez fournir les points de terminaison dans votre exemple de notebook :

# Set endpoints and API keys for Azure services
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
# AZURE_SEARCH_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR SEARCH SERVICE ADMIN KEY HERE"
AZURE_OPENAI_ACCOUNT: str = "PUR YOUR AZURE OPENAI ENDPOINT HERE"
# AZURE_OPENAI_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR AZURE OPENAI KEY HERE"

Exemple de script pour l’invite et la requête

Voici le script Python qui instancie les clients, définit l’invite et configure la requête. Vous pouvez exécuter ce script dans le notebook pour générer une réponse à partir de votre modèle de déploiement de conversation.

Pour le cloud Azure Government, modifiez le point de terminaison d’API sur le fournisseur de jetons en "https://cognitiveservices.azure.us/.default".

# Import libraries
from azure.search.documents import SearchClient
from openai import AzureOpenAI

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
 )

deployment_name = "gpt-4o"

search_client = SearchClient(
     endpoint=AZURE_SEARCH_SERVICE,
     index_name=index_name,
     credential=credential
 )

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below. Cite your source when you answer the question
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}
"""

# Provide the search query. 
# It's hybrid: a keyword search on "query", with text-to-vector conversion for "vector_query".
# The vector query finds 50 nearest neighbor matches in the search index
query="What's the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
# Search results are limited to the top 5 matches. Limiting top can help you stay under LLM quotas.
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    select=["title", "chunk", "locations"],
    top=5,
)

# Newlines could be in the OCR'd content or in PDFs, as is the case for the sample PDFs used for this tutorial.
# Use a unique separator to make the sources distinct. 
# We chose repeated equal signs (=) followed by a newline because it's unlikely the source documents contain this sequence.
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

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

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

Passer en revue les résultats

Dans cette réponse, la réponse est basée sur cinq entrées (top=5) composées de blocs déterminés par le moteur de recherche pour être les plus pertinents. Les instructions de l’invite indiquent au LLM d’utiliser uniquement les informations dans les sources ou les résultats de la recherche mis en forme.

Les résultats de la première requête "What's the NASA earth book about?" devraient ressembler à l’exemple suivant.

The NASA Earth book is about the intricate and captivating science of our planet, studied 
through NASA's unique perspective and tools. It presents Earth as a dynamic and complex 
system, observed through various cycles and processes such as the water cycle and ocean 
circulation. The book combines stunning satellite images with detailed scientific insights, 
portraying Earth’s beauty and the continuous interaction of land, wind, water, ice, and 
air seen from above. It aims to inspire and demonstrate that the truth of our planet is 
as compelling as any fiction.

Source: page-8.pdf

Il est attendu que les LLM retournent des réponses différentes, même si l’invite et les requêtes sont inchangées. Votre résultat peut être très différent de l’exemple. Pour plus d’informations, consultez Découvrez comment utiliser des sorties reproductibles.

Remarque

Lors du test de ce tutoriel, nous avons vu une variété de réponses, certaines plus pertinentes que d’autres. Quelques fois, la répétition de la même requête a provoqué une détérioration de la réponse, probablement en raison de confusion dans l’historique des conversations, éventuellement avec le modèle inscrivant les requêtes répétées comme insatisfaction avec la réponse générée. La gestion de l’historique des conversations est hors de portée pour ce tutoriel, mais son inclusion dans le code de votre application devrait atténuer ou même éliminer ce comportement.

Ajouter un filtre

Rappelez-vous que vous avez créé un champ locations à l’aide de l’IA appliquée, renseigné avec des emplacements reconnus par la compétence Reconnaissance d’entité. La définition de champ pour les emplacements inclut l’attribut filterable. Répétons la requête précédente, mais cette fois en ajoutant un filtre qui sélectionne le terme glace dans le champ des emplacements.

Un filtre introduit des critères d’inclusion ou d’exclusion. Le moteur de recherche effectue toujours une recherche vectorielle sur "What's the NASA earth book about?", mais il exclut maintenant les correspondances qui n’incluent pas glace. Pour plus d’informations sur le filtrage des collections de chaînes et des requêtes vectorielles, consultez les notions de base du filtre de texte, Comprendre les filtres de collection et Ajouter des filtres à une requête vectorielle.

Remplacez la définition search_results par l’exemple suivant qui inclut un filtre :

query="what is the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Add a filter that selects documents based on whether locations includes the term "ice".
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    select=["title", "chunk", "locations"],
    top=5,
)

sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

search_results = search_client.search(
    search_text=query,
    top=10,
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    select="title, chunk, locations"

Les résultats de la requête filtrée doivent maintenant ressembler à la réponse suivante. Notez l’accent mis sur la couverture de glace.

The NASA Earth book showcases various geographic and environmental features of Earth through 
satellite imagery, highlighting remarkable landscapes and natural phenomena. 

- It features extraordinary views like the Holuhraun Lava Field in Iceland, captured by 
Landsat 8 during an eruption in 2014, with false-color images illustrating different elements 
such as ice, steam, sulfur dioxide, and fresh lava ([source](page-43.pdf)).
- Other examples include the North Patagonian Icefield in South America, depicted through 
clear satellite images showing glaciers and their changes over time ([source](page-147.pdf)).
- It documents melt ponds in the Arctic, exploring their effects on ice melting and 
- heat absorption ([source](page-153.pdf)).
  
Overall, the book uses satellite imagery to give insights into Earth's dynamic systems 
and natural changes.

Modifier les entrées

L’augmentation ou la diminution du nombre d’entrées au LLM peut avoir un effet important sur la réponse. Essayez d’exécuter à nouveau la même requête après avoir défini top=8. Lorsque vous augmentez les entrées, le modèle retourne des résultats différents à chaque fois, même si la requête ne change pas.

Voici un exemple de ce que le modèle retourne après avoir augmenté les entrées à 8.

The NASA Earth book features a range of satellite images capturing various natural phenomena 
across the globe. These include:

- The Holuhraun Lava Field in Iceland documented by Landsat 8 during a 2014 volcanic 
eruption (Source: page-43.pdf).
- The North Patagonian Icefield in South America, highlighting glacial landscapes 
captured in a rare cloud-free view in 2017 (Source: page-147.pdf).
- The impact of melt ponds on ice sheets and sea ice in the Arctic, with images from 
an airborne research campaign in Alaska during July 2014 (Source: page-153.pdf).
- Sea ice formations at Shikotan, Japan, and other notable geographic features in various 
locations recorded by different Landsat missions (Source: page-168.pdf).

Summary: The book showcases satellite images of diverse Earth phenomena, such as volcanic 
eruptions, icefields, and sea ice, to provide insights into natural processes and landscapes.

Étant donné que le modèle est lié aux données de base, la réponse devient plus vaste lorsque vous augmentez la taille de l’entrée. Vous pouvez utiliser le réglage de pertinence pour générer potentiellement des réponses plus ciblées.

Modifier l’invite

Vous pouvez également modifier l’invite pour contrôler le format de la sortie, la tonalité et si vous souhaitez que le modèle complète la réponse avec ses propres données de formation en modifiant l’invite.

Voici un autre exemple de sortie LLM si nous recentrons la requête sur l’identification des emplacements d’une étude scientifique.

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps scientists identify locations for future study.
Answer the query cocisely, using bulleted points.
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.
Do not exceed 5 bullets.
Query: {query}
Sources:\n{sources}
"""

La sortie de la modification de la requête, sinon la conservation de tous les aspects de la requête précédente, peut ressembler à cet exemple.

The NASA Earth book appears to showcase various locations on Earth captured through satellite imagery, 
highlighting natural phenomena and geographic features. For instance, the book includes:

- The Holuhraun Lava Field in Iceland, detailing volcanic activity and its observation via Landsat 8.
- The North Patagonian Icefield in South America, covering its glaciers and changes over time as seen by Landsat 8.
- Melt ponds in the Arctic and their impacts on the heat balance and ice melting.
- Iceberg A-56 in the South Atlantic Ocean and its interaction with cloud formations.

(Source: page-43.pdf, page-147.pdf, page-153.pdf, page-39.pdf)

Conseil

Si vous poursuivez avec le tutoriel, n’oubliez pas de restaurer la requête sur sa valeur précédente (You are an AI assistant that helps users learn from the information found in the source material).

La modification des paramètres et des requêtes affecte la réponse du LLM. À mesure que vous explorez vous-même, gardez à l’esprit les conseils suivants :

  • L’augmentation de la valeur top peut épuiser le quota disponible sur le modèle. S’il n’y a pas de quota, un message d’erreur est retourné ou le modèle peut renvoyer « Je ne sais pas ».

  • L’augmentation de la valeur top n’améliore pas nécessairement le résultat. Dans les tests avec top, nous constatons parfois que les réponses ne sont pas considérablement meilleures.

  • Alors, qu’est-ce qui pourrait aider ? En règle générale, la réponse est un réglage de pertinence. L’amélioration de la pertinence des résultats de la recherche à partir de la Recherche Azure AI est généralement l’approche la plus efficace pour optimiser l’utilité de votre LLM.

Dans la série suivante de tutoriels, le focus se déplace vers l’optimisation de la pertinence et l’optimisation du niveau de performance des requêtes pour la vitesse et la concision. Nous revisitons la définition de schéma et la logique de requête pour implémenter des fonctionnalités de pertinence, mais le reste du pipeline et des modèles restent intacts.

Étape suivante