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

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

	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 {
    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());
    }
  }
}

PHP

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

require __DIR__ . '/vendor/autoload.php';

use Google\Cloud\Talent\V4beta1\EventServiceClient;
use Google\Cloud\Talent\V4beta1\ClientEvent;
use Google\Cloud\Talent\V4beta1\JobEvent;
use Google\Cloud\Talent\V4beta1\JobEvent_JobEventType;
use Google\Protobuf\Timestamp;

/**
 * Creates a client event.
 *
 * @param string $projectId Your Google Cloud Project ID
 * @param string $tenantId  Identifier of the Tenant
 * @param string $requestId A unique ID generated in the API responses.
 *                          Value should be set to the request_id from an API response.
 * @param string $eventId   A unique identifier, generated by the client application
 */
function sampleCreateClientEvent($projectId, $tenantId, $requestId, $eventId)
{

    $eventServiceClient = new EventServiceClient();

    // $projectId = 'Your Google Cloud Project ID';
    // $tenantId = 'Your Tenant ID (using tenancy is optional)';
    // $requestId = '[request_id from ResponseMetadata]';
    // $eventId = '[Set this to a unique identifier]';
    $formattedParent = $eventServiceClient->tenantName($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
    $seconds = 0;
    $createTime = new Timestamp();
    $createTime->setSeconds($seconds);

    // The type of event attributed to the behavior of the end user
    $type = JobEvent_JobEventType::VIEW;

    // List of job names associated with this event
    $jobsElement = 'projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]';
    $jobsElement2 = 'projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]';
    $jobs = [$jobsElement, $jobsElement2];
    $jobEvent = new JobEvent();
    $jobEvent->setType($type);
    $jobEvent->setJobs($jobs);
    $clientEvent = new ClientEvent();
    $clientEvent->setRequestId($requestId);
    $clientEvent->setEventId($eventId);
    $clientEvent->setCreateTime($createTime);
    $clientEvent->setJobEvent($jobEvent);

    try {
        $response = $eventServiceClient->createClientEvent($formattedParent, $clientEvent);
        printf('Created client event'.PHP_EOL);
    } finally {
        $eventServiceClient->close();
    }

}

Ruby

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


# Creates a client event
#
# @param project_id {String} Your Google Cloud Project ID
# @param tenant_id {String} Identifier of the Tenant
# @param request_id {String} A unique ID generated in the API responses.
# Value should be set to the request_id from an API response.
# @param event_id {String} A unique identifier, generated by the client application
def sample_create_client_event project_id, tenant_id, request_id, event_id
  # Instantiate a client
  event_client = Google::Cloud::Talent::Event.new version: :v4beta1

  # 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]"
  formatted_parent = event_client.class.tenant_path(project_id, 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 = :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 = event_client.create_client_event(formatted_parent, client_event)
  puts "Created client event"
end

C#

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

public static object CreateClientEvent(string projectId, string tenantId, string requestId, string eventId, IEnumerable<string> jobIds)
{
    EventServiceClient eventServiceClient = EventServiceClient.Create();

    TenantName tenantName = TenantName.FromProjectTenant(projectId, tenantId);

    long seconds = 1L;
    Timestamp createTime = new Timestamp
    {
        Seconds = seconds
    };

    // The type of event attributed to the behavior of the end user.
    JobEventType type = JobEventType.View;

    // List of job names associated with this event.
    List<string> jobs = new List<string>();
    foreach (var jobId in jobIds)
    {
        //build full path of job IDs
        JobName name = JobName.FromProjectTenantJob(projectId, tenantId, jobId);
        jobs.Add(name.ToString());
    }

    JobEvent jobEvent = new JobEvent
    {
        Type = type
    };
    jobEvent.Jobs.Add(jobs);

    ClientEvent clientEvent = new ClientEvent
    {
        RequestId = requestId,
        EventId = eventId,
        CreateTime = createTime,
        JobEvent = jobEvent
    };

    CreateClientEventRequest request = new CreateClientEventRequest
    {
        ParentAsTenantName = tenantName,
        ClientEvent = clientEvent
    };

    ClientEvent response = eventServiceClient.CreateClientEvent(request);
    Console.WriteLine($"Created client event.");
    Console.WriteLine(response);

    return 0;
}

이벤트 메시지

필수 필드:

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

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

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

  • 통합 필드 event: jobEvent 또는 profileEvent 중 하나일 수 있습니다. jobEvent 객체는 취업정보 검색 기능과 함께 사용되며 구직자가 서비스와 상호작용할 때 발행됩니다. profileEvent 객체는 프로필 검색(베타) 기능과 함께 사용되며 프로필 검색자가 서비스와 상호작용할 때 발행됩니다. 프로필 검색(베타)에 관심이 있으시면 Google에 문의하세요.

샘플 이벤트 메시지

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

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

시나리오 및 워크플로

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

워크플로 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은 클라이언트 이벤트 구현을 검증하는 데 사용할 수 있는 셀프 서비스 도구를 제공합니다. 사용 가능한 셀프 서비스 옵션에 대한 자세한 정보는 관리 도구를 참조하십시오.