Migliora il modello preaddestrato con i dati sugli eventi del client

Cloud Talent Solution è un servizio che aggiunge il machine learning all'esperienza di ricerca di lavoro, restituendo risultati di alta qualità a chi cerca lavoro ben oltre i limiti dei tipici metodi basati su parole chiave. Da subito, il CTS applica modelli di pertinenza e ontologie di lavoro/competenze ai dettagli del tuo lavoro. Puoi migliorare i risultati restituiti a chi cerca lavoro registrando gli eventi del client in base all'attività di questa persona.

Registra gli eventi client utilizzando createClientEventRequest

Quando chi cerca lavoro esegue un'azione specifica, puoi utilizzare la ricerca di lavoro per registrare l'azione. Ad esempio, nella visualizzazione della persona in cerca di lavoro o di un'altra entità che interagisce con il servizio è stato visualizzato un job (o un elenco di job), come in un elenco di risultati di ricerca in formato compresso o ritagliato. Puoi inviare un evento IMPRESSION a Cloud Talent Solution per fornire dati sul contesto della ricerca e sui risultati che chi è in cerca di lavoro può vedere. Quando la persona in cerca di un lavoro fa clic sul risultato per visualizzare la descrizione completa dell'offerta di lavoro, puoi inviare un evento VIEW che registra il suo interesse per la posizione scelta.

L'esempio seguente illustra come inviare un messaggio a Cloud Talent Solution utilizzando un'API. La persona in cerca di lavoro o altra entità che interagisce con il servizio ha visualizzato un job (o un elenco di job), ad esempio in un elenco di risultati di ricerca in formato compresso o tagliato. Questo evento è in genere associato a una persona in cerca di lavoro che visualizza un elenco di offerte di lavoro su una singola pagina.

Go

Per scoprire come installare e utilizzare la libreria client per CTS, consulta Librerie client CTS. Per maggiori informazioni, consulta la documentazione di riferimento dell'API Go CTS.

Per eseguire l'autenticazione su CTS, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.

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

	talent "cloud.google.com/go/talent/apiv4beta1"
	"cloud.google.com/go/talent/apiv4beta1/talentpb"
	"github.com/golang/protobuf/ptypes"
)

// 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: %w", err)
	}
	defer c.Close()

	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: %w", err)
	}

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

	return resp, nil
}

Java

Per scoprire come installare e utilizzare la libreria client per CTS, consulta Librerie client CTS. Per maggiori informazioni, consulta la documentazione di riferimento dell'API Java CTS.

Per eseguire l'autenticazione su CTS, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


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 {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    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());
    }
  }
}

Node.js

Per scoprire come installare e utilizzare la libreria client per CTS, consulta Librerie client CTS. Per maggiori informazioni, consulta la documentazione di riferimento dell'API Node.js CTS.

Per eseguire l'autenticazione su CTS, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


const talent = require('@google-cloud/talent').v4;

/**
 * Creates a client event
 *
 * @param projectId {string} Your Google Cloud Project ID
 * @param tenantId {string} Identifier of the Tenant
 * @param requestId {string} A unique ID generated in the API responses.
 * Value should be set to the request_id from an API response.
 * @param eventId {string} A unique identifier, generated by the client application
 */
