Snowflake Data Clean Rooms: 웹 앱에서 개발자 API 템플릿 등록하기¶
이 항목에서는 공급자가 컨슈머와 함께 클린룸을 프로그래밍 방식으로 만들고 공유하는 방법과 컨슈머가 웹 앱에서 분석을 실행하는 데 사용할 수 있는 사용자 인터페이스를 제공하는 방법을 설명합니다. 머신 러닝 흐름과 유사하지만, 컨슈머에게 복잡한 머신 러닝 워크플로에 대한 사용자 인터페이스를 제공하는 방법을 보여줍니다. 공급자가 웹 앱에 클린룸을 등록하면, 컨슈머는 Snowsight나 개발자 APIs를 사용할 필요가 없으므로 기술 전문가가 아닌 컨슈머도 복잡한 사용자 지정 클린룸을 사용할 수 있습니다.
공급자는 클린룸에 대한 여러 개의 사용자 지정 템플릿을 등록할 수 있으며, 각 템플릿은 컨슈머용 웹 앱에 표시됩니다. 공급자는 관련 APIs를 여러 번 호출하기만 하면 됩니다.
이 흐름에는 다음이 포함됩니다.
공급자:
a. Lookalike Modeling 분석을 실행하는 사용자 지정 템플릿을 추가합니다.
b. XGBoost 를 활용하여 머신 러닝 Python 코드 기반 템플릿을 보안 방식으로 추가합니다.
c. 사용자 지정 템플릿을 사용하여 클린룸 내부에서 머신 러닝 UDFs를 호출합니다.
d. 사용자 지정 UI 양식을 사용하여 웹 앱에서 클린룸을 등록합니다.
컨슈머:
a. 웹 앱을 사용하여 클린룸을 설치하고 분석을 실행합니다.
참고
Lookalike Modeling 은 컨슈머가 공급자의 데이터에서 고가치 고객을 대상으로 통계 모델을 훈련하여 “높은 가치” 고객을 찾아내는 분석 유형입니다. 이 모델은 컨슈머가 지정한 플래그를 사용하여 특정 임계값 이상의 지출을 한 사용자와 같은 고가치 사용자를 컨슈머의 데이터 세트에 표시합니다. 그런 다음 훈련된 모델을 사용하여 공급자의 데이터 중 컨슈머에게 잠재적으로 “높은 가치”를 제공할 수 있는 고객을 추론합니다.
전제 조건¶
이 흐름을 완료하려면 두 개의 별도 Snowflake 계정이 필요합니다. 첫 번째 계정을 사용하여 공급자의 명령을 실행한 다음 두 번째 계정으로 전환하여 컨슈머의 명령을 실행합니다.
공급자¶
이 섹션의 명령을 실행하려면 공급자 계정에서 Snowflake 워크시트를 사용합니다.
환경 설정¶
개발자 APIs를 사용하기 전에 SAMOOHA_APP_ROLE 역할로 APIs를 실행하는 데 사용되는 웨어하우스를 지정해야 합니다. SAMOOHA_APP_ROLE 역할이 없는 경우 계정 관리자에게 문의하십시오.
다음 명령을 실행하여 환경을 설정합니다.
USE ROLE samooha_app_role;
USE WAREHOUSE app_wh;
클린룸 만들기¶
클린룸을 만들기 전에 클린룸의 영숫자 이름을 지정해야 합니다. 이름에는 공백과 밑줄을 제외한 특수 문자를 사용할 수 없습니다. 클린룸의 이름이 기존 클린룸과 중복되지 않도록 주의하십시오.
클린룸의 이름을 지정하려면 다음 명령을 실행합니다.
SET cleanroom_name = 'UI Registration ML Clean room';
이제 provider.cleanroom_init 명령을 실행하여 클린룸을 만들 준비가 되었습니다. 두 번째 인자는 클린룸의 분포를 정의합니다. 이 예제에서는 이 값을 INTERNAL로 설정하여 클린룸을 공동 작업자에게 공개하기 전에 수행되는 자동 보안 검사를 우회합니다. INTERNAL 배포 메서드를 사용하려면 공급자 계정과 컨슈머 계정이 동일한 조직에 있어야 합니다. 다른 조직의 계정에 클린룸을 배포하는 경우에는 EXTERNAL 배포를 사용해야 합니다.
클린룸을 만들려면 다음 명령을 실행합니다.
CALL samooha_by_snowflake_local_db.provider.cleanroom_init($cleanroom_name, 'INTERNAL');
클린룸을 만든 후에는 공동 작업자와 공유하기 전에 릴리스 지시문을 설정해야 합니다.
참고
클린룸 배포를 EXTERNAL로 설정한 경우 보안 검사가 완료될 때까지 기다렸다가 릴리스 지시문을 설정해야 합니다. 다음을 실행하여 보안 검사 상태를 볼 수 있습니다.
CALL samooha_by_snowflake_local_db.provider.view_cleanroom_scan_status($cleanroom_name);
provider.create_cleanroom_listing 명령을 실행하기 전에 릴리스 지시문을 설정하는 한 보안 검사 중에도 명령을 계속 실행할 수 있습니다.
클린룸에 대한 릴리스 지시문을 설정하려면 다음 명령을 실행합니다.
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', '0');
리전 간 공유¶
사용자의 계정과 다른 리전에 있는 Snowflake 고객과 클린룸을 공유하려면 클라우드 간 자동 복제를 활성화해야 합니다. 다른 리전의 컨슈머와 협업하는 데 따른 추가 비용에 대한 자세한 내용은 클라우드 간 자동 복제 비용을 참조하십시오.
개발자 APIs를 사용할 때, 리전 간 공유를 활성화하는 것은 2단계 프로세스입니다.
ACCOUNTADMIN 역할이 있는 Snowflake 관리자는 Snowflake 계정에 대해 클라우드 간 자동 복제를 사용 설정할 수 있습니다. 자세한 지침은 다른 리전의 계정과 협업을 참조하십시오.
provider.enable_laf_for_cleanroom 명령을 실행하여 클린룸에 클라우드 간 자동 복제를 사용하도록 설정합니다. 예:
CALL samooha_by_snowflake_local_db.provider.enable_laf_for_cleanroom($cleanroom_name);
클린룸에 대해 클라우드 간 자동 복제를 활성화한 후에는 평소와 같이 provider.create_cleanroom_listing 명령을 사용하여 목록에 컨슈머를 추가할 수 있습니다. 목록은 필요에 따라 원격 클라우드 및 리전에 자동으로 복제됩니다.
데이터 세트를 연결하고 데이터 세트에 대한 조인 정책을 설정합니다.¶
Snowflake 테이블을 클린룸에 연결하고, Snowflake 계정의 테이블 목록을 탐색하여 정규화된 테이블 이름(Database.Schema.Table)을 배열로 입력합니다. 이 절차를 사용하면 클린룸 내부에서 테이블을 안전하게 볼 수 있어 테이블에 자동으로 액세스할 수 있으므로 테이블 사본을 만들 필요가 없습니다.
CALL samooha_by_snowflake_local_db.provider.link_datasets($cleanroom_name, ['samooha_provider_sample_database.lookalike_modeling.customers']);
참고
테이블이 있지만, 이 단계가 작동하지 않는다면 SAMOOHA_APP_ROLE 역할에 아직 테이블에 대한 액세스 권한이 부여되지 않았기 때문일 수 있습니다. 그러한 경우, ACCOUNTADMIN 역할로 전환하고 데이터베이스에서 아래 프로시저를 호출한 다음 다시 전환하여 나머지 흐름을 진행합니다.
USE ROLE accountadmin;
CALL samooha_by_snowflake_local_db.provider.register_db('<DATABASE_NAME>');
USE ROLE samooha_app_role;
클린룸에 연결된 데이터 세트 이름을 보려면 다음 프로시저를 호출합니다.
CALL samooha_by_snowflake_local_db.provider.view_provider_datasets($cleanroom_name);
다음 절차에 따라 클린룸에 연결된 데이터 세트를 볼 수 있습니다.
SELECT * FROM <PROVIDER_TABLE> LIMIT 10;
클린룸 내에서 템플릿을 실행할 때 컨슈머가 어떤 열에 참여할 수 있는지 지정합니다. 이 절차는 이메일과 같은 ID 열에 대해 호출되어야 합니다. 조인 정책은 “바꾸기 전용”이므로 함수가 다시 호출되면 이전에 설정된 조인 정책이 새 정책으로 완전히 바뀝니다.
CALL samooha_by_snowflake_local_db.provider.set_join_policy($cleanroom_name, ['samooha_provider_sample_database.lookalike_modeling.customers:hashed_email']);
조인 정책 열을 결정하기 위해 모든 열을 보려면 다음 프로시저를 호출합니다.
CALL samooha_by_snowflake_local_db.provider.view_join_policy($cleanroom_name);
클린룸에 기밀 머신 러닝 Python 코드를 추가합니다.¶
클린룸에 몇 가지 Python 함수를 로드하여 lookalike ML 작업을 수행합니다. 클린룸에 설치된 모든 Python 함수는 완전히 기밀로 유지됩니다. 컨슈머에게는 표시되지 않습니다.
다음 API를 사용하면 Python 함수를 클린룸에 인라인 함수로 직접 정의할 수 있습니다. 또는 클린룸 스테이지에 업로드한 스테이징된 파일에서 Python을 로드할 수 있습니다. 예제는 API 참조 가이드를 참조하십시오.
참고
이 구현은 ARRAY_AGG가 집계할 수 있는 데이터의 총량(즉, 16MB)에 대한 Snowflake 크기 제약 조건에 의해 제한된다는 점에 유의하십시오. 일괄 처리를 사용하여 임의의 크기의 데이터 세트로 확장할 수 있는 일괄 처리 및 스트리밍 모델을 활용하는 구현은 요청 시 제공 됩니다.
CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
$cleanroom_name,
'lookalike_train',
['input_data variant', 'labels variant'],
['pandas', 'numpy', 'xgboost'],
'variant',
'train',
$$
import numpy as np
import pandas as pd
import xgboost
from sklearn import preprocessing
import sys
import os
import pickle
import codecs
import threading
class TrainXGBoostClassifier(object):
def __init__(self):
self.model = None
self._params = {
"objective": "binary:logistic",
"max_depth": 3,
"nthread": 1,
"eval_metric": "auc",
}
self.num_boosting_rounds = 10
def get_params(self):
if self.model is not None and "updater" not in self._params:
self._params.update(
{"process_type": "update", "updater": "refresh", "refresh_leaf": True}
)
return self._params
def train(self, X, y):
# Train the model in a threadsafe way
# pick only the categorical attributes
categorical = X.select_dtypes(include=[object])
# fit a one-hot-encoder to convert categorical features to binary features (required by XGBoost)
ohe = preprocessing.OneHotEncoder()
categorical_ohe = ohe.fit_transform(categorical)
self.ohe = ohe
# get the rest of the features and add them to the binary features
non_categorical = X.select_dtypes(exclude=[object])
train_x = np.concatenate((categorical_ohe.toarray(), non_categorical.to_numpy()), axis=1)
xg_train = xgboost.DMatrix(train_x, label=y)
params = self.get_params()
params["eval_metric"] = "auc"
evallist = [(xg_train, "train")]
evals_result = {}
self.model = xgboost.train(
params, xg_train, self.num_boosting_rounds, evallist, evals_result=evals_result
)
self.evals_result = evals_result
def __dump_model(self, model):
# Save down the model as a json string to load up for scoring/inference
pickle_jar = codecs.encode(pickle.dumps([model, self.ohe]), "base64").decode()
return pickle_jar
def dump_model(self):
# Save down the model as a json string to load up for scoring/inference
if self.model is not None:
return self.__dump_model(self.model)
else:
raise ValueError("Model needs to be trained first")
def train(d1, l1):
# get take training features and put them in a pandas dataframe
X = pd.DataFrame(d1)
# get the labels into a Numpy array
y = np.array(l1)
trainer = TrainXGBoostClassifier()
trainer.train(X, y)
# return training stats, accuracy, and the pickled model and pickled one-hot-encoder
return {
"total_rows": len(d1),
"total_bytes_in": sys.getsizeof(d1),
"model": trainer.dump_model(),
"iteration": trainer.num_boosting_rounds,
"auc": np.max(trainer.evals_result["train"]["auc"]),
"error": 1 - np.max(trainer.evals_result["train"]["auc"])
}
$$);
이제 클린룸에 채점 함수를 설치합니다.
CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
$cleanroom_name,
'lookalike_score',
['pickle_jar variant', 'emails variant', 'features variant'],
['pandas', 'numpy', 'xgboost', 'scikit-learn'],
'string',
'score',
$$
import numpy as np
import pandas as pd
import xgboost as xgb
import pickle
import codecs
import json
def score(model, emails, features):
# load model
model = model[0] if not isinstance(model, str) else model
model = pickle.loads(codecs.decode(model.encode(), "base64"))
# retrieve the XGBoost trainer from the pickle jar
bst = model[0]
# retrieve the fitted one-hot-encoder from the pickle jar
ohe2 = model[1]
# create pandas dataframe from the inference features
Y = pd.DataFrame(features)
# select the categorical attributes and one-hot-encode them
Y1 = Y.select_dtypes(include=[object])
Y2 = ohe2.transform(Y1)
# select the non-categorical attributes
Y3 = Y.select_dtypes(exclude=[object])
# join the results of the one-hot encoding to the rest of the attributes
Y_pred = np.concatenate((Y2.toarray(), Y3.to_numpy()), axis=1)
# inference
dscore = xgb.DMatrix(Y_pred)
pred = bst.predict(dscore)
retval = list(zip(np.array(emails), list(map(str, pred))))
retval = [{"email": r[0], "score": r[1]} for r in retval]
return json.dumps(retval)
$$);
참고
클린룸에 Python을 로드하면 클린룸에 새로운 패치가 생성됩니다. 클린룸 배포가 EXTERNAL로 설정된 경우 보안 검사가 완료될 때까지 기다린 다음 다음을 사용하여 기본 릴리스 지시문을 업데이트해야 합니다.
-- See the versions available inside the cleanroom
SHOW VERSIONS IN APPLICATION PACKAGE samooha_cleanroom_UI_Registration_ML_clean_room;
-- Once the security scan is approved, update the release directive to the latest version
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', '2');
사용자 지정 Lookalike Modeling 템플릿 추가¶
클린룸에 사용자 지정 분석 템플릿을 추가하려면 공급자 측과 컨슈머 측 모두에 테이블 이름을 위한 자리표시자와 공급자 측의 조인 열이 필요합니다. SQL Jinja 템플릿에서는 다음 자리 표시자가 항상 있어야 합니다.
source_table: 공급자의 테이블 이름 배열
my_table: 컨슈머의 테이블 이름 배열
테이블 이름은 이러한 변수를 사용하여 동적으로 만들 수 있지만, 원하는 경우 클린룸에 연결된 뷰의 이름을 사용하여 템플릿에 하드코딩할 수도 있습니다. 원하는 경우 열 이름을 템플릿에 하드코딩하거나 매개 변수를 통해 동적으로 설정할 수 있습니다. 매개 변수를 통해 설정한 경우 열 정책에 대해 확인하려면 배열이어야 하는 매개 변수 dimensions 또는 measure_column 을 호출해야 한다는 점을 기억하십시오. 이를 템플릿에 SQL Jinja 매개 변수로 추가하면 나중에 컨슈머가 쿼리할 때 전달할 수 있습니다. 조인 정책은 컨슈머가 권한이 있는 열 이외의 열에 조인할 수 없도록 보장합니다.
또는 사용자 지정 SQL Jinja 템플릿의 모든 인자가 다음 필터를 사용하여 조인 및 열 정책을 준수하는지 확인할 수 있습니다.
join_policy: 문자열 값 또는 필터 절이 조인 정책을 준수하는지 확인합니다.
column_policy: 문자열 값 또는 필터 절이 열 정책을 준수하는지 확인합니다.
join_and_column_policy: 필터 절에서 조인에 사용된 열이 조인 정책을 준수하는지, 필터로 사용된 열이 열 정책을 준수하는지 확인합니다.
예를 들어, {{ provider_id | sqlsafe | join_policy }} 절에서, p.HEM 의 입력을 구문 분석하여 p.HEM 이 조인 정책에 있는지 확인합니다. 참고: sqlsafe 필터는 공동 작업자가 템플릿에 순수 SQL을 삽입할 수 있도록 허용하므로 주의해서 사용해야 합니다.
참고
모든 공급자/컨슈머 테이블은 이러한 인자를 사용하여 참조되어야 합니다. 왜냐하면 클린룸에 실제로 연결된 보안 뷰의 이름이 테이블 이름과 다르기 때문입니다. 중요한 사항으로, 공급자 테이블 별칭은 반드시 p(또는 p1), p2, p3, p4 등이어야 하며, 컨슈머 테이블 별칭은 반드시 c(또는 c1), c2, c3 등이어야 합니다. 이는 클린룸의 보안 정책을 시행하기 위해 필요합니다.
이 함수는 이름이 동일한 기존 템플릿을 모두 재정의합니다. 기존 템플릿을 업데이트하려면 업데이트된 템플릿으로 이 함수를 다시 호출하면 하면 됩니다.
공급자 데이터 세트에서 기능 세트가 선택되고, 컨슈머 데이터 세트에서 레이블 집합과 “높은 값” 플래그(label_value라고 함)가 선택됩니다. 그런 다음 이 두 테이블은 이메일에서 내부 결합되어 랜덤 포레스트 훈련 알고리즘에 전달됩니다. 마지막으로, 모델 훈련 단계의 출력은 추론 함수에 전달되며, 추론 함수는 훈련된 모델을 사용하여 컨슈머 데이터 세트에 없는 공급자 고객 중 “높은 가치”를 가질 수 있는 고객을 “추론”합니다. 그런 개인의 개수 가 모델 오류와 함께 반환됩니다.
고객이 “높은 가치”를 가질 가능성이 높은 점수를 결정하는 임계값은 템플릿에서 수동으로 0.5로 설정됩니다. 클린룸에 템플릿을 추가할 때 이를 쉽게 변경할 수 있습니다.
CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template($cleanroom_name, 'prod_custom_lookalike_template',
$$
WITH
features AS (
SELECT
identifier({{ provider_join_col | join_policy }}) AS joincol,
array_construct({{ dimensions[0] | sqlsafe }} {% for feat in dimensions[1:] %} , {{ feat | sqlsafe }} {% endfor %}) AS features
FROM
identifier({{ source_table[0] }}) AS p
),
labels AS (
SELECT
c.{{ consumer_join_col | sqlsafe }} AS joincol,
c.{{ filter_column | default('SALES_DLR') | sqlsafe }} {{ operator | default('>=') | sqlsafe }} {{ filter_value | default(2000) | sqlsafe }} AS label_value
FROM
identifier({{ my_table[0] }}) AS c
),
trained_model AS (
SELECT
train_out:model::varchar AS model,
train_out:error::float AS error
FROM (
SELECT
cleanroom.{{ lookalike_train_function | default('lookalike_train') | sqlsafe }}(array_agg(f.features), array_agg(l.label_value)) AS train_out
FROM features f, labels l
WHERE f.joincol = l.joincol
)
),
inference_output AS (
SELECT
MOD(seq4(), 100) AS batch,
cleanroom.{{ lookalike_score_function | default('lookalike_score') | sqlsafe }}(
array_agg(distinct t.model),
array_agg(identifier({{ provider_join_col | join_policy }})),
array_agg(array_construct( identifier({{ dimensions[0] }}) {% for feat in dimensions[1:] %} , identifier({{ feat }}) {% endfor %}) )
) AS scores
FROM trained_model t, identifier({{ source_table[0] }}) p
WHERE identifier({{ provider_join_col | join_policy }}) NOT IN (SELECT c.{{ consumer_join_col | sqlsafe }} FROM identifier({{ my_table[0] }}) c)
GROUP BY batch
),
processed_output AS (
SELECT value:email::string as id, value:score::float AS score FROM (select scores from inference_output), lateral flatten(input => parse_json(scores))
), train_results AS (
SELECT {{ num_boosting_rounds | sqlsafe }} AS num_boosting_rounds, {{ trim_extremes | sqlsafe }} AS trim_extremes, p.audience_size AS audience_size, t.error AS error FROM (SELECT count(distinct id) AS audience_size FROM processed_output WHERE score > 0.5) p, trained_model t
), seed_size AS (
select count(*) AS seed_audience_size FROM features f, labels l WHERE f.joincol = l.joincol
)
SELECT s.seed_audience_size, t.audience_size AS num_lookalikes_found, t.error FROM train_results t, seed_size s
$$);
참고
위의 samooha_by_snowflake_local_db.provider.add_custom_sql_template 프로시저 호출에 차등 개인정보 보호 민감도를 마지막 매개 변수로 추가할 수 있습니다. 추가하지 않으면 기본값은 1입니다.
현재 클린룸에서 활성화된 템플릿을 보려면 다음 프로시저를 호출합니다. 분석에 차등 개인정보 보호 보장을 활성화하도록 수정할 수 있습니다. 유사한 패턴을 사용자가 선택한 사용자 지정 템플릿에 통합할 수 있습니다.
CALL samooha_by_snowflake_local_db.provider.view_added_templates($cleanroom_name);
각 테이블에 열 정책 설정¶
테이블의 내부에 있는 열을 확인하기 위해 연결된 데이터를 표시합니다. 상위 10개 행을 보려면 다음 프로시저를 호출합니다.
SELECT * FROM <PROVIDER_TABLE> LIMIT 10;
모든 테이블과 템플릿 조합에 대해 그룹화, 집계(예: SUM/AVG) 및 일반적으로 분석에 사용할 열을 설정합니다. 이를 통해 유연성이 제공되므로 기본 템플릿에 따라 동일한 테이블에서도 다른 열 선택을 허용할 수 있습니다. 이 작업은 템플릿을 추가한 후에만 호출해야 합니다.
열 정책은 바꾸기 전용 이므로 함수가 다시 호출되면 이전에 설정된 열 정책이 새 정책으로 완전히 바뀝니다.
컨슈머가 이러한 열을 기준으로 그룹화할 수 없도록 하려면 이메일, HEM 또는 RampID 등과 같은 ID 열에는 열 정책을 사용해서는 안 됩니다. 프로덕션 환경에서는 시스템이 지능적으로 PII 열을 추론하여 이 작업을 차단하지만 샌드박스 환경에서는 이 기능을 사용할 수 없습니다. 상태, 연령대, 리전 코드, 활성 일수 등 컨슈머가 집계하고 그룹화할 수 있는 열에만 사용해야 합니다.
컨슈머 분석 요청에 대한 검사를 수행하기 위해 “column_policy” 및 “join_policy”가 SQL Jinja 템플릿에서 모든 열 이름을 dimensions 또는 measure_columns 로 참조해야 합니다. 사용자 지정 SQL Jinja 템플릿에서 확인할 열을 참조할 때 이 태그를 사용합니다.
CALL samooha_by_snowflake_local_db.provider.set_column_policy($cleanroom_name, [
'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:status',
'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:age',
'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:region_code',
'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:days_active',
'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:income_bracket'
]);
클린룸에 추가된 열 정책을 보려면 다음 프로시저를 호출합니다.
CALL samooha_by_snowflake_local_db.provider.view_column_policy($cleanroom_name);
웹 앱을 사용한 클린룸 등록¶
이제 클린룸이 컨슈머와 공유되었으므로 사용자 지정 템플릿을 등록하여 웹 앱에서 컨슈머가 사용할 수 있도록 할 수 있습니다. 즉, 컨슈머는 개발자 APIs를 사용할 필요 없이 사용자 인터페이스를 통해 복잡한 머신 러닝 코드가 뒷받침하는 분석을 포함한 사용자 지정 분석을 실행할 수 있습니다.
컨슈머가 웹 앱에서 접속할 수 있도록 클린룸을 등록하는 과정은 3단계로 구성됩니다. 다음을 수행해야 합니다.
provider.add_ui_form_customizations 명령을 호출하여 템플릿이 웹 앱에 표시되는 방식을 정의합니다.
provider.register_cleanroom_in_ui 명령을 호출하여 템플릿을 등록합니다.
웹에 공급자로 로그인합니다.
템플릿에 대한 사용자 인터페이스 만들기¶
provider.add_ui_form_customizations 명령은 클린룸의 템플릿이 웹 앱에 표시되는 방식을 정의합니다. 사용자 인터페이스를 설계하는 데 사용할 수 있는 사용자 지정에 대한 자세한 설명은 공급자 API 참조의 클린룸 UI 등록 방법 섹션을 참조하십시오.
참고
warehouse_hints
사용자 지정을 사용하여 선택적으로 컨슈머 계정에서 분석을 실행하는 데 사용할 웨어하우스의 종류를 제어할 수 있습니다. 예를 들어, 대부분의 머신 러닝 사용 사례의 경우 Snowflake는 Snowpark 최적화된 웨어하우스를 지정하는 것을 권장합니다. warehouse_size
에 유효한 값은 CREATE WAREHOUSE를 참조하십시오.
이 예제에서는 다음 사용자 지정을 사용하여 provider.add_ui_form_customizations 명령을 실행합니다.
CALL samooha_by_snowflake_local_db.provider.add_ui_form_customizations(
$cleanroom_name,
'prod_custom_lookalike_template',
{
'display_name': 'Custom Lookalike Template',
'description': 'Use our customized ML techniques to find lookalike audiences.',
'methodology': 'Specify your own seed audience, while matching against our users. Then customize the lookalike model across number of boosting rounds and removing outliers.',
'warehouse_hints': {
'warehouse_size': 'medium',
'snowpark_optimized': TRUE
}
},
{
'num_boosting_rounds': {
'display_name': 'Number of Boosting Rounds',
'type': 'integer',
'default': 10,
'order': 7,
'description': 'How many rounds of boosting should the model do?',
'size': 'M',
'group': 'Training & Inference Configuration'
},
'trim_extremes': {
'display_name': 'Trim Extremes',
'type': 'boolean',
'default': False,
'order': 8,
'description': 'Remove outliers by default?',
'size': 'M',
'group': 'Training & Inference Configuration'
},
'lookalike_train_function': {
'display_name': 'Training Function',
'choices': ['lookalike_train'],
'type': 'dropdown',
'order': 9,
'description': 'Which function do you want to use for training?',
'size': 'M',
'group': 'Training & Inference Configuration'
},
'lookalike_score_function': {
'display_name': 'Scoring Function',
'choices': ['lookalike_score'],
'type': 'dropdown',
'order': 10,
'description': 'Which function do you want to use for scoring?',
'size': 'M',
'group': 'Training & Inference Configuration'
},
'provider_join_col': {
'display_name': 'Provider Join Column',
'choices': ['p.HASHED_EMAIL'],
'type': 'dropdown',
'order': 4,
'description': 'Select the provider column to join users on.',
'infoMessage': 'We recommend using HASHED_EMAIL.',
'size': 'M',
'group': 'Enable Provider Features'
},
'consumer_join_col': {
'display_name': 'Consumer Join Column',
'description': 'Specify column in your table that matches the providers (i.e. HASHED_EMAIL).',
'size': 'M',
'default': 'HASHED_EMAIL',
'infoMessage': 'We recommend using HASHED_EMAIL.',
'order': 5,
'group': 'Enable Provider Features'
},
'dimensions': {
'display_name': 'Feature Selection',
'choices': ['p.STATUS', 'p.AGE', 'p.REGION_CODE', 'p.DAYS_ACTIVE'],
'type': 'multiselect',
'order': 6,
'description': 'What features do you want to train on?',
'infoMessage': 'We recommend selecting all features for maximum signal.',
'size': 'M',
'group': 'Enable Provider Features'
},
'filter_column': {
'display_name': 'Filter Column',
'type': 'any',
'order': 1,
'description': 'Specify column in your table to filter for high value users (i.e. SALES_DLR)',
'size': 'S',
'default': 'SALES_DLR',
'infoMessage': 'We recommend you input SALES_DLR over here.',
'group': 'Seed Audience Selection'
},
'operator': {
'display_name': 'Operator',
'choices': ['>=', '=', '<='],
'type': 'dropdown',
'order': 2,
'description': 'What is the operator your want to use for the filter?',
'size': 'S',
'group': 'Seed Audience Selection'
},
'filter_value': {
'display_name': 'Filter Value',
'order': 3,
'description': 'What value do you want to filter to?',
'default': 2000,
'size': 'S',
'group': 'Seed Audience Selection'
}
}, {
'measure_columns': ['seed_audience_size', 'audience_size', 'num_lookalikes_found', 'error'],
'default_output_type': 'BAR'
});
템플릿 등록¶
웹 앱에서 템플릿의 모양을 정의한 후 provider.register_cleanroom_in_ui 명령을 실행하여 템플릿을 등록하여 컨슈머의 클린룸 환경에서 사용할 수 있도록 합니다.
provider.register_cleanroom_in_ui 명령은 다음 인자를 받습니다.
클린룸의 이름입니다.
템플릿의 이름입니다.
클린룸을 공유하고 있는 컨슈머 계정입니다.
컨슈머의 클린룸 환경에 있는 웹 앱 사용자의 이메일 주소입니다. Snowflake는 확인 목적으로 이 이메일 주소를 사용합니다.
참고
provider.register_cleanroom_in_ui 명령은 provider.add_consumers 및 provider.create_cleanroom_listing 명령과 달리 컨슈머 계정의 전체 계정 식별자가 필요하며 LOCATOR.REGION.CLOUD
형식으로 지정해야 합니다. 이 계정 식별자를 찾는 방법에 대한 자세한 내용은 계정 로케이터를 식별자로 사용하기를 참조하십시오.
몇 가지 예는 다음과 같습니다.
ABC01234.us-west-2.aws
XYZ01234.us-east-1.aws
MNO01234.west-us-2.azure
이 예제에서 생성한 prod_custom_lookalike_template
템플릿을 등록하려면 다음 명령어를 실행합니다.
CALL samooha_by_snowflake_local_db.provider.register_cleanroom_in_ui($cleanroom_name, 'prod_custom_lookalike_template', '<CONSUMER_ACCOUNT_IDENTIFIER>', '<CONSUMER_USER_EMAIL>');
이전 등록 요청을 검토하려면 다음 명령을 실행합니다.
CALL samooha_by_snowflake_local_db.provider.view_ui_registration_request_log();
웹 앱에 로그인합니다.¶
provider.register_cleanroom_in_ui 명령을 실행한 후 공급자는 웹 앱에 로그인하여 등록 프로세스를 완료해야 합니다. 공급자로 웹 앱에 로그인할 때까지 요청은 “PENDING” 상태로 유지됩니다. 웹 앱에 로그인하려면 Snowflake Data Clean Room: 웹 앱을 참조하십시오.
도우미 메서드¶
여러 개의 컨슈머 계정 로케이터를 provider.add_consumers 함수에 쉼표로 구분된 문자열로 전달하거나 provider.add_consumers 에 대한 별도의 호출로 전달할 수 있습니다.
이 클린룸에 추가된 컨슈머를 보려면 다음 프로시저를 호출합니다.
CALL samooha_by_snowflake_local_db.provider.view_consumers($cleanroom_name);
최근에 생성된 클린룸을 보려면 다음 절차를 따릅니다.
CALL samooha_by_snowflake_local_db.provider.view_cleanrooms();
자신이 만든 클린룸에 대해 더 자세히 알아보려면 다음 절차를 따릅니다.
CALL samooha_by_snowflake_local_db.provider.describe_cleanroom($cleanroom_name);
생성된 클린룸도 삭제할 수 있습니다. 다음 명령은 클린룸을 완전히 삭제하므로 이전에 클린룸을 사용할 수 있었던 모든 컨슈머는 더 이상 클린룸을 사용할 수 없습니다. 나중에 이름이 동일한 클린룸이 필요한 경우 위의 흐름을 사용하여 다시 초기화해야 합니다.
CALL samooha_by_snowflake_local_db.provider.drop_cleanroom($cleanroom_name);
컨슈머 흐름¶
공급자로서 방금 만든 클린룸은 이제 컨슈머의 클린룸 환경 내 웹 앱에서 사용할 수 있습니다.
참고
공급자 계정에서 UI 양식을 계속 수정할 수 있으며, 컨슈머의 클린룸 환경 변화를 실시간으로 확인할 수 있습니다.
웹 앱에서 컨슈머 계정에 액세스¶
클린룸에 컨슈머로 로그인하려면:
Snowflake Data Clean Room 웹 앱에 로그인합니다. 자세한 내용은 Snowflake Data Clean Room: 웹 앱을 참조하십시오.
이메일 주소를 입력하고 계속을 선택합니다.
비밀번호를 입력합니다.
컨슈머 계정과 연결된 Snowflake 계정을 선택합니다.
클린룸 설치¶
클린룸 페이지에서 방금 만든 클린룸에 해당하는 타일을 찾아 설치를 선택합니다. 타일은 다음과 같을 수 있습니다.
분석 실행¶
클린룸에서 분석을 실행하려면:
분석 및 쿼리 페이지에서 새 분석 및 쿼리를 선택합니다.
생성한 사용자 지정 Lookalike 템플릿에 해당하는 타일을 선택한 후 다음을 선택합니다.
클린룸을 선택한 후 다음을 선택합니다.
클린룸을 위해 만든 맞춤형 양식을 작성합니다.