Usa llamadas a funciones de SAP con modelos alojados en Vertex AI

En este documento, se describe cómo usar las llamadas a funciones de SAP con los siguientes modelos alojados en Vertex AI a través del SDK de Vertex AI para ABAP:

Puedes definir funciones personalizadas y proporcionarlas a los modelos de Gemini y Claude con la función Llamada a función. Los modelos no invocan directamente las funciones personalizadas, sino que generan un resultado de datos estructurados que especifica el nombre de la función y los argumentos sugeridos. Este resultado te permite escribir aplicaciones que tomen el resultado estructurado y llamen a APIs externas. El resultado de la API resultante se puede incorporar a otra instrucción del modelo, lo que permite respuestas de consulta más completas.

El SDK de Vertex AI para ABAP simplifica las llamadas a funciones para los desarrolladores de ABAP, ya que les brinda oportunidades para invocar lógica personalizada escrita en módulos de funciones de SAP de las siguientes maneras:

  • Pasar nombres de módulos de funciones de SAP al modelo como declaraciones de funciones, que describen el nombre de la función, su propósito y los parámetros relacionados.
  • Establecer la invocación automática del módulo de funciones de SAP de forma implícita mientras se invoca el modelo.

El siguiente es un recorrido típico de un desarrollador de ABAP para invocar llamadas a funciones de SAP:

  1. El usuario proporciona una instrucción de entrada.
  2. El SDK pasa la instrucción de entrada y las declaraciones de funciones al modelo.
  3. El modelo revisa la instrucción y las funciones declaradas para derivar la función a la que llamar y sugiere los valores de los parámetros para llamar a la función.
  4. Si se establece la invocación automática, el SDK llama al módulo de funciones de SAP.
  5. Luego, el SDK invoca el modelo con el resultado de la función llamada.
  6. El modelo responde con una respuesta confiable para la instrucción final enriquecida con el resultado de la función llamada.
  7. El SDK muestra la respuesta al usuario.

Llamadas a funciones de SAP con Gemini

Si decides no invocar automáticamente los módulos de funciones de SAP, el SDK te permite usar la función de llamada a función sin ninguna invocación de módulo de función de SAP. En este caso, puedes seguir el flujo de trabajo típico de llamadas a función para usar herramientas externas, como APIs y funciones.

Antes de comenzar

Antes de usar el SDK de Vertex AI para ABAP para las llamadas a funciones de SAP con Gemini, asegúrate de que tú o tus administradores hayan completado los siguientes requisitos previos:

Para Gemini:

Para Claude:

Enriquece el contexto del modelo de IA con datos de SAP

En esta sección, se explica cómo puedes enriquecer el contexto del modelo de IA con datos de SAP usando el SDK de Vertex AI para ABAP.

Crea una instancia de la clase de invocador multimodal

Para invocar llamadas a funciones en SAP con los modelos de Gemini , usa la clase /GOOG/CL_GENERATIVE_MODEL.

Para invocar llamadas a funciones en SAP con los modelos de Claude , usa 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.

Gemini

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

Claude

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.

Crea un módulo de función de SAP

Para crear un módulo de función de SAP para que el SDK lo invoque automáticamente, sigue el esquema proporcionado:

Categoría Nombre del parámetro Tipo asociado
Se está importando IT_FUNCTION_PARAMETERS /GOOG/T_FUNCTION_PARAMETERS
Exportando EV_FUNCTION_RESPONSE STRING
Cambiando CV_PROMPT STRING
Excepciones /GOOG/CX_SDK Exception Class

En función de los parámetros de importación, escribe tu lógica personalizada dentro del módulo de la función, que puede ser recuperar datos de SAP a través de consultas SELECT o llamar a una API o un módulo externos para obtener la información faltante.

Configura el parámetro de exportación EV_FUNCTION_RESPONSE con la información para enviar comentarios al contexto de LLM. También puedes cambiar o modificar el texto de la instrucción en CV_PROMPT según la lógica personalizada y los requisitos empresariales para dar más instrucciones al LLM según diferentes situaciones empresariales.

