使用预训练的 TensorFlow 模型嵌入文本

本教程介绍如何使用预训练的 TensorFlow 模型在 BigQuery 中生成 NNLM、SWIVEL 和 BERT 文本嵌入。文本嵌入是一段文本的密集矢量表示,如果两段文本在语义上是相似的,则它们的嵌入在嵌入向量空间中彼此接近。

NNLM、SWIVEL 和 BERT 模型

NNLM、SWIVEL 和 BERT 模型的大小、准确性、可扩缩性和费用各不相同。使用下表帮助您确定要使用的模型:

模型 模型大小 嵌入维度 使用场景 说明
NNLM <150MB 50 简短短语、新闻、推文、评价 神经网络语言模型
SWIVEL <150MB 20 简短短语、新闻、推文、评价 子矩阵矢量嵌入学习器
BERT ~200MB 768 简短短语、新闻、推文、评价、短段落 基于转换器的双向编码器表示法

在本教程中,NNLM 和 SWIVEL 模型是导入的 TensorFlow 模型,而 BERT 模型是 Vertex AI 上的远程模型

所需权限

  • 如需创建数据集,您需要拥有 bigquery.datasets.create Identity and Access Management (IAM) 权限。

  • 如需创建存储桶,您需要拥有 storage.buckets.create IAM 权限。

  • 如需将模型上传到 Cloud Storage,您需要拥有 storage.objects.createstorage.objects.get IAM 权限。

  • 如需创建连接资源,您需要以下 IAM 权限:

    • bigquery.connections.create
    • bigquery.connections.get
  • 如需将模型加载到 BigQuery ML 中,您需要以下 IAM 权限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 如需运行推断,您需要以下 IAM 权限:

    • 对象表的 bigquery.tables.getData 权限
    • 模型的 bigquery.models.getData 权限
    • bigquery.jobs.create

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • BigQuery:您在 BigQuery 中运行的查询会产生费用。
  • BigQuery ML:您在 BigQuery ML 中创建模型和执行推断时会产生费用。
  • Cloud Storage:您需要为存储在 Cloud Storage 中的对象支付费用。
  • Vertex AI:如果按照生成 BERT 模型的说明执行操作,则将模型部署到端点会产生费用。

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

如需了解详情,请参阅以下资源:

须知事项

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 BigQuery, BigQuery Connection, and Vertex AI API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 BigQuery, BigQuery Connection, and Vertex AI API。

    启用 API

创建数据集

如需创建名为 tf_models_tutorial 的数据集以存储您创建的模型,请选择以下选项之一:

SQL

使用 CREATE SCHEMA 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
    

    PROJECT_ID 替换为您的项目 ID。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  2. 如需创建数据集,请运行 bq mk 命令

    bq mk --dataset --location=us PROJECT_ID:tf_models_tutorial
    

    PROJECT_ID 替换为您的项目 ID。

生成模型并将其上传到 Cloud Storage

如需详细了解如何使用预训练的 TensorFlow 模型生成文本嵌入,请参阅 Colab 笔记本。否则,请选择以下模型之一:

