手把手教你使用Dify on wechat搭建基于Gewechat架构的聊天机器人

1. 简介

随着AI技术不断下沉和大语言模型(LLM)的发展,享受AI带来便利的门槛越来越低,大厂、大模型团队的网页版和移动端APP都有简洁友好的UI界面。但平时日常使用中,微信无疑是使用频率最高的,在使用微信沟通时,如果需要使用LLM来辅助,就需要在不同APP之间切换多次,并不够有效率,如果能在微信中使用LLM,就能大大提高效率。

在GIthub上由hanfangyuan4396大佬发布的Dify on wechat项目可以很好的实现这个效果,通过对接微信与LLM,就可以实现AI自动回复等功能。

与其他类似项目相比,该项目的优势主要有2个,第一是可以通过使用Gewechat项目(由Devo919大佬发布)使用Ipad协议登录,相比Ichat协议更加稳定;第二是可以通过Dify平台,使用个人搭建的Chatbot或Agent(智能体)来处理收到的信息,还可以通过本地部署Dify平台和LLM搭建本地知识库或在Chatbot中调用,或使用Dify平台中的插件,以实现即时信息的AI搜索等功能。

本教程以基于Docker部署的方式,通过在本地部署Dify、Gewechat和Dify on wechat,实现搭建一个微信聊天机器人。

##请遵守微信风控相关规定并文明上网,本教程无法确保微信账号安全或因使用相关项目所带来的任何后果。

2. 前期准备

2.1硬件准备

一台能够运行Docker环境的计算机,处理器不少于2Core,内存(Ram)不少于4G,系统可以是Linux,Windows或Mac,如需机器人任何时间都能响应,请不要关闭部署项目的计算机。

##如需要本地部署LLM,请根据模型规模选择。

##理论上可以使用与你同城市的云服务器。

2.2环境准备

可以安装Docker,Docker在Linux,Windows和Mac系统上的安装都非常简单,本教程不再赘述。

##也可以查阅相关文档使用其他方式部署。

一个实名认证的微信账号,鉴于日常使用的微信账号需要在多设备上登录或联系人数量较多等因素,建议单独开设一个微信账号,即通常所说的“小号”。

##如小号触发风控可能会提醒,如果多次触发风控,可能会封禁,个别情况下可能影响同实名认证的大号使用,故请务必注意遵守相关规定。

一个DIfy平台可以通过API调用的在线或本地LLM,基本常见的模型都可以,包括但不限于ChatGPT、LLama、Qwen、Deepseek等。

3. 部署过程

本教程均以Ubuntu系统为例,按照Gewechat、DIfy平台和Dify on wechat的顺序进行部署,Windows平台我只部署了Gewechat用于测试,是完全能够正常运行的。

因为涉及多个项目,且多个项目之间会互相调用,可以理解成使用gewechat创建虚拟IPad设备和供机器人调用的框架,使用Dify on wechat来部署一个机器人对虚拟IPad进行监控并操作,使用Dify创建AI实例,给机器人注入灵魂。

3.1 Gewechat部署

Gewechat是个人微信免费开源框架,支持二次开发、任意语言都可接入,Restful API接入,该框架无需用户安装电脑微信,无需安装手机破解插件,只需扫码登录即可使用,操作简单。功能也非常丰富,除了简单的聊天外,还能实现群管理及好友管理、设置好友备注、邀请好友统计、拉好友进群等操作。

3.1.1 Docker部署

部署Gewechat项目非常简单,这里推荐大佬 @1H 重构的镜像,让gewe镜像不依赖cgroup和docker --privilege可以在更高版本的ubuntu,debian以及macos系统上运行。

Pull代码如下:

docker pull registry.cn-chengdu.aliyuncs.com/tu1h/wechotd:alpine

docker tag registry.cn-chengdu.aliyuncs.com/tu1h/wechotd:alpine gewe

启动代码如下:

mkdir -p /root/temp

docker run -itd -v /root/temp:/root/temp -p 2531:2531 -p 2532:2532 --name=gewe gewe

#将容器设置成开机运行

docker update --restart=always gewe

3.1.2 测试API调用功能

部署Gewechat之后,需要配置API服务调用,Gewechat的API服务调用地址是http://{你的ip地址}:2531/v2/api/{接口名}。文件下载地址是http://{你的ip地址}:2532/download/{接口返回的文件路径}。点击API接口文档可以查看详细的调用方式。这里要说明一下,是指上级路由分配给配置Gewechat设备的地址,通常是192.168.x.x格式的,不能填写本地默认地址127.0.0.1或者Docker分配给容器的IP地址。