function sampleCreateClientEvent(projectId, tenantId, requestId, eventId) {
  const client = new talent.EventServiceClient();
  // const projectId = 'Your Google Cloud Project ID';
  // const tenantId = 'Your Tenant ID (using tenancy is optional)';
  // const requestId = '[request_id from ResponseMetadata]';
  // const eventId = '[Set this to a unique identifier]';
  const formattedParent = client.tenantPath(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
  const seconds = 0;
  const createTime = {
    seconds: seconds,
  };

  // The type of event attributed to the behavior of the end user
  const type = 'VIEW';

  // List of job names associated with this event
  const jobsElement = 'projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]';
  const jobsElement2 =
    'projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]';
  const jobs = [jobsElement, jobsElement2];
  const jobEvent = {
    type: type,
    jobs: jobs,
  };
  const clientEvent = {
    requestId: requestId,
    eventId: eventId,
    createTime: createTime,
    jobEvent: jobEvent,
  };
  const request = {
    parent: formattedParent,
    clientEvent: clientEvent,
  };
  client
    .createClientEvent(request)
    .then(responses => {
      const response = responses[0];
      console.log('Created client event');
      console.log(`Response: ${response}`);
    })
    .catch(err => {
      console.error(err);
    });
}

Python

Per scoprire come installare e utilizzare la libreria client per CTS, consulta Librerie client CTS. Per maggiori informazioni, consulta la documentazione di riferimento dell'API Python CTS.

Per eseguire l'autenticazione su CTS, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


from google.cloud import talent
from google.cloud.talent import enums

def create_client_event(project_id, tenant_id, request_id, event_id):
    """
    Creates a client event

    Args:
      project_id Your Google Cloud Project ID
      tenant_id Identifier of the Tenant
      request_id A unique ID generated in the API responses.
      Value should be set to the request_id from an API response.
      event_id A unique identifier, generated by the client application
    """

    client = talent.EventServiceClient()

    # 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]'

    if isinstance(project_id, bytes):
        project_id = project_id.decode("utf-8")
    if isinstance(tenant_id, bytes):
        tenant_id = tenant_id.decode("utf-8")
    if isinstance(request_id, bytes):
        request_id = request_id.decode("utf-8")
    if isinstance(event_id, bytes):
        event_id = event_id.decode("utf-8")
    parent = f"projects/{project_id}/tenants/{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_ = enums.JobEvent.JobEventType.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 = client.create_client_event(parent=parent, client_event=client_event)
    print(response)

Messaggi evento

Campi obbligatori:

  • eventId (definito dal cliente): ogni messaggio inviato a Cloud Talent Solution deve avere un eventId univoco. Come best practice, incorpora il timestamp mentre definisci questo campo per garantire la non duplicazione. La lunghezza massima di questo campo è di 255 caratteri.

  • requestId: il valore dell'elemento requestId restituito dall'oggetto di risposta della ricerca. Questo valore è univoco per una determinata chiamata API SearchJobsRequest. Viene utilizzato per tutti i messaggi successivi derivanti dall'evento IMPRESSION di ricerca originale. Quando viene effettuata una nuova chiamata API SearchJobsRequest (ad esempio: chi cerca lavoro va alla pagina dei risultati successiva), requestId cambia.

  • createTime Il timestamp dell'evento (in formato Timestamp, con precisione di nanosecondi. Questo timestamp dovrebbe riflettere quando si è verificato effettivamente l'evento, non quando è stato inviato il messaggio.

  • Campo di unione event: jobEvent gli oggetti vengono utilizzati con la funzionalità Job Search e vengono emessi quando una persona alla ricerca di lavoro interagisce con il servizio.

Esempio di messaggio di evento

La chiamata API nell'esempio di codice riportato sopra dovrebbe generare un messaggio JSON nel seguente formato:

JSON

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

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

Scenari e flussi di lavoro

Di seguito sono riportati due scenari di esempio di chi cerca, visualizza e presenta domanda di lavoro.

Flusso di lavoro 1

  1. La persona in cerca di lavoro esegue una ricerca. Ad esempio: Gestore prodotto SF

    I risultati della ricerca vengono restituiti a chi cerca l'impiego.

    L'oggetto della risposta della ricerca job rinviato al server del cliente contiene un requestId univoco (ad esempio: 8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==). Utilizza questo requestId per tutti i messaggi futuri relativi a questa particolare chiamata API SearchJobsRequest.

    Invia un messaggio IMPRESSION a Cloud Talent Solution.

    Esempio di messaggio di evento:

    {
      "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. La persona in cerca di lavoro seleziona un risultato (un'offerta di lavoro) per visualizzare i dettagli completi del lavoro.

    Invia un messaggio VISUALIZZA a 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. La persona in cerca di lavoro si applica all'offerta di lavoro visualizzata.

    a. Se la persona in cerca di lavoro viene reindirizzata a una pagina all'interno dello stesso dominio (una pagina interna dell'applicazione), invia a Cloud Talent Solution un messaggio APPLICATION_START.

    {
      "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. Se la persona in cerca di lavoro viene reindirizzata a una pagina dell'applicazione esterna, invia a Cloud Talent Solution un messaggio APPLICATION_REDIRECT.

    {
      "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. Quando la persona in cerca di lavoro completa una candidatura interna, invia a Cloud Talent Solution un messaggio APPLICATION_FINISH:

    {
      "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. La persona in cerca di lavoro torna ai risultati di ricerca e va alla pagina 2 (oppure continua alla pagina 2 senza aver fatto clic su un'offerta di lavoro).

    Invia un messaggio IMPRESSION a Cloud Talent Solution con il successivo set di risultati dalla pagina 2. Nota: viene generato un nuovo valore requestId nella risposta alla chiamata API SearchJobsRequest che genera la seconda pagina dei risultati. (ad esempio, 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. La persona in cerca di lavoro prosegue sulla pagina terza dei risultati di ricerca.

    Invia un messaggio IMPRESSION a Cloud Talent Solution con il successivo set di risultati. NOTA: c'è un nuovo requestId (ad esempio, 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"]}
    }
    

Flusso di lavoro 2

  1. La persona in cerca di lavoro esegue una ricerca. Ad esempio: Gestore prodotto SF

    I risultati della ricerca vengono restituiti a chi cerca l'impiego.

    L'oggetto della risposta di ricerca job contiene un requestId univoco (ad esempio: a2179a9b-cf73-413e-8076-98af08b991ad). Utilizza questo requestId per tutti i messaggi futuri relativi a questa chiamata API SearchJobsRequest.

    Invia un messaggio IMPRESSION a 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. La persona in cerca di lavoro seleziona un risultato (un'offerta di lavoro) per visualizzare i dettagli completi del lavoro.

    Invia un messaggio VISUALIZZA a 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. La persona in cerca di lavoro esegue un'applicazione con un solo clic per un job, come descritto in APPLICATION_QUICK_SUBMISSION.

    Invia a Cloud Talent Solution un messaggio APPLICATION_QUICK_SUBMISSION con il prossimo insieme di risultati.

    {
      "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. La persona in cerca di lavoro esegue le seguenti azioni.

    a. La persona in cerca di lavoro torna ai risultati di ricerca direttamente dalla pagina dei risultati di ricerca. La procedura di richiesta è più lunga di quella definita in APPLICATION_QUICK_SUBMISSION (ovvero un processo di candidatura in più fasi).

    Invia un messaggio APPLICATION_START_FROM_SERP a 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. La persona in cerca di lavoro completa la candidatura per il lavoro. Invia un messaggio APPLICATION_FINISH a 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. La persona in cerca di lavoro torna ai risultati di ricerca e si applica a un lavoro direttamente dalla pagina dei risultati di ricerca. Il processo di applicazione reindirizza la persona in cerca di lavoro a un altro dominio esterno al sito tenant (applicazione esterna) da cui non è possibile monitorare l'avanzamento della richiesta.

    Invia un messaggio APPLICATION_REDIRECT_FROM_SERP a 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"]}
    }
    

    È diverso da quello di APPLICATION_REDIRECT, dove una persona in cerca di lavoro si trova nella pagina di descrizione del job quando viene reindirizzato.

Verificare l'implementazione degli eventi client

Cloud Talent Solution ti fornisce strumenti self-service che puoi utilizzare per verificare l'implementazione degli eventi dei clienti. Consulta gli strumenti di gestione per ulteriori informazioni sulle opzioni self-service disponibili.