Afficher les journaux Gemini

Ce document explique comment activer la collecte et le stockage de l'activité Gemini pour Google Cloud , y compris les éléments suivants:

  • Gemini pour Google Cloud les requêtes et les journaux de réponse, tels que les entrées utilisateur, les informations contextuelles et les réponses.
  • Gemini pour Google Cloud les journaux de métadonnées, telles que les métadonnées de télémétrie et les lignes de code acceptées par l'utilisateur.

Gemini pour Google Cloud ne collecte ni n'envoie à Cloud Logging aucune autre interaction utilisateur qu'il aurait pu avoir avec Gemini pour Google Cloud, y compris les commentaires écrits. Les données collectées sont envoyées à Cloud Logging pour être stockées. Vous pouvez consulter ces données en recherchant des entrées de journal avec le type de ressource cloudaicompanion.googleapis.com/Instance.

Cette fonctionnalité ne consigne pas les requêtes ni les réponses dans Gemini dans Vertex AI. Pour activer les journaux pour Gemini dans Vertex AI, consultez la section Activer les journaux d'audit des accès aux données.

Les rôles IAM (Identity and Access Management) contrôlent la possibilité pour un principal d'accéder aux journaux. Vous pouvez attribuer des rôles prédéfinis aux principaux ou créer des rôles personnalisés. Pour en savoir plus sur les autorisations requises, consultez la section Contrôle des accès.

Par défaut, Cloud Logging chiffre le contenu client stocké au repos. Les données stockées dans des buckets de journaux par Logging sont chiffrées à l'aide de clés de chiffrement de clés, un processus appelé chiffrement encapsulé. L'accès à vos données de journalisation nécessite l'accès à ces clés de chiffrement de clé, qui sont gérées par Google gère sans aucune action de votre part.

Votre organisation peut avoir des exigences de chiffrement réglementaires, de conformité ou avancées que notre chiffrement au repos par défaut ne fournit pas. Pour répondre aux exigences de votre organisation, vous pouvez gérer vos clés au lieu de laisser Google gérer les clés de chiffrement qui protègent vos données.

Pour en savoir plus sur l'utilisation des clés de chiffrement gérées par le client (CMEK), y compris leurs avantages et leurs limites, consultez la page Clés de chiffrement gérées par le client.

Limites

Les données de journal enregistrées par Gemini dans Google Cloudcomprennent les interactions des utilisateurs avec les produits suivants :
  • Gemini Code Assist dans l'IDE

Avant de commencer

Activer Gemini pour la Google Cloud journalisation

Contactez l' Google Cloud assistance ou votre Google Cloud représentant en indiquant l'ID du projet pour lequel vous souhaitez activer Gemini pour laGoogle Cloud journalisation, Gemini pour la Google Cloud journalisation des métadonnées ou les deux.

.

Afficher les journaux utilisateur et les journaux de métadonnées de Gemini pour Google Cloud

Pour afficher les journaux utilisateur et les journaux de métadonnées Gemini, procédez comme suit : Google Cloud

Console Google Cloud

  1. Dans la console Google Cloud, accédez à la page Explorateur de journaux.

    Accéder à l'explorateur de journaux

    Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est Logging.

  2. Dans la barre d'outils, sélectionnez un projet de la console Google Cloud.
  3. Dans la barre d'outils, développez le menu Toutes les ressources, puis sélectionnez la ressource Instance associée Cloud AI.

Google Cloud CLI

Exécutez la commande suivante :

gcloud logging read "resource.type=cloudaicompanion.googleapis.com/Instance" --project PROJECT_ID  --limit 3

Journaux Gemini pour Google Cloud

Un LogEntry est l'unité de données de base dans Cloud Logging. Les sections suivantes fournissent des listes de champs trouvés dans LogEntry pour un événement de plate-forme Gemini for Google Cloud , tels que les requêtes utilisateur et les réponses Gemini for Google Cloud .

Demandes des utilisateurs

Le tableau suivant présente la liste des champs trouvés dans une entrée de journal de requête utilisateur.

Champ Valeurs et notes
LogEntry.resource.type Gemini pour Google Cloud type de ressource: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container Identifiant unique du conteneur de ressources dans lequel Gemini pour Google Cloud a été utilisé.
LogEntry.resource.labels.location Emplacement où Gemini pour Google Cloud a été utilisé.
LogEntry.resource.labels.instance_id ID unique de la ressource où Gemini pour Google Cloud a été utilisé.
LogEntry.labels.method Peut être l'un des éléments suivants, en fonction de ce qui a appelé logEntry:

CompleteTask: par exemple, une requête de chat provenant de Gemini Code Assist ou d'un autre service Gemini pour Google Cloud

GenerateCode: par exemple, une requête de génération de code, comme une requête de transformation de code dans Gemini Code Assist.

CompleteCode: par exemple, une requête de complétion de code lorsque vous travaillez dans l'IDE, comme avec les suggestions intégrées dans Gemini Code Assist.
LogEntry.labels.product Nom du service Gemini pour Google Cloud . Si le produit Gemini for Google Cloud est Gemini Code Assist, cette valeur est code_assist. Si le produit Gemini pour Google Cloud est Gemini Cloud Assist, cette valeur est cloud_assist. Sinon, cette valeur est unknown.
LogEntry.labels.request_id Identifiant unique permettant de mettre en corrélation une requête avec une entrée de journal de réponse.
LogEntry.labels.user_id Identifiant de l'utilisateur à l'origine de cette requête.
LogEntry.jsonPayload Charge utile de l'entrée de journal.
LogEntry.logName Identifie le journal.

L'exemple suivant montre une entrée de journal pour un événement d'invite de chat.

{
  "insertId": "654581e30003b19e340bbd96",
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
        instance_id: "default"
        location: "global"
        resource_container: "my-project-id"
     }
  },
  "timestamp": "2023-11-03T23:27:31.242078Z",
  "labels": {
    "product": "code_assist",
    "request_id": "4ea1e265-ea5d-4d11-b3c8-39bad9c96326"
    "user_id": "my-user@example.com"
  },
  "jsonPayload" : {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
    "taskCompletionRequest":
      input: {
        messages: [{
          author: "USER"
          content: "What are some best practices to save cost on my Google Cloud bill?"
        }]
        preamble: ""
      }
  }
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2023-11-03T23:27:31.255648319Z"
  "severity": "INFO"
}

L'exemple suivant montre une entrée RequestLog pour les invites de suggestion de code en ligne automatiques et les invites Gemini pour Google Cloud dans un fichier de code.

Les données d'invite pour les suggestions de code intégrées utilisent l'objet codeCompletionRequest (comme illustré dans l'exemple suivant), tandis que la génération déclenchée manuellement utilise codeGenerationRequest.

{
  "insertId": "654581e30003b19e340bbd96",
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
        instance_id: "default"
        location: "global"
        resource_container: "my-project-id"
     }
  },
  "timestamp": "2023-11-03T23:27:31.242078Z",
  "labels": {
    "product": "code_assist",
    "request_id": "4ea1e265-ea5d-4d11-b3c8-39bad9c96326"
    "user_id": "my-user@example.com"
  },
  "jsonPayload" : {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
    "codeCompletionRequest": {
      "input_data_context": {
        "additional_context": {
          "files": [
            {
              "language": "go",
              "path": "{/path/to/../current-file.go",
              "segments": [
                {
                  "content": "...Prefix Text..."
                },
                {
                  "content": "...Suffix Text..."
                }
              ],
              "state": ["EDITED"]
            },
            {
              "language": "go",
              "path": "/path/to/../recent-file.go",
              "segments": [
                {
                  "content": "...File Text..."
                }
              ],
              "state": ["RECENTLY_OPENED"]
            }
          ]
        }
      }
    }
  }
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2023-11-03T23:27:31.255648319Z"
  "severity": "INFO"
}

Réponses de Gemini pour Google Cloud

Le tableau suivant présente les champs et les descriptions de la réponse Gemini pour Google Cloud .

Champ Valeurs et notes
LogEntry.resource.type Gemini pour Google Cloud type de ressource: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container Identifiant unique du conteneur de ressources dans lequel Gemini pour Google Cloud a été utilisé.
LogEntry.resource.labels.location Emplacement où Gemini pour Google Cloud a été utilisé.
LogEntry.resource.labels.instance_id ID unique de la ressource où Gemini pour Google Cloud a été utilisé.
LogEntry.labels.method Peut être l'un des éléments suivants, en fonction de ce qui a appelé logEntry:

CompleteTask: par exemple, une requête de chat provenant de Gemini Code Assist ou d'un autre service Gemini pour Google Cloud

GenerateCode: par exemple, une requête de génération de code, comme une requête de transformation de code dans Gemini Code Assist.

CompleteCode: par exemple, une requête de complétion de code lorsque vous travaillez dans l'IDE, comme avec les suggestions intégrées dans Gemini Code Assist.
LogEntry.labels.product Nom du service Gemini pour Google Cloud . Si le produit Gemini for Google Cloud est Gemini Code Assist, cette valeur est code_assist. Si le produit Gemini pour Google Cloud est Gemini Cloud Assist, cette valeur est cloud_assist. Sinon, cette valeur est unknown.
LogEntry.labels.request_id Identifiant unique permettant de mettre en corrélation une requête avec une entrée de journal de réponse.
LogEntry.labels.user_id Identifiant de l'utilisateur à l'origine de cette requête.
LogEntry.jsonPayload Charge utile de l'entrée de journal. Toutes les citations de sources utilisées pour générer la réponse sont incluses dans cet objet en tant que attribution_context.
LogEntry.logName Identifie le journal.

Gemini pour les journaux de métadonnées Google Cloud

Pour que les journaux de métadonnées soient générés, le paramètre de télémétrie de l'extension Gemini Code Assist doit être activé pour les extensions VS Code et IntelliJ. De plus, pour VS Code, le paramètre de collecte de télémétrie globale doit également être activé.

Les journaux de métadonnées Gemini pour Google Cloud suivent la même structure que les journaux Gemini pour Google Cloud , mais spécifient des champs différents. Le tableau suivant présente la liste des champs trouvés dans une entrée de journal de requêtes utilisateur:

Champ Valeurs et notes
LogEntry.@type Gemini pour Google Cloud type de ressource de métadonnées: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method Pour les journaux de métadonnées, cette valeur d'étiquette est Export.Metrics.
LogEntry.labels.product Nom du service Gemini pour Google Cloud . Si le produit Gemini for Google Cloud est Gemini Code Assist, cette valeur est code_assist. Si le produit Gemini pour Google Cloud est Gemini Cloud Assist, cette valeur est cloud_assist. Sinon, cette valeur est unknown.
LogEntry.labels.user_id Identifiant de l'utilisateur à l'origine de cette requête.
LogEntry.jsonPayload Indique un événement codeExposure ou code.Acceptance. Un événement codeExposure indique l'exposition d'une suggestion de code à un utilisateur. Un événement code.Acceptance indique qu'un événement d'acceptation a été déclenché par l'utilisateur, par exemple une frappe, un tabulation ou une acceptation complète.
LogEntry.jsonPayload.clientName Nom de l'IDE, par exemple CloudCodeVscode.
LogEntry.jsonPayload.clientVersion Numéro de version de l'IDE.
LogEntry.jsonPayload.codeAcceptance Pour les IDE VS Code et IntelliJ uniquement, indique qu'un événement d'acceptation a été déclenché par l'utilisateur, comme un remplacement, une tabulation ou une acceptation complète. Inclut également les champs suivants:
  • linesCount: nombre total de lignes de code acceptées par l'utilisateur.
  • commentLinesCount: nombre de lignes de commentaire dans le code accepté par l'utilisateur. Cette propriété n'apparaît que si Gemini Code Assist peut déterminer combien de lignes acceptées sont des lignes de commentaire.
  • originalRequestId: identifiant associant un événement codeExposure à zéro ou plusieurs événements codeAcceptance. Vous pouvez ainsi calculer les mesures de taux d'acceptation et de lignes de code acceptées.
  • programmingLanguage: langage de programmation du code accepté, tel que python.
LogEntry.jsonPayload.codeExposure Pour les IDE VS Code et IntelliJ uniquement, indique qu'une suggestion de code a été exposée à un utilisateur. Inclut également les champs suivants:
  • programmingLanguage: langage de programmation de l'exposition, par exemple python.
  • originalRequestId: identifiant associant un événement codeExposure à zéro ou plusieurs événements codeAcceptance. Vous pouvez ainsi calculer les mesures de taux d'acceptation et de lignes de code acceptées.
LogEntry.jsonPayload.chatExposure Indique qu'une réponse de chat a été exposée à un utilisateur. Inclut également le champ suivant:
  • originalRequestId: identifiant associant un événement chatExposure à zéro ou plusieurs événements codeAcceptance ou codeExposure. Vous pouvez ainsi calculer les mesures de taux d'acceptation et de lignes de code acceptées.

L'exemple suivant montre un exemple d'entrée de journal codeExposure:

{
  insertId: "whfrqgc1gj"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    codeExposure: {
      originalRequestId: "cac019824a0b25ba"
      programmingLanguage: "python"
    }
  requestId: "0c5178fe-446f-4ab6-b996-520dec100cf8"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:35.662837985Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
  type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:35.021564463Z"
}

L'exemple suivant montre un exemple d'entrée de journal codeAcceptance:

{
  insertId: "whfrqgc1gk"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    codeAcceptance: {
      linesCount: 2
      originalRequestId: "cac019824a0b25ba"
      programmingLanguage: "python"
    }
    requestId: "ddf11040-c315-452e-b7cd-928c3f97984e"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:37.632662272Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
    type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:36.778692483Z"
} 

L'exemple suivant montre un exemple d'entrée de journal chatExposure:

{
  insertId: "3diaj2c208"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    chatExposure: {
      originalRequestId: "cac019824a0b25ba"
    }
  requestId: "0c5178fe-446f-4ab6-b996-520dec100cf8"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:35.662837985Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
  type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:35.021564463Z"
}

Calculer le taux d'acceptation des codes

Pour calculer le taux d'acceptation à l'aide des journaux de métadonnées Gemini Code Assist, recherchez le nombre total d'ID uniques des événements avec codeAcceptance.originalRequestId, puis divisez-le par le nombre total d'ID uniques des événements avec codeExposure.originalRequestId. Vous pouvez affiner ce calcul par langage de programmation et par utilisateur à l'aide des champs d'événement de journal de métadonnées respectifs.

Calculer le nombre de lignes de code acceptées

Pour calculer le nombre de lignes de code acceptées, recherchez la valeur maximale de codeAcceptance.linesCount pour un codeAcceptance.originalRequestId unique. Ajoutez ensuite la valeur linesCount pour tous les événements codeAcceptance finaux de chaque originalRequestId afin de calculer le nombre total de lignes de code acceptées. Vous pouvez affiner ce calcul par langage de programmation et par utilisateur à l'aide des champs d'événement de journal de métadonnées respectifs.

Étape suivante