打开API接口文档后,需要先通过POST方式检验API服务是否可用,并且需要通过POST方式记录几条非常重要的字符串。

第一步要获取Gewechat的Token,没有Token是不能被其他项目调用的。API接口文档中已经给出了POST的参数设置,以Ubuntu为例,可以直接使用cURL命令进行POST。代码如下:

curl --location --request POST '{你的IP地址}:2531/v2/api /tools/getTokenId'

如果POST请求成功,会返回

{

  "ret": 200,

  "msg": "操作成功",

  "data": ""

}

其中data:后面就是Gewechat的Token,请将该{ {gewe-token}}进行记录,后面部署Dify on wechat时需要填写。

第二步要获取登录二维码,这一步同时会获取appID这个字符串,该字符串也非常重要,可以理解为Gewechat会分配一个虚拟的Ipad给用户,每个虚拟的Ipad都有一个appID,这样等于可以在一个私有的设备上进行登录小号,每次登录的设备相同,不容易触发风控。所以请务必记录。代码如下:

curl --location --request POST '{你的IP地址}:2531/v2/api /login/getLoginQrCode' \

--header 'X-GEWE-TOKEN: { {gewe-token}}' \

--header 'Content-Type: application/json' \

--data-raw '{

    "appId": ""

}'

如果POST请求成功,会返回(示例)

{

  "ret": 200,

  "msg": "操作成功",

  "data": {

    "appId": "wx_wR_U4zPj2M_OTS3BCyoE4",

"qrData": "http://weixin.qq.com/x/4dmHZZMtoLbHoLZwd1wE",

  "qrImgBase64":

"data:image/jpg;base64,……(二维码图片base64,略)

    "uuid": "4dmHZZMtoLbHoLZwd1wE"

  }

}

再次提示:请记录"appId"和"uuid"。

这一步成功,说明Gewechat框架已正常运行,不放心的话,可以将"qrData"中的地址生成二维码图片(可以使用网页版),用手机扫码登录,当看到微信界面最上方出现“IPad微信已登录”即说明登录成功。

如果已进行了登录,记得在测试成功后退出登录:

curl --location --request POST '/login/logout' \

--header 'X-GEWE-TOKEN: { {gewe-token}}' \

--header 'Content-Type: application/json' \

--data-raw '{

    "appId": ""

}'

3.2 Dify平台部署

3.2.1下载和部署DIfy项目

    使用git命令,克隆Dify项目:

cd /

mkdir -p /dify

git clone https://github.com/langgenius/dify.git

启动 Dify 服务器的最简单方法是运行官方提供的 docker-compose.yml 文件:

cd dify/docker   #进入dify目录下的docker目录

cp .env.example .env   #将.env.example复制为.env文件

docker compose up -d   #启动容器

##Dify会使用到80端口,如果你的Linux系统安装了Nginx,Nginx也会占用80端口,你可以在 docker-compose.yml 修改端口,也可以自行调整nginx端口号。

3.2.2设置Dify的WebUI

启动后,可以通过访问本机IP进入Dify平台的WebUI。进入WebUI后需要先注册一个账号,因为是本地部署,填写邮箱和密码注册即可。

##如你打算在公网上使用Dify平台,请保证合适的密码强度。

登录DIfy平台后会发现空空如也,这时的平台既没有创建任何实例,也没有调用任何LLM,需要进行设置。点击右上角账号名称处,点击设置,再点击模型供应商,选择你有的模型,然后输入Api-key和Url等信息就可以了,也支持ollama部署本地模型,这些信息在模型官方页面中很容易查到,如果需要调用本地模型,请通过Ollma添加,这里不再赘述。

3.2.3添加AI实例

添加模型之后,就可以创建AI实例了。点击进入“工作室”,然后选择“创建空白应用”。之后可以从“聊天助手”“Agent”“文本生成应用”“Chatflow”“工作流”中选择一个,下面就以“Chatflow”为例,简要介绍一下编排过程,达到一个模型分类回答的效果。

第一步,选择Chatflow,输入你喜欢的应用名称和描述(选填),并选择图标,点击确定。

第二步,这时会进入编排Chatflow的界面,系统会自动生成一个最简单的Chatflow,即“开始——LLM——直接回复”,流程就是将用户输入的内容交给大模型处理,然后进行回复。但是因为通常LLM中的知识不会即时更新,所以当需要问一些最近发生的事情时,LLM并不能直接回答,所以下面需要通过Chatflow来实现联网搜索功能。

