
BigQueryãšå€§èŠæš¡èšèªã¢ãã«(LLM)ã®çµ±åã§å§ããããã¹ããšã³ã¹ãã£ã³ã°ãçšããSEOæ¹åã®äºäŸ
ãã®èšäºã¯ Ubie Engineering Advent Calendar 2023 ã® 19 æ¥ç®ã®èšäºã§ããæšæ¥ã¯Tatsuro Nakamuraã«ããã匷ãéçºããŒã ãäœãããã®ã³ãã課é¡ã®æœåºã»å¯èŠåã»å ±æã®ãã©ã¯ãã£ã¹ã ãã§ããã
åããŸããŠãUbie Product Platformã®ã°ããŒã¹ããŒã ã§ãšã³ãžãã¢ãããŠããç°å£ã§ãããå¥åº·ã空æ°ã®ããã«èªç¶ã«ãªãäžçããç®æããçç¶æ€çŽ¢ã«ããçºçããå蚺ãŸã§ã®ãµããŒããããµãŒãã¹çç¶æ€çŽ¢ãšã³ãžã³ããŠãâããæäŸããŠããŸãã
ååBigQueryãšãµãŒãã³ã³ãœãŒã«ã飿ºããLLMã䜿ã£ãŠããŒã¯ãŒãã®åé¡ã¿ã¹ã¯ãè¡ã£ãèšäºãæžããŸããã
ä»åã¯ç¶ããšããŠãåé¡ããçµæãå ã«çç¶æ€çŽ¢ãšã³ãžã³ããŠããŒããçæŽ»è ã®ããŒãºãæããã³ã³ãã³ããæäŸã§ããŠããã®ããã»ãã³ãã£ãã¯æ€çŽ¢ã®èãæ¹ã«æ²¿ã£ãåæãããã¹ããšã³ã¹ãã£ã³ã°ã掻çšããŠèªååããäºäŸã玹ä»ããŸãã
ML.GENERATE_TEXT_EMBEDDINGãšã¯
ML.GENERATE_TEXT_EMBEDDINGãå©çšãããšãSQLã ãã§BigQuery ããŒãã«ã«ä¿åãããŠããããã¹ããåã蟌ãããšãã§ããŸãã
ããã¹ã ãšã³ããã£ã³ã°ã䜿ããšæ¬¡ã®ã¿ã¹ã¯ãè¡ãããšãã§ããŸãã
ã»ãã³ãã£ãã¯æ€çŽ¢
æšå¥š
åé¡
ã¯ã©ã¹ã¿ãªã³ã°
å€ã倿€åº
ä»åã¯ç¹ã«ã»ãã³ãã£ãã¯æ€çŽ¢ã«çç®ããŠæŽ»çšããŠã¿ãŸããã
詳现ã«ã€ããŠã¯ãäžèšã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
ã»ãã³ãã£ãã¯æ€çŽ¢ãšã¯
ã»ãã³ãã£ãã¯æ€çŽ¢ãšã¯ãæ€çŽ¢æããæ€çŽ¢ãŠãŒã¶ãŒã®æå³ãç®çãæ€çŽ¢ãšã³ãžã³ãé©åã«çè§£ãããŠãŒã¶ãŒãæ±ãããã®ã«å³ããæ€çŽ¢çµæãæäŸããããã®æè¡ã®ããšã§ãã
ã»ãã³ãã£ãã¯æ€çŽ¢ã¯ãä»ããŠã§ãæ€çŽ¢ã®åºæ¬ãšããããéèŠãªèŠçŽ ã§ããæµå ¥ããŒã¯ãŒããšèªç€Ÿã³ã³ãã³ãã®é¡äŒŒåºŠãåæããããšã§ãèªè ã®ããŒãºã«åã£ãã³ã³ãã³ããæäŸãããã广çãªæ å ±çºä¿¡ãå¯èœãšãªããŸãã
ããã¹ããšã³ããã£ã³ã°ãšã¯ãããã¹ãã®é«æ¬¡ãã¯ãã«è¡šçŸã§ãã2 ã€ã®ããã¹ããæå³çã«é¡äŒŒããŠããå Žåãããããã®ãšã³ããã£ã³ã°ã¯ãšã³ããã£ã³ã° ãã¯ãã«ç©ºéå
ã§äºãã«è¿æ¥ããŠããŸããæµå
¥ããŒã¯ãŒããšèªç€Ÿã³ã³ãã³ãã®é¡äŒŒåºŠãæ¯èŒããããšã§ãæ€çŽ¢æå³ã«è¿ããããŒãžãèšç®ããããšãã§ããŸãã
èšç®ããæ€çŽ¢æå³ã«è¿ãããŒãžãšãå®éã«ããŒã¯ãŒããç²åŸããŠããããŒãžãæ¯èŒããããšã§ãããŒã¯ãŒããã³ã³ãã³ãã®éè€ãæ€ç¥ããããšãã§ããŸãã
SQLã§ã¢ãã«ãäœæãã
VertexAIã®ãªã¢ãŒãã¢ãã«ãäœæããŸããã¢ãã«ã®äœæãSQLã§è¡ãããšãã§ããŸããremote_service_typeã«ã¯CLOUD_AI_TEXT_EMBEDDING_MODEL_V1ãæå®ããŸãã
-- SQL
CREATE OR REPLACE MODEL `<your-project-id>.<your-dataset-id>.<your-model-id>`
REMOTE WITH CONNECTION `<your-project-id>.<your-location-id>.<your-connection-id>`
OPTIONS (REMOTE_SERVICE_TYPE = 'CLOUD_AI_TEXT_EMBEDDING_MODEL_V1');詳ãããªã¢ãŒãã¢ãã«ã®èšå®ã«ã€ããŠã¯ãäžèšã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ãŸãã¯å€§ããªã«ããŽãªã§ããŒã¯ãŒããåé¡ãã
ããã¯ååã®èšäºã®å
容ãšå€ãããããŸããããäºåã«ããŒã¯ãŒãã®ãªã¹ããããçšåºŠã®ã«ããŽãªã§åé¡ããŠãããŸãã
çç¶æ€çŽ¢ãšã³ãžã³ããŠããŒãã¯æ°ã«ãªãçç¶ããã£ãã調ã¹ãŠèŠããµãŒãã¹ãªã®ã§ç¹ã«çç¶ã«ã€ããŠæ°ã«ããŠããããªããŒã¯ãŒãããŸãäºåã«ãã£ã«ã¿ãªã³ã°ããŸãã
äºåã«åé¡ã§ãããã®ã¯åé¡ããŠãããã»ãããã³ã³ãã³ãã®é¡äŒŒåºŠèšç®ã®èšç®éãæžãã®ã§ããããã§ãã
CREATE TEMP FUNCTION
CreatePrompt(text STRING)
RETURNS STRING
LANGUAGE js AS r"""
return `
以äžã®textãintentã«åé¡ããªãããintentã®ã¿åºåããããšã
intent:
ç
æ°ã«ã€ããŠ
çç¶ã«ã€ããŠ
蚺æã«ã€ããŠ
æ€æ»ã«ã€ããŠ
æ²»çã«ã€ããŠ
è¬ã«ã€ããŠ
å¥åº·èšºæã«ã€ããŠ
æç¶ããæ¯æŽã«ã€ããŠ
å蚺ã«ã€ããŠ
ç
é¢ã«ã€ããŠ
ãã®ä»
åºåäŸ:
text: "垯ç¶ç±ç¹"
intent: ç
æ°ã«ã€ããŠ
text: "ãŠããŒ"
intent: ãã®ä»
text: "ãè
¹ãçã"
intent: çç¶ã«ã€ããŠ
text: ${text}
intent:
`.trim();
""";
CREATE OR REPLACE TABLE `<your-project-id>.<your-dataset-id>.searchdata_url_impression_with_intent`
SELECT
*
FROM
-- ãã®ã¢ãã«ã¯ `CLOUD_AI_LARGE_LANGUAGE_MODEL_V1` ãå©çšããŠãã ããã
ML.GENERATE_TEXT( MODEL `<your-project-id>.<your-dataset-id>.<your-model-id>`,
(
SELECT
CreatePrompt(query) AS prompt,
*,
FROM
`<your-project-id>.<your-dataset-id>.searchdata_site_impression`
QUALIFY
data_date = MAX(data_date) OVER() -- å
šä»¶ã ãšæµç³ã«å€ãããã®ã§ææ°ã®ããŒã¿ã䜿ã
),
STRUCT( 0.8 AS temperature,
100 AS max_output_tokens,
0.95 AS top_p,
40 AS top_k,
TRUE AS flatten_json_output ) )ããŒã¯ãŒããåã蟌ã
ML.GENERATE_TEXT_EMBEDDINGã䜿ã£ãŠããŒã¯ãŒãã®ãã¯ãã«ãåŸãŸãã
CREATE OR REPLACE TABLE `<your-project-id>.<your-dataset-id>.searchdata_url_impression_with_embedding` AS
SELECT
*
FROM
-- ãã®ã¢ãã«ã¯ `CLOUD_AI_TEXT_EMBEDDING_MODEL_V1` ãå©çšããŠãã ãã
ML.GENERATE_TEXT_EMBEDDING( MODEL `<your-project-id>.<your-dataset-id>.<your-model-id>`,
(
SELECT
*,
query AS content
FROM
`<your-project-id>.<your-dataset-id>.searchdata_url_impression_with_intent`
WHERE
ml_generate_text_llm_result LIKE "%çç¶ã«ã€ããŠ%" -- çç¶ã«é¢é£ããããŒã¯ãŒãã®ã¿
),
STRUCT(TRUE AS flatten_json_output))å®äºãããštext_embeddingã«ã©ã ã«ãã¯ãã«ãåŸãããšãã§ããŸãã

