Partager via


Didacticiel : Utiliser Azure Cache pour Redis comme cache sémantique

Dans ce didacticiel, vous utiliserez Azure Cache pour Redis comme cache sémantique avec un grand modèle de langage (LLM) basé sur l’IA. Vous utiliserez Azure OpenAI Service pour générer des réponses LLM aux requêtes et mettre en cache ces réponses à l’aide d’Azure Cache pour Redis, fournissant des réponses plus rapides et réduisant les coûts.

Étant donné qu’Azure Cache pour Redis fournit une fonctionnalité de recherche vectorielle intégrée, vous pouvez également effectuer une mise en cache sémantique. Vous pouvez retourner des réponses mises en cache pour des requêtes identiques, ainsi que des requêtes similaires, même si le texte n’est pas le même.

Dans ce tutoriel, vous allez apprendre à :

  • Créer une instance Azure Cache pour Redis configurée pour la mise en cache sémantique
  • Utilisez LangChain et d’autres bibliothèques Python populaires.
  • Utilisez le service Azure OpenAI pour générer du texte à partir de modèles IA et de résultats mis en cache.
  • Consultez les gains de performances de l’utilisation de la mise en cache à l’aide de LLM.

Important

Ce didacticiel vous guide tout au long de la création d’un Jupyter Notebook. Vous pouvez suivre ce didacticiel avec un fichier de code Python (.py) et obtenir des résultats similaires, mais vous devez ajouter tous les blocs de code de ce didacticiel dans le fichier .py et exécuter une fois pour afficher les résultats. En d’autres termes, Jupyter Notebooks fournit des résultats intermédiaires lorsque vous exécutez des cellules, mais ce n’est pas un comportement à attendre lorsque vous travaillez dans un fichier de code Python.

Important

Si vous souhaitez effectuer un suivi dans un notebook Jupyter terminé à la place, téléchargez le fichier de notebook Jupyter nommé semanticcache.ipynb et enregistrez-le dans le nouveau dossier semanticcache.

Prérequis

Créer une instance Cache Redis Azure

Suivez le guide de démarrage rapide : Créer un cache Redis Enterprise. Dans la page Avancé, vérifiez que vous avez ajouté le module RediSearch et que vous choisissez la stratégie de cluster d’entreprise. Tous les autres paramètres peuvent correspondre à la valeur par défaut décrite dans le démarrage rapide.

La création du cache nécessite que quelques minutes. Vous pouvez passer à l’étape suivante dans l’intervalle.

Capture d’écran montrant l’onglet Niveau de service de base de l’entreprise rempli.

Configurer votre environnement de développement

  1. Créez un dossier sur votre ordinateur local nommé semanticcache à l’emplacement où vous enregistrez généralement vos projets.

  2. Créez un fichier Python (tutorial.py) ou un notebook Jupyter (tutorial.ipynb) dans le dossier.

  3. Installez les packages Python requis :

    pip install openai langchain redis tiktoken
    

Créer des modèles Azure OpenAI

Vérifiez que vous disposez de deux modèles déployés sur votre ressource Azure OpenAI :

  • LLM qui fournit des réponses de texte. Pour ce didacticiel, nous utilisons le modèle GPT-3.5-turbo-instruct.

  • Modèle d’incorporation qui convertit les requêtes en vecteurs pour les comparer aux requêtes passées. Pour ce didacticiel, nous utilisons le modèle text-embedding-ada-002 (version 2).

Pour obtenir des instructions plus détaillées, consultez Déployer un modèle. Enregistrez le nom que vous avez choisi pour chaque déploiement de modèle.

Importez des bibliothèques et configurez les informations de connexion

