Richiamare i modelli Anthropic Claude

Questo documento descrive come richiamare i modelli Anthropic Claude per generare risposte per input di testo e multimodali, utilizzando l'SDK Vertex AI per ABAP. I modelli Claude possono accettare più modalità di input, tra cui testo, immagini e documenti. Puoi utilizzare i modelli Claude per casi d'uso come i seguenti:

  • Riassumere un testo in formato libero
  • Descrivere o interpretare gli asset multimediali
  • Traduzione tra lingue

L'utilizzo di modelli generativi per creare funzionalità incentrate sull'AI non richiede alcuna competenza in machine learning (ML). Non devi raccogliere un set di dati di grandi dimensioni o addestrare un modello. Per iniziare il tuo primo programma, ti basta descrivere in poche frasi cosa vuoi che faccia il modello. L'SDK Vertex AI per ABAP fornisce classi e metodi ABAP per accedere ai modelli Claude dal tuo ambiente SAP.

Prima di iniziare

Prima di utilizzare l'SDK Vertex AI per ABAP con i modelli Claude, assicurati che tu o i tuoi amministratori abbiate completato i seguenti prerequisiti:

Inviare una richiesta a Claude

Questa sezione spiega come inviare richieste ai modelli Claude tramite l'API Vertex AI utilizzando l'SDK Vertex AI per ABAP.

Istanzia la classe di invoker multimodale Claude

Per richiamare i modelli di testo e multimodali Claude utilizzando prompt di testo o multimodali, puoi utilizzare la classe /GOOG/CL_MODEL_CLAUDE. Istanzia la classe passando la chiave del modello configurata nei parametri di generazione del modello:

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

Sostituisci MODEL_KEY con il nome della chiave del modello, configurato nei parametri di generazione del modello.

Generare contenuti con un prompt

Per generare contenuti fornendo un prompt di testo al modello, puoi utilizzare il metodo GENERATE_CONTENT:

lo_model->generate_content( 'PROMPT' ).

Sostituisci PROMPT con il tuo prompt di testo.

Fornire istruzioni di sistema al modello

Per trasmettere al modello istruzioni di sistema basate su testo, puoi utilizzare il metodo SET_SYSTEM_INSTRUCTIONS:

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

Sostituisci SYSTEM_INSTRUCTIONS con le istruzioni di sistema per il modello.

Imposta la configurazione di generazione per il modello

Mantieni la configurazione della generazione per i modelli nella tabella /GOOG/AI_CONFIG. Per ignorare la configurazione di generazione per una chiamata specifica, puoi utilizzare il metodo SET_GENERATION_CONFIG. Se il parametro di importazione per una proprietà generata è impostato, viene preso in considerazione il valore parametro passato.

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' ).

Sostituisci quanto segue:

  • TEMPERATURE: Temperatura di casualità.
  • TOP_P: campionamento Top-P.
  • TOP_K: campionamento top-K.
  • MAX_OUTPUT_TOKENS: Numero massimo di token di output per messaggio

Per saperne di più su questi parametri, consulta Configurare i parametri di generazione del modello.

Passare l'input multimodale al modello

Puoi richiamare i modelli Gemini utilizzando input multimodali, che possono essere testo, immagini o documenti. Puoi passare l'input per immagini e PDF come dati non elaborati. Per i PDF, puoi anche fornire un URI se il PDF è accessibile pubblicamente.

La tabella seguente elenca i tipi MIME supportati:

Tipo di media Tipi MIME supportati
Immagini
  • image/jpeg
  • image/png
  • image/gif
  • image/webp
Documenti
  • application/pdf

Imposta dati non elaborati

Per fornire i dati non elaborati di un file come input al modello, insieme al relativo tipo MIME, puoi utilizzare il metodo SET_INLINE_DATA:

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

Sostituisci quanto segue:

  • MIME_TYPE: il tipo MIME standard IANA dei dati non elaborati. Per impostazione predefinita, il tipo MIME è impostato su image/jpeg.
  • RAW_DATA: dati non elaborati con codifica Base64 dell'immagine o del PDF da includere inline nel prompt.

Per cancellare i dati non elaborati dei file dall'input del modello con la stessa istanza della classe /GOOG/CL_MODEL_CLAUDE, puoi utilizzare il metodo CLEAR_INLINE_DATA:

lo_model->clear_inline_data( ).

Contare il numero di token in un prompt di testo

Per contare il numero di token in un prompt di testo prima di richiamare il modello con il prompt, puoi utilizzare il metodo COUNT_TOKENS:

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

Sostituisci quanto segue:

Aggiungere sequenze di interruzioni

Un stop_sequence è un insieme di stringhe che indica a Claude di interrompere la generazione quando incontra una di queste stringhe nella sua risposta. In sostanza, è un comando che dice a Claude: "Se generi questa sequenza, interrompi immediatamente la generazione!"

Il seguente esempio di codice non include un 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( ).

Questo esempio di codice restituisce la seguente risposta:

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

Il seguente esempio di codice include un 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( ).

Questo esempio di codice restituisce la seguente risposta:

Ecco un oggetto JSON che rappresenta una persona con nome, email e numero di telefono:

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

Nota che l'output non include la sequenza di interruzione }. Per analizzare questo valore come JSON, devi aggiungere la chiusura }.

Quando un modello Claude fornisce una risposta, la proprietà stop_reason indica perché il modello ha interrotto la generazione di testo.

Per ottenere il motivo dell'interruzione, puoi utilizzare il seguente esempio di codice:

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

