![](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312211746065.jpg)
微信机器人(2):自动回复源码分析
上节回顾
前情提要
上一节,我们通过接入讯飞星火大语言模型的形式,实现了一个拥有大语言模型能力的自动回复机器人,本节我们来重点看一下自动回复机器人的实现逻辑,为我们后续的自定义机器人打好理论基础。
项目结构
首先我们从整个项目的文件结构上,对代码有一个整体印象。
![](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312121007444.png)
- 项目通过
app.py
中的run()
函数启动 channel
文件夹中主要是项目支持的渠道逻辑,比如微信、飞书、微信公众号、企业微信等bot
文件夹中主要存放的是项目现已支持的大模型 比如ChatGPT、OpenAI、百度文心一言、讯飞星火等bridge
文件夹中是桥接channel 和bot的一些逻辑
项目启动
1.我们通过app.py
文件分析一下项目的启动流程
def run():
try:
# load config
load_config()
# ctrl + c
sigterm_handler_wrap(signal.SIGINT)
# kill signal
sigterm_handler_wrap(signal.SIGTERM)
# create channel
channel_name = conf().get("channel_type", "wx")
if "--cmd" in sys.argv:
channel_name = "terminal"
if channel_name == "wxy":
os.environ["WECHATY_LOG"] = "warn"
# os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT'] = '127.0.0.1:9001'
channel = channel_factory.create_channel(channel_name)
if channel_name in ["wx", "wxy", "terminal", "wechatmp", "wechatmp_service", "wechatcom_app", "wework", const.FEISHU]:
PluginManager().load_plugins()
# startup channel
channel.startup()
except Exception as e:
logger.error("App startup failed!")
logger.exception(e)
if __name__ == "__main__":
run()
首先第 4 行代码通过load_config() 将配置文件
config.json
配置文件加载到项目中然后第 11、20 行,通过配置文件中配置的
channel_type
字段,通过channel_factory去创建一个对应的channel最后第 25 行 ,调用对应
channel
的startup()
函数启动
channel
下面我们重点看一下channel模块组成,以及WechatChannel(个人微信)对应的startup 的逻辑
![](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312111716401.png)
- 从红框 1 可以看出这个项目支持的渠道有 飞书、命令行、微信、微信公众号、企业微信等
- 从红框 2 可以看出 个人微信渠道的实现是通过
itChat
这个库来实现的,可以通过 itChat详细了解 - 通过代码我们可以看出WechatChannel 继承自 ChatChannel,我们可以在chatChannel 中查看详细的消息回复部分逻辑
消息回复
回复消息的创建逻辑实现在ChatChannel 的 _generate_reply() 函数中,如下图
![image-20231211172859219](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312111729574.png)
我们重点查看红框部分可知,replay的构建通过父类的 build_replay_content() 函数实现,在ChatChannel 的父类 Channel 中
![image-20231211173122682](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312111731268.png)
我们继续追踪代码,可以发现,回复的消息最终通过一个具体的 bot进行创建
![image-20231211173307327](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312111733764.png)
bot
下边我们来查看下项目中 bot部分的组成
![image-20231211173644904](https://cdn.jsdelivr.net/gh/upfind/pic-cloud/pic/202312111736194.png)
从bot 部分截图我们可知,该项目现已支持的机器人有 百度文心一言、chatGPT、LinkAI、openAI、讯飞星火等,通过分析XunFeiBot 可知,机器人的实现主要通过继承 Bot类,实现replay()函数来实现 由此,整个项目的核心流程我们已经分析完了,下边我们做一个总结
总结
以微信渠道搭配讯飞星火大模型为例
在启动过程中,首先通过
config.json
配置文件中的 **"channel_type": "wx"**确定使用微信渠道,使用 **"model": "xunfei"**确定使用讯飞星火大语言模型。在WechatChannel的
startup
函数中,使用itChat 库来模拟微信的PC端登录,监听微信消息。微信截图_20231212102545 在收到消息后,通过Bridge中的
fetch_reply_content()
找到配置的对应的 XunFeiBot机器人去回复消息。