클라이언트 이벤트 데이터로 선행 학습된 모델 개선

Cloud Talent Solution은 머신러닝을 채용정보 검색 환경에 적용하여 일반적인 키워드 기반 방법의 한계를 훨씬 뛰어넘는 우수한 검색결과를 구직자에게 제공하는 서비스입니다. CTS는 처음부터 관련성 모델 및 직업/기술 온톨로지를 채용정보 세부정보에 적용합니다. 구직자의 활동에 따라 클라이언트 이벤트를 기록하면 구직자에게 반환되는 결과를 개선할 수 있습니다.

createClientEventRequest를 사용하여 클라이언트 이벤트 기록

구직자가 특정 작업을 수행하면 채용정보 검색을 사용하여 해당 작업을 기록할 수 있습니다. 예를 들어, 구직자 또는 서비스와 상호작용하는 다른 개체에서는 압축되거나 잘린 형식의 검색결과 목록과 같이 자신의 시각에서 렌더링된 채용정보(또는 채용정보 목록)를 가지고 있습니다. IMPRESSION 이벤트를 Cloud Talent Solution으로 보내 검색 컨텍스트 및 구직자가 볼 수 있는 결과에 대한 데이터를 제공할 수 있습니다. 구직자가 채용정보 결과를 클릭하여 전체 채용정보 설명을 볼 때, 선택한 위치에 구직자의 관심을 등록하는 VIEW 이벤트를 보낼 수 있습니다.

다음 예시는 API를 사용하여 Cloud Talent Solution에 메시지를 보내는 방법을 보여줍니다. 구직자 또는 서비스와 상호작용하는 다른 개체에서는 압축되거나 잘린 형식의 검색결과 목록과 같이 자신의 시각에서 렌더링된 채용정보(또는 채용정보 목록)를 가지고 있습니다. 이 이벤트는 일반적으로 단일 페이지에서 채용정보 목록을 보는 구직자와 연결됩니다.

Go

CTS용 클라이언트 라이브러리를 설치하고 사용하는 방법은 CTS 클라이언트 라이브러리를 참조하세요. 자세한 내용은 CTS Go API 참조 문서를 확인하세요.

CTS에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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

CTS용 클라이언트 라이브러리를 설치하고 사용하는 방법은 CTS 클라이언트 라이브러리를 참조하세요. 자세한 내용은 CTS Java API 참조 문서를 확인하세요.

CTS에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


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

CTS용 클라이언트 라이브러리를 설치하고 사용하는 방법은 CTS 클라이언트 라이브러리를 참조하세요. 자세한 내용은 CTS Node.js API 참조 문서를 확인하세요.

CTS에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


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

CTS용 클라이언트 라이브러리를 설치하고 사용하는 방법은 CTS 클라이언트 라이브러리를 참조하세요. 자세한 내용은 CTS Python API 참조 문서를 확인하세요.

CTS에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


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)

이벤트 메시지

필수 필드:

  • eventId(고객 정의): Cloud Talent Solution으로 전송된 각 메시지에는 고유한 eventId가 있어야 합니다. 중복되지 않도록 하려면 이 필드를 정의하는 동안 타임스탬프를 포함하는 것이 좋습니다. 이 필드의 최대 길이는 255자입니다.

  • requestId: 검색 응답 객체가 반환한 requestId의 값 이 값은 특정 SearchJobsRequest API 호출에 고유한 값으로, 원래의 검색 IMPRESSION 이벤트에서 파생된 모든 후속 메시지에 사용됩니다. 새 SearchJobsRequest API 호출이 수행되면(예: 구직자가 결과의 다음 페이지로 이동) requestId가 변경됩니다.

  • createTime 이벤트의 타임스탬프(타임스탬프 형식으로, 정밀도는 나노초 수준입니다. 이 타임스탬프는 메시지가 전송되었을 때가 아니라 이벤트가 실제로 발생했을 때 반영되어야 합니다.

  • 통합 필드 event: jobEvent 객체는 채용정보 검색 기능과 함께 사용되며 구직자가 서비스와 상호작용할 때 발행됩니다.

샘플 이벤트 메시지

위의 코드 샘플에서 API 호출은 다음 형식으로 JSON 메시지를 생성해야 합니다.

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. }

