メむンコンテンツぞスキップ
芋出し画像

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 で募集しおいたす。


     
     
    Ubie Product Platformのグロヌスチヌムで働いおいたす。 症状怜玢゚ンゞン「ナビヌ」(https://ubie.app/) ゜フトりェア゚ンゞニアだったり、マヌケタヌだったり

    あなたぞのおすすめ