Exemple de magasin avec guide de démarrage rapide Gemini

Ce tutoriel explique comment créer de manière itérative des exemples few-shot et les récupérer de manière dynamique à partir du magasin d'exemples pour corriger le comportement d'un LLM. Dans ce tutoriel, vous allez utiliser le modèle gemini-2.0-flash et effectuer les actions suivantes :

  • Créer une instance de magasin d'exemples (ExampleStore)

  • Créer des exemples basés sur la réponse de Gemini et les importer dans l'instance de magasin d'exemples

  • Récupérer vos exemples de manière dynamique à partir du magasin d'exemples pour guider le LLM vers le comportement attendu

  • Effectuer un nettoyage

Avant de commencer

Pour suivre les étapes décrites dans ce tutoriel, vous devez d'abord configurer votre projet et votre environnement.

Configurer votre projet

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Vertex AI API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Vertex AI API.

    Enable the API

  8. Assurez-vous de disposer du rôle IAM Utilisateur Vertex AI (roles/aiplatform.user) sur le projet que vous avez sélectionné, le cas échéant.
  9. S'authentifier sur Vertex AI

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    Importer des bibliothèques

    1. Exécutez la commande suivante pour installer le SDK Vertex AI pour Python pour le magasin d'exemples.

      pip install --upgrade google-cloud-aiplatform>=1.87.0
    2. Utilisez l'exemple de code suivant pour importer et initialiser le SDK pour le magasin d'exemples.

      import vertexai
      from vertexai.preview import example_stores
      
      vertexai.init(
        project="PROJECT_ID",
        location="LOCATION"
      )
      

      Remplacez les éléments suivants :

      • PROJECT_ID : ID de votre projet

      • LOCATION : votre région. Seule la région us-central1 est compatible.

    Créer une instance de magasin d'exemples

    Utilisez l'exemple de code suivant pour créer une instance de magasin d'exemples qui utilise le modèle d'embedding text-embedding-005.

    example_store = example_stores.ExampleStore.create(
        example_store_config=example_stores.ExampleStoreConfig(
            vertex_embedding_model="text-embedding-005"
        )
    )
    

    Notez que la création d'une instance de magasin d'exemples peut prendre quelques minutes.

    Pour en savoir plus sur la création ou la réutilisation de ces instances, consultez Créer une instance de magasin d'exemples.

    Importer des exemples dans l'instance de magasin d'exemples

    Suivez la procédure ci-dessous pour créer et importer des exemples dans l'instance de magasin d'exemples. Vous pouvez importer jusqu'à cinq exemples par requête.

    1. Définissez l'outil de fonction get_current_weather. Les exemples que vous créerez lors des étapes suivantes indiqueront au modèle quand appeler cette fonction et les arguments à lui transmettre.

      Pour en savoir plus sur la manière dont les exemples peuvent améliorer les performances des appels de fonction et les réponses du modèle, consultez Utiliser des exemples pour améliorer les performances des appels de fonction. Pour savoir comment créer une application d'appel de fonction, consultez Présentation de l'appel de fonction.

      from google.genai import types as genai_types
      
      get_current_weather_func = genai_types.FunctionDeclaration(
        name="get_current_weather",
        description="Get the current weather in a given location",
        parameters={
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "The city name of the location for which to get the weather."
            }
          },
        },
      )
      
    2. Envoyez une requête à Gemini pour générer du contenu à l'aide de la fonction get_current_weather.

      Consultez Créer un client pour le SDK Gen AI.

      from google import genai
      
      client = genai.Client(
          http_options=genai_types.HttpOptions(api_version="v1"),
          vertexai=True,
          project="PROJECT_ID",,
          location="LOCATION")
      
      user_content = genai_types.Content(
        role="user",
        parts=[Part(text="What is the weather like in Boston?")],
      )
      response = client.models.generate_content(
        model="gemini-2.0-flash",
        user_content,
        config=genai_types.GenerateContentConfig(
          tools=[
            genai_types.Tool(function_declarations=[get_current_weather_func])]
        )
      )
      
    3. Effectuez l'une des opérations suivantes pour créer et importer un exemple.

      • Si la réponse du LLM présente le comportement attendu, utilisez l'exemple de code suivant pour créer un exemple basé sur la réponse et l'importer dans le magasin d'exemples.

        function_response = genai_types.Content(
          parts=[
            genai_types.Part(
              function_response={
                "name": "get_current_weather",
                "response": {
                  "location": "New York, NY", "temperature": 38,
                  "description": "Partly Cloudy",
                  "icon": "partly-cloudy", "humidity": 65,
                  "wind": { "speed": 10, "direction": "NW" }
                }
              }
            )
          ]
        )
        final_model_response = genai_types.Content(
          role="model",
          parts=[genai_types.Part(text="The weather in NYC is 38 degrees and partly cloudy.")],
        )
        example = {
          "contents_example": {
            "contents": [user_content.to_json_dict()],
            "expected_contents": [
              {"content": response.candidates[0].content.to_json_dict()},
              {"content": function_response.to_json_dict()},
              {"content": final_model_response.to_json_dict()},
            ],
          },
          "search_key": user_content.parts[0].text,
        }
        example_store.upsert_examples(examples=[example])
        
      • Si la réponse ne couvre pas toutes les fonctions ou les résultats attendus, ou si le modèle a du mal à raisonner, utilisez l'exemple de code suivant pour créer une réponse afin de corriger le comportement du modèle.

        expected_function_call = genai_types.Content(
          parts=[
            genai_types.Part(
              function_call={
                "name": "get_current_weather",
                "args": {"location": "New York, NY"}
              }
            )
          ]
        )
        function_response = genai_types.Content(
          parts=[
            genai_types.Part(
              function_response={
                "name": "get_current_weather",
                "response": {
                  "location": "New York, NY", "temperature": 38,
                  "description": "Partly Cloudy",
                  "icon": "partly-cloudy", "humidity": 65,
                  "wind": { "speed": 10, "direction": "NW" }
                }
              }
            )
          ]
        )
        final_model_response = genai_types.Content(
          role="model",
          parts=[genai_types.Part(text="The weather in NYC is 38 degrees and partly cloudy.")],
        )
        example = {
          "contents_example": {
            "contents": [user_content.to_json_dict()],
            "expected_contents": [
              {"content": expected_function_call.to_json_dict()},
              {"content": function_response.to_json_dict()},
              {"content": final_model_response.to_json_dict()},
            ],
          },
          "search_key": user_content.parts[0].text,
        }
        example_store.upsert_examples(examples=[example])
        
    4. Répétez les étapes 2 et 3 pour créer et importer plusieurs exemples, si nécessaire. Vous pouvez importer des exemples supplémentaires si le modèle présente un comportement inattendu ou si les exemples importés ne couvrent pas toutes les fonctions, résultats ou raisonnements attendus. Pour savoir quand vous devez importer des exemples supplémentaires, consultez Importer des exemples.

    Récupérer et utiliser des exemples avec Gemini

    Recherchez des exemples en fonction de leur similitude avec votre requête. Vous pouvez ensuite inclure ces exemples dans votre requête pour guider le LLM vers le comportement attendu.

    Définir des fonctions d'assistance pour mettre en forme des exemples

    Utilisez l'exemple de code suivant pour définir une classe ExampleStorePrompt et des fonctions d'assistance qui vous permettent de rechercher et de récupérer des exemples.

    import abc
    import jinja2
    import json
    
    from google.protobuf import json_format
    # --BOILERPLATE CODE FOR FORMATTING--
    
    EXAMPLES_PREAMBLE = """<EXAMPLES>
    The following are examples of user queries and model responses using the available python libraries.
    
    Begin few-shot
    """
    
    EXAMPLES_POSTAMBLE = """
    End few-shot
    
    Now, try to follow these examples and complete the following conversation:
    </EXAMPLES>
    """
    
    EXAMPLE_PREAMBLE = "EXAMPLE"
    
    TEMPLATE = """
    """
    
    class ExampleStorePrompt:
    
        def __init__(
              self, template = TEMPLATE, example_preamble = EXAMPLE_PREAMBLE,
              examples_preamble = EXAMPLES_PREAMBLE,
              examples_postamble = EXAMPLES_POSTAMBLE):
    
            self.template = jinja2.Template(template)
            self.example_preamble = example_preamble
            self.examples_preamble = examples_preamble
            self.examples_postamble = examples_postamble
    
        @abc.abstractmethod
        def process_function_response(self, function_response):
            return json.dumps(function_response)
    
        @abc.abstractmethod
        def process_function_call(self, function_call):
            args_list = []
            for key, value in function_call.get("args", []).items():
                if isinstance(value, str):
                    # Wrap strings in quotes.
                    value = f'"{value}"'
                if isinstance(value, list):
                    value = ', '.join(
                        f'"{item}"' if isinstance(item, str)
                        else str(item) for item in value)
                    value = f"[{value}]"
                if isinstance(value, dict):
                    value = json.dumps(value)
                args_list.append(f'{key}={value}')
            args = ", ".join(args_list)
            return f"```\n{function_call.get('name')}({args})\n```"
    
        @abc.abstractmethod
        def process_part(self, part):
            if "function_call" in part:
                return self.process_function_call(part["function_call"])
            if "text" in part:
                return part.get("text")
            if "function_response" in part:
                return self.process_function_response(part["function_response"])
    
        @abc.abstractmethod
        def process_content(self, content):
            response = []
            for part in content.get("parts", []):
                response.append(self.process_part(part))
            return [content.get("role"), response]
    
        @abc.abstractmethod
        def example_formatter(self, example: dict):
            response = []
            for content in example.get("contents", []):
                response.append(self.process_content(content))
            for content in example.get("expected_contents", []):
                content = content.get("content", {})
                response.append(self.process_content(content))
            return response
    
        def get_prompt(self, examples: list):
            if not examples:
              return ""
            contents_example = example.get("example", {}).get(
              "stored_contents_example", {}).get("contents_example", {})
            examples = [self.example_formatter(example) for example in examples]
            return self.template.render(
                examples=examples,
                example_preamble=self.example_preamble,
                examples_preamble=self.examples_preamble,
                examples_postamble=self.examples_postamble
            )
    

    Rechercher des exemples pertinents

    Utilisez l'exemple de code suivant pour rechercher des exemples pertinents pour la conversation en cours avec le LLM. Vous pouvez ensuite utiliser les fonctions d'assistance pour inclure ces exemples dans vos requêtes.

    query = "what's the fastest way to get to disney from lax"
    
    # Search for relevant examples.
    examples = example_store.search_examples(
      {"stored_contents_example_key": query}, top_k=3)
    
    prompt = ExampleStorePrompt().get_prompt(examples.get("results", []))
    
    model_response = client.models.generate_content(
        model="gemini-2.0-flash",
        contents="How do I get to LAX?",
        config=genai_types.GenerateContentConfig(
          system_instruction=prompt,
          tools=[
            genai_types.Tool(function_declarations=[track_flight_status_function])]
      )
    )
    

    Améliorer la qualité des réponses de manière itérative

    Pour améliorer les schémas de réponse de Gemini à l'aide d'exemples few-shot, répétez les étapes des sections suivantes :

    1. Importer des exemples dans l'instance de magasin d'exemples

    2. Récupérer et utiliser des exemples avec Gemini

    Effectuer un nettoyage

    Pour nettoyer toutes les ressources utilisées dans ce projet, vous pouvez supprimer le projet Google Cloud que vous avez utilisé pour ce tutoriel.

    Vous pouvez également supprimer les ressources individuelles que vous avez créées, comme suit :

    1. Utilisez l'exemple de code suivant pour supprimer l'instance de magasin d'exemples.

      example_store.delete()
      
    2. Supprimez tous les fichiers créés localement.

    Étape suivante