시나리오 및 워크플로

다음 두 가지 시나리오 예시에서는 구직자가 채용정보를 검색 및 확인하고 채용에 지원하는 다양한 시나리오를 보여줍니다.

워크플로 1

  1. 구직자가 검색을 수행합니다. 예를 들면 Product mgr SF입니다.

    검색결과가 구직자에게 반환됩니다.

    고객의 서버로 다시 전송된 취업정보 검색 응답 객체에는 고유한 requestId(예: 8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==)가 포함되어 있습니다. 이 SearchJobsRequest API 호출에 requestId를 사용합니다.

    Cloud Talent Solution에 IMPRESSION 메시지를 보냅니다.

    샘플 이벤트 메시지:

    {
      "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. 구직자가 결과(채용 공고)를 선택하여 채용정보의 전체 세부정보를 확인합니다.

    Cloud Talent Solution에 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. 구직자가 열람한 채용 공고에 지원합니다.

    a. 구직자가 동일한 도메인 내 페이지(내부 지원 페이지)로 리디렉션되면 Cloud Talent Solution에 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. 구직자가 외부 지원 페이지로 리디렉션되는 경우 Cloud Talent Solution에 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. 구직자가 내부 지원을 완료하면 Cloud Talent Solution에 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. 구직자는 검색 결과로 돌아가서 2페이지로 계속됩니다(또는 채용 공고를 클릭하지 않고 2페이지로 계속됩니다).

    2페이지의 다음 결과 세트가 포함된 IMPRESSION 메시지를 Cloud Talent Solution에 보냅니다. 참고: 두 번째 결과 페이지를 생성하는 SearchJobsRequest API 호출의 응답으로 생성되는 새로운 requestId가 있습니다. (예: 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. 구직자가 검색결과의 3페이지로 넘어갑니다.

    다음 결과 세트가 포함된 IMPRESSION 메시지를 Cloud Talent Solution에 보냅니다. 참고: 새로운 requestId가 있습니다(예: 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"]}
    }
    

워크플로 2

  1. 구직자가 검색을 수행합니다. 예를 들면 Product mgr SF입니다.

    검색결과가 구직자에게 반환됩니다.

    취업정보 검색 응답 객체에는 고유한 requestId(예: a2179a9b-cf73-413e-8076-98af08b991ad)가 포함되어 있습니다. 이 SearchJobsRequest API 호출과 관련되어 이후에 발생하는 모든 메시지에 이 requestId를 사용합니다.

    Cloud Talent Solution에 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. 구직자가 결과(채용 공고)를 선택하여 채용정보의 전체 세부정보를 확인합니다.

    Cloud Talent Solution에 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. 구직자가 APPLICATION_QUICK_SUBMISSION의 설명대로 한 번 클릭하여 채용에 지원합니다.

    다음 결과 세트가 포함된 APPLICATION_QUICK_SUBMISSION 메시지를 Cloud Talent Solution에 보냅니다.

    {
      "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. 구직자가 다음 작업을 수행합니다.

    a. 구직자가 검색결과로 돌아가 검색결과 페이지에서 직접 채용정보에 지원합니다. 지원 프로세스는 APPLICATION_QUICK_SUBMISSION에 정의된 것보다 긴 프로세스입니다. 즉, 다중 단계 지원 프로세스입니다.

    Cloud Talent Solution에 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. 구직자가 채용정보 지원을 완료합니다. Cloud Talent Solution에 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. 구직자가 검색결과로 돌아가 검색결과 페이지에서 직접 채용정보에 지원합니다. 지원 프로세스는 지원자 진행 상황을 추적할 수 없는 테넌트 사이트(외부 지원) 외부에 있는 다른 도메인으로 구직자를 리디렉션합니다.

    Cloud Talent Solution에 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"]}
    }
    

    구직자가 다시 라우팅될 때 채용정보 설명 페이지에 있는 APPLICATION_REDIRECT와 다릅니다.

클라이언트 이벤트 구현 확인

Cloud Talent Solution은 클라이언트 이벤트 구현을 검증하는 데 사용할 수 있는 셀프 서비스 도구를 제공합니다. 사용 가능한 셀프 서비스 옵션에 대한 자세한 정보는 관리 도구를 참조하십시오.