调用 Gemini 模型

本文档介绍了如何使用 Vertex AI SDK for ABAP 调用 Gemini 模型,以针对文本和多模态输入生成回答。Gemini 模型可以接受多种输入模式,包括文本图片视频音频文档。 您可以将 Gemini 模型用于以下应用场景:

  • 总结自由形式的文本
  • 描述或解释媒体素材资源
  • 在多种语言之间翻译

使用生成模型构建以 AI 为中心的功能不需要任何机器学习 (ML) 专业知识。您无需收集大型数据集或训练模型。若要开始编写您的第一个程序,只需用几句话描述您希望模型执行的操作即可。Vertex AI SDK for ABAP 提供了 ABAP 类和方法来从 SAP 环境访问 Gemini 模型。首先,请查看这些代码示例

准备工作

在将 Vertex AI SDK for ABAP 与 Gemini 模型搭配使用之前,请确保您或您的管理员已满足以下前提条件:

向 Gemini 发送请求

本部分介绍了如何使用 Vertex AI SDK for ABAP 通过 Vertex AI API 向 Gemini 模型发送请求。

实例化多模态 Gemini 调用程序类

如需使用文本或多模态提示来调用 Gemini 文本和多模态模型,您可以使用 /GOOG/CL_GENERATIVE_MODEL 类。您可以通过传递在模型生成参数中配置的模型键来实例化该类。

DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

MODEL_KEY 替换为模型键名,该名称在模型生成参数中进行配置。

使用提示生成内容

如需通过向模型提供文本提示来生成内容,您可以使用 GENERATE_CONTENT 方法。

lo_model->generate_content( 'PROMPT' ).

PROMPT 替换为您的文本提示

向模型提供系统指令

如需将基于文本的系统指令传递给模型,您可以使用 SET_SYSTEM_INSTRUCTIONS 方法。

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

SYSTEM_INSTRUCTIONS 替换为您为模型提供的系统指令

添加安全设置

如需为模型添加安全设置以生成回答,您可以使用 ADD_SAFETY_SETTINGS 方法。此功能用于对模型实施安全准则,以屏蔽不安全的内容。

lo_model->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY'
                               iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
                               iv_harm_block_method    = 'HARM_BLOCK_METHOD' ).

替换以下内容:

在每次方法调用中,ADD_SAFETY_SETTINGS 方法都会将指定的安全设置添加到模型的输入中。

为模型设置生成配置

您可以在表 /GOOG/AI_CONFIG 中维护模型的生成配置。如需替换特定调用的生成配置,您可以使用 SET_GENERATION_CONFIG 方法。如果设置了生成属性的导入参数,则传递的参数值将生效。

lo_model->set_generation_config( iv_response_mime_type = 'RESPONSE_MIME_TYPE'
                                 iv_temperature        = 'TEMPERATURE'
                                 iv_top_p              = 'TOP_P'
                                 iv_top_k              = 'TOP_K'
                                 iv_candidate_count    = 'CANDIDATE_COUNT'
                                 iv_max_output_tokens  = 'MAX_OUTPUT_TOKENS'
                                 iv_presence_penalty   = 'PRESENCE_PENALTY'
                                 iv_frequency_penalty  = 'FREQUENCY_PENALTY' ).

替换以下内容:

  • RESPONSE_MIME_TYPE:模型的回答 MIME 类型。
  • TEMPERATURE:随机性温度。
  • TOP_P:Top-P 采样。
  • TOP_K:Top-K 采样。
  • CANDIDATE_COUNT:要生成的候选项数量。
  • MAX_OUTPUT_TOKENS:每条消息的输出 token 数上限
  • PRESENCE_PENALTY:正例惩罚。
  • FREQUENCY_PENALTY:频次惩罚。

如需详细了解这些参数,请参阅配置模型生成参数

将多模态输入传递给模型

您可以使用多模态输入调用 Gemini 模型,这些输入可以是文本图片视频文档或它们的组合。您可以按原始数据格式传递输入,也可以通过提供文件对象的 Cloud Storage URI 来传递输入。

设置原始数据

如需提供文件的原始数据及其 MIME 类型作为模型的输入,您可以使用 SET_INLINE_DATA 方法。对于视频输入,若要仅考虑视频的特定部分,您可以分别使用可选导入参数 IV_VIDEO_START_OFFSETIV_VIDEO_END_OFFSET 设置开始时间和结束时间。

lo_model->set_inline_data( iv_mime_type = 'MIME_TYPE'
                           iv_data      = 'RAW_DATA' ).

