调用 Anthropic Claude 模型

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

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

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

准备工作

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

向 Claude 发送请求

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

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

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

DATA(lo_model) = NEW /goog/cl_model_claude( 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 替换为您为模型提供的系统指令

为模型设置生成配置

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

lo_model->set_generation_config(
                                iv_temperature        = 'TEMPERATURE'
                                iv_top_p              = 'TOP_P'
                                iv_top_k              = 'TOP_K'
                                iv_max_output_tokens  = 'MAX_OUTPUT_TOKENS' ).

替换以下内容:

  • TEMPERATURE:随机性温度。
  • TOP_P:Top-P 采样。
  • TOP_K:Top-K 采样。
  • MAX_OUTPUT_TOKENS:每条消息的输出 token 数上限

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

将多模态输入传递给模型

您可以使用多模态输入调用 Gemini 模型,这些输入可以是文本图片文档。您可以将图片和 PDF 的输入内容作为原始数据传递。对于 PDF,如果 PDF 可公开访问,您还可以提供 URI。

下表列出了支持的 MIME 类型:

媒体类型 支持的 MIME 类型
图片
  • image/jpeg
  • image/png
  • image/gif
  • image/webp
文档
  • application/pdf

设置原始数据

如需提供文件的原始数据及其 MIME 类型作为模型的输入,您可以使用 SET_INLINE_DATA 方法:

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

替换以下内容:

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

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

lo_model->clear_inline_data( ).

计算文本提示中的 token 数

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

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

替换以下内容:

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

添加停止序列

stop_sequence 是一组字符串,用于指示 Claude 在其回答中遇到其中任何字符串时停止生成内容。从本质上讲,它是一条命令,告诉 Claude:“如果你生成了这个序列,请立即停止生成!”

以下代码示例不包含 stop_sequence

lv_prompt = 'Generate a JSON object representing a person with a name, email, and phone number'.

lv_response = lo_model->generate_content( lv_prompt )->get_text( ).

此代码示例会返回以下响应:

{
  "name": "Dana A",
  "email": "dana@example.com",
  "phoneNumber": "800-555-0199"
}

以下代码示例包含一个 stop_sequence

DATA: lt_stop_sequences TYPE TABLE OF STRING.

lv_prompt = 'Generate a JSON object representing a person with a name, email, and phone number'.

APPEND '}' to lt_stop_sequences.

lv_response = lo_model->set_stop_sequence( lt_stop_sequences
                )->generate_content( lv_prompt
                )->get_text( ).

此代码示例会返回以下响应:

以下是一个 JSON 对象,表示具有姓名、邮箱和手机号码的人员:

{
  "name": "Dana A",
  "email": "dana@example.com",
  "phoneNumber": "800-555-0199"

请注意,输出不包含 } 停止序列。如需将其解析为 JSON,您需要添加结束 }

当 Claude 模型提供回答时,其 stop_reason 属性会指明模型停止生成文本的原因。

如需获取停止原因,您可以使用以下代码示例:

lv_stop_reason = lo_model->set_stop_sequence( lt_stop_sequences
                )->generate_content( lv_prompt
                )->get_stop_reason( ).

添加示例

少样本提示是一种有效的策略,您可以通过向模型提供少量示例来引导其输出。您可以使用对话记录向 Claude 提供这些示例,从而实现此目的。

例如,若要使用 Claude 分析推文情感,您可以先提出以下问题:“分析这条推文中的情感:”,然后观察生成的输出结果。

lv_prompt = 'The Burger was delicious and my taste buds were on fire, too yummy!'
lv_system_instruction = 'Please do the sentiment analysis of the review'.
lv_response = lo_model->set_system_instructions( lv_system_instructions
                     )->generate_text( lv_prompt
                     )->get_text( ).

输出:

# Sentiment Analysis

This tweet expresses a strongly positive sentiment:

- Words like "delicious" and "yummy" directly convey enjoyment
- The phrase "taste buds were on fire" is used positively to indicate intense flavor enjoyment
- The exclamation mark adds enthusiasm
- "too yummy" emphasizes the exceptional quality