Aggiungi esempi

Il prompt few-shot è una strategia efficace in cui fornisci a un modello un piccolo insieme di esempi per guidarne l'output. Puoi farlo utilizzando la cronologia delle conversazioni per fornire a Claude questi esempi.

Ad esempio, per analizzare il sentiment dei tweet utilizzando Claude, potresti iniziare chiedendo: "Analizza il sentiment di questo tweet: " e poi osservare l'output risultante.

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( ).

Output:

# 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.

Sebbene una risposta completa sia preziosa, per l'analisi automatica del sentiment di numerosi tweet è preferibile un output più conciso da Claude. Puoi standardizzare le risposte di Claude in una sola parola come POSITIVO, NEUTRO, NEGATIVO o in un valore numerico come 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( ).

Output:

POSITIVE

Impostare il testo dell'assistente

Un'altra strategia comune per ottenere risultati molto specifici è quella di "mettere le parole in bocca a Claude". Invece di fornire a Claude solo messaggi user, puoi anche fornire un messaggio assistant che Claude utilizza quando genera l'output.

Se fornisci un messaggio assistant, Claude continua la conversazione dall'ultimo token assistant. Ricorda solo che devi iniziare con un messaggio di 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( ).

Questo snippet di codice mostra il seguente output: C) Mars.

Imposta versione Anthropic

Puoi impostare il parametro anthropic_version. Per impostazione predefinita, vertex-2023-10-16 è il valore impostato per questo parametro. Devi modificare il valore solo se vuoi accedere a un'altra versione di Anthropic supportata.

Se devi modificare la versione di Anthropic, puoi utilizzare il metodo SET_ANTHROPIC_VERSION:

lo_model->set_anthropic_version( 'ANTHROPIC_VERSION' ).

Sostituisci ANTHROPIC_VERSION con la versione di Anthropic da utilizzare. Per saperne di più, consulta la documentazione di Anthropic.

Ricevere una risposta da Claude

Per ricevere risposte elaborate dal modello e presentarle in modo significativo per gli sviluppatori ABAP, l'SDK fornisce la classe /GOOG/CL_RESPONSE_CLAUDE.

La risposta acquisita dalla classe /GOOG/CL_RESPONSE_CLAUDE è concatenata alle richieste effettuate tramite i metodi della classe /GOOG/CL_MODEL_CLAUDE, in modo che tu possa accedere direttamente alla risposta in un'unica istruzione senza richiedere variabili per archiviare i risultati intermedi.

Ricevere una risposta di testo

Per ricevere una risposta di testo dal modello, puoi utilizzare il metodo GET_TEXT:

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

Sostituisci PROMPT con il tuo prompt di testo.

Ottieni il numero di token nel prompt della richiesta

Per ricevere il numero di token nel prompt di input del modello, puoi utilizzare il metodo GET_PROMPT_TOKEN_COUNT:

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

Sostituisci PROMPT con il tuo prompt di testo.

Ottieni il numero di token nella risposta del modello

Per ricevere il numero di token nella risposta del modello, puoi utilizzare il metodo GET_CANDIDATES_TOKEN_COUNT:

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

Sostituisci PROMPT con il tuo prompt di testo.

Ottenere il conteggio totale dei token (richiesta e risposta)

Per determinare il conteggio totale dei token, che comprende sia la richiesta che la risposta, puoi utilizzare il metodo GET_TOTAL_TOKEN_COUNT:

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

Sostituisci PROMPT con il tuo prompt di testo.

Ottieni motivo interruzione

Per ricevere il motivo per cui il modello ha bloccato la generazione della risposta, puoi utilizzare il metodo GET_STOP_REASON:

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

Sostituisci PROMPT con il tuo prompt di testo.

Esempi di codice

I seguenti esempi di codice mostrano come richiamare i modelli Claude per generare risposte per vari tipi di input.

Generazione basata su testo

Il seguente esempio di codice mostra come generare una risposta da un prompt di testo insieme a un'istruzione di sistema. L'istruzione di sistema è facoltativa e può essere trasmessa insieme al prompt per indicare al modello di comportarsi in un modo specifico.

Esempio di codice

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.

Sostituisci quanto segue:

Generazione multimodale

Il seguente esempio di codice mostra come generare una risposta da un input multimodale, come testo e un'immagine. Fornisci l'input come stringa con codifica base64. L'istruzione di sistema è facoltativa e può essere trasmessa insieme al prompt per indicare al modello di comportarsi in un modo specifico.

Esempio di codice

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.

Sostituisci quanto segue:

  • MODEL_KEY: il nome della chiave del modello, configurato nei parametri di generazione del modello.
  • PROMPT: il tuo prompt di testo.
  • SYSTEM_INSTRUCTIONS: le istruzioni di sistema per il modello.
  • MIME_TYPE: il tipo MIME standard IANA dei dati del file. Per impostazione predefinita, il tipo MIME è impostato su application/pdf.
  • INLINE_DATA: dati non elaborati con codifica Base64 dell'immagine o del PDF da includere inline nel prompt.

Trovare il numero di token e caratteri fatturabili in un prompt

Prima di richiamare il modello con un prompt, ti consigliamo di controllare il numero di token nel prompt.

In questo modo, puoi prendere decisioni consapevoli sui prompt e sull'utilizzo. L'endpoint count-tokens non prevede costi. Il seguente esempio di codice mostra come trovare questi numeri prima di richiamare l'API:

Esempio di codice

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.

Sostituisci quanto segue:

Passaggi successivi