ChatGLM接入微信公众号(cpolar的使用)
一,尝试
继上利用frp加上阿里云服务器,借助公网ip实现内网穿透,再加上申请域名,解析云服务器,再frp上建立http连接,但是由于阿里云免费的服务器,不支持备案,所以域名解析的服务器无法通过域名访问,所以我尝试去购买便宜的香港的服务器免去备案的麻烦,但是连接完之后,token依旧验证失败。
二,方法
2.1 解决验证问题
我的连接问题我认为很大概率是我的域名和服务器的问题,所以得找到一个替代省去麻烦,最好就是找一个内网穿透的工具,可以建立http连接并且能够提供备案域名实现连接。
2.2 cpolar的使用
我看到b站视频cpolar,这个工具可以免费进行内网穿透并提供备案域名,但是备案域名只是24h内随机域名,需要固定域名可以购买基础套餐
进入cpolar的官网
cpolar - secure introspectable tunnels to localhost
登录注册之后
按照图片要求操作,下载对应版本的cpolar,解压缩之后,连接自己的账户
./cpolar http 80
开放端口进入
实际效果应该是这样
只需要将对应的连接80端口的提供好的给你的域名,填入微信公众号验证就行,在加上token的验证代码,上一个文章也有,我粘贴部分
def wechat():
timestamp = request.args.get("timestamp")
nonce = request.args.get("nonce")
echostr = request.args.get("echostr")
signature = request.args.get("signature")
if request.method == "GET":
if not all([signature, echostr, nonce, timestamp]):
abort(404)
li = [wechatToken, timestamp, nonce]
li.sort()
tmp_str = "".join(li)
sign = hashlib.sha1(tmp_str.encode("utf-8")).hexdigest()
if signature != sign:
abort(403)
else:
return echostr
因为微信在给你发送验证请求的是get请求,所以分开执行后面的post发送也会比较方便
2.3 验证成功
输入对应的网址和运行代码就可以验证成功
对应的也会有这个显示,代表了验证成功,可以去对接微信接口进行开发
三, 运行ChatGLM
3.1 公众号的选择
因为当时在创建公众号的时候并没有过多的考虑,不经过微信认证的公众号所开的接口十分有限,在消息回复当中只有自动回复的接口可以使用。可以在接口权限中找到,我放一下我自己的公众号。
3.2 实现聊天
github老哥的代码 ,完整代码在
pli2014/chatGLM-wechat: 【技术篇】个人微信公众号对接chatGLM-6B (github.com)
我截取部分
xml = request.data
if xml:
try:
msg = parse_message(xml)
print("message from wechat msg:{}".format(msg))
t1 = Thread(target=asyncTask, args=(msg.source, msg.content))
t1.start()
这里是一个xml的一个解析,此刻一定要注意,老哥的代码使用的是明文模式,不能选择其他模式,否则就会出现找不到MsgType的情况,这个也弄了我好长时间,此处老哥的代码是一个线程运行,调用asyncTask的函数,后面的就是传进函数的参数,然后线程执行
问题1 老哥的代码使用权限问题
无论是这种
tokenizer = AutoTokenizer.from_pretrained("model/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("model/chatglm-6b", trust_remote_code=True).float()
def asyncTask(userId, content):
print("ask a quesion with userId:{}, content:{}".format(userId, content))
response, history = model.chat(tokenizer, content, history=[])
print("chat-GLB replay:{}".format(response))
reply = create_reply('这是条文字消息', msg)
return reply.render()
还是这种
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).float()
def asyncTask(userId, content):
print("ask a quesion with userId:{}, content:{}".format(userId, content))
response, history = model.chat(tokenizer, content, history=[])
print("chat-GLB replay:{}".format(response))
client.message.send_text(userId, response)
里面涉及到的消息转发的函数微信认证的公众号都不可以使用,所以我们需要利用xml的格式进行post转发
xml = request.data
if xml:
try:
xml = ET.fromstring(request.data)
fromUser = xml.find('FromUserName').text
toUser = xml.find('ToUserName').text
msgType = xml.find("MsgType").text
createTime = xml.find("CreateTime")
content = xml.find('Content').text
xml_sta = '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>'
GLM_Reply = reply(content)
res = make_response(xml_sta % (fromUser, toUser, str(int(time.time())), GLM_Reply))
res.content_type = 'application/xml'
return res
这样就不会报,没有接口权限的错误了
3.3 问题
进行到这里,依旧出现了一个问题,当我向客户端发送你好的时候,GLM也作出了回答,但是传递公众号上却不显示,问题的点在于没有报错,所以也没弄明白原因,并且CPU和内存的占有率非常高,但是GPU性能却一点没用,也让我很困惑
这个CPU和内存访问超时的问题已经解决,核心就是在接口的调用错误,阿里云机器学习平台的现存是32G完全够用,然而老哥的代码时使用CPU本地部署,而且微信公众号也是微信认证的。
应仿照官方文档调用模型
问题1 因为是否可能是这个响应的问题超过五秒了,服务器拒绝了
这个问题已经有方法了,如果你们需要接入微信公众号,那么就必须要进行微信认证,获得24h的客服回复接口,才能避免生成结果超过5s的问题。
问题2 在尝试调用ChatGLM的api也会有响应问题,通过建立流式api,但在服务器运行过程中卡住,这个问题也没有解决,运行卡住了