ããŒãžã³ã³ãã³ããåã蟌ã
Ubieã§ã¯åæç°å¢ã®BigQueryã«ããŒãžã³ã³ãã³ããã®ãã®ããã¡ã¿ããŒã¿ããšã¯ã¹ããŒãããŠããŸãããããBigQueryã«ããŒã¿ããªãå Žåã¯æåã§ã¢ããããŒãããããšãã§ããŸãã
BigQueryäžã«èªç€ŸããŒã¿ãéçŽããããšã§ããµãŒãã³ã³ãœãŒã«ã®ããŒã¿ã ãã§ã¯ã§ããªããèªç€ŸããŒã¿ãšæãåãããåæãè¡ãããšãã§ããŸãã
ããŒã¯ãŒããšåæ§ã«ããŒãžã³ã³ãã³ããåã蟌ã¿ãè¡ããŸãã
CREATE OR REPLACE TABLE `<your-project-id>.<your-dataset-id>.content_table_with_embedding` AS
SELECT
*
FROM
-- ãã®ã¢ãã«ã¯ `CLOUD_AI_TEXT_EMBEDDING_MODEL_V1` ãå©çšããŠãã ãã
ML.GENERATE_TEXT_EMBEDDING( MODEL `<your-project-id>.<your-dataset-id>.<your-model-id>`,
(
SELECT
*,
html AS content
FROM
`<your-project-id>.<your-dataset-id>.content_table`),
STRUCT(TRUE AS flatten_json_output))ããŒã¯ãŒããšããŒãžã³ã³ãã³ãã®é¡äŒŒåºŠãèšç®ãã
ããŒã¯ãŒããšããŒãžã³ã³ãã³ãã®ã³ãµã€ã³é¡äŒŒåºŠãèšç®ããããŒã¯ãŒãã«å¯ŸããŠãã£ãšãé¡äŒŒåºŠã®é«ãããŒãžã³ã³ãã³ããèšç®ããŸãã
ML.DISTANCE颿°ãå©çšããããšã§ç°¡åã«èšç®ããããšãã§ããŸãã
WITH
calc_ml_distance AS (
SELECT
a.content AS keyword,
a.url AS actual_url,
b.content AS similar_content,
b.url AS similar_url,
ML.DISTANCE(a.text_embedding, b.text_embedding, 'COSINE') AS distance,
FROM
`<your-project-id>.<your-dataset-id>.searchdata_url_impression_with_embedding` AS a,
`<your-project-id>.<your-dataset-id>.content_table_with_embedding` AS b
)
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY keyword ORDER BY distance) AS rank
FROM
calc_ml_distance
QUALIFY
rank = 1
åŸãããçµæãããšã«ãããçºç±ã®ããŒãžã«é¢ããŠæ·±æãããŠèŠãŠã¿ããšãçºç±ç³»ã®ããŒã¯ãŒããè€æ°ã®ããŒãžã«ãŸããã£ãŠããäºãããããŸããã
ãã®çµæãåèã«ãããŒã¯ãŒããã³ã³ãã³ãã®éè€ãçºèŠãããŠãŒã¶ãŒäœéšåäžã®ããã®èšäºåè³ªã®æ¹å掻åãè¡ã£ãŠããŸãã