Overall, this is a very positive tweet expressing high satisfaction with the burger.

虽然全面的回答很有价值,但对于大量推文的自动情感分析而言,Claude 提供的更简洁的输出更可取。您可以将 Claude 的回答标准化为单个字词(例如“肯定”“中性”“否定”)或数值(例如 1、0、-1)。

lv_prompt = 'The Burger was delicious and my taste buds were on fire, too yummy!'.
lv_response = lo_model->add_examples( iv_input = |Unpopular opinion: Pickles are disgusting. Don't hate me|
        iv_output = |NEGATIVE|
        )->add_examples( iv_input = |I think my love for burgers might be getting out of hand. I just bought a burger sticker for my crocs|
        iv_output =  |POSITIVE|
        )->add_examples( iv_input = |Seriously why would anyone ever eat a brugers?  Those things are unhealthy!|
        iv_output =  |NEGATIVE|
        )->generate_content( lv_prompt
        )->get_text( ).

输出:

POSITIVE

设置助理文本

另一种获得非常具体输出的常见策略是“让 Claude 说出您想说的话”。除了仅向 Claude 提供 user 消息之外,您还可以提供 assistant 消息,供 Claude 在生成输出时使用。

如果您提供 assistant 消息,Claude 会从最后一个 assistant 令牌继续对话。请注意,您需要先发送 user 消息。

  lv_prompt = 'The fourth nearest planet to sun is: A) Mercury B) Venus C) Mars D ) Andromeda'.
 lv_assistant_text = 'The answer is:'.
    lv_response = lo_model->set_assistant_text( lv_instruction
                                       )->generate_content( lv_prompt
                                       )->get_text( ).

此代码段会显示以下输出:C) Mars

设置 Anthropic 版本

您可以设置参数 anthropic_version。默认情况下,此参数的设置值为 vertex-2023-10-16。如果您想访问任何其他受支持的 Anthropic 版本,才需要更改其值。

如果您需要更改 Anthropic 版本,可以使用 SET_ANTHROPIC_VERSION 方法:

lo_model->set_anthropic_version( 'ANTHROPIC_VERSION' ).

ANTHROPIC_VERSION 替换为要使用的 Anthropic 版本。如需了解详情,请参阅 Anthropic 文档

接收 Claude 的回答

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

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

获取文本回答

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

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

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 替换为您的文本提示

获取总 token 数(请求和回答)

如需确定包含请求和回答的 token 总数,您可以使用 GET_TOTAL_TOKEN_COUNT 方法:

DATA(lv_stop_reason) = lo_model->generate_content( 'PROMPT'
                              )->get_total_token_count( ).

PROMPT 替换为您的文本提示

获取停止原因

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

DATA(lv_stop_reason) = lo_model->generate_content( 'PROMPT'
                              )->get_stop_reason( ).
Replace PROMPT with your text prompt.

PROMPT 替换为您的文本提示

代码示例

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

基于文本的生成

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

代码示例

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

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

TRY.
    DATA(lo_model) = NEW /goog/cl_model_claude( 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.

替换以下内容:

多模态生成

以下代码示例展示了如何根据多模态输入(例如文本和图片)生成回答。您以 base64 编码的字符串形式提供输入。系统指令是可选的,可以与提示一起传递,以指示模型以特定方式运行。

代码示例

DATA:
lv_instruction TYPE string,
lv_prompt      TYPE string.

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

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

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                            )->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
  • INLINE_DATA:要在提示中内嵌包含的图片或 PDF 的 base64 编码原始数据。

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

在使用提示调用模型之前,您可能需要检查提示中的 token 数量。

这有助于您就提示和使用情况做出明智的决策。count-tokens 端点可免费使用。以下代码示例展示了如何在实际调用 API 之前找到这些数字:

代码示例

DATA:
  lv_prompt      TYPE string.

lv_prompt      = 'PROMPT'.

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

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

IF lv_total_tokens IS NOT INITIAL.
      cl_demo_output=>display( 'Total Tokens -' && lv_total_tokens ).
ENDIF.

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

ENDTRY.

替换以下内容:

后续步骤