前言
我之前使用了 FastGPT + oneAPI 、自主选择模型的方式进行智能客服对话,在开源的产品中,这样的效果是比较 OK 的,由于需要对接微信公众平台,因此,我选择了 chatgpt-on-wechat。
准备工作
docker-compose.yml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| version: "2.0" services: chatgpt-on-wechat: ports: - "8080:8080" image: zhayujie/chatgpt-on-wechat container_name: chatgpt-on-wechat security_opt: - seccomp:unconfined environment: MODEL: "gpt-3.5-turbo"
OPEN_AI_API_KEY: "xxx-xxxx" OPEN_AI_API_BASE: "https://-xxx.xxx.com/api/v1" channel_type: "wechatmp_service" wechatmp_token: "xxx" wechatmp_port: 8080 wechatmp_app_id: "xxx" wechatmp_app_secret: "xxxx" wechatmp_aes_key: "xxx" voice_reply_voice: "True" PROXY: "" HOT_RELOAD: "False" SINGLE_CHAT_PREFIX: '[""]' SINGLE_CHAT_REPLY_PREFIX: "" GROUP_CHAT_PREFIX: '[""]' GROUP_NAME_WHITE_LIST: '[""]' IMAGE_CREATE_PREFIX: '[""]' CONVERSATION_MAX_TOKENS: 1000 SPEECH_RECOGNITION: "False" CHARACTER_DESC: "你是AI机器人, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。" SUBSCRIBE_MSG: "感谢您的关注!😊😉我是人工智能客服,请问有什么可以帮您。" EXPIRES_IN_SECONDS: 3600 USE_GLOBAL_PLUGIN_CONFIG: "True" USE_LINKAI: "False" LINKAI_API_KEY: "" LINKAI_APP_CODE: ""
|
关键点
- 微信公众平台的 Token、EncodingAESKey、appID、appsecret,需要到微信公众平台的后台获取,官方都有介绍我不再追述。
- 需要将容器内部的
wechatmp_port: 8080
映射到外部,issues:1960 。
- 在公众平台开启了消息服务器配置后,微信公众平台会自动关闭自动回复功能,菜单功能等等。需要通过配置 IP 白名单,将当前服务器 IP 添加到白名单中,通过调用接口生成菜单,详情见下文。
- fastGPT 使用的规范是和 OPENAI 的
gpt-3.5-turbo
一致的,所以可以直接使用这个规则进行配置,但是fastGPT
使用的一个独立的设置chatID
,他通过了chatID
来进行会话的判断,但是在 COW 中适配的模型中、包括gpt-3.5-turbo
自身也是没有chatID
这一机制的,issues:1617 、issues:12031 ,在这两个 issues, 能看到有热心网友提供能临时解决这个问题的办法,可以通过源码部署的方式修改代码解决;也能看到两家都不想解决这个问题,我也不想解决,谁有时间去研究一下提一个 PR 吧。
菜单配置
config.py1 2 3 4 5
|
WECHAT_APPID = 'xxx' WECHAT_SECRET = 'xxx' TOKEN = 'xxx'
|
menu.json1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| { "button": [ { "name": "合作方", "sub_button": [ { "type": "view", "name": "入围xxx", "url": "https://xxxxx" }, { "type": "view", "name": "入围xxx", "url": "https://xx.xxx.com/o/xx" } ] }, { "type": "view", "name": "联系客服", "url": "xxxx" } ] }
|
wechat_menu.py1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| import requests import json from config import WECHAT_APPID, WECHAT_SECRET
def get_access_token(appid, secret): url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}" print("发出请求获取 access token") response = requests.get(url) if response.status_code == 200: data = response.json() return data.get('access_token') else: print(f"获取 access token 失败: {response.text}") return None
def create_menu(access_token, menu_data): print("进入create_menu")
url = f"https://api.weixin.qq.com/cgi-bin/menu/create?access_token={access_token}" response = requests.post(url, data=menu_data.encode('utf-8')) if response.status_code == 200: data = response.json() if data.get('errcode') == 0: print("菜单创建成功") else: print(f"菜单创建失败: {data}") else: print(f"请求失败: {response.text}")
print("开始") access_token = get_access_token(WECHAT_APPID, WECHAT_SECRET) print(f"access_token: {access_token}") if access_token: with open('menu.json', 'r', encoding='utf-8') as file: menu_data = file.read() create_menu(access_token, menu_data)
|
执行 wechat_menu.py,注意需要配置 IP 白名单
菜单设置参考文档