替换以下内容:

  • MIME_TYPE:原始数据的 IANA 标准 MIME 类型。默认情况下,MIME 类型设置为 application/pdf
  • RAW_DATA:要在提示中内嵌包含的图片、PDF 或视频的 base64 编码原始数据。

如需使用 /GOOG/CL_GENERATIVE_MODEL 类的相同实例从模型输入中清除文件的原始数据,您可以使用 CLEAR_INLINE_DATA 方法。

lo_model->clear_inline_data( ).

设置 Cloud Storage 中的对象

如需提供 Cloud Storage 存储桶中存储的文件对象的 URI 及其 MIME 类型作为模型的输入,您可以使用 SET_FILE_DATA 方法。对于视频输入,若要仅考虑视频的特定部分,您可以分别使用可选导入参数 IV_VIDEO_START_OFFSETIV_VIDEO_END_OFFSET 设置开始时间和结束时间。

lo_model->set_file_data( iv_mime_type = 'MIME_TYPE'
                         iv_file_uri  = 'FILE_URI' ).

替换以下内容:

  • MIME_TYPE:文件数据的 IANA 标准 MIME 类型。默认情况下,MIME 类型设置为 application/pdf
  • FILE_URI:Cloud Storage 存储桶中存储的文件的 URI。

如果您想将 Cloud Storage 存储桶中的所有文件作为输入传递给模型,请使用 SET_FILES_FROM_GCS 方法指定目标 Cloud Storage 存储桶名称。

lo_model->set_files_from_gcs( iv_storage_bucket_name = 'STORAGE_BUCKET_NAME').

STORAGE_BUCKET_NAME 替换为包含文件的 Cloud Storage 存储桶的名称。

如果您有单独的客户端密钥用于通过 ABAP SDK for Google Cloud 调用 Cloud Storage API,请在导入参数 IV_KEY_NAME 中传递客户端密钥名称。

如需使用 /GOOG/CL_GENERATIVE_MODEL 类的同一实例从模型输入中清除通过 Cloud Storage URI 设置的对象,您可以使用 CLEAR_FILE_DATA 方法。

lo_model->clear_file_data( ).

设置回答 MIME 类型

如需设置模型在回答时使用的 MIME 类型,您可以使用 SET_RESPONSE_MIME_TYPE 方法。 如果未设置,则模型默认采用 text/plain 作为回答 MIME 类型。

lo_model->set_response_mime_type( iv_mime_type = 'RESPONSE_MIME_TYPE' ).

RESPONSE_MIME_TYPE 替换为生成内容的回答 MIME 类型

计算文本提示中的 token 数

如需在使用提示调用模型之前统计文本提示中的 token 数,您可以使用 COUNT_TOKENS 方法。

DATA(lv_total_tokens) = lo_model->count_tokens( iv_prompt_text         = 'PROMPT'
                                                iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
                               )->get_total_tokens( ).

DATA(lv_total_billable_characters) = lo_model->count_tokens(
                                                 iv_prompt_text         = 'PROMPT'
                                                 iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
                                            )->get_total_billable_characters( ).

替换以下内容:

  • PROMPT:您的文本提示
  • SYSTEM_INSTRUCTIONS:您向模型发出的系统指令

接收 Gemini 的回答

为了从模型接收经过处理的回答,并以有意义的方式向 ABAP 开发者呈现这些回答,SDK 提供了类 /GOOG/CL_MODEL_RESPONSE

通过 /GOOG/CL_MODEL_RESPONSE 类捕获的回答会链接到通过 /GOOG/CL_GENERATIVE_MODEL 类的方法发出的请求,以便您可以在单个语句中直接访问回答,而无需使用变量来存储中间结果。

获取文本回答

如需从模型接收文本回答,您可以使用 GET_TEXT 方法。

DATA(lv_response_text) = lo_model->generate_content( 'PROMPT'
                                )->get_text( ).

PROMPT 替换为您的文本提示

获取安全性评分

如需接收模型回答安全性的评分列表,您可以使用 GET_SAFETY_RATING 方法。

DATA(lt_safety_ratings) = lo_model->generate_content( 'PROMPT'
                                 )->get_safety_rating( ).

PROMPT 替换为您的文本提示

获取请求提示中的 token 数量

如需接收模型的输入提示中的 token 数量,您可以使用 GET_PROMPT_TOKEN_COUNT 方法。

DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
                                     )->get_prompt_token_count( ).

PROMPT 替换为您的文本提示

获取模型回答中的 token 数量

如需接收模型回答中的 token 数量,您可以使用 GET_CANDIDATES_TOKEN_COUNT 方法。

DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
                                         )->get_candidates_token_count( ).