Agrega la declaración de la función

Para agregar una declaración de función al contexto de LLM, puedes usar el método ADD_FUNCTION_DECLARATION. Llama al método ADD_FUNCTION_DECLARATION cada vez que necesites agregar una función al contexto.

Gemini

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
            type           = 'PARAMETER_TYPE'
            description    = 'PARAMETER_DESCRIPTION'
            is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
lo_model->add_function_declaration( iv_name        = 'FUNCTION_MODULE_NAME'
                                iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                it_parameters  = lt_parameters ).

Claude

DATA lt_parameters TYPE /goog/cl_model_claude=>tt_parameter_properties.
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
            type           = 'PARAMETER_TYPE'
            description    = 'PARAMETER_DESCRIPTION'
            is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
lo_model->add_function_declaration( iv_name        = 'FUNCTION_MODULE_NAME'
                                iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                it_parameters  = lt_parameters ).

Reemplaza lo siguiente:

  • PARAMETER_NAME: El nombre del parámetro.
  • PARAMETER_TYPE: Es el tipo de datos del parámetro, como string, integer o boolean.
  • PARAMETER_DESCRIPTION: Una explicación clara del propósito del parámetro y el formato esperado.
  • PARAMETER_IS_REQUIRED: Si este parámetro es obligatorio para que la función se ejecute, establece el valor en ABAP_TRUE.
  • FUNCTION_MODULE_NAME: Es el nombre del módulo de funciones de SAP.
  • FUNCTION_MODULE_DESCRIPTION: Es la descripción del módulo de funciones de SAP.

También puedes declarar una función sin parámetros, que puede servir como función de resguardo o copia de seguridad. Si la instrucción del usuario no proporciona suficiente información para llamar a una función específica, puedes indicarle al modelo que seleccione esta función de resguardo.

Cómo configurar la invocación automática del módulo de funciones de SAP

Para configurar la invocación automática de la función de SAP que selecciona el modelo, puedes usar el método SET_AUTO_INVOKE_SAP_FUNCTION. Si se pasa ABAP_TRUE en el parámetro de importación IV_AUTO_INVOKE, el SDK invoca el módulo de función y su respuesta se incluye con el contexto de LLM para generar la respuesta final.

Debes definir tu módulo de funciones siguiendo el esquema que se describe en la sección Cómo crear un módulo de funciones de SAP.

lo_model->set_auto_invoke_sap_function( abap_true ).

Genera contenido con llamadas a función

Para pasar el texto de la instrucción a un modelo, puedes usar el método GENERATE_CONTENT. Para obtener la respuesta que genera el modelo con el contexto adicional agregado desde el módulo de funciones de SAP a través de llamadas a funciones, usa el método GET_TEXT.

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

Reemplaza PROMPT por tu instrucción de texto.

Obtén el nombre de la función y los valores de los parámetros seleccionados

Para obtener la función seleccionada por el modelo (entre las funciones declaradas) y sus parámetros sugeridos, usa el método GET_FUNCTION_CALL.

DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                               )->generate_content( iv_prompt_text = 'PROMPT' ).
lo_response->get_function_call( IMPORTING ev_function_name       = DATA(lv_function_name)
                                          et_function_parameters = DATA(lt_function_parameters) ).

Reemplaza PROMPT por tu instrucción de texto.

Puedes obtener el nombre de la función seleccionada de LV_FUNCTION_NAME y los parámetros sugeridos de LT_FUNCTION_PARAMETERS. Puedes usar esta información para validar, hacer un seguimiento y registrar las acciones del modelo según los lineamientos de administración de información y eventos de seguridad de tu empresa.

Muestra de código

En la siguiente muestra de código, se ilustra cómo usar las llamadas a función de SAP para recibir una respuesta final del modelo.

Gemini

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                type           = 'PARAMETER_TYPE'
                description    = 'PARAMETER_DESCRIPTION'
                is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
