クライアント イベントデータを使用して事前学習モデルを改善する

Cloud Talent Solution は、求人検索体験に機械学習を導入するサービスであり、一般的なキーワード ベース方式の制約をはるかに超えた高品質の結果を求職者に返します。 CTS により、関連性モデルと求人 / スキルのオントロジーが、求人情報に自動的に適用されます。求職者の活動に基づいてクライアント イベントを記録することで、求職者に返される結果を改善できます。

createClientEventRequest を使用してクライアント イベントを記録する

求職者が特定のアクションを行ったときに、求人検索を使用してそのアクションを記録できます。たとえば、求職者やその他のエンティティは、サービスを操作しているときに、検索結果のリストを圧縮したりクリップしたりするなど、求人(または求人リスト)を自分のビューでレンダリングすることがあります。Cloud Talent Solution に IMPRESSION イベントを送信して、検索のコンテキストと求職者に表示される結果を提供できます。また、求職者が求人結果をクリックして詳しい職務内容を表示したときに、VIEW イベントを送信してこの求職者の関心をこの職位に登録できます。

次の例は、この API を使用して、Cloud Talent Solution にメッセージを送信する方法を示しています。求職者や他のエンティティは、サービスを操作しているときに、検索結果のリストを圧縮したりクリップしたりするなど、求人(または求人リスト)を自分のビューにレンダリングすることがあります。このイベントは、一般に求職者による 1 ページでの求人リストの表示に関連付けられます。

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
}

Java

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

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 = client.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_ = 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, client_event)
    print(response)

Ruby

Cloud Talent Solution クライアントのインストールと作成の詳細については、Cloud Talent Solution クライアント ライブラリをご覧ください。

require "google/cloud/talent"

# Instantiate a client
event_client = Google::Cloud::Talent.event_service

# project_id = "Your Google Cloud Project ID"
# tenant_id = "Your Tenant ID (using tenancy is optional)"
parent = event_client.tenant_path project: project_id, tenant: 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 = 1
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
# job_one = "projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]"
# job_two = "projects/[Project ID]/tenants/[Tenant ID]/jobs/[Job ID]"
jobs = [job_one, job_two]
job_event = { type: type, jobs: jobs }

# request_id = "[request_id from ResponseMetadata]"
# event_id = "[Set this to a unique identifier]"
client_event = {
  request_id:  request_id,
  event_id:    event_id,
  create_time: create_time,
  job_event:   job_event
}

response = event_client.create_client_event parent: parent, client_event: client_event
puts "Created client event: #{response.event_id}"

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: イベントのタイムスタンプ(Timestamp 形式、精度はナノ秒)。このタイムスタンプは、メッセージが送信された時点ではなくイベントが実際に発生した時点を反映します。

  • ユニオン フィールド event: jobEvent または profileEvent のいずれかにできます。jobEvent オブジェクトは 求人検索機能で使用され、求職者がサービスを操作したときに発行されます。

イベント メッセージの例

上記のコードサンプルの 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. }

シナリオとワークフロー

以下では、求職者が求人を検索して表示し、求人に応募する 2 つのシナリオ例を紹介します。

ワークフロー 1

  1. 求職者が検索を行います。 たとえば、Product mgr SF です。

    検索結果が求職者に返されます。

    お客様のサーバーに返される求人検索レスポンス オブジェクトには固有の requestId(例: 8d2bdd5d-1361-42a5-a0fd-bd2b58b7d8fb:APAb7ISd4Sc5faibw2V5hTU/OoC2WAW5AA==)が含まれます。この requestId は、対応する SearchJobsRequest API 呼び出しに関連する以降のすべてのメッセージに使用します。

    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 に APPICATION_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 ページ目に表示される次の結果セットで Cloud Talent Solution に IMPRESSION メッセージを送信します。注: 2 ページ目の結果を生成する 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 ページ目の検索結果を表示します。

    次の結果セットで Cloud Talent Solution に IMPRESSION メッセージを送信します。 注: 新しい requestIde2d2b916-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)が含まれています。この requestId は、この SearchJobsRequest API 呼び出しに関連する以降のすべてのメッセージに使用します。

    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 に概要が示されているように、1 回のクリックで求人に応募します。

    次の結果セットで Cloud Talent Solution に APPLICATION_QUICK_SUBMISSION メッセージを送信します。

    {
      "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 には、クライアント イベントの実装を検証できるセルフサービス ツールが用意されています。利用可能なセルフサービス オプションの詳細については、管理ツールをご覧ください。