Mejorar el modelo preentrenado con datos de eventos de clientes

Cloud Talent Solution es un servicio que incorpora el aprendizaje automático a tu experiencia de búsqueda de empleo y ofrece resultados de alta calidad a las personas que buscan trabajo, sin las limitaciones de los métodos tradicionales basados en palabras clave. De forma predeterminada, CTS aplica modelos de relevancia y ontologías de empleo o habilidades a los detalles de tus empleos. Puedes mejorar los resultados que se devuelven a los candidatos registrando eventos de cliente en función de su actividad.

Registrar eventos de cliente con createClientEventRequest

Cuando un candidato realiza una acción específica, puedes usar Búsqueda de empleo para registrarla. Por ejemplo, el candidato o la otra entidad que interactúa con el servicio ha visto un empleo (o una lista de empleos) en su vista, como en una lista de resultados de búsqueda en un formato comprimido o recortado. Puede enviar un evento IMPRESSION a Cloud Talent Solution para proporcionar datos sobre el contexto de la búsqueda y los resultados que puede ver un candidato. Cuando el candidato hace clic en un resultado de empleo para ver la descripción completa, puede enviar un evento VIEW que registre el interés del candidato en el puesto elegido.

En el siguiente ejemplo se muestra cómo enviar un mensaje a Cloud Talent Solution mediante una API. El candidato o la otra entidad que interactúa con el servicio ha visto un empleo (o una lista de empleos) en su vista, como en una lista de resultados de búsqueda en un formato comprimido o recortado. Este evento suele asociarse a un candidato que ve una lista de empleos en una sola página.

Go

Para saber cómo instalar y usar la biblioteca de cliente de CTS, consulta Bibliotecas de cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API Go de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

Para saber cómo instalar y usar la biblioteca de cliente de CTS, consulta Bibliotecas de cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API Java de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.


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

Para saber cómo instalar y usar la biblioteca de cliente de CTS, consulta Bibliotecas de cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API Node.js de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.


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

Para saber cómo instalar y usar la biblioteca de cliente de CTS, consulta Bibliotecas de cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API Python de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.


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)

Mensajes de eventos

Campos obligatorios:

  • eventId (definido por el cliente): cada mensaje enviado a Cloud Talent Solution debe tener un eventId único. Te recomendamos que incorpores la marca de tiempo al definir este campo para asegurarte de que no haya duplicados. La longitud máxima de este campo es de 255 caracteres.

  • requestId: valor de requestId devuelto por el objeto de respuesta de búsqueda. Este valor es único para una llamada a la API SearchJobsRequest concreta. Se usa en todos los mensajes posteriores derivados del evento IMPRESSION de la búsqueda original. Cuando se hace una nueva llamada a la API SearchJobsRequest (por ejemplo, cuando un candidato pasa a la siguiente página de resultados), requestId cambia.

  • createTime Marca de tiempo del evento (en formato Timestamp con una precisión de nanosegundos. Esta marca de tiempo debe reflejar el momento en el que se produjo el evento, no cuando se envió el mensaje.

  • Campo de unión event: jobEvent Los objetos se usan con la función de búsqueda de empleo y se emiten cuando un candidato interactúa con el servicio.

Mensaje de evento de ejemplo

La llamada a la API del ejemplo de código anterior debería generar un mensaje JSON con el siguiente 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. }

Situaciones y flujos de trabajo

A continuación se muestran dos ejemplos de situaciones en las que un candidato busca, consulta y solicita un empleo.

Flujo de trabajo 1

  1. El candidato realiza una búsqueda. Por ejemplo: Gestor de producto de SF

    Los resultados de búsqueda se devuelven al candidato.

    El objeto de respuesta de búsqueda de empleo que se envía al servidor del cliente contiene un requestId único (por ejemplo, 8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==). Usa este requestId en todos los mensajes futuros relacionados con esta llamada a la API SearchJobsRequest.

    Envía un mensaje IMPRESSION a Cloud Talent Solution.

    Mensaje de evento de ejemplo:

    {
      "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 que busca empleo selecciona un resultado (una oferta de empleo) para ver todos los detalles del puesto.

    Envía un mensaje VIEW 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. El candidato solicita el puesto de trabajo que ha visto.

    a. Si se redirige al candidato a una página del mismo dominio (una página de solicitud interna), envíe un mensaje APPLICATION_START a 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 se redirige al candidato a una página de solicitud externa, envíe un mensaje APPLICATION_REDIRECT a 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. Cuando el candidato complete una solicitud interna, envía un mensaje APPLICATION_FINISH 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_FINISH",
      "jobs":["jobs/4000000000"]}
    
    }
    
  5. El candidato vuelve a los resultados de búsqueda y pasa a la página 2 (o pasa a la página 2 sin haber hecho clic en ninguna oferta de empleo).

    Envía a Cloud Talent Solution un mensaje IMPRESSION con el siguiente conjunto de resultados de la página 2. Nota: Se genera un nuevo requestId en la respuesta de la llamada a la API SearchJobsRequest que genera la segunda página de resultados. Por ejemplo, 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. El candidato sigue en la página 3 de los resultados de búsqueda.

    Envía a Cloud Talent Solution un mensaje IMPRESSION con el siguiente conjunto de resultados. NOTA: Hay un nuevo requestId (por ejemplo, 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"]}
    }
    

Flujo de trabajo 2

  1. El candidato realiza una búsqueda. Por ejemplo: Gestor de producto de SF

    Los resultados de búsqueda se devuelven al candidato.

    El objeto de respuesta de búsqueda de empleo contiene un requestId único (por ejemplo, a2179a9b-cf73-413e-8076-98af08b991ad). Usa este requestId en todos los mensajes futuros relacionados con esta llamada a la API SearchJobsRequest.

    Envía un mensaje 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 que busca empleo selecciona un resultado (una oferta de empleo) para ver todos los detalles del puesto.

    Envía un mensaje VIEW 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. El candidato hace clic una vez para enviar una solicitud de empleo, tal como se describe en APPLICATION_QUICK_SUBMISSION.

    Envía a Cloud Talent Solution un mensaje APPLICATION_QUICK_SUBMISSION con el siguiente conjunto de resultados.

    {
      "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. El candidato realiza las siguientes acciones.

    a. El candidato vuelve a los resultados de búsqueda y solicita un empleo directamente desde la página de resultados de búsqueda. El proceso de solicitud es más largo que el definido en APPLICATION_QUICK_SUBMISSION (es decir, es un proceso de solicitud de varios pasos).

    Envía un mensaje 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. El candidato completa la solicitud de empleo. Envía un mensaje 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. El candidato vuelve a los resultados de búsqueda y solicita un empleo directamente desde la página de resultados de búsqueda. El proceso de solicitud redirige al candidato a otro dominio que no pertenece al sitio del arrendatario (solicitud externa), por lo que no se puede hacer un seguimiento del progreso del candidato.

    Envía un mensaje 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"]}
    }
    

    Es diferente de APPLICATION_REDIRECT, donde un candidato se encuentra en la página de descripción del empleo cuando se le redirige.

Verificar la implementación de eventos de cliente

Cloud Talent Solution te ofrece herramientas de autoservicio que puedes usar para verificar la implementación de eventos de cliente. Consulta las herramientas de gestión para obtener más información sobre las opciones de autoservicio disponibles.