一、开通和配置ECS
1、 创建ECS实例(以Ubuntu系统为例),作为登录数据库的客户端。设置ECS用户名及登录密码(使用ecs-user登录,如果使用root安装,后续部分安装包会提示有权限风险)。
2、 设置安全组配置,配置出方向端口22,并在源IP中加入本机IP。
3、 本机ssh到云ECS。
二、构建自己的知识库+LLM
1、 根据产品指导书,开通Lindorm知识库+LLM实例,并根据指导书导入或SQL方式写入自己的知识文档,完成知识库的构建。该方案安装部署LLM非常简便,仅需一条简单的SQL命令即可完成安装。
2、 将ECS客户端IP加入到Lindorm数据库白名单,确保ECS可以正常访问Lindorm数据库。可以在ECS上安装Lindorm CLI客户端进行测试。
3、 在ECS上安装phoenixdb(用于连接数据库):pip install phoenixdb==1.2.0
注意:有些系统版本在安装时,可能会报错“subprocess.CalledProcessError: Command 'krb5-config --libs gssapi' returned non-zero exit status 127”,原因是缺乏安装依赖,需执行如下命令后再安装:sudo apt-get -y install gcc libkrb5-dev
三、申请钉钉机器人
1、 在钉钉上申请钉钉机器人:选择一个群,点击右上角的“群设置”按钮,选择“机器人”进行添加。
2、 根据文档说明,完成机器人申请:
3、 机器人申请成功后,完成基础设置。其中消息接受模式选择“HTTP模式”;配置消息接受地址:将IP设置为前面申请的ECS大网IP,服务端口号设置为自定义好的端口号(本文以5000为例,后面的钉钉post程序中也需配置为该端口)。
四、编写钉钉机器人post程序
说明:该程序运行在ECS上,用于响应钉钉机器人从钉钉上获取的信息,进行应答。
1、 在ECS上安装dingtalkchatbot、fastapi、uvicorn:pip install dingtalkchatbot fastapi uvicorn
2、 编写钉钉机器人服务端程序(Python脚本),示例:
#!/bin/python3# -*- coding: utf-8 -*-importosfromfastapiimportFastAPI, Requestfromdingtalkchatbot.chatbotimportDingtalkChatbotimportuvicornimportjsonimportloggingimportphoenixdbfromconfigs.dingtalk4lindormimport*# global env:如下配置正式使用时请放在单独的配置文件中,如:dingtalk4lindorm# 这里的链接地址与lindorm-cli的链接地址比,需要去掉http之前的字符串#LINDORM_URL = "http://ld-XXXX-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060"#LINDORM_USER_NAME = 'XXXX'#LINDORM_USER_PW = 'XXXX'#LLM_MODEL = 'XXXX'# 连接到lindorm数据库defconnect(kw_args): try: returnphoenixdb.connect(LINDORM_URL, autocommit=True, **kw_args) exceptAttributeError: print("Failed to connect") # logerlogging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='/tmp/test.log', filemode='w') logger=logging.getLogger(__name__) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') # init FastAPI appapp=FastAPI() # 使用FastAPI的装饰器定义路由post("/generate") .asyncdefgenerate_response(request: Request): # 读取请求的JSON数据json_post_raw=awaitrequest.json() json_post=json.dumps(json_post_raw) json_post_list=json.loads(json_post) # 获取请求中的输入文本和会话Webhookprompt=json_post_list.get('text').get('content') session_webhook=json_post_list.get('sessionWebhook') logger.info("prompt: %s, session webhook is: %s "% (prompt, session_webhook)) print(session_webhook) # 连接Lindorm数据库,调用AI数据服务平台SQL查询接口,获取Lindorm知识库问答结果# 用户名通过lindorm_user字段传递,密码使用lindorm_password字段设置,database字段设置连接初始化默认数据库。connect_kw_args= {'lindorm_user': LINDORM_USER_NAME, 'lindorm_password': LINDORM_USER_PW, 'database': 'default'} connection=connect(connect_kw_args) msg=""withconnection.cursor() asstatement: # 查询sql_select="select ai_infer('%s', '%s')"% (LLM_MODEL , prompt) # print(sql_select)statement.execute(sql_select) response=statement.fetchall() msg=response[0][0] #查询返回是list格式,需要取list[0][0],转换为str格式# print("LLM response:", msg)logger.info("LLM return: %s"%msg) connection.close() # 实例化钉钉机器人对象dingtalk_chatbot=DingtalkChatbot(session_webhook) returndingtalk_chatbot.send_markdown(title='数据库百事通', text=msg) # 启动FastAPI应用if__name__=='__main__': uvicorn.run(app, host='0.0.0.0', port=5000, workers=1)
代码详解:
Lindorm提供了类JDBC的连接和使用方式,使用起来非常简便。对于知识库和LLM的调用,直接使用SQL查询方式即可返回LLM的问答结果,将返回的内容进行格式化整理即可:
sql_select = "select ai_infer('%s', '%s')" % (LLM_MODEL , prompt)
statement.execute(sql_select)
response = statement.fetchall()
msg = response[0][0] #查询返回是list格式,需要取list[0][0],转换为str格式
3、 配置服务端口(本文设置为5000,见上述代码。也可以自定义端口,注意和钉钉机器人配置以及代码中保持一致),配置安全组,放通入方向IP。初始调试的时候,可以配置为0.0.0.0/0,以免因为网络配置导致程序不通。调测成功后再修改为钉钉机器人服务器对应的IP(见步骤5)。
4、 运行脚本:nohup python3 dingtalkpost.py &
5、安全组入方向IP获取方法:上述步骤使用nohup方式运行脚本后,会在该脚本所在目录下生成一个“nohup.out”日志文件,该文件内会记录调用钉钉机器人的源端IP,比如:
INFO: 59.82.84.108:15922 - "POST /generate HTTP/1.1" 200 OK
持续使用一段时间后,通过分析该日志文件中的源端IP,即可获取到调用钉钉机器人的IP信息,从而配置安全组。如上示例,可配置59.82.0.0/16,见:
五、效果展示
在钉钉群中添加所申请的机器人,并@该机器人进行智能问答。则可以回答涉及私域知识的问题。
六、必薅羊毛
对于喜欢研究学习LLM、AIGC、知识库、智能问答、文生图等方面的爱好者,或想借助AIGC能力用于工作、学习中的人,发现阿里云最近有系列AIGC相关的优惠活动推出。
在此推荐一个智能问答、文生图相关的AIGC优惠活动:秒级开通,仅60元/月,即刻畅享私域知识库+LLM智能问答系统。该系统可以直接玩开源LLM、还可以上传自己的私域文档构建自己的知识库,文生图应用貌似也要上线了。
新用户首次开通还可获得100元猫超卡奖励,目前该奖励活动还在有效期内,手慢无。
活动链接:https://www.aliyun.com/activity/ambassador/Lindorm
开通后,即刻就能使用,界面截图:
附录
钉钉post程序示例:
https://code.alibaba-inc.com/pangshaoting.pst/PST/blob/master/dingtalk4lindorm.py
参考:
https://code.alibaba-inc.com/yeyan.wy/langchain-ChatGLM-dingdingbot/blob/master/dingbot.py