PROMPT 替换为您的文本提示

获取阻止原因

如需接收模型阻止生成回答的原因,您可以使用 GET_BLOCK_REASON 方法。

DATA(lv_block_reason) = lo_model->generate_content( 'PROMPT'
                               )->get_block_reason( ).

PROMPT 替换为您的文本提示

获取阻止原因消息

如需接收阻止模型生成回答的原因消息并且这些消息可读性强,您可以使用 GET_BLOCK_REASON_MESSAGE 方法。

DATA(lv_block_reason_message) = lo_model->generate_content( 'PROMPT'
                                       )->get_block_reason_message( ).

PROMPT 替换为您的文本提示

代码示例

以下代码示例演示了如何调用 Gemini 模型以针对不同类型的输入生成回答。

基于文本的生成

以下代码示例展示了如何根据文本提示以及系统指令生成回答。系统指令是可选的,可以与提示一起传递,以指示模型以特定方式运行。

代码示例

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                               )->generate_content( lv_prompt
                               )->get_text( ).
    IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).

    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

替换以下内容:

多模态生成

以下代码示例展示了如何根据多模态输入(例如文本和图片)生成回答。您可以提及 Cloud Storage URI 或图片、视频或文档的原始文件数据,以及文本提示。系统指令是可选的,可以与提示一起传递,以指示模型以特定方式运行。

代码示例

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                               )->set_file_data( iv_mime_type = 'MIME_TYPE'
                                                 iv_file_uri  = 'FILE_URI'
                               )->set_inline_data( iv_mime_type = 'MIME_TYPE'
                                                   iv_data      = 'INLINE_DATA'
                               )->generate_content( lv_prompt
                               )->get_text( ).
    IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).

    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

替换以下内容:

  • MODEL_KEY:模型键名,可在模型生成参数中配置。
  • PROMPT:您的文本提示
  • SYSTEM_INSTRUCTIONS:您向模型发出的系统指令
  • MIME_TYPE:文件数据的 IANA 标准 MIME 类型。默认情况下,MIME 类型设置为 application/pdf
  • FILE_URI:Cloud Storage 存储桶中存储的文件的 URI。
  • INLINE_DATA:要在提示中内嵌包含的图片、PDF 或视频的 base64 编码原始数据。

为模型添加安全设置

以下代码示例展示了如何为模型添加安全设置以生成回答。

代码示例

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                               )->set_file_data( iv_mime_type = 'MIME_TYPE'
                                                 iv_file_uri  = 'FILE_URI'
                               )->set_inline_data( iv_mime_type = 'MIME_TYPE'
                                                   iv_data      = 'INLINE_DATA'
                               )->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY'
                                                       iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
                                                       iv_harm_block_method    = 'HARM_BLOCK_METHOD'
                               )->generate_content( lv_prompt
                               )->get_text( ).
    IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).

    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

替换以下内容:

  • MODEL_KEY:模型键名,可在模型生成参数中配置。
  • PROMPT:您的文本提示
  • SYSTEM_INSTRUCTIONS:您向模型发出的系统指令
  • MIME_TYPE:文件数据的 IANA 标准 MIME 类型。默认情况下,MIME 类型设置为 application/pdf
  • FILE_URI:Cloud Storage 存储桶中存储的文件的 URI。
  • INLINE_DATA:要在提示中内嵌包含的图片、PDF 或视频的 base64 编码原始数据。
  • HARM_CATEGORY:您要应用的危害类别
  • HARM_BLOCK_THRESHOLD:您要应用的基于概率的阈值级别
  • HARM_BLOCK_METHOD:您要应用的有害内容屏蔽方法

查找提示中的 token 数和计费字符数

在使用提示调用模型之前,您可能需要检查提示中的 token 数量以及 token 中存在多少可计费字符,以便规划 Google Cloud 项目结算。以下代码示例展示了如何查找这些数量并评估类似模型调用的结算情况。

代码示例

DATA:
  lv_prompt      TYPE string.

lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_total_tokens) = lo_model->count_tokens( lv_prompt
                                   )->get_total_tokens( ).

    DATA(lv_total_billable_characters) = lo_model->count_tokens( lv_prompt
                                                )->get_total_billable_characters( ).
    IF lv_total_tokens IS NOT INITIAL.
      cl_demo_output=>display( 'Total Tokens -' && lv_total_tokens ).

    ENDIF.

    IF lv_total_billable_characters IS NOT INITIAL.
      cl_demo_output=>display( 'Total Billable Characters -' && lv_total_billable_characters ).

    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

替换以下内容:

后续步骤