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

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

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

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

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

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

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

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

	return resp, nil
}

자바

Cloud Talent Solution 클라이언트 설치 및 생성에 대한 자세한 내용은 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());
    }
  }
}

Node.js

Cloud Talent Solution 클라이언트 설치 및 만들기에 대한 자세한 내용은 Cloud Talent Solution 클라이언트 라이브러리를 참조하세요.


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

Cloud Talent Solution 클라이언트 설치 및 만들기에 대한 자세한 내용은 Cloud Talent Solution 클라이언트 라이브러리를 참조하세요.


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

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, six.binary_type):
        project_id = project_id.decode("utf-8")
    if isinstance(tenant_id, six.binary_type):
        tenant_id = tenant_id.decode("utf-8")
    if isinstance(request_id, six.binary_type):
        request_id = request_id.decode("utf-8")
    if isinstance(event_id, six.binary_type):
        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은 클라이언트 이벤트 구현을 검증하는 데 사용할 수 있는 셀프 서비스 도구를 제공합니다. 사용 가능한 셀프 서비스 옵션에 대한 자세한 정보는 관리 도구를 참조하십시오.