Invoca los modelos Claude de Anthropic

En este documento, se describe cómo invocar los modelos de Claude de Anthropic para generar respuestas a entradas de texto y multimodales con el SDK de Vertex AI para ABAP. Los modelos de Claude pueden aceptar varios modos de entrada, incluidos texto, imágenes y documentos. Puedes usar los modelos de Claude para casos de uso como los siguientes:

  • Resume texto sin formato
  • Describir o interpretar recursos multimedia
  • Traducción entre idiomas

El uso de modelos generativos para crear funciones centradas en la IA no requiere experiencia en aprendizaje automático (AA). No necesitas recopilar un conjunto de datos grande ni entrenar un modelo. Para comenzar tu primer programa, solo debes describir en pocas oraciones lo que quieres que haga el modelo. El SDK de Vertex AI para ABAP proporciona clases y métodos de ABAP para acceder a los modelos de Claude desde tu entorno de SAP.

Antes de comenzar

Antes de usar el SDK de Vertex AI para ABAP con los modelos de Claude, asegúrate de que tú o tus administradores hayan completado los siguientes requisitos previos:

Envía la solicitud a Claude

En esta sección, se explica cómo enviar solicitudes a los modelos de Claude a través de la API de Vertex AI con el SDK de Vertex AI para ABAP.

Crea una instancia de la clase de invocador multimodal de Claude

Para invocar los modelos multimodales y de texto de Claude con instrucciones multimodales o de texto, puedes usar la clase /GOOG/CL_MODEL_CLAUDE. Para crear una instancia de la clase, debes pasar la clave de modelo configurada en los parámetros de generación del modelo:

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

Reemplaza MODEL_KEY por el nombre de la clave de modelo, que se configura en los parámetros de generación del modelo.

Genera contenido con una instrucción

Para generar contenido proporcionando una instrucción de texto al modelo, puedes usar el método GENERATE_CONTENT:

lo_model->generate_content( 'PROMPT' ).

Reemplaza PROMPT por tu instrucción de texto.

Proporciona instrucciones del sistema al modelo

Para pasar instrucciones del sistema basadas en texto al modelo, puedes usar el método SET_SYSTEM_INSTRUCTIONS:

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

Reemplaza SYSTEM_INSTRUCTIONS por tus instrucciones del sistema para el modelo.

Establece la configuración de generación para el modelo

Mantienes la configuración de generación para los modelos en la tabla /GOOG/AI_CONFIG. Para anular la configuración de generación de una llamada en particular, puedes usar el método SET_GENERATION_CONFIG. Si se establece el parámetro de importación para una propiedad de generación, se tendrá en cuenta el valor del parámetro que se pasó.

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

Reemplaza lo siguiente:

  • TEMPERATURE: Temperatura de aleatoriedad.
  • TOP_P: Muestreo de Top-P.
  • TOP_K: Muestreo de Top-K.
  • MAX_OUTPUT_TOKENS: Cantidad máxima de tokens de salida por mensaje

Para obtener más información sobre estos parámetros, consulta Cómo configurar los parámetros de generación del modelo.

Pasa la entrada multimodal al modelo

Puedes invocar los modelos de Gemini con entradas multimodales, que pueden ser texto, imágenes o documentos. Puedes pasar la entrada para imágenes y PDFs como datos sin procesar. En el caso de los PDFs, también puedes proporcionar un URI si el PDF es accesible públicamente.

En la siguiente tabla, se enumeran los tipos de MIME admitidos:

Tipo de medio Tipos de MIME admitidos
Imágenes
  • image/jpeg
  • image/png
  • image/gif
  • image/webp
Documentos
  • application/pdf

Configura datos sin procesar

Para proporcionar los datos sin procesar de un archivo como entrada para el modelo, junto con su tipo de MIME, puedes usar el método SET_INLINE_DATA:

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

Reemplaza lo siguiente:

  • MIME_TYPE: Es el tipo de MIME estándar de IANA de los datos sin procesar. De forma predeterminada, el tipo MIME se establece en image/jpeg.
  • RAW_DATA: Son los datos sin procesar codificados en Base64 de la imagen o el PDF que se incluirán intercalados en la instrucción.

Para borrar los datos sin procesar de los archivos de la entrada del modelo con la misma instancia de la clase /GOOG/CL_MODEL_CLAUDE, puedes usar el método CLEAR_INLINE_DATA:

lo_model->clear_inline_data( ).

Cómo contar la cantidad de tokens en una instrucción de texto

Para contar la cantidad de tokens en una instrucción de texto antes de invocar el modelo con la instrucción, puedes usar el método COUNT_TOKENS:

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

Reemplaza lo siguiente:

Cómo agregar secuencias de detención

Un stop_sequence es un conjunto de cadenas que le indica a Claude que detenga la generación cuando encuentre cualquiera de estas cadenas en su respuesta. Básicamente, es una instrucción que le dice a Claude: "Si generas esta secuencia, deja de hacerlo de inmediato".

La siguiente muestra de código no incluye 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( ).

Este muestra de código devuelve la siguiente respuesta:

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

La siguiente muestra de código incluye 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( ).

Este muestra de código devuelve la siguiente respuesta:

Este es un objeto JSON que representa a una persona con un nombre, un correo electrónico y un número de teléfono:

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

Ten en cuenta que el resultado no incluye la secuencia de detención }. Para analizarlo como JSON, debes agregar el } de cierre.

Cuando un modelo de Claude proporciona una respuesta, su propiedad stop_reason indica por qué el modelo dejó de generar texto.

Para obtener el motivo de detención, puedes usar la siguiente muestra de código:

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