Pour effectuer correctement un appel sur Azure OpenAI, vous avez besoin d’un point de terminaison et d’une clé. Vous avez également besoin d’un point de terminaison et d’une clé pour vous connecter à Azure Cache pour Redis.

  1. Accédez à votre ressource Azure OpenAI dans le portail Azure.

  2. Recherchez Point de terminaison et clés dans la section Gestion des ressources de votre ressource Azure OpenAI. Copiez votre point de terminaison et votre clé d’accès, car vous avez besoin de l’authentification de vos appels d’API. Voici un exemple de point de terminaison : https://docs-test-001.openai.azure.com. Vous pouvez utiliser soit KEY1, soit KEY2.

  3. Accédez à la page Vue d’ensemble de votre ressource Azure Cache pour Redis dans le Portail Azure. Copiez votre point de terminaison.

  4. Localisez Clés d’accès dans la section Paramètres. Copiez votre clé d’accès. Vous pouvez utiliser soit Primary, soit Secondary.

  5. Ajoutez le code suivant à une nouvelle cellule de code :

       # Code cell 2
    
    import openai
    import redis
    import os
    import langchain
    from langchain.llms import AzureOpenAI
    from langchain.embeddings import AzureOpenAIEmbeddings
    from langchain.globals import set_llm_cache
    from langchain.cache import RedisSemanticCache
    import time
    
    
    AZURE_ENDPOINT=<your-openai-endpoint>
    API_KEY=<your-openai-key>
    API_VERSION="2023-05-15"
    LLM_DEPLOYMENT_NAME=<your-llm-model-name>
    LLM_MODEL_NAME="gpt-35-turbo-instruct"
    EMBEDDINGS_DEPLOYMENT_NAME=<your-embeddings-model-name>
    EMBEDDINGS_MODEL_NAME="text-embedding-ada-002"
    
    REDIS_ENDPOINT = <your-redis-endpoint>
    REDIS_PASSWORD = <your-redis-password>
    
    
  6. Mettez à jour la valeur de API_KEY et RESOURCE_ENDPOINT avec les valeurs de clé et de point de terminaison de votre déploiement Azure OpenAI.

  7. Définissez LLM_DEPLOYMENT_NAME et EMBEDDINGS_DEPLOYMENT_NAME sur le nom de vos deux modèles déployés dans Azure OpenAI Service.

  8. Mettez à jour REDIS_ENDPOINT et REDIS_PASSWORD avec la valeur de point de terminaison et de clé de votre instance Azure Cache pour Redis.

    Important

    Nous vous recommandons vivement d’utiliser des variables d’environnement ou un gestionnaire de secrets comme Azure Key Vault pour transmettre les informations sur la clé API, le point de terminaison et le nom de déploiement. Ces variables sont définies en texte en clair ici par souci de simplicité.

  9. Exécutez la cellule de code 2.

Initialiser des modèles IA

Ensuite, vous initialisez les modèles LLM et d’incorporations.

  1. Ajoutez le code suivant à une nouvelle cellule de code :

       # Code cell 3
    
    llm = AzureOpenAI(
        deployment_name=LLM_DEPLOYMENT_NAME,
        model_name="gpt-35-turbo-instruct",
        openai_api_key=API_KEY,
        azure_endpoint=AZURE_ENDPOINT,
        openai_api_version=API_VERSION,
    )
    embeddings = AzureOpenAIEmbeddings(
        azure_deployment=EMBEDDINGS_DEPLOYMENT_NAME,
        model="text-embedding-ada-002",
        openai_api_key=API_KEY,
        azure_endpoint=AZURE_ENDPOINT,
        openai_api_version=API_VERSION
    )
    
  2. Exécutez la cellule de code 3.

Configurer Redis en tant que cache sémantique

Ensuite, spécifiez Redis comme cache sémantique pour votre LLM.

  1. Ajoutez le code suivant à une nouvelle cellule de code :

       # Code cell 4
    
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    set_llm_cache(RedisSemanticCache(redis_url = redis_url, embedding=embeddings, score_threshold=0.05))
    

    Important

    La valeur du paramètre score_threshold détermine la façon dont deux requêtes similaires doivent être afin de retourner un résultat mis en cache. Plus le nombre est faible, plus les requêtes doivent être similaires. Vous pouvez ajuster cette valeur en fonction de votre application.

  2. Exécutez la cellule de code 4.

Interroger et obtenir des réponses à partir du LLM

Enfin, interrogez le LLM pour obtenir une réponse générée par l’IA. Si vous utilisez un notebook Jupyter, vous pouvez ajouter %%time en haut de la cellule pour générer le temps nécessaire pour exécuter le code.

  1. Ajoutez le code suivant à une nouvelle cellule de code et exécutez-le :

    # Code cell 5
    %%time
    response = llm("Please write a poem about cute kittens.")
    print(response)
    

    Vous devez voir une sortie similaire à la suivante :

    Fluffy balls of fur,
    With eyes so bright and pure,
    Kittens are a true delight,
    Bringing joy into our sight.
    
    With tiny paws and playful hearts,
    They chase and pounce, a work of art,
    Their innocence and curiosity,
    Fills our hearts with such serenity.
    
    Their soft meows and gentle purrs,
    Are like music to our ears,
    They curl up in our laps,
    And take the stress away in a snap.
    
    Their whiskers twitch, they're always ready,
    To explore and be adventurous and steady,
    With their tails held high,
    They're a sight to make us sigh.
    
    Their tiny faces, oh so sweet,
    With button noses and paw-sized feet,
    They're the epitome of cuteness,
    ...
    Cute kittens, a true blessing,
    In our hearts, they'll always be reigning.
    CPU times: total: 0 ns
    Wall time: 2.67 s
    

    La valeur Wall time indique 2,67 secondes. Cela correspond au temps réel nécessaire pour interroger le LLM et pour que le LLM génère une réponse.

  2. Réexécutez la cellule 5. Vous devez voir exactement la même sortie, mais avec une valeur Wall time plus basse :

    Fluffy balls of fur,
    With eyes so bright and pure,
    Kittens are a true delight,
    Bringing joy into our sight.
    
    With tiny paws and playful hearts,
    They chase and pounce, a work of art,
    Their innocence and curiosity,
    Fills our hearts with such serenity.
    
    Their soft meows and gentle purrs,
    Are like music to our ears,
    They curl up in our laps,
    And take the stress away in a snap.
    
    Their whiskers twitch, they're always ready,
    To explore and be adventurous and steady,
    With their tails held high,
    They're a sight to make us sigh.
    
    Their tiny faces, oh so sweet,
    With button noses and paw-sized feet,
    They're the epitome of cuteness,
    ...
    Cute kittens, a true blessing,
    In our hearts, they'll always be reigning.
    CPU times: total: 0 ns
    Wall time: 575 ms
    

    La valeur Wall time semble raccourcir d’un facteur de cinq, soit jusqu’à 575 millisecondes.

  3. Modifiez la requête Please write a poem about cute kittens pour Write a poem about cute kittens, puis réexécutez la cellule 5. Vous devez voir exactement la même sortie et une valeur Wall time inférieure à la requête d’origine. Même si la requête a changé, la signification sémantique de la requête est restée la même, de sorte que la même sortie mise en cache a été retournée. C’est l’avantage de la mise en cache sémantique !

