SAP与AI大模型-GUICHAT
最近看到一些SAP集成AI很好的方案,研究了下是怎样开发做到的,结果和大家分享下,由于主流的大模型(Deepseek、百度文心一言、通义千问)不免费,百度文心一言要注册SSL证书,所以集成的是阿里的百炼大模型平台-通义千问本地部署版。1. SE38新建一个report。
·
集成的是阿里的百炼大模型平台-通义千问本地部署版。
一、GUICHAT
1. SE38新建一个report
REPORT zcall_ai.
DATA: ok_code TYPE sy-ucomm.
DATA: lv_input TYPE string,
lv_output TYPE string.
PARAMETERS: p_input TYPE string NO-DISPLAY,
p_input2 TYPE string NO-DISPLAY.
CLASS lcl_hlp DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF t_source,
line TYPE char255,
END OF t_source.
TYPES: tt_source TYPE STANDARD TABLE OF t_source WITH DEFAULT KEY.
DATA:
results TYPE string,
source_editor TYPE REF TO cl_gui_textedit,
dest_editor TYPE REF TO cl_gui_textedit,
abap_editor TYPE REF TO cl_gui_abapedit.
METHODS: create_source_editor.
METHODS: create_dest_editor.
METHODS: f_query.
METHODS: pai IMPORTING VALUE(i_okcode) TYPE sy-ucomm.
ENDCLASS.
START-OF-SELECTION.
DATA(hlp) = NEW lcl_hlp( ).
CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*& Module PBO OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE pbo OUTPUT.
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITLE'.
hlp->create_source_editor( ).
hlp->create_dest_editor( ).
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module PAI INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE pai INPUT.
hlp->pai( ok_code ).
ENDMODULE.
CLASS lcl_hlp IMPLEMENTATION.
METHOD create_source_editor.
IF source_editor IS INITIAL.
source_editor = NEW #( parent = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_top
no_autodef_progid_dynnr = abap_true
extension = 120 ) ) .
ENDIF.
*将输入信息返回倒界面上
IF p_input IS NOT INITIAL.
CALL METHOD source_editor->set_textstream
EXPORTING
text = p_input
EXCEPTIONS
OTHERS = 1.
ENDIF.
ENDMETHOD.
METHOD create_dest_editor.
IF dest_editor IS INITIAL.
dest_editor = NEW #( parent = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom
no_autodef_progid_dynnr = abap_true
extension = 210 ) ) .
ENDIF.
"隐藏输出文本框菜单栏
CALL METHOD dest_editor->set_toolbar_mode
EXPORTING
toolbar_mode = 0
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
*将输入信息返回倒界面上
IF p_input2 IS NOT INITIAL.
CALL METHOD dest_editor->set_textstream
EXPORTING
text = p_input2
EXCEPTIONS
OTHERS = 1.
ENDIF.
ENDMETHOD.
METHOD f_query.
DATA: source TYPE soli_tab.
source_editor->get_text_as_stream(
IMPORTING
text = source
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 3
).
IF sy-subrc EQ 0.
IF source IS INITIAL.
MESSAGE s001(00) WITH '请输入查询信息' DISPLAY LIKE 'E' ##MG_MISSING ##NO_TEXT.
RETURN.
ENDIF.
lv_input = cl_bcs_convert=>txt_to_string( it_soli = source ).
*调用阿里AI接口
CALL FUNCTION 'ZINT_AI_POST'
EXPORTING
input_str = lv_input
IMPORTING
output_str = lv_output.
*将接口返回信息返回倒界面上
CALL METHOD dest_editor->set_textstream
EXPORTING
text = lv_output
EXCEPTIONS
OTHERS = 1.
ENDIF.
ENDMETHOD.
METHOD pai.
CLEAR sy-ucomm.
CASE i_okcode.
WHEN 'BACK' OR 'UP' OR 'EXIT'.
LEAVE PROGRAM.
WHEN 'F_QUERY'.
f_query( ).
ENDCASE.
ENDMETHOD.
ENDCLASS.
2.屏幕

