叫用 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

本節說明如何使用 ABAP 適用的 Vertex AI SDK,透過 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:前 K 個取樣。
  • MAX_OUTPUT_TOKENS:每則訊息的輸出符記數量上限

如要進一步瞭解這些參數,請參閱「設定模型生成參數」。

將多模態輸入內容傳送至模型

您可以使用多模態輸入內容 (文字圖片文件) 呼叫 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( ).

計算文字提示中的權杖數量

如要在使用提示叫用模型前,計算文字提示中的權杖數量,可以使用 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 分析推文情緒,可以先詢問「Analyze the sentiment in this tweet:」(分析這則推文的情緒:),然後觀察結果。

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 替換為您的文字提示

取得要求提示中的權杖數量

如要取得模型輸入提示中的權杖數量,可以使用 GET_PROMPT_TOKEN_COUNT 方法:

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

PROMPT 替換為您的文字提示

取得模型回覆中的權杖數量

如要取得模型回覆中的權杖數量,可以使用 GET_CANDIDATES_TOKEN_COUNT 方法:

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

PROMPT 替換為您的文字提示

取得權杖總數 (要求和回應)

如要確認權杖總數 (包括要求和回應),可以使用 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 編碼原始資料,可內嵌在提示中。

計算提示中的權杖和可計費字元數

使用提示叫用模型前,建議先檢查提示中的權杖數量。

這有助於您根據提示和用量做出明智決策。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.

更改下列內容:

後續步驟