1、AutoDL上的操作
autoDL每个实例都留了端口6006暴露在外以提供服务,这就给了我们通过这个端口访问部署在AutoDL上的MING的可能性
首先简单编写脚本启动在部署在AutoDL上的model_worker、controller和ming_api_server
import subprocess
import threading
def run_controller():
subprocess.run(["python", "-m", "fastchat.serve.controller", "--host", "0.0.0.0", "--port", "21001"])
def run_model_worker():
subprocess.run(["python", "-m", "fastchat.serve.model_worker", "--host", "0.0.0.0", "--controller-address",
"http://0.0.0.0:21001", "--port", "21002","--model-path", "/root/autodl-tmp/MING-MOE-4B","--model-name", "ming-moe-4B"])
def run_api_server():
subprocess.run(["python", "-m", "ming_api_serve", "--host", "0.0.0.0", "--controller-address",
"http://0.0.0.0:21001", "--port", "6006"])
controller_thread = threading.Thread(target=run_controller)
controller_thread.start()
model_worker_thread = threading.Thread(target=run_model_worker)
model_worker_thread.start()
api_server_thread = threading.Thread(target=run_api_server)
api_server_thread.start()
不过想要访问该接口,需要以SSH隧道方式进行访问
幸运的是,文章autodl一键安装Langchain-Chatchat_langchain-chatglm3一键部署安装包-CSDN博客
中提供了一个ssh端口转发的工具,利用该工具我们便可以将远程服务的端口转发到本地上,并访问本地端口来访问autodl上的接口
把上面的登录指令和密码都复制到工具上
并转发到本地的6006端口,这样向地址http://127.0.0.1:6006/v1/chat/completions发出post请求便可以与AutoDL上的ming_api_server进行通信
可以看到能够正常返回json格式化信息
2、包装消息
MessageWrapper实现了对发送消息和返回的包装,以便序列化为Json
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MessageWrapper {
public String role;
public String content;
}
3、存储聊天消息到数据库中
ChatMessage为消息对应的数据库实体类,与MessageWrapper不同的是,标注了对应用户的id
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@TableName("chat_message")
public class ChatMessage {
@TableId(value = "id",type= IdType.AUTO)
private Integer id;
private Integer userId;
private String role;
private String content;
}
为访问对应数据库表格,建立对应的Mapper
@Mapper
public interface ChatMessageDao extends BaseMapper<ChatMessage> {
@Select("select * from chat_message where user_id=#{userId} order by id asc")
List<ChatMessage> findChatMessageByUserId(Integer userId);
@Delete("delete * from chat_message where user_id=#{userId}")
void clearChatMessageByUserId(Integer userId);
}
该Mapper提供了两个接口,一个是获取指定用户的所有消息记录,一个是清除指定用户的所有消息记录。