Modifier le seuil de similarité

  1. Essayez d’exécuter une requête similaire avec une signification différente, comme Please write a poem about cute puppies. Notez que le résultat mis en cache est également retourné ici. La signification sémantique du mot puppies est assez proche du mot kittens retourné par le résultat mis en cache.

  2. Le seuil de similarité peut être modifié pour déterminer quand le cache sémantique doit retourner un résultat mis en cache et quand il doit retourner une nouvelle sortie à partir du LLM. Dans la cellule de code 4, remplacez la valeur score_threshold de 0.05 par 0.01 :

    # Code cell 4
    
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    set_llm_cache(RedisSemanticCache(redis_url = redis_url, embedding=embeddings, score_threshold=0.01))
    
  3. Essayez à nouveau la requête Please write a poem about cute puppies. Vous devez recevoir une nouvelle sortie spécifique aux chiots :

    Oh, little balls of fluff and fur
    With wagging tails and tiny paws
    Puppies, oh puppies, so pure
    The epitome of cuteness, no flaws
    
    With big round eyes that melt our hearts
    And floppy ears that bounce with glee
    Their playful antics, like works of art
    They bring joy to all they see
    
    Their soft, warm bodies, so cuddly
    As they curl up in our laps
    Their gentle kisses, so lovingly
    Like tiny, wet, puppy taps
    
    Their clumsy steps and wobbly walks
    As they explore the world anew
    Their curiosity, like a ticking clock
    Always eager to learn and pursue
    
    Their little barks and yips so sweet
    Fill our days with endless delight
    Their unconditional love, so complete
    ...
    For they bring us love and laughter, year after year
    Our cute little pups, in every way.
    CPU times: total: 15.6 ms
    Wall time: 4.3 s
    

    Vous devrez probablement affiner le seuil de similarité en fonction de votre application pour vous assurer que la sensibilité appropriée est utilisée lors de la détermination des requêtes à mettre en cache.

Nettoyer les ressources

Si vous souhaitez continuer à utiliser les ressources que vous avez créées dans cet article, conservez le groupe de ressources.

Sinon, si vous avez terminé avec les ressources, vous pouvez supprimer le groupe de ressources Azure que vous avez créé pour éviter les frais.

Important

La suppression d’un groupe de ressources est irréversible. Quand vous supprimez un groupe de ressources, toutes les ressources qu’il contient sont supprimées définitivement. Veillez à ne pas supprimer accidentellement des ressources ou un groupe de ressources incorrects. Si vous avez créé les ressources dans un groupe de ressources existant contenant des ressources que vous souhaitez conserver, vous pouvez supprimer chaque ressource individuellement, au lieu de supprimer l’intégralité du groupe de ressources.

Pour supprimer un groupe de ressources

  1. Connectez-vous au Portail Azure, puis sélectionnez Groupes de ressources.

  2. Recherchez le groupe de ressources à supprimer.

    S’il existe de nombreux groupes de ressources, utilisez la zone Filtrer pour n’importe quel champ..., tapez le nom du groupe de ressources que vous avez créé pour cet article. Sélectionnez le groupe de ressources dans la liste des résultats.

    Capture d’écran montrant une liste de groupes de ressources à supprimer dans le volet de travail.

  3. Sélectionnez Supprimer le groupe de ressources.

  4. Vous êtes invité à confirmer la suppression du groupe de ressources. Saisissez le nom de votre groupe de ressources pour confirmer, puis sélectionnez Supprimer.

    Capture d’écran montrant un formulaire qui demande le nom de la ressource pour confirmer la suppression.

Après quelques instants, le groupe de ressources et toutes ses ressources sont supprimés.