使用LM Studio本地部署AI模型并发布API接口供SAP调用
首先是下载LM Studio。LM Studio作为运行AI的框架,安装简单,用户协议友好,可以方便的通过防火墙实现离线运行。
https://pan.baidu.com/s/1bcU2dKIfvfk4GZVKBEfwMA?pwd=1nku 提取码: 1nku @NathMath
bilibili大佬一键包 度盘:https://pan.baidu.com/s/1hPbaQrIrH7l8lhcUPy6fjg?pwd=NATH
提取码:NATH 谷歌:https://drive.google.com/file/d/1zdfai-
gSIKgpxXuxZtCIM0-LjunqOqia/view?usp=drive_link
内层压缩包解压密码【NathMath@bilibili#39】
---
LM Studio本身可以下载AI模型,如果有小伙伴网络困难,可以直接使用大佬的离线下载。
可选配的推荐模型 DeepSeek R1 8B + 32B 擅长数学推理 + 科研探索 + 逻辑推理
度盘:https://pan.baidu.com/s/1XM_s1uOc89A2Cll8Z6l2EQ?pwd=NATH 提取码:NATH Phi4
擅长英文文本推理 + 数学推理(Phi3.5也值得推荐)
度盘:https://pan.baidu.com/s/1YWaQdfGjUeOEAFEWoeXHiQ?pwd=NATH 提取码:NATH Gemma 9B
擅长通用文本推理 + 文学类文本写作
度盘:https://pan.baidu.com/s/1nCMAxr_BRyzzbWbNw_BxFA?pwd=NATH 提取码:NATH Smegmma
9B 擅长二次元风格的虚拟角色扮演对话 + 无限
度盘:链接:https://pan.baidu.com/s/1pKzIRIVcATqln4NDRJatsg?pwd=NATH 提取码:NATH
花活+无限的推荐模型列表参考(有很多,这里都是UP推荐的好用的模型)
度盘:https://pan.baidu.com/s/1_n_-M7KhdExqgw4kdpYqfA?pwd=NATH 提取码:NATH
---
如果机器性能好,个人推荐使用32B以上的模型,这个最接近于Deepseek R1的能力,虽然只有八九折的样子,但勉强能算生产力了。
下面是大佬的分享站
https://truthful-busby-322.notion.site/NathMath-
LLM-18e45165050a80408586c3f2bf93ce68
启动LM Studio,我们先安装模型。
首先点击下面的Power User,把最左侧一栏的几个图标唤出。
点击左边的放大镜图标可以下载模型(网络问题自行解决)
或者点击文件夹,手动导入模型
注意模型的目录,默认是在C:\Users\\{ 用户名 }\\.lmstudio\models下。
下载好的模型,需要放在models下的【发布者】文件夹下,【模型名】文件夹下。
点击界面右下角齿轮,下载Runtimes,Compatible Only的全部下载。
点击APP Setting,将Local LLM Service启用,这样可以后台运行LM
Studio了(关闭GUI会在托盘生成一个图标继续运行模型,点击托盘图标唤醒GUI)
点击开发者按钮,将模型发布成本地API。LM Studio发布的API兼容OpenAI的API,这会节省不少开发
首先点击setting设置端口号,其他的保持默认即可,可以按照需求选择:
我这里端口设置的2345,拨动Stauts旁边的开关,如果能切换到Running模式,说明这个端口好可以使用,如果不行,就换个端口号试试。端口号需要大于1024。
运行成功后可以看到一个接口的IP地址,各种可以使用的服务也给了出来。后面开发我们使用chat服务进行演示。
接口运行起来了,现在运行模型。还是开发者页面,选择安装好的模型。稍后要在本地跑SAP的Docker,这里就只跑个9B的模型进行演示。
按照需求调整参数,运行。
运行成功是这样的
现在启动SAP。我这里的开发环境是ABAP Trial 2022 SP01,只能在英文环境中开发。
第一版的ABAP AI助手只能在SE38,SE37,SE24和专属事务代码下运行,无法跳转后使用。
程序原理:
可以看到代码编辑区域新增了一个呼出AI助手的按钮,这里是在类CL_CTXMNU_MGR,方法CREATE_PROXY中增强,添加按钮。
FORM add_menu USING menu TYPE REF TO cl_ctmenu .
CALL METHOD menu -> add_functionEXPORTING
fcode = 'AISP'
text = '呼出AI助手' .
ENDFORM .---
点击按钮后触发事件,目前没有找到合适的增强点,在函数USERCOM_INPUT
309行插入命令判断。这个位置可以防止SE37将变量fcode强行变成DUMY
下面是主程序ZAISUPPORTER的开发:
*&---------------------------------------------------------------------**& Modulpool ZAISUPPORTER*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zaisupporter.
FIELD-SYMBOLS: <docking> TYPE REF TO cl_gui_docking_container, <lo_container> TYPE REF TO cl_gui_splitter_container, <input> TYPE REF TO cl_gui_textedit, <output> TYPE REF TO cl_gui_textedit.
CLASS lcl_aisupporter DEFINITION. PUBLIC SECTION.
CLASS-METHODS main.PRIVATE SECTION. CLASS-METHODS handle_sapevent FOR EVENT sapevent OF cl_abap_browser IMPORTING action.ENDCLASS.
CLASS lcl_aisupporter IMPLEMENTATION. METHOD main.STATICS : docking TYPE REF TO cl_gui_docking_container, lo_container TYPE REF TO cl_gui_splitter_container, input_txt TYPE REF TO cl_gui_textedit, output_txt TYPE REF TO cl_gui_textedit.
• MESSAGE 'call AISUPPORTER' TYPE 'S'.
TRY.
IF input_txt IS NOT INITIAL. cl_abap_browser=>close_browser( ).input_txt->free( ). CLEAR input_txt. ENDIF. IF output_txt IS NOT INITIAL. output_txt->free( ). CLEAR input_txt. ENDIF. IF lo_container IS NOT INITIAL. lo_container->free( ). CLEAR lo_container. ENDIF. IF docking IS NOT INITIAL. docking->free( ). CLEAR docking. ENDIF.
CASE sy-tcode. WHEN 'SE38'. docking = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_right extension = 350 repid = 'SAPLS38E' dynnr = '0500' ). lo_container = NEW cl_gui_splitter_container( parent = docking rows = 3 columns = 1 ).
WHEN 'SE37'. docking = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_right extension = 350 repid = 'SAPLSFUNCTION_BUILDER' dynnr = '3000' ). lo_container = NEW cl_gui_splitter_container( parent = docking rows = 3 columns = 1 ).
WHEN 'SE24'. docking = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_right extension = 350 repid = 'SAPLSEO_CLEDITOR' dynnr = '0200' ). lo_container = NEW cl_gui_splitter_container( parent = docking rows = 3...