本文描述在阿里云上从0开始构建一个LLM智能问答钉钉机器人。LLM直接调用了阿里云百炼平台提供的调用服务。
一、开通和配置ECS
1、创建ECS实例(以Ubuntu系统为例),作为登录数据库的客户端。设置ECS用户名及登录密码(使用ecs-user登录,如果使用root安装,后续部分安装包会提示有权限风险)。
2、设置安全组配置,配置出方向端口22,并在源IP中加入本机IP。
3、本机ssh到云ECS。
二、申请钉钉机器人
1、在钉钉上申请钉钉机器人:选择一个群,点击右上角的“群设置”按钮,选择“机器人”进行添加。
2、根据文档说明,完成机器人申请:
3、机器人申请成功后,完成基础设置。其中消息接受模式选择“HTTP模式”;配置消息接受地址:将IP设置为前面申请的ECS大网IP,服务端口号设置为自定义好的端口号(本文以5000为例,后面的钉钉post程序中也需配置为该端口)。
三、开通百炼LLM调用服务
LLM可以自己安装,也直接使用云上提供的LLM调用服务。比如,阿里云百炼平台就提供了业界常用的系列LLM调用服务。无需自己安装,开通百炼服务,并[创建一个API KEY](https://bailian.console.aliyun.com/?tab=model#/api-key)就能实现调用。而且调用格式支持OpenAI方式,如下是百炼的一个官方示例:
import os from openai import OpenAI client = OpenAI( # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) completion = client.chat.completions.create( # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models model="qwen-plus", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "你是谁?"}, ], # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False) # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错 # extra_body={"enable_thinking": False}, ) print(completion.model_dump_json())
四、编写钉钉机器人post程序
说明:该程序运行在ECS上,用于响应钉钉机器人从钉钉上获取的信息,进行应答。
1、在ECS上安装所需的包:pip3 install dingtalkchatbot fastapi uvicorn openai dotenv
2、编写钉钉机器人服务端程序(Python脚本)。
#!/bin/python3 # -*- coding: utf-8 -*- import os from fastapi import FastAPI, Request from dingtalkchatbot.chatbot import DingtalkChatbot import uvicorn import json import logging from openai import OpenAI from dotenv import load_dotenv load_dotenv() # 加载 .env 文件,API Key等私密信息存放在.env 文件中 #DASHSCOPE_API_KEY = "sk-695xxxxx" # 填入用户在百炼上创建的API KEY # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger("dingbot") client = OpenAI( # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) # init FastAPI app app = FastAPI() # 使用FastAPI的装饰器定义路由 @app.post("/generate") async def generate_response(request: Request): # 读取请求的JSON数据 json_post_raw = await request.json() json_post = json.dumps(json_post_raw) json_post_list = json.loads(json_post) # 获取请求中的输入文本和会话Webhook prompt = 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) # 调用LLM,获取问答结果 response = client.chat.completions.create( # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models model="qwen-plus", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt}, ], # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False) # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错 # extra_body={"enable_thinking": False}, ) msg = response.choices[0].message.content # 实例化钉钉机器人对象 dingtalk_chatbot = DingtalkChatbot(session_webhook) return dingtalk_chatbot.send_markdown(title = '千问AI助理', text = msg) # 启动FastAPI应用 if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=5000, workers=1)
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,见:
五、效果展示
在钉钉群中添加所申请的机器人,并@该机器人进行智能问答。