X

一分钟拆箱即用的微信公众号服务端+AI Agent框架的保姆级教程-以金融智能助理为例

1. 简介

大模型LLM 应用+AI Agents框架,为我们提供了非常便利的自动化执行任务的能力。微信公众号(订阅号)则是非常适合落地各种AI Agents的场景,我们可以利用微信公众号提供的文本、图像、语音的输入,在自己服务器上部署一套API框架,把自己感兴趣的一些对话、图文、语音等能力的API封装为Agents。这里给大家介绍一个拆箱即用的微信公众号服务端框架 Flask+tencent代码库来实现,并且会利用一个简单的金融智能助理(Finance Agent)的例子来实现一个根据用户输入来查询实时股价,并且返回给微信公众号用户的功能,支持更加复杂定制的AI Agents业务逻辑。

2. 环境准备

开发一个微信公众号(订阅号)的自动回复和AI Agents需要下列准备,包括:

  • 2.1 服务器:可以提供80端口和公共IP的服务器,这样微信公众号后台就可以发送请求到 http://{ip_address}:80/wx 端口,然后你的服务端返回内容给公众号,给用户提供服务。
  • 2.2 python库 flask (提供web服务)
  • 2.3 python库 tencent (提供了三方的API包括封装好的微信服务端验证,文本请求,图像请求等等)。

安装环境可以执行下列命令

 
pip install flask tencent

3. 拆箱即用部署

3.0 服务器上部署Flask+tencent服务端

从github上下载例子,main.py文件地址:

 
wget https://github.com/AI-Hub-Admin/tencent/blob/main/examples/wechat/main.py
python main.py

部署好服务之后,可以通过浏览器访问 http://127.0.0.1:80/wx_home 查看是否部署成功。如果可以看到Hello World的一个html页面就代表服务部署成功了。给微信提供验证的服务入口在 (http://127.0.0.1:80/wx)。



下一步就要在微信官方平台,验证你的服务器可以给公众号提供服务了。

需要保存好 1. 你对外提供的URL: http://{your_ip_address}/wx (80端口从URL里省去) 2. 一个验证用的token,例子代码中 token="dummy",需要填写在下一端的对应位置,你可以修改wechat_constants.py 文件中对应变量

3.1 注册微信公众号

详细的注册和开发流程参考微信公众号开发文档(https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html),但是因为自己第一次部署很容易配置失败,这里给大家分享一些拆箱即用的可以直接上手跑的例子。

a.登录微信平台注册账号

