ML.GENERATE_TEXT 函数

本文档介绍了 ML.GENERATE_TEXT 函数,该函数允许您对 BigQuery 表中存储的文本执行生成自然语言任务。语言任务示例包括:

  • 分类
  • 情感分析
  • 实体提取
  • 抽样问答
  • 摘要
  • 以其他风格重写文本
  • 生成广告文案
  • 概念构思

该函数的工作原理是向表示 Vertex AI text-bison* 自然语言基础模型 (LLM) 之一的 BigQuery ML 远程模型发送请求,然后返回 LLM 的响应。函数的几个参数都提供了影响 LLM 响应的参数

prompt 参数提供模型要分析的文本。提示设计会对 LLM 返回的响应产生很大影响。如需了解详情,请参阅设计文本提示

语法

ML.GENERATE_TEXT(
MODEL `project_id.dataset.model`,
{ TABLE `project_id.dataset.table` | (query_statement) },
STRUCT(
  [number_of_output_tokens AS max_output_tokens]
  [, top_k_value AS top_k]
  [, top_p_value AS top_p]
  [, temperature AS temperature]
  [, flatten_json_output AS flatten_json_output])
)

参数

ML.GENERATE_TEXT 接受以下参数:

  • project_id:您的项目 ID。

  • dataset:包含模型的 BigQuery 数据集。

  • model:使用其中一个 text-bison* Vertex AI LLM 的远程模型的名称。如需详细了解如何创建此类远程模型,请参阅 ENDPOINT

  • table:包含提示数据的 BigQuery 表的名称。会将名为 prompt 的列中的文本发送到模型。如果您的表没有 prompt 列,请对此参数使用 SELECT 语句,以提供现有表列的别名。如果没有 prompt 列可用,则会发生错误。

  • query_statement:用于生成提示数据的 GoogleSQL 查询。

  • max_output_tokens[1,1024] 范围内的一个 INT64 值,用于设置模型输出的词法单元数量上限。指定较低的值可获得较短的响应,指定较高的值可获得较长的响应。默认值为 50

    词元可能小于一个单词,大约为 4 个字符。100 个词元对应大约 60-80 个单词。

  • temperature[0.0,1.0] 范围内的一个 FLOAT64 值,用于在生成响应期间进行采样(在应用 top_ktop_p 时发生)。温度控制词元选择的随机程度。较低的 temperature 值有利于需要更具确定性、更少开放性或创造性响应的提示,而较高的 temperature 值可能会导致更具多样性或创造性的结果。temperature0 表示确定,即始终选择概率最高的响应。默认值为 1.0

  • top_k[1,40] 范围内的一个 INT64 值,用于更改模型为输出选择词元的方式。指定较低的值可获得随机程度较低的响应,指定较高的值可获得随机程度较高的响应。默认值为 40

    top_k 值为 1 表示下一个选定词元是模型词汇表的所有词元中概率最高的词元,而 top_k3 表示将使用 temperature 值从 3 个概率最高的词元中选择下一个词元。

    在每个词元选择步骤中,系统都会对概率最高的 top_k 个词元进行采样。然后,系统会根据 top_p 进一步过滤词元,并使用温度采样选择最终的词元。

  • top_p[0.0,1.0] 范围内的一个 FLOAT64 值,用于更改模型为输出选择词元的方式。指定较低的值可获得随机程度较低的响应,指定较高的值可获得随机程度较高的响应。默认值为 1.0

    系统会按照概率从最高(基于 top_k 值)到最低的顺序选择词元,直到所选词元的概率总和等于 top_p 值。例如,如果词元 A、B 和 C 的概率分别是 0.30.20.1,并且 top_p 值为 0.5,则模型使用 temperature 值选择 A 或 B 作为下一个词元,而不考虑 C。

  • flatten_json_outputBOOL 值,用于确定函数返回的 JSON 内容是否被解析为单独的列。默认值为 FALSE

输出

ML.GENERATE_TEXT 返回输入表以及以下列:

  • ml_generate_text_result:对模型的 projects.locations.endpoints.predict 调用返回的 JSON 响应。生成的文本位于 content 元素中。安全属性位于 safetyAttributes 元素中。当 flatten_json_outputFALSE 时,将返回此列。
  • ml_generate_text_llm_resultSTRING 值,包含对模型的 projects.locations.endpoints.predict 调用返回的生成文本。当 flatten_json_outputTRUE 时,将返回此列。
  • ml_generate_text_rai_resultSTRING 值,包含对模型的 projects.locations.endpoints.predict 调用返回的安全属性。当 flatten_json_outputTRUE 时,将返回此列。
  • ml_generate_text_statusSTRING 值,包含相应行的 API 响应状态。如果操作成功,则此值为空。

位置

ML.GENERATE_TEXT 必须在函数引用的远程模型所在的区域中运行。您只能在以下位置创建基于 text-bison* 模型的远程模型:

  • asia-northeast3
  • asia-southeast1
  • eu
  • europe-west1
  • europe-west2
  • europe-west3
  • europe-west4
  • europe-west9
  • us
  • us-central1
  • us-west4

配额

请参阅 Cloud AI 服务表值函数配额和限制

示例

示例 1

此示例显示了一个具有以下特征的请求:

  • 提供单个提示。
  • 返回较长的生成文本响应。
  • 返回概率较低的生成文本响应。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (SELECT 'What is the purpose of dreams?' AS prompt),
    STRUCT(
      0.8 AS temperature,
      1024 AS max_output_tokens,
      0.95 AS top_p,
      40 AS top_k));

示例 2

此示例显示了一个具有以下特征的请求:

  • 提供名为 prompt 的表列中的提示数据。
  • 返回较短的生成文本响应。
  • 返回概率较高的生成文本响应。
  • 将 JSON 响应展平为单独的列。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL
      `mydataset.llm_model`
        TABLE `mydataset.prompt_table`,
    STRUCT(
      0.2 AS temperature, 75 AS max_output_tokens, 0.3 AS top_p, 15 AS top_k, TRUE AS flatten_json_output));

示例 3

此示例显示了一个具有以下特征的请求:

  • 提供名为 question、别名为 prompt 的表列的提示数据。
  • 返回中等长度的生成文本响应。
  • 返回概率中等的生成文本响应。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (SELECT question AS prompt FROM `mydataset.prompt_table`),
    STRUCT(
      0.4 AS temperature, 750 AS max_output_tokens, 0.5 AS top_p, 30 AS top_k));

示例 4

此示例显示了一个具有以下特征的请求:

  • 连接字符串和表列以提供提示数据。
  • 返回较长的生成文本响应。
  • 返回概率较高的生成文本响应。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (
      SELECT
        CONCAT(
          'Classify the sentiment of the following text as positive or negative.Text:',
          input_column,
          'Sentiment:') AS prompt
      FROM `mydataset.input_table`
    ),
    STRUCT(
      0.1 AS temperature,
      1000 AS max_output_tokens,
      0.1 AS top_p,
      10 AS top_k));

后续步骤