Beispielgeschäft mit Gemini-Schnellstart

In diesem Tutorial wird gezeigt, wie Sie iterativ Few-Shot-Beispiele erstellen und dynamisch aus dem Example Store abrufen können, um das Verhalten eines LLM zu korrigieren. In dieser Anleitung verwenden Sie das gemini-1.5-pro-001-Modell. Gehen Sie so vor:

  • Erstellen Sie eine Beispiel-Shop-Instanz (ExampleStore).

  • Erstellen Sie anhand der Antwort von Gemini Beispiele und laden Sie diese in die Beispiel-Store-Instanz hoch.

  • Sie können Ihre Beispiele dynamisch aus dem Example Store abrufen, um den LLM auf das gewünschte Verhalten hinzuweisen.

  • bereinigen.

Hinweise

Bevor Sie die in dieser Anleitung beschriebenen Schritte ausführen können, müssen Sie Ihr Projekt und Ihre Umgebung einrichten.

Projekt einrichten

  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. Wenn Sie ein Projekt ausgewählt haben, benötigen Sie die IAM-Rolle Vertex AI-Nutzer (roles/aiplatform.user) für das Projekt.

Bei Vertex AI authentifizieren

Wenn Sie die Python Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

  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, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten in der Dokumentation zur Google Cloud-Authentifizierung.

Bibliotheken importieren

  1. Führen Sie den folgenden Befehl aus, um das Vertex AI SDK for Python für den Beispiel-Shop zu installieren:

    pip install --upgrade google-cloud-aiplatform>=1.87.0
  2. Verwenden Sie das folgende Codebeispiel, um das SDK für den Beispiel-Shop zu importieren und zu initialisieren.

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID.

    • LOCATION: Ihre Region. Es wird nur us-central1 unterstützt.

Beispiel-Shop-Instanz erstellen

Im folgenden Codebeispiel wird eine Beispielspeicherinstanz erstellt, die das Einbettungsmodell text-embedding-005 verwendet.

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

Das Erstellen eines Beispielgeschäfts dauert einige Minuten.

Weitere Informationen zum Erstellen oder Wiederverwenden von Beispielgeschäftsinstanzen finden Sie unter Beispielgeschäfts-Instanz erstellen.

Beispiele in die Beispiel-Shop-Instanz hochladen

Führen Sie die folgenden Schritte aus, um Beispiele zu erstellen und in die Beispiel-Shop-Instanz hochzuladen. Sie können maximal fünf Beispiele pro Anfrage hochladen.

  1. Definieren Sie das Tool für die Funktion get_current_weather. Anhand der Beispiele, die Sie in den folgenden Schritten erstellen, lernt das Modell, wann diese Funktion aufgerufen werden soll und welche Argumente übergeben werden müssen.

    Weitere Informationen dazu, wie Sie mithilfe von Beispielen die Leistung von Funktionsaufrufen und Modellantworten verbessern können, finden Sie unter Mithilfe von Beispielen die Leistung von Funktionsaufrufen verbessern. Weitere Informationen zum Erstellen einer Anwendung für Funktionsaufrufe finden Sie unter Einführung in Funktionsaufrufe.

    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. Senden Sie eine Anfrage an Gemini, um Inhalte mit der Funktion get_current_weather zu generieren.

    Weitere Informationen finden Sie unter Client erstellen für das Gen AI SDK.

    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. Sie haben folgende Möglichkeiten, ein Beispiel zu erstellen und hochzuladen:

    • Wenn die Antwort des LLM das erwartete Verhalten zeigt, verwenden Sie das folgende Codebeispiel, um anhand der Antwort ein Beispiel zu erstellen und in den Beispielspeicher hochzuladen.

      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])
      
    • Wenn die Antwort nicht alle erwarteten Funktionen oder Ergebnisse abdeckt oder das Modell Probleme mit der Argumentation hat, können Sie mit dem folgenden Codebeispiel eine Antwort schreiben, um das Modellverhalten zu korrigieren.

      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. Wiederholen Sie die Schritte 2 und 3, um bei Bedarf mehrere Beispiele zu erstellen und hochzuladen. Sie können zusätzliche Beispiele hochladen, wenn das Modell unerwartetes Verhalten zeigt oder die hochgeladenen Beispiele nicht alle Funktionen, Ergebnisse oder Begründungen abdecken, die Sie erwarten. Weitere Informationen dazu, wann Sie zusätzliche Beispiele hochladen müssen, finden Sie unter Beispiele hochladen.

Beispiele mit Gemini abrufen und verwenden

Sie können nach Beispielen suchen, die Ihrem Prompt ähnlich sind. Sie können diese Beispiele dann in Ihren Prompt einfügen, um das LLM auf das erwartete Verhalten hinzuweisen.

Hilfsfunktionen zum Formatieren von Beispielen definieren

Verwenden Sie das folgende Codebeispiel, um eine ExampleStorePrompt-Klasse und Hilfsfunktionen zu definieren, mit denen Sie nach Beispielen suchen und diese abrufen können.

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
        )

Nach relevanten Beispielen suchen

Verwenden Sie das folgende Codebeispiel, um nach Beispielen zu suchen, die für die aktuelle Unterhaltung mit dem LLM relevant sind. Anschließend können Sie diese Beispiele mithilfe der Hilfsfunktionen in Ihre Prompts einfügen.

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

Antwortqualität iterativ verbessern

Wenn Sie die Antwortmuster von Gemini mithilfe von Beispielen für wenige Instanzen verbessern möchten, wiederholen Sie die Schritte in den folgenden Abschnitten:

  1. Erstellen Sie Beispiele und laden Sie sie in die Beispiel-Shop-Instanz hoch.

  2. Beispiele mit Gemini abrufen und verwenden

Bereinigen

Wenn Sie alle in diesem Projekt verwendeten Ressourcen bereinigen möchten, können Sie das Google Cloud Projekt löschen, das Sie für den Schnellstart verwendet haben.

Andernfalls können Sie die einzelnen Ressourcen löschen, die Sie in dieser Anleitung erstellt haben:

  1. Verwenden Sie das folgende Codebeispiel, um die Instanz „Beispielgeschäft“ zu löschen.

    example_store.delete()
    
  2. Löschen Sie alle lokal erstellten Dateien.

Nächste Schritte