Agregar ejemplos

La instrucción con ejemplos limitados es una estrategia eficaz en la que proporcionas a un modelo un pequeño conjunto de ejemplos para guiar su resultado. Para lograrlo, puedes usar el historial de conversaciones para proporcionarle a Claude estos ejemplos.

Por ejemplo, para analizar la opinión de un tweet con Claude, puedes comenzar preguntando: "Analiza la opinión de este tweet: " y, luego, observar el resultado.

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

Resultado:

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

Si bien una respuesta integral es valiosa, para el análisis de opiniones automatizado de numerosos tweets, es preferible un resultado más conciso de Claude. Puedes estandarizar las respuestas de Claude en una sola palabra, como POSITIVO, NEUTRO o NEGATIVO, o en un valor numérico, como 1, 0 o -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( ).

Resultado:

POSITIVE

Establece el texto del asistente

Otra estrategia común para obtener resultados muy específicos es "poner palabras en la boca de Claude". En lugar de solo proporcionar mensajes user a Claude, también puedes proporcionar un mensaje assistant que Claude use cuando genere resultados.

Si proporcionas un mensaje assistant, Claude continúa la conversación desde el último token assistant. Solo recuerda que debes comenzar con un mensaje 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( ).

Este fragmento de código muestra el siguiente resultado: C) Mars.

Establece la versión de Anthropic

Puedes establecer el parámetro anthropic_version. De forma predeterminada, vertex-2023-10-16 es el valor establecido para este parámetro. Solo debes cambiar su valor si deseas acceder a otra versión de Anthropic admitida.

Si necesitas cambiar la versión de Anthropic, puedes usar el método SET_ANTHROPIC_VERSION:

lo_model->set_anthropic_version( 'ANTHROPIC_VERSION' ).

Reemplaza ANTHROPIC_VERSION por la versión de Anthropic que se usará. Para obtener más información, consulta la documentación de Anthropic.

Recibe una respuesta de Claude

Para recibir respuestas procesadas del modelo y presentarlas de una manera significativa para los desarrolladores de ABAP, el SDK proporciona la clase /GOOG/CL_RESPONSE_CLAUDE.

La respuesta que captura la clase /GOOG/CL_RESPONSE_CLAUDE se encadena a las solicitudes realizadas a través de los métodos de la clase /GOOG/CL_MODEL_CLAUDE, de modo que puedas acceder directamente a la respuesta en una sola sentencia sin necesidad de variables para almacenar los resultados intermedios.

Obtén una respuesta de texto

Para recibir una respuesta de texto del modelo, puedes usar el método GET_TEXT:

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

Reemplaza PROMPT por tu instrucción de texto.

Obtén la cantidad de tokens en la instrucción de la solicitud

Para recibir la cantidad de tokens en la instrucción de entrada al modelo, puedes usar el método GET_PROMPT_TOKEN_COUNT:

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

Reemplaza PROMPT por tu instrucción de texto.

Obtén la cantidad de tokens en la respuesta del modelo

Para recibir la cantidad de tokens en la respuesta del modelo, puedes usar el método GET_CANDIDATES_TOKEN_COUNT:

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

Reemplaza PROMPT por tu instrucción de texto.

Obtén el recuento total de tokens (solicitud y respuesta)

Para determinar el recuento total de tokens, que abarca tanto la solicitud como la respuesta, puedes usar el método GET_TOTAL_TOKEN_COUNT:

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

Reemplaza PROMPT por tu instrucción de texto.

Obtén el motivo de la detención

Para recibir el motivo por el que el modelo bloqueó la generación de respuestas, puedes usar el método GET_STOP_REASON:

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

Reemplaza PROMPT por tu instrucción de texto.

Muestras de código

En las siguientes muestras de código, se muestra cómo invocar los modelos de Claude para generar respuestas para diferentes tipos de entradas.

Generación basada en texto

En la siguiente muestra de código, se muestra cómo generar una respuesta a partir de una instrucción del sistema junto con una instrucción de texto. La instrucción del sistema es opcional y se puede pasar junto con la instrucción para indicarle al modelo que se comporte de una manera específica.

Muestra de código

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.

Reemplaza lo siguiente:

Generación multimodal

En la siguiente muestra de código, se muestra cómo generar una respuesta a partir de una entrada multimodal, como texto y una imagen. Proporcionas la entrada como una cadena codificada en base64. La instrucción del sistema es opcional y se puede pasar junto con la instrucción para indicarle al modelo que se comporte de una manera específica.

Muestra de código

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.

Reemplaza lo siguiente:

  • MODEL_KEY: El nombre de la clave del modelo, que se configura en los parámetros de generación del modelo.
  • PROMPT: Tu sugerencia de texto.
  • SYSTEM_INSTRUCTIONS: Son tus instrucciones del sistema para el modelo.
  • MIME_TYPE: Es el tipo de MIME estándar de IANA de los datos del archivo. De forma predeterminada, el tipo MIME se establece en application/pdf.
  • INLINE_DATA: Son los datos sin procesar codificados en base64 de la imagen o el PDF que se incluirán intercalados en el mensaje.

Busca la cantidad de tokens y caracteres facturables en una instrucción

Antes de invocar el modelo con una instrucción, es posible que desees verificar la cantidad de tokens que contiene.

Esto te ayuda a tomar decisiones fundamentadas sobre tus instrucciones y tu uso. El extremo count-tokens no tiene costo. En el siguiente muestra de código, se muestra cómo encontrar estos números antes de invocar la API:

Muestra de código

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.

Reemplaza lo siguiente:

¿Qué sigue?