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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Vertex AI API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Vertex AI API.
- 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. -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
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
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.
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." } }, }, )
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])] ) )
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])
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.
Utilisez l'exemple de code suivant pour supprimer l'instance de magasin d'exemples.
example_store.delete()
Supprimez tous les fichiers créés localement.
- Découvrez comment créer une instance de magasin d'exemples.
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.
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
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.
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 :
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 :