ãŸãšã
BigQueryã䜿ã£ãããã¹ããšã³ã¹ãã£ã³ã°ã§SEOãæ¹åããäºäŸã玹ä»ããŸããã
ããã¹ããšã³ããã£ã³ã°ããã³ãµã€ã³é¡äŒŒåºŠã®æ¯èŒãæ©æ¢°åŠç¿ã¢ãã«ã®äœæãããããã¢ããªã±ãŒã·ã§ã³ã®æºåã¯äžèŠã§ãã
ã¢ã€ãã¢æ¬¡ç¬¬ã§ã»ãã³ãã£ãã¯æ€çޢ以å€ã«ããèšäºã®ã¬ã³ã¡ã³ããŒã·ã§ã³ãã¯ã©ã¹ã¿ãªã³ã°ãªã©ã«ã掻çšã§ãããã§ãã
ä»åã¯æµå
¥ããŒã¯ãŒããšèªç€Ÿã³ã³ãã³ãã®é¡äŒŒåºŠãèšç®ããŸããããããŒã¯ãŒãå士ãã³ã³ãã³ãåå£«ã®æ¯èŒã§ãã瀺åãåŸããããããããŸããã
èªç€ŸããŒã¿ãBigQueryã«éçŽããããšã§ãµãŒãã³ã³ãœãŒã«ã ãã§ã¯ã§ããªãã£ãåæãå¯èœã«ãªããŸãã
宣äŒ
ã°ããŒã¹ããŒã ã§ã¯ãGenerativeAIã®æŽ»çšãå«ãããå¥åº·ã空æ°ã®ããã«èªç¶ã«ãªãäžçããç®æããŠãäŒç»ãéçºãåæãªã©æ§ã
ãªæ¥åã«åãçµãã§ããŸãã
éçºæ¥åã ãã«ãšã©ãŸããããµãŒãã¹ã°ããŒã¹ã®ããã®ããããææŠã«èå³ãããæ¹ã¯ãã²ã話ããŸãããã
twitter / pitta ã§åéããŠããŸãã