二、调用大模型
FUNCTION zint_ai_post.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(INPUT_STR) TYPE STRING OPTIONAL
*" VALUE(ABAP_FLG) TYPE CHAR1 OPTIONAL
*" EXPORTING
*" REFERENCE(OUTPUT_STR) TYPE STRING
*" TABLES
*" LT_OUTPUT STRUCTURE ZINT_AI_POST_OUT OPTIONAL
*"----------------------------------------------------------------------
* Global data declarations
DATA: lv_len TYPE i, "发送报文长度
lv_url TYPE string, "接口地址
lc_http_client TYPE REF TO if_http_client, "http客户端
lv_authorization TYPE string,
lv_code TYPE i, "HTTP 返回状态
lv_reason TYPE string. " HTTP 状态描述
DATA: l_sysubrc TYPE i,
l_error_text TYPE string.
DATA: lv_token TYPE string.
DATA: l_json_data TYPE string,
l_msg TYPE string,
lv_auth TYPE string.
DATA: i_request TYPE string,
e_response TYPE string.
CLEAR: lv_url,i_request.
"输入结构
DATA: BEGIN OF ls_input_mes,
role TYPE string,
content TYPE string,
END OF ls_input_mes.
DATA: BEGIN OF ls_input,
model TYPE string,
messages LIKE TABLE OF ls_input_mes,
END OF ls_input.
DATA: ls_req LIKE ls_input_mes.
"输出结构
DATA: BEGIN OF t_message3,
role TYPE string,
content TYPE string,
END OF t_message3.
DATA: BEGIN OF t_choices2,
message LIKE t_message3,
END OF t_choices2.
DATA: BEGIN OF ls_output,
choices LIKE TABLE OF t_choices2,
END OF ls_output.
ls_input-model = 'qwen2.5-instruct'.
* ls_input-model = '大模型model'.
ls_req-role = 'user'.
ls_req-content = input_str.
APPEND ls_req TO ls_input-messages.
i_request = /ui2/cl_json=>serialize( data = ls_input
pretty_name = 'L' ).
lv_url = '大模型API'.
*****创建http服务
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_url
IMPORTING
client = lc_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO l_msg
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
CALL METHOD lc_http_client->request->set_header_field
EXPORTING
name = 'Content-Type'
value = 'application/JSON;charset=utf-8'.
lv_auth = ''.
CALL METHOD lc_http_client->request->set_header_field
EXPORTING
name = 'Authorization'
value = lv_auth.
CALL METHOD lc_http_client->request->set_method( 'POST' ).
"发送前数据准备
lv_len = strlen( i_request ).
CALL METHOD lc_http_client->request->set_cdata
EXPORTING
data = i_request
offset = 0
length = lv_len.
*****发送http服务
CALL METHOD lc_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO l_msg
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
*****接收返回数据
CALL METHOD lc_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
CLEAR e_response.
e_response = lc_http_client->response->get_cdata( ).
"获取返回的状态信息
CLEAR: lv_code, lv_reason.
CALL METHOD lc_http_client->response->get_status
IMPORTING
code = lv_code
reason = lv_reason.
/ui2/cl_json=>deserialize( EXPORTING json = e_response
CHANGING data = ls_output ).
IF lv_code = '200'.
SORT ls_output-choices[].
READ TABLE ls_output-choices[] INDEX 1 INTO DATA(ls_out) .
IF sy-subrc = 0.
output_str = ls_out-message-content.
ENDIF.
ELSE.
output_str = '调用失败!'.
ENDIF.
IF abap_flg = 'Y'.
DATA: es_output LIKE zint_ai_post_out.
DATA: lt_table TYPE TABLE OF string.
DATA: lv_row_number TYPE i,
lv_row_number_begin TYPE i,
lv_row_number_end TYPE i.
SPLIT output_str AT cl_abap_char_utilities=>newline INTO TABLE lt_table.
lv_row_number_begin = 0.
lv_row_number_end = 0.
LOOP AT lt_table INTO DATA(ls_table).
lv_row_number = sy-tabix.
IF ls_table CS 'report' OR ls_table CS 'REPORT'.
lv_row_number_begin = lv_row_number.
EXIT.
ENDIF.
ENDLOOP.
lv_row_number_begin = lv_row_number_begin + 1.
LOOP AT lt_table INTO ls_table FROM lv_row_number_begin.
es_output-text = ls_table.
APPEND es_output TO lt_output.
ENDLOOP.
ENDIF.
"关闭接口
CALL METHOD lc_http_client->close.
ENDFUNCTION.
*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
* 获取token失败
表结构

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)