官方网址 (https://mp.weixin.qq.com/) 个人开发者可以先选择订阅号,服务号和企业号都需要公司营业执照等材料。

b. 配置服务器设置

选择:在导航栏选择 "设置与开发-基本配置",在"服务器" 配置项选择修改配置。这里的对话框可以选择填写你的服务端信息。

URL:填写你对外暴露服务的地址 http://{your_ip_address}/wx token:这里先填写 dummy (对应我们的 python例子,可以后续再修改)

最后保存。当你点击保存按钮的时候,微信服务端会给你的地址发一个 GET 请求来验证你拥有服务器,这里如果验证失败了,可以看看python 后台的日志如下图中 (hashcode和signature是否一致).这里验证逻辑被封装到 tencent库的 WechatServerVeriAPI.static_api函数内,感兴趣可以查看 (tencent.contrib.wechat.wechat_api)。保存后点击"启用"就可以从公众号上发消息验证了。

c. 关注公众号并发送文本图片消息

如果部署成功了,你发送文本消息,公众号回复 "hello",如果你发送图片,公众号会把相同图片的mediaid 返回给你,达到回复用户相同图片效果。参考例子main.py文件中对基础文本回复 和 对图像回复,封装在了 WechatTextReplyBaseAPI.static_api 和 WechatImageReplyBaseAPI.static_api 这两个函数里。初次上手微信后台开发的开发者可以不用纠结于request的XML请求的格式细节,只用关注最核心的业务逻辑,获取用户输入,得到输出并返回给用户就好了。

3.2 常见错误

a. 系统发生错误,请稍后重试

因为填写配置错误导致 hash_code和signature计算不同,注意点: 1. URL:不能带端口,一定是固定 服务器, 不能是 http://{your_ip_address}:80/wx 或者是 https://{your_ip_address}:443/wx,这样填写是不行的。 2. token: 只能英文数字,不能有下划线,或者别的符号,这个很容易被忽略。必须为英文或数字,长度为3-32字符。 具体错误原因微信后台没有提供,我们可以从我们 python服务端日志来看出端倪。查看下列flask打印的日志,看看 hashcode 和 signature是否一致不一致就是哪里填错了。

 
handle/GET input data: signature 276a55169e89095bf50db3e8c840836daaa8477e, timestamp 1729407411, nonce 1504589802, echostr 5829305829921636275
handle/GET func: hashcode 276a55169e89095bf50db3e8c840836daaa8477e, signature: 276a55169e89095bf50db3e8c840836daaa8477e

4. 实现自己的金融助理(查询股价)

可以参考代码库(https://github.com/AI-Hub-Admin/tencent)中 examples/tests/ 目录下的 main_finance_agent.py 例子。 微信公众号开发很多对 服务端request的输入输出格式都很复杂,为了简单上手,可以直接继承 WechatTextReplyBaseAPI 基础类,然后主要关心获取用户输入和返回给用户的核心业务逻辑就可以了。

这里金融智能助理为例,我们希望做一个可以查询股票价格的 AI Agents,我们只用自己实现核心业务逻辑就好。完整代码参考例子:

4.1 开发 WechatTextReplyFinanceAPI 类

这个 WechatTextReplyFinanceAPI 类继承自tencent库的 WechatTextReplyBaseAPI 类,我们只用修改入口静态方法 static_api(args, kwargs) 和 process(self, msg) 函数实现业务逻辑就好了。这个类代码如下,其中查询股票代码,我们使用了 FinanceAgent 库(包含了港股A股美国等open api请求股价的函数,也支持Agents式的 tools自动化调用):

 

class WechatTextReplyFinanceAPI(WechatTextReplyBaseAPI):

    @staticmethod
    def static_api(args, kwargs):
        return WechatTextReplyFinanceAPI(None).api(args, kwargs)

    def process(self, msg):
        """
            input: msg is a class of Wechat sent Msg, TextMsg, ImageMsg defined in receive.py file, you can also access other input information 
                    toUser = msg.FromUserName
                    fromUser = msg.ToUserName
            output: str, the outer api method will process and wrap the Message Object
        """
        input_text = msg.Content
        # parse user intent and query stock code from input text, This example, we will use 700 for tencent as example
        ## implement_your_code_here
        stock_info_list = fa.api(symbol_list=['700'], market="HK")
        response_list = []
        for stock_info in stock_info_list:
            response= "%s,股价: %s, 最高价: %s, 最低价: %s, 数据更新时间: %s, 数据源: %s" % (stock_info["symbol"], stock_info["avg_price"], stock_info["high"], stock_info["low"], stock_info["update_time"], stock_info["source"])
            response_list.append(response)
        output_text = ";".join(response_list)       
        return output_text

需要重写的函数:

  • static_api是为了其他module 使用时候,不用实例化直接通过类Classname.static_api 来调用函数,注意这里要修改对应的类名字 (WechatTextReplyFinanceAPI)
  • process() 是包含具体的处理用户请求的逻辑:输入是一个 Msg对象(从微信请求的xml请求体转化来的),我们通过 msg.Content 获取用户输入的文本。返回的是你希望回传给用户的 字符串(str),比如腾讯(股票代码: 700)的股价总结。

在Flask对应的 /wx方法的Flask 函数主入口,把原先的 WechatTextReplyBaseAPI.static_api(args=[recMsg], kwargs={}) 替换为你实现的金融服务的函数就好了。WechatTextReplyFinanceAPI.static_api(args=[recMsg], kwargs={})。点击运行,再给你的公众号发送消息。如果成功你就可以看到查询的腾讯的最新股价了。


参考文档

Comments

Write Your Comment

Upload Pictures and Videos