NNLM

  1. 使用 pip 安装 bigquery-ml-utils

    pip install bigquery-ml-utils
    
  2. 生成 NNLM 模型。以下 Python 代码从 TensorFlow Hub 加载了 NNLM 模型,并为其准备了 BigQuery:

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate an NNLM model.
    text_embedding_model_generator.generate_text_embedding_model('nnlm', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH 替换为本地文件夹的路径,您可以在其中临时存储模型。

  3. 可选:输出生成的模型的签名:

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 如需将生成的模型从本地文件夹复制到 Cloud Storage 存储桶,请使用 gsutil 工具

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/nnlm_model
    

    BUCKET_PATH 替换为要将模型复制到的 Cloud Storage 存储桶的名称。

SWIVEL

  1. 使用 pip 安装 bigquery-ml-utils

    pip install bigquery-ml-utils
    
  2. 生成 SWIVEL 模型。以下 Python 代码从 TensorFlow Hub 加载 SWIVEL 模型,并为其准备 BigQuery:

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate a SWIVEL model.
    text_embedding_model_generator.generate_text_embedding_model('swivel', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH 替换为本地文件夹的路径,您可以在其中临时存储模型。

  3. 可选:输出生成的模型的签名:

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 如需将生成的模型从本地文件夹复制到 Cloud Storage 存储桶,请使用 gsutil 工具

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/swivel_model
    

    BUCKET_PATH 替换为要将模型复制到的 Cloud Storage 存储桶的名称。

BERT

  1. 使用 pip 安装 bigquery-ml-utils

    pip install bigquery-ml-utils
    
  2. 生成 BERT 模型。以下 Python 代码从 TensorFlow Hub 加载 BERT 模型,并为其准备了 BigQuery:

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate a BERT model.
    text_embedding_model_generator.generate_text_embedding_model('bert', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH 替换为本地文件夹的路径,您可以在其中临时存储模型。

  3. 可选:输出生成的模型的签名:

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 如需将生成的模型从本地文件夹复制到 Cloud Storage 存储桶,请使用 gsutil 工具

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/bert_model
    

    BUCKET_PATH 替换为要将模型复制到的 Cloud Storage 存储桶的名称。

将模型加载到 BigQuery 中

选择以下模型之一:

NNLM

使用 CREATE MODEL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE OR REPLACE MODEL tf_models_tutorial.nnlm_model
    OPTIONS (
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/nnlm_model/*');
    

    BUCKET_NAME 替换为您之前创建的存储桶的名称。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

SWIVEL

使用 CREATE MODEL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE OR REPLACE MODEL tf_models_tutorial.swivel_model
    OPTIONS (
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/swivel_model/*');
    

    BUCKET_NAME 替换为您之前创建的存储桶的名称。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

BERT

如需将 BERT 模型加载到 BigQuery,请将 BERT 模型导入 Vertex AI,将模型部署到 Vertex AI 端点,创建连接,然后在 BigQuery 中创建远程模型。

如需将 BERT 模型导入 Vertex AI,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,进入 Vertex AI Model Registry 页面。

    进入 Model Registry

  2. 点击导入,然后执行以下操作:

    • 对于名称,输入 BERT
    • 对于区域,选择与您的 Cloud Storage 存储桶的区域匹配的区域。
  3. 点击继续,然后执行以下操作:

    • 对于模型框架版本,选择 2.8
    • 对于模型工件位置,输入您存储模型文件的 Cloud Storage 存储桶的路径。例如 gs://BUCKET_PATH/bert_model
  4. 点击导入。导入完成后,您的模型将显示在 Model Registry 页面上。

如需将 BERT 模型部署到 Vertex AI 端点并将其连接到 BigQuery,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,进入 Vertex AI Model Registry 页面。

    进入 Model Registry

  2. 点击您的模型的名称。

  3. 点击部署和测试

  4. 点击部署到端点

  5. 对于端点名称,输入 bert_model_endpoint

  6. 点击继续

  7. 选择您的计算资源。

  8. 点击部署

  9. 创建 BigQuery Cloud 资源连接并向该连接的服务账号授予访问权限

如需根据 Vertex AI 端点创建远程模型,请使用 CREATE MODEL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE OR REPLACE MODEL tf_models_tutorial.bert_model
    INPUT(content STRING)
    OUTPUT(embedding ARRAY<FLOAT64>)
    REMOTE WITH CONNECTION `PROJECT_ID.CONNECTION_LOCATION.CONNECTION_ID`
    OPTIONS (
      ENDPOINT = "https://ENDPOINT_LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/ENDPOINT_LOCATION/endpoints/ENDPOINT_ID");
    

    请替换以下内容:

    • PROJECT_ID:项目 ID
    • CONNECTION_LOCATION:BigQuery 连接的位置
    • CONNECTION_ID:BigQuery 连接的 ID

      当您在 Google Cloud 控制台中查看连接详情时,它是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如 projects/myproject/locations/connection_location/connections/myconnection

    • ENDPOINT_LOCATION:Vertex AI 端点的位置。例如:“us-central1”。
    • ENDPOINT_ID:模型端点的 ID

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

生成文本嵌入

在本部分中,您将使用 ML.PREDICT() 推断函数从公共数据集 bigquery-public-data.imdb.reviews 生成 review 列的文本嵌入。该查询将表限制为 500 行,以减少处理的数据量。

NNLM

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.nnlm_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

结果类似于以下内容:

+-----------------------+----------------------------------------+
| embedding             | content                                |
+-----------------------+----------------------------------------+
|  0.08599445223808289  | Isabelle Huppert must be one of the... |
| -0.04862852394580841  |                                        |
| -0.017750458791851997 |                                        |
|  0.8658871650695801   |                                        |
| ...                   |                                        |
+-----------------------+----------------------------------------+

SWIVEL

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.swivel_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

结果类似于以下内容:

+----------------------+----------------------------------------+
| embedding            | content                                |
+----------------------+----------------------------------------+
|  2.5952553749084473  | Isabelle Huppert must be one of the... |
| -4.015787601470947   |                                        |
|  3.6275434494018555  |                                        |
| -6.045154333114624   |                                        |
| ...                  |                                        |
+----------------------+----------------------------------------+

BERT

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.bert_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

结果类似于以下内容:

+--------------+---------------------+----------------------------------------+
| embedding    | remote_model_status | content                                |
+--------------+---------------------+----------------------------------------+
| -0.694072425 | null                | Isabelle Huppert must be one of the... |
|  0.439208865 |                     |                                        |
|  0.99988997  |                     |                                        |
| -0.993487895 |                     |                                        |
| ...          |                     |                                        |
+--------------+---------------------+----------------------------------------+

清理

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。