Migliorare il modello preaddestrato con i dati sugli eventi client (v4beta1)

Cloud Talent Solution è un servizio che applica il machine learning alla tua esperienza di ricerca di lavoro e offre ai candidati risultati di alta qualità che superano i limiti dei metodi tradizionali basati su parole chiave. CTS applica immediatamente modelli di pertinenza e ontologie di lavoro/competenze ai dettagli dei lavori. Puoi migliorare i risultati restituiti ai candidati registrando gli eventi client in base alla loro attività.

Registrare gli eventi client utilizzando createClientEventRequest

Quando un candidato esegue un'azione specifica, puoi utilizzare la ricerca di lavoro per registrarla. Ad esempio, il candidato o un'altra entità che interagisce con il servizio ha visualizzato un lavoro (o un elenco di lavori), ad esempio 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 un candidato può visualizzare. Quando il candidato fa clic su un risultato di lavoro per visualizzare la descrizione completa, puoi inviare un evento VIEW che registra l'interesse del candidato per la posizione scelta.

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

Go

Per scoprire come installare e utilizzare la libreria client per CTS, consulta la sezione Librerie client CTS. Per saperne di più, consulta la documentazione di riferimento dell'API CTS Go.

Per eseguire l'autenticazione in CTS, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura 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 saperne di più sull'installazione e la creazione di un client Cloud Talent Solution, consulta Librerie client 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 {
    // 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());
    }
  }
}

Python

Per saperne di più sull'installazione e la creazione di un client Cloud Talent Solution, consulta Librerie client Cloud Talent Solution.


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 di eventi

Campi obbligatori:

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

  • requestId: il valore di requestId restituito dall'oggetto della risposta di 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, il candidato passa alla pagina successiva dei risultati), requestId cambia.

  • createTime Il timestamp dell'evento (in formato Timestamp, preciso al nanosecondo). Questo timestamp deve riflettere il momento in cui si è verificato l'evento, non quando è stato inviato il messaggio.

  • Campo unione event: può essere jobEvent o profileEvent. jobEvent gli oggetti vengono utilizzati con la funzionalità di ricerca di lavoro e vengono emessi quando un candidato interagisce con il servizio.

Messaggio di evento di esempio

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 one of the following: "jobEvent": { object (JobEvent) }, "profileEvent": { object (ProfileEvent) } // End of list of possible types for union field event. }

Scenari e flussi di lavoro

Di seguito sono riportati due esempi di scenari in cui il candidato cerca, visualizza e si candida per un lavoro.

Flusso di lavoro 1

  1. Il candidato esegue una ricerca. Ad esempio: Product mgr SF

    I risultati di ricerca vengono restituiti al candidato.

    L'oggetto della risposta di ricerca di lavoro inviato 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 a Cloud Talent Solution un messaggio IMPRESSION.

    Messaggio di evento di esempio:

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

    Invia a Cloud Talent Solution un messaggio VIEW.

    {
      "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. Il candidato si candida per l'offerta di lavoro visualizzata.

    a. Se il candidato viene reindirizzato a una pagina all'interno dello stesso dominio (una pagina di candidatura interna), 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 il candidato viene reindirizzato a una pagina di candidatura 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 il candidato 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. Il candidato torna ai risultati di ricerca e continua alla pagina 2 (oppure continua alla pagina 2 senza aver fatto clic su un'offerta di lavoro).

    Invia a Cloud Talent Solution un messaggio IMPRESSION con il set di risultati successivo della pagina 2. Nota: nella risposta della chiamata API SearchJobsRequest che genera la seconda pagina dei risultati viene generato un nuovo requestId. (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. Il candidato continua alla pagina 3 dei risultati di ricerca.

    Invia a Cloud Talent Solution un messaggio IMPRESSION con il set di risultati successivo. NOTA: è presente 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. Il candidato esegue una ricerca. Ad esempio: Product mgr SF

    I risultati di ricerca vengono restituiti al candidato.

    L'oggetto della risposta di ricerca di lavoro 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 a Cloud Talent Solution un messaggio IMPRESSION.

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

    Invia a Cloud Talent Solution un messaggio VIEW.

    {
      "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. Il candidato esegue una candidatura con un solo clic per un lavoro, come descritto in APPLICATION_QUICK_SUBMISSION.

    Invia a Cloud Talent Solution un messaggio APPLICATION_QUICK_SUBMISSION con il set di risultati successivo.

    {
      "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. Il candidato esegue le seguenti azioni.

    a. Il candidato torna ai risultati di ricerca e si candida per un lavoro direttamente dalla pagina dei risultati di ricerca. La procedura di candidatura è più lunga di quella definita in APPLICATION_QUICK_SUBMISSION (ovvero, è una procedura di candidatura in più passaggi).

    Invia a Cloud Talent Solution un messaggio APPLICATION_START_FROM_SERP.

    {
      "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. Il candidato completa la candidatura per il lavoro. Invia a Cloud Talent Solution un messaggio APPLICATION_FINISH.

    {
      "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. Il candidato torna ai risultati di ricerca e si candida per un lavoro direttamente dalla pagina dei risultati di ricerca. La procedura di candidatura reindirizza il candidato a un altro dominio esterno al sito del tenant (candidatura esterna) da cui non è possibile monitorare l'avanzamento del candidato.

    Invia a Cloud Talent Solution un messaggio APPLICATION_REDIRECT_FROM_SERP.

    {
      "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"]}
    }
    

    Questo è diverso da APPLICATION_REDIRECT, in cui un candidato si trova nella pagina della descrizione del lavoro 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 client. Per saperne di più sulle opzioni self-service disponibili, consulta Strumenti di gestione.