第三步,编排工作流,在开始后添加一个问题分类器,先调用LLM对用户的问题进行分析,根据给定的提示词进行分类,例如我分了2类,第一种是模型已知的内容,第二种是需要搜索才能获取的即时数据,你也可以根据需要再进行细分。对于模型已知内容,让LLM直接回答,之后进行回复;对于需要搜索的即时数据,再添加一个搜索工具,Dify自带很多搜索工作,我这里使用了“TAVILY SEARCH”,需要在TAVILY SEARCH的网站上进行注册,每月可以免费使用额度有1000个单位。之后再将搜索工具查询的信息交给LLM进行综合汇总,按照易读的格式进行输出。

下面说一下编排过程中的参数设置。

问题分类器:模型选择需要的模型,输入变量选择“开始{x}sys.query”,对于对中文识别好的模型,分类内容可以直接用中文输入。

LLM模块:模型选择需要的模型,SYSTEM中输入提示词:“对‘内容’进行回复”并点击{x}插入变量,选择“开始{x}sys.query”来替换提示词中的‘内容’,开启记忆功能以实现追问。

TAVILY SEARCH模块:查询中选择“开始{x}sys.query”,其他内容根据需要进行设定,如果不想使用过多的AI搜索免费额度,可以调整最大结果数。

直接回复模块:选择对应的LLM输出—LLM/{x}text。

至此,Dify平台WebUI部分工作设置完成,编排过程中可以点击预览进行调试,调试完毕后记得点击发布来保存,否则之前的工作全部白费了。

3.3部署Dify on wechat

3.3.1 Docker部署

部署Dify on wechat同样非常简单,首先需要使用git来拉取该项目最新的源码。代码如下:

mkdir -p /dify-on-wechat

git clone https://github.com/hanfangyuan4396/dify-on-wechat

cd dify-on-wechat/docker # 进入docker目录

3.3.2 配置DIfy on wechat

先复制设置文档模板:

cp ../config-template.json ../config.json

编辑设置文档,配置文档具体内容如下:

# dify config.json文件内容示例

"dify_api_base": "https://api.dify.ai/v1", # dify base url

"dify_api_key": "app-xxx", # dify api key

"dify_app_type": "chatbot", # dify应用类型 chatbot(对应聊天助手)/agent(对应Agent)/workflow(对应工作流),默认为chatbot

"dify_convsersation_max_messages": 5, # dify目前不支持设置历史消息长度,暂时使用超过最大消息数清空会话的策略,缺点是没有滑动窗口,会突然丢失历史消息,当设置的值小于等于0,则不限制历史消息长度

"channel_type": "gewechat", # 通道类型,默认wx为个人微信,需要改为gewechat

"gewechat_token": "{gewe-token}",  # 填写之前Post Gewechat框架返回的token

"gewechat_app_id": "{appid}", # 填写之前Post Gewechat框架返回的appid

"gewechat_base_url": "http://{你的IP地址}:2531/v2/api",      # API地址

"gewechat_callback_url": "http://{你的IP地址}:9919/v2/api/callback/collect", # 回调地址

"gewechat_download_url": "http:// {你的IP地址}ip:2532/download" # 文件下载地址

"model": "dify", # 模型名称,当前对应dify平台

"single_chat_prefix": [""], # 私聊时文本需要包含该前缀才能触发机器人回复,如不希望机器人对所有消息都回复,请添加前缀

"single_chat_reply_prefix": "", # 私聊时自动回复的前缀,用于区分真人

"group_chat_prefix": ["@bot"], # 群聊时包含该前缀则会触发机器人回复,可以将"bot"改为小号昵称

"group_name_white_list": ["ALL_GROUP"], # 机器人回复的群名称列表,"ALL_GROUP"为所有群。

"image_recognition": true, # 是否开启图片理解功能,需保证对应的dify应用已开启视觉功能

"speech_recognition": true, # 是否开启语音识别

"voice_reply_voice": true, # 是否使用语音回复语音

"always_reply_voice": false, # 是否一直使用语音回复

"voice_to_text": "dify", # 语音识别引擎

"text_to_voice": "dify" # 语音合成引擎

}

3.3.3 启动Docker容器

使用docker compose启动容器

docker compose up -d # 启动docker容器

docker logs -f dify-on-wechat # 查看二维码并登录

这时候应该能看到登录的二维码了,等待登录后,继续查看一下控制器中的内容,如果回调地址设置成功,且没有报错的话,就说明登录成功,快用微信向作为BOT的微信小号发消息试试吧。