DATA(lv_response) = lo_model->add_function_declaration(
                                  iv_name        = 'FUNCTION_MODULE_NAME'
                                  iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                  it_parameters  = lt_parameters
                            )->set_auto_invoke_sap_function( abap_true
                            )->generate_content( iv_prompt_text ='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.

Claude

DATA lt_parameters TYPE /goog/cl_model_claude=>tt_parameter_properties.
TRY.
DATA(lo_model) = NEW /goog/cl_model_claude( iv_model_key = 'MODEL_KEY' ).
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                type           = 'PARAMETER_TYPE'
                description    = 'PARAMETER_DESCRIPTION'
                is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
DATA(lv_response) = lo_model->add_function_declaration(
                                  iv_name        = 'FUNCTION_MODULE_NAME'
                                  iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                  it_parameters  = lt_parameters
                            )->set_auto_invoke_sap_function( abap_true
                            )->generate_content( iv_prompt_text ='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.
  • PARAMETER_NAME: El nombre del parámetro.
  • PARAMETER_TYPE: Es el tipo de datos del parámetro, como string, integer o boolean.
  • PARAMETER_DESCRIPTION: Una explicación clara del propósito del parámetro y el formato esperado.
  • PARAMETER_IS_REQUIRED: Si este parámetro es obligatorio para que la función se ejecute, establece el valor en ABAP_TRUE.
  • FUNCTION_MODULE_NAME: Es el nombre del módulo de funciones de SAP.
  • FUNCTION_MODULE_DESCRIPTION: Es la descripción del módulo de funciones de SAP.
  • PROMPT: Tu sugerencia de texto.

Encadenamiento automático de funciones

La función de encadenamiento automático de funciones te permite invocar varios módulos de función definida por el usuario para generar una respuesta. Esta función solo se admite cuando está habilitada la invocación automática de módulos de funciones de SAP.

En el siguiente muestra de código, se ilustra el encadenamiento automático de funciones. Para la instrucción Get the air quality in my current location, el modelo primero invoca el módulo de función Z_GET_CURRENT_LOCATION para obtener la información de longitud y latitud, y, luego, pasa esa información al módulo de función Z_GET_CURRENT_AIR_QUALITY para obtener la calidad del aire para los puntos de longitud y latitud determinados.

Gemini

gv_prompt = 'Get the air quality in my current location'.
gv_system_instruction = 'You are a helpful weather assistant bot. You can turn find my location and get the weather information like temperature' &&
'You can also alert me about EarthQuakes and Storm.' &&
'You can also provide me information on Air Quality based on a location' &&
'Do not perform any other tasks.'.
TRY.
    DATA(lo_model_key) = NEW /goog/cl_generative_model( iv_model_key = 'gemini-flash-2' ).
    gv_final_op = lo_model_key->gs_ai_config-model_id.
    lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_LOCATION'
                                            iv_description = 'Get the current location'
                                            it_parameters  = gt_parameters ).
    CLEAR gt_parameters.
    gs_parameter-parameter_name = |Latitude|.
    gs_parameter-type = 'string'.
    gs_parameter-description = |Latitude|.
    gs_parameter-is_required = abap_true.
    APPEND gs_parameter TO gt_parameters.
    CLEAR gs_parameter.
    gs_parameter-parameter_name = |Longitude|.
    gs_parameter-type = 'string'.
    gs_parameter-description = |Longitude|.
    gs_parameter-is_required = abap_true.
    APPEND gs_parameter TO gt_parameters.
    CLEAR gs_parameter.
    lo_model_key->add_function_declaration( iv_name        = 'Z_GET_WEATHER_INFORMATION'
                                            iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_AIR_QUALITY'
                                            iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->add_function_declaration( iv_name        = 'GET_EARTHQUAKE_POSSIBILITY'
                                            iv_description = 'Gets possibility of Earthquake for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->add_function_declaration( iv_name        = 'GET_STORM_POSSIBILITY'
                                            iv_description = 'Gets possibility of a STORM for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->set_system_instructions(
      EXPORTING
        iv_text = gv_system_instruction
    ).
    DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                  )->generate_content( iv_prompt_text = gv_prompt ).
    DATA(ls_response) = lo_response->get_response( ).
    /ui2/cl_json=>serialize(
      EXPORTING
        data   = ls_response-candidates[ 1 ]-content-parts           " Data to serialize
      RECEIVING
        r_json = DATA(lv_json_string)                 " JSON string
    ).
    IF lv_json_string IS NOT INITIAL.
      CLEAR gv_output.
      gv_output = lv_json_string.
    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
  cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
lo_model_key->close( ).
CLEAR lo_model_key.
CLEAR lo_response.
CLEAR ls_response.

Claude

gv_prompt = 'Get the air quality in my current location'.
gv_system_instruction = 'You are a helpful weather assistant bot. You can turn find my location and get the weather information like temperature' &&
'You can also alert me about EarthQuakes and Storm.' &&
'You can also provide me information on Air Quality based on a location' &&
'Do not perform any other tasks.'.
TRY.
    DATA(lo_model_key) = NEW /goog//goog/cl_model_claude( iv_model_key = 'claude' ).
    gv_final_op = lo_model_key->gs_ai_config-model_id.
    lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_LOCATION'
                                            iv_description = 'Get the current location'
                                            it_parameters  = gt_parameters ).
    CLEAR gt_parameters.
    gs_parameter-parameter_name = |Latitude|.
    gs_parameter-type = 'string'.
    gs_parameter-description = |Latitude|.
    gs_parameter-is_required = abap_true.
    APPEND gs_parameter TO gt_parameters.
    CLEAR gs_parameter.
    gs_parameter-parameter_name = |Longitude|.
    gs_parameter-type = 'string'.
    gs_parameter-description = |Longitude|.
    gs_parameter-is_required = abap_true.
    APPEND gs_parameter TO gt_parameters.
    CLEAR gs_parameter.
    lo_model_key->add_function_declaration( iv_name        = 'Z_GET_WEATHER_INFORMATION'
                                            iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_AIR_QUALITY'
                                            iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->add_function_declaration( iv_name        = 'GET_EARTHQUAKE_POSSIBILITY'
                                            iv_description = 'Gets possibility of Earthquake for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->add_function_declaration( iv_name        = 'GET_STORM_POSSIBILITY'
                                            iv_description = 'Gets possibility of a STORM for a given location which is latitude and longitude'
                                            it_parameters  = gt_parameters ).
    lo_model_key->set_system_instructions(
      EXPORTING
        iv_text = gv_system_instruction
    ).
    DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                  )->generate_content( iv_prompt_text = gv_prompt ).
    DATA(ls_response) = lo_response->get_response( ).
    /ui2/cl_json=>serialize(
      EXPORTING
        data   = ls_response-candidates[ 1 ]-content-parts           " Data to serialize
      RECEIVING
        r_json = DATA(lv_json_string)                 " JSON string
    ).
    IF lv_json_string IS NOT INITIAL.
      CLEAR gv_output.
      gv_output = lv_json_string.
    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
  cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
lo_model_key->close( ).
CLEAR lo_model_key.
CLEAR lo_response.
CLEAR ls_response.

Para inhabilitar el encadenamiento automático de funciones y obtener solo la respuesta de la primera función del LLM, usa el método SET_FUNCTION_CALLING_CONFIG y configura el parámetro IV_DISABLE_FUNCTION_CHAINING como ABAP_TRUE. Por ejemplo:


      lo_model_key->set_function_calling_config( iv_disable_function_chaining = abap_true ).
      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

Si quieres obtener todos los módulos de funciones invocados por el SDK y los parámetros que se les pasaron, llama al método GET_ALL_FUNCTION_CALLS:

      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

      DATA(ls_response) = lo_response->get_all_function_calls( ).

¿Qué sigue?