Guía de inicio rápido de la tienda de ejemplo con Gemini

En este instructivo, se muestra cómo puedes crear de forma iterativa ejemplos de pocos disparos y recuperarlos dinámicamente del Almacén de ejemplos para corregir el comportamiento de un LLM. En este instructivo, usarás el modelo gemini-2.0-flash. Harás lo siguiente:

  • Crea una instancia de Example Store (ExampleStore).

  • Crea ejemplos de autor basados en la respuesta de Gemini y súbelos a la instancia de Example Store.

  • Recupera dinámicamente tus ejemplos del Almacén de ejemplos para guiar el LLM hacia el comportamiento esperado.

  • Realizar una limpieza

Antes de comenzar

Para completar los pasos que se muestran en este instructivo, primero debes configurar tu proyecto y tu entorno.

Configura tu proyecto

  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. Si seleccionaste un proyecto, asegúrate de tener el rol de IAM de usuario de Vertex AI (roles/aiplatform.user) en el proyecto.
  9. Autentica en Vertex AI

    Para usar las muestras de Python de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    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.

    Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local en la Google Cloud documentación de autenticación.

    Importa las bibliotecas

    1. Ejecuta el siguiente comando para instalar el SDK de Vertex AI para Python para Example Store.

      pip install --upgrade google-cloud-aiplatform>=1.87.0
    2. Usa el siguiente muestra de código para importar y, luego, inicializar el SDK de Example Store.

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

      Reemplaza lo siguiente:

      • PROJECT_ID: ID del proyecto

      • LOCATION: Tu región. Solo se admite us-central1.

    Crea una instancia de Example Store

    Usa la siguiente muestra de código para crear una instancia de Example Store que use el modelo de incorporación text-embedding-005.

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

    Ten en cuenta que la creación de un almacén de ejemplos tarda unos minutos.

    Para obtener más información sobre cómo crear o reutilizar instancias de Example Store, consulta Crea una instancia de Example Store.

    Sube ejemplos a la instancia de Example Store

    Realiza los siguientes pasos para crear y subir ejemplos a la instancia de Example Store. Puedes subir un máximo de cinco ejemplos por solicitud.

    1. Define la herramienta de función get_current_weather. Los ejemplos que crearás en los pasos posteriores guiarán al modelo sobre cuándo invocar esta función y qué argumentos pasarle.

      Para obtener más información sobre cómo los ejemplos pueden mejorar el rendimiento de la llamada a función y las respuestas del modelo, consulta Usa ejemplos para mejorar el rendimiento de la llamada a función. Para obtener más información sobre cómo crear una aplicación que llama a función, consulta Introducción a la llamada a función.

      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. Envía una solicitud a Gemini para generar contenido con la función get_current_weather.

      Consulta Crea un cliente para el SDK de IA generativa.

      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. Realiza una de las siguientes acciones para crear y subir un ejemplo.

      • Si la respuesta del LLM muestra el comportamiento esperado, usa la siguiente muestra de código para crear un ejemplo basado en la respuesta y subirlo a Example Store.

        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])
        
      • Como alternativa, si la respuesta no abarca todas las funciones o los resultados que esperabas, o si ves que el modelo tiene dificultades para razonar, usa la siguiente muestra de código para crear una respuesta que corrija el comportamiento del modelo.

        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. Repite los pasos 2 y 3 para crear y subir varios ejemplos, según sea necesario. Puedes subir ejemplos adicionales si el modelo muestra un comportamiento inesperado o si los ejemplos subidos no abarcan todas las funciones, los resultados o el razonamiento que esperas. Para obtener más información sobre cuándo debes subir ejemplos adicionales, consulta Cómo subir ejemplos.

    Cómo recuperar y usar ejemplos con Gemini

    Buscar ejemplos según su similitud con tu instrucción Luego, puedes incluir estos ejemplos en tu instrucción para guiar al LLM hacia el comportamiento esperado.

    Define funciones auxiliares para dar formato a los ejemplos

    Usa la siguiente muestra de código para definir una clase ExampleStorePrompt y funciones auxiliares que te permitan buscar y recuperar ejemplos.

    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
            )
    

    Busca ejemplos pertinentes

    Usa la siguiente muestra de código para buscar ejemplos relevantes para la conversación en curso con el LLM. Luego, puedes usar las funciones de ayuda para incluir estos ejemplos en tus instrucciones.

    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])]
      )
    )
    

    Mejora la calidad de las respuestas de forma iterativa

    Para mejorar los patrones de respuesta de Gemini con ejemplos de aprendizaje con pocos ejemplos, repite los pasos de las siguientes secciones:

    1. Crea y sube ejemplos a la instancia de Example Store.

    2. Cómo recuperar y usar ejemplos con Gemini

    Limpia

    Para limpiar todos los recursos que se usaron en este proyecto, puedes borrar el proyecto Google Cloud que usaste para la guía de inicio rápido.

    De lo contrario, puedes borrar los recursos individuales que creaste en este instructivo de la siguiente manera:

    1. Usa la siguiente muestra de código para borrar la instancia de Example Store.

      example_store.delete()
      
    2. Borra los archivos creados de forma local.

    ¿Qué sigue?