Améliorer le modèle pré-entraîné à l'aide des données d'événements client

Cloud Talent Solution est un service qui apporte le machine learning (apprentissage automatique) à votre expérience de recherche d'emploi, en renvoyant des résultats de haute qualité aux demandeurs d'emploi, et en outrepassant les limites des méthodes classiques basées sur des mots clés. Prêt à l'emploi, CTS applique directement des modèles de pertinence et des ontologies poste/compétences aux détails de votre offre d'emploi. Vous pouvez enregistrer les événements client en fonction de l'activité des demandeurs afin d'améliorer les résultats qui leur sont renvoyés.

Enregistrer des événements clients à l'aide de createClientEventRequest

Lorsqu'un demandeur d'emploi effectue une action spécifique, vous pouvez utiliser Job Search pour enregistrer cette action. Par exemple, un demandeur ou une autre entité interagissant avec le service reçoit une offre d'emploi (ou une liste d'offres) visible sur son écran, s'apparentant à une liste de résultats de recherche dans un format compressé ou tronqué. Vous pouvez envoyer un événement IMPRESSION à Cloud Talent Solution afin de fournir des données sur le contexte de la recherche et les résultats qu'un demandeur d'emploi peut consulter. Lorsque le demandeur d'emploi clique sur le résultat d'une offre d'emploi pour afficher la description complète de l'offre, vous pouvez envoyer un événement VIEW qui enregistre l'intérêt du demandeur pour le poste choisi.

L'exemple suivant montre comment envoyer un message à Cloud Talent Solution à l'aide d'une API. Le demandeur d'emploi ou une autre entité utilisant le service a reçu une offre d'emploi apparaissant sur son écran, par exemple dans une liste de résultats de recherche au format condensé ou sous forme d'extraits. Cet événement est généralement associé à un demandeur d'emploi affichant une liste d'offres sur une seule page.

Go

import (
	"context"
	"fmt"
	"io"
	"time"

	talent "cloud.google.com/go/talent/apiv4beta1"
	"github.com/golang/protobuf/ptypes"
	talentpb "google.golang.org/genproto/googleapis/cloud/talent/v4beta1"
)

// createClientEvent creates a client event.
func createClientEvent(w io.Writer, projectID string, requestID string, eventID string, relatedJobNames []string) (*talentpb.ClientEvent, error) {
	ctx := context.Background()

	// Create an eventService client.
	c, err := talent.NewEventClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("talent.NewEventClient: %v", err)
	}

	createTime, _ := ptypes.TimestampProto(time.Now())
	clientEventToCreate := &talentpb.ClientEvent{
		RequestId:  requestID,
		EventId:    eventID,
		CreateTime: createTime,
		Event: &talentpb.ClientEvent_JobEvent{
			JobEvent: &talentpb.JobEvent{
				Type: talentpb.JobEvent_VIEW,
				Jobs: relatedJobNames,
			},
		},
	}

	// Construct a createJob request.
	req := &talentpb.CreateClientEventRequest{
		Parent:      fmt.Sprintf("projects/%s", projectID),
		ClientEvent: clientEventToCreate,
	}

	resp, err := c.CreateClientEvent(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("CreateClientEvent: %v", err)
	}

	fmt.Fprintf(w, "Client event created: %v\n", resp.GetEvent())

	return resp, nil
}

Java

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


import com.google.cloud.talent.v4beta1.ClientEvent;
import com.google.cloud.talent.v4beta1.CreateClientEventRequest;
import com.google.cloud.talent.v4beta1.EventServiceClient;
import com.google.cloud.talent.v4beta1.JobEvent;
import com.google.cloud.talent.v4beta1.TenantName;
import com.google.protobuf.Timestamp;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class JobSearchCreateClientEvent {

  public static void createClientEvent() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String tenantId = "your-tenant-id";
    String requestId = "your-req-id-from-response-metadata";
    String eventId = "your-unique-identifier-id";
    createClientEvent(projectId, tenantId, requestId, eventId);
  }

  // Creates a client event.
  public static void createClientEvent(
      String projectId, String tenantId, String requestId, String eventId) throws IOException {
    try (EventServiceClient eventServiceClient = EventServiceClient.create()) {
      TenantName parent = TenantName.of(projectId, tenantId);

      // The timestamp of the event as seconds of UTC time since Unix epoch
      // For more information on how to create google.protobuf.Timestamps
      // See:
      // https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/timestamp.proto
      long seconds = 3L;
      Timestamp createTime = Timestamp.newBuilder().setSeconds(seconds).build();

      // The type of event attributed to the behavior of the end user
      JobEvent.JobEventType type = JobEvent.JobEventType.VIEW;

      // List of job names associated with this event
      String jobsElement = "projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]";
      String jobsElement2 = "projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]";

      List<String> jobs = Arrays.asList(jobsElement, jobsElement2);
      JobEvent jobEvent = JobEvent.newBuilder().setType(type).addAllJobs(jobs).build();
      ClientEvent clientEvent =
          ClientEvent.newBuilder()
              .setRequestId(requestId)
              .setEventId(eventId)
              .setCreateTime(createTime)
              .setJobEvent(jobEvent)
              .build();
      CreateClientEventRequest request =
          CreateClientEventRequest.newBuilder()
              .setParent(parent.toString())
              .setClientEvent(clientEvent)
              .build();
      ClientEvent response = eventServiceClient.createClientEvent(request);
      System.out.println("Created client event. ");
      System.out.println(response.toString());
    }
  }
}

PHP

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.

require __DIR__ . '/vendor/autoload.php';

use Google\Cloud\Talent\V4beta1\EventServiceClient;
use Google\Cloud\Talent\V4beta1\ClientEvent;
use Google\Cloud\Talent\V4beta1\JobEvent;
use Google\Cloud\Talent\V4beta1\JobEvent_JobEventType;
use Google\Protobuf\Timestamp;

/**
 * Creates a client event.
 *
 * @param string $projectId Your Google Cloud Project ID
 * @param string $tenantId  Identifier of the Tenant
 * @param string $requestId A unique ID generated in the API responses.
 *                          Value should be set to the request_id from an API response.
 * @param string $eventId   A unique identifier, generated by the client application
 */
function sampleCreateClientEvent($projectId, $tenantId, $requestId, $eventId)
{

    $eventServiceClient = new EventServiceClient();

    // $projectId = 'Your Google Cloud Project ID';
    // $tenantId = 'Your Tenant ID (using tenancy is optional)';
    // $requestId = '[request_id from ResponseMetadata]';
    // $eventId = '[Set this to a unique identifier]';
    $formattedParent = $eventServiceClient->tenantName($projectId, $tenantId);

    // The timestamp of the event as seconds of UTC time since Unix epoch
    // For more information on how to create google.protobuf.Timestamps
    // See: https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/timestamp.proto
    $seconds = 0;
    $createTime = new Timestamp();
    $createTime->setSeconds($seconds);

    // The type of event attributed to the behavior of the end user
    $type = JobEvent_JobEventType::VIEW;

    // List of job names associated with this event
    $jobsElement = 'projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]';
    $jobsElement2 = 'projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]';
    $jobs = [$jobsElement, $jobsElement2];
    $jobEvent = new JobEvent();
    $jobEvent->setType($type);
    $jobEvent->setJobs($jobs);
    $clientEvent = new ClientEvent();
    $clientEvent->setRequestId($requestId);
    $clientEvent->setEventId($eventId);
    $clientEvent->setCreateTime($createTime);
    $clientEvent->setJobEvent($jobEvent);

    try {
        $response = $eventServiceClient->createClientEvent($formattedParent, $clientEvent);
        printf('Created client event'.PHP_EOL);
    } finally {
        $eventServiceClient->close();
    }

}

Ruby

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


# Creates a client event
#
# @param project_id {String} Your Google Cloud Project ID
# @param tenant_id {String} Identifier of the Tenant
# @param request_id {String} A unique ID generated in the API responses.
# Value should be set to the request_id from an API response.
# @param event_id {String} A unique identifier, generated by the client application
def sample_create_client_event project_id, tenant_id, request_id, event_id
  # Instantiate a client
  event_client = Google::Cloud::Talent::Event.new version: :v4beta1

  # project_id = "Your Google Cloud Project ID"
  # tenant_id = "Your Tenant ID (using tenancy is optional)"
  # request_id = "[request_id from ResponseMetadata]"
  # event_id = "[Set this to a unique identifier]"
  formatted_parent = event_client.class.tenant_path(project_id, tenant_id)

  # The timestamp of the event as seconds of UTC time since Unix epoch
  # For more information on how to create google.protobuf.Timestamps
  # See: https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/timestamp.proto
  seconds = 0
  create_time = { seconds: seconds }

  # The type of event attributed to the behavior of the end user
  type = :VIEW

  # List of job names associated with this event
  jobs_element = "projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]"
  jobs_element_2 = "projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]"
  jobs = [jobs_element, jobs_element_2]
  job_event = { type: type, jobs: jobs }
  client_event = {
    request_id: request_id,
    event_id: event_id,
    create_time: create_time,
    job_event: job_event
  }

  response = event_client.create_client_event(formatted_parent, client_event)
  puts "Created client event"
end

C#

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.

public static object CreateClientEvent(string projectId, string tenantId, string requestId, string eventId, IEnumerable<string> jobIds)
{
    EventServiceClient eventServiceClient = EventServiceClient.Create();

    TenantName tenantName = TenantName.FromProjectTenant(projectId, tenantId);

    long seconds = 1L;
    Timestamp createTime = new Timestamp
    {
        Seconds = seconds
    };

    // The type of event attributed to the behavior of the end user.
    JobEventType type = JobEventType.View;

    // List of job names associated with this event.
    List<string> jobs = new List<string>();
    foreach (var jobId in jobIds)
    {
        //build full path of job IDs
        JobName name = JobName.FromProjectTenantJob(projectId, tenantId, jobId);
        jobs.Add(name.ToString());
    }

    JobEvent jobEvent = new JobEvent
    {
        Type = type
    };
    jobEvent.Jobs.Add(jobs);

    ClientEvent clientEvent = new ClientEvent
    {
        RequestId = requestId,
        EventId = eventId,
        CreateTime = createTime,
        JobEvent = jobEvent
    };

    CreateClientEventRequest request = new CreateClientEventRequest
    {
        ParentAsTenantName = tenantName,
        ClientEvent = clientEvent
    };

    ClientEvent response = eventServiceClient.CreateClientEvent(request);
    Console.WriteLine($"Created client event.");
    Console.WriteLine(response);

    return 0;
}

Messages d'événement

Champs obligatoires :

  • eventId (défini par le client) : chaque message envoyé à Cloud Talent Solution doit contenir un champ eventId unique. Il est recommandé d'inclure l'horodatage lors de la définition de ce champ pour éviter toute duplication. La longueur maximale de ce champ est de 255 caractères.

  • requestId : valeur du champ requestId renvoyée par l'objet de réponse à la recherche. Cette valeur est unique pour chaque appel d'API SearchJobsRequest. On l'utilise pour tous les messages ultérieurs issus de l'événement de recherche IMPRESSION. La valeur requestId change à chaque nouvel appel d'API SearchJobsRequest (par exemple, lorsque le demandeur d'emploi accède à la page suivante des résultats).

  • createTime : horodatage de l'événement (au format Timestamp, avec une précision en nanosecondes). Cet horodatage doit indiquer le moment exact où l'événement s'est produit et non pas la date d'envoi du message.

  • Champ event Union : peut être jobEvent ou profileEvent. Les objets jobEvent sont utilisés avec la fonctionnalité Job Search et sont émis lorsqu'un demandeur d'emploi interagit avec le service. Les objets profileEvent sont utilisés avec la fonctionnalité de recherche de profil (bêta) et sont émis lorsqu'un chercheur de profil interagit avec le service. Contactez-nous si vous souhaitez participer à la recherche de profil (version bêta).

Exemple de message d'événement :

L'appel d'API dans l'exemple de code ci-dessus doit générer un message JSON au format suivant :

JSON

{
  "requestId": string,
  "eventId": string,
  "createTime": string,
  "eventNotes": string,

// Union field event can be only one of the following: "jobEvent": { object (JobEvent) }, "profileEvent": { object (ProfileEvent) } // End of list of possible types for union field event. }

Scénarios et workflows

Voici deux exemples de scénarios de recherche, d’affichage et de candidature à un poste par le demandeur d’emploi.

Workflow 1

  1. Le demandeur d'emploi effectue une recherche. Par exemple : Chef de produit San Francisco.

    Les résultats de la recherche sont renvoyés au demandeur d'emploi.

    L'objet de réponse à la recherche d'emploi renvoyé au serveur du client contient un requestId unique (par exemple : 8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==). Utilisez ce requestId pour tous les futurs messages liés à cet appel d'API SearchJobsRequest particulier.

    Envoyez un message IMPRESSION à Cloud Talent Solution.

    Exemple de message d'événement :

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID1",
      "createTime": "2018-12-19T16:39:57-08:00",
      "jobEvent":
      {"type":"IMPRESSION",
      "jobs":["jobs/4000000000", "jobs/4000000001","jobs/4000000002",
      "jobs/4000000003", "jobs/4000000004"]}
    }
    
  2. Le demandeur d'emploi sélectionne un résultat (une offre d'emploi) pour afficher tous les détails du poste.

    Envoyez un message VIEW à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID2",
      "createTime": "2018-12-19T16:40:57-08:00",
      "jobEvent":
      {"type":"VIEW",
      "jobs":["jobs/4000000000"]}
    
    }
    
  3. Le demandeur d'emploi postule à l'offre consultée.

    a. Si le demandeur d'emploi est redirigé vers une page du même domaine (une page de candidature interne), envoyez un message APPLICATION_START à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID3",
      "createTime": "2018-12-19T16:41:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_START",
    "jobs":["jobs/4000000000"]}
    }
    

    b. Si le demandeur d'emploi est redirigé vers une page de candidature externe, envoyez un message APPLICATION_REDIRECT à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID3",
      "createTime": "2018-12-19T16:41:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_REDIRECT",
      "jobs":["jobs/4000000000"]}
    
    }
    
  4. Lorsque le demandeur d'emploi termine une candidature interne, envoyez un message APPICATION_FINISH à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID4",
      "createTime": "2018-12-19T16:43:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_FINISH",
      "jobs":["jobs/4000000000"]}
    
    }
    
  5. Le demandeur d'emploi revient aux résultats de la recherche et continue à la page 2 (ou continue à la page 2 sans avoir cliqué sur une offre d'emploi).

    Envoyez à Cloud Talent Solution un message IMPRESSION indiquant le prochain lot de résultats affiché sur la deuxième page. Remarque : Un nouveau requestId est généré dans la réponse de l'appel d'API SearchJobsRequest qui génère la deuxième page de résultats (par exemple, 99e5b99c-f1ba-4f85-b17d-ccf878f451f9:APAb7IRESj+/Hzwa3bBd54P3qPx2yOWm5w==).

    {
      "requestId": "99e5b99c-f1ba-4f85-b17d-ccf878f451f9:APAb7IRESj+/Hzwa3bBd54P3qPx2yOWm5w==",
      "eventId": "ID5",
      "createTime": "2018-12-19T18:39:57-08:00",
      "jobEvent":
      {"type":"IMPRESSION",
      "jobs":["jobs/4000000005", "jobs/4000000006","jobs/4000000007",
      "jobs/4000000008", "jobs/4000000009"]}
    }
    
  6. Le demandeur d'emploi passe à la troisième page des résultats de recherche.

    Envoyez un message IMPRESSION à Cloud Talent Solution avec le lot de résultats suivant. REMARQUE : Un nouveau requestId est généré (par exemple, e2d2b916-78c3-4c65-aecc-d8452bc0afb0:APAb7IRvCsNPiRXYkgF8PN5e8BkbFzKOyg==).

    {
      "requestId": "e2d2b916-78c3-4c65-aecc-d8452bc0afb0:APAb7IRvCsNPiRXYkgF8PN5e8BkbFzKOyg==",
      "eventId": "ID6",
      "createTime": "2018-12-19T16:41:57-08:00",
      "jobEvent":
      {"type":"IMPRESSION",
      "jobs":["jobs/4000000010", "jobs/4000000011","jobs/4000000012",
      "jobs/400000013", "jobs/4000000014"]}
    }
    

Workflow 2

  1. Le demandeur d'emploi effectue une recherche. Par exemple : Chef de produit San Francisco.

    Les résultats de la recherche sont renvoyés au demandeur d'emploi.

    L'objet de réponse à la recherche d'emploi contient un requestId unique (par exemple, a2179a9b-cf73-413e-8076-98af08b991ad). Utilisez ce requestId pour tous les futurs messages liés à cet SearchJobsRequest appel d'API.

    Envoyez un message IMPRESSION à Cloud Talent Solution.

    {
      "requestId": "a2179a9b-cf73-413e-8076-98af08b991ad",
      "eventId": "ID1",
      "createTime": "2018-12-19T16:39:57-08:00",
      "jobEvent":
      {"type":"IMPRESSION",
      "jobs":["jobs/4000000000", "jobs/4000000001","jobs/4000000002",
      "jobs/4000000003", "jobs/4000000004"]}
    }
    
  2. Le demandeur d'emploi sélectionne un résultat (une offre d'emploi) pour afficher tous les détails du poste.

    Envoyez un message VIEW à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID2",
      "createTime": "2018-12-19T16:40:57-08:00",
      "jobEvent":
      {"type":"VIEW",
      "jobs":["jobs/4000000000"]}
    }
    
  3. Le demandeur d'emploi candidate à une offre en un seul clic, comme décrit dans APPLICATION_QUICK_SUBMISSION.

    Envoyez un message APPLICATION_QUICK_SUBMISSION à Cloud Talent Solution avec le lot de résultats suivant.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID3",
      "createTime": "2018-12-19T16:41:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_QUICK_SUBMISSION",
      "jobs":["jobs/4000000000"]}
     }
    
  4. Le demandeur d'emploi effectue les actions suivantes :

    a. Le demandeur d'emploi retourne aux résultats de la recherche et candidate à un poste directement depuis cette page. Le processus de candidature est plus long que celui défini dans APPLICATION_QUICK_SUBMISSION (il s'agit d'un processus de candidature en plusieurs étapes).

    Envoyez un message APPLICATION_START_FROM_SERP à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID4",
      "createTime": "2018-12-19T16:43:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_START_FROM_SERP",
      "jobs":["jobs/4000000000"]}
    }
    

    b. Le demandeur d'emploi termine sa candidature au poste. Envoyez un message APPLICATION_FINISH à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID5",
      "createTime": "2018-12-19T16:44:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_FINISH",
      "jobs":["jobs/4000000000"]}
    }
    
  5. Le demandeur d'emploi revient aux résultats de la recherche et candidate à un poste directement depuis cette page. Le processus de candidature redirige le demandeur d'emploi vers un autre domaine situé en dehors du site client (candidature externe), à partir duquel il est impossible de suivre la progression de la candidature.

    Envoyez un message APPLICATION_REDIRECT_FROM_SERP à Cloud Talent Solution.

    {
      "requestId": "8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==",
      "eventId": "ID6",
      "createTime": "2018-12-19T16:45:57-08:00",
      "jobEvent":
      {"type":"APPLICATION_START_FROM_SERP",
      "jobs":["jobs/4000000001"]}
    }
    

    Cette méthode est différente de APPLICATION_REDIRECT, où un demandeur d'emploi reste sur la page de description du poste lors de la redirection.

Vérifier la mise en œuvre d'événements client

Cloud Talent Solution met à votre disposition des outils de libre service que vous pouvez utiliser pour vérifier la mise en œuvre des événements client. Consultez la rubrique sur les outils de gestion pour plus d'informations sur les options de libre service disponibles.