Giter VIP home page Giter VIP logo

jeff-tian / bedrock Goto Github PK

View Code? Open in Web Editor NEW
4.0 3.0 1.0 694 KB

微信公众号自动回复机器人,基于 AWS Bedrock GenAI 服务。微信关注“哈德韦”即可体验。AWS Bedrock GenAI based auto reply robot for wechat public number.

Home Page: https://zhuanlan.zhihu.com/p/674125115

License: MIT License

JavaScript 98.94% Dockerfile 1.06%
aws-bedrock claude-ai gen-ai wechat-public-number

bedrock's Introduction

bedrock


调用 AWS Bedrock 服务,为微信公众号消息提供自动回复功能。

体验

关注“哈德韦”公众号,发送任意消息即可体验。

效果如下图所示:

为什么有这个库

微信公众号提供了自动回复功能,但是不够智能,只能根据关键字进行回复。这个库可以让你的公众号更加智能,可以根据用户的消息内容,调用 AWS Bedrock 服务,得到更加智能的回复。当然,关键字回复也是同时支持的,即使 AWS Bedrock 服务没有响应,也会回复提前设置好的关键字回复。

即该库在微信公众号自动回复的基础上,增加了智能回复的功能。是一个 AI 增强的微信公众号自动回复库。

难点

调用 AWS Bedrock 服务本身并不难,难点在于微信服务器的限制。微信服务器只等待 5 秒,如果超过 5 秒没有响应,就会重试。而最多重试 3 次,如果 3 次都没有响应,用户就会收不到回复。而微信服务器等待 5 秒的时间,是包括网络传输的时间的,所以,实际上,从接收到微信服务器发来的消息,一次只有不到 5 秒的时间来响应。而 AWS Bedrock 服务的响应时间很可能超过 5 秒,所以,这里使用了缓存,如果是同一消息,就不再调用 AWS Bedrock 服务,而是等待上次的调用结果。如果到第 3 次还没收到 AWS Bedrock 服务的响应,那就只能回复提前设置好的关键字回复了(当然,在这时,可以带上一个链接,允许用户稍后查看回复结果)。

时序图

有时候,AWS Bedrock 服务的响应很快,时序图如下:

sequenceDiagram
    participant 微信用户
    participant 微信服务器
    participant 本项目
    participant AWS Bedrock 服务
    微信用户 ->> 微信服务器: 发送消息
    微信服务器 ->> 本项目: 发送消息
    本项目 ->> AWS Bedrock 服务: 发送消息
    AWS Bedrock 服务 ->> 本项目: 回复消息
    本项目 ->> 微信服务器: 回复消息
    微信服务器 ->> 微信用户: 回复消息

有时候,AWS Bedrock 服务的响应很慢,引起了微信服务器的一次重试,时序图如下:

sequenceDiagram
    participant 微信用户
    participant 微信服务器
    participant 本项目
    participant AWS Bedrock 服务
    微信用户 ->> 微信服务器: 发送消息
    微信服务器 ->> 本项目: 发送消息
    本项目 ->> 缓存: 将消息编号缓存起来
    本项目 ->> AWS Bedrock 服务: 发送消息
    note over AWS Bedrock 服务: 思考中
    note over 微信服务器: 等待 5 秒后超时
    微信服务器 ->> 本项目: 重试消息
    AWS Bedrock 服务 ->> 本项目: 回复消息
    本项目 ->> 缓存: 更新缓存,将回答写回对应的消息编号
    本项目 ->> 微信服务器: 回复消息
    微信服务器 ->> 微信用户: 回复消息

如果再慢一点,就会引起两次重试,时序图如下:

sequenceDiagram
    participant 微信用户
    participant 微信服务器
    participant 本项目
    participant AWS Bedrock 服务
    微信用户 ->> 微信服务器: 发送消息
    微信服务器 ->> 本项目: 发送消息
    本项目 ->> 缓存: 将消息编号缓存起来
    本项目 ->> AWS Bedrock 服务: 发送消息
    note over AWS Bedrock 服务: 思考中
    note over 微信服务器: 等待 5 秒后超时
    微信服务器 ->> 本项目: 重试消息
    本项目 ->> 缓存: 检查缓存,仍未得到回答
    note over 微信服务器: 等待 5 秒后超时
    微信服务器 ->> 本项目: 重试消息
    AWS Bedrock 服务 ->> 本项目: 回复消息
    本项目 ->> 缓存: 更新缓存,将回答写回对应的消息编号
    本项目 ->> 微信服务器: 回复消息
    微信服务器 ->> 微信用户: 回复消息

以上是终于在微信服务器的重试次数内得到了回复的情况。如果 AWS Bedrock 服务的响应时间超过了微信服务器 3 次重试等待的总时间,那么,就只能回复提前设置好的关键字回复了。时序图如下:

sequenceDiagram
    participant 微信用户
    participant 微信服务器
    participant 本项目
    participant AWS Bedrock 服务
    微信用户 ->> 微信服务器: 发送消息
    微信服务器 ->> 本项目: 发送消息
    本项目 ->> 缓存: 将消息编号缓存起来
    本项目 ->> AWS Bedrock 服务: 发送消息
    note over AWS Bedrock 服务: 思考中
    note over 微信服务器: 等待 5 秒后超时
    微信服务器 ->> 本项目: 重试消息
    本项目 ->> 缓存: 检查缓存,仍未得到回答
    note over 微信服务器: 等待 5 秒后超时
    微信服务器 ->> 本项目: 重试消息
    本项目 ->> 缓存: 检查缓存,仍未得到回答
    本项目 ->> 微信服务器: 回复消息兜底消息,带上稍后查看链接
    微信服务器 ->> 微信用户: 回复消息
    AWS Bedrock 服务 ->> 本项目: 回复消息
    本项目 ->> 缓存: 更新缓存,将回答写回对应的消息编号
    微信用户 ->> 本项目: 点击稍后查看链接
    本项目 ->> 缓存: 检查缓存,得到回答
    本项目 ->> 微信用户: 展示消息和回答页面

开发

配置环境变量

本地环境变量

本地开发需要配置环境变量,可以参考 .env.example 文件。将其复制为 .env 文件,并修改其中的环境变量。

Kubernetes 环境变量

如果新增或者修改了已有的环境变量值,需要同步修改最终部署到 k8s 环境中的环境变量值。这需要首先运行

```bash
sops -d -i k8s/secrets.yaml
```

然后修改 k8s/secrets.yaml 文件,将其中的环境变量值修改为最新的值。最后,运行

```bash
sops -e -i k8s/secrets.yaml
```

GitHub Actions 环境变量

新增或者修改的环境变量值,需要同步修改 GitHub Actions 中的 Secret 值。

AWS Lambda 环境中的环境变量

新增或者修改的环境变量值,需要在部署时将改动应用到 AWS Lambda 中。这通过修改 [.github/workflows/lambda.yml] 文件中的环境变量值来实现。一般是在最后一步, 将从 GitHub Actions Secrets 中的 Secret 值应用到 AWS Lambda 中。

测试

yarn test

部署

可以部署到任意 Kubernetes 集群。注意如果采用了内存缓存,replica 就需要设置成 1,如果设置成多个 Pod,会导致缓存失效。

如果采用了 Redis 缓存,可以设置成多个 Pod,但是,需要注意,如果 Pod 重启,缓存会丢失,所以,需要设置成多个 Pod 的时候,需要使用 Redis 缓存。

本来本项目部署在 Okteto 提供的免费 Kubernetes 集群上,域名是 https://bedrock-backstage-jeff-tian.cloud.okteto.net/message ,但是在 2024 年 1 月 15 日,Okteto 关闭免费服务。于是对本项目进行了重新部署,选择 cyclic,它是一个无服务器平台,不能再使用内存缓存,因为微信服务的消息重试会打在不同的实例上。好在,cyclic 提供了方便的 DynamoDb 存储,于是,将缓存从内存缓存改成了 DynamoDb 缓存。

缓存

由于微信公众号消息只等待 5 秒,而调用 AWS Bedrock 服务很可能在超过 5 秒后才能得到响应。超时后微信会再重试请求,为了避免重复调用 AWS Bedrock 服务,这里使用了缓存,如果是同一消息,就不再调用 AWS Bedrock 服务,而是等待上次的调用结果。

公众号后台配置

如何让你的微信公众号支持自动回复功能?只需要将该项目部署,然后在公众号后台配置即可。

依赖

代码依赖

本项目基于 Koa js 和 AWS 的 Bedrock SDK,并依赖 Cyclic 提供的对 AWS SDK 的上层封装。

基础设施依赖

本项目依赖 AWS Bedrock 服务,并且需要 Cyclic 平台 或者 AWS DynamoDb 和任意的 Kubernetes 平台。

部署

可以部署到多个环境,包括本地、Vercel、AWS Lambda、Cyclic 和 Kubernetes 等等。推荐使用 GitHub Actions 进行自动部署。

部署到 Cyclic

  1. Cyclic 上创建一个项目
  2. 链接到你的 GitHub 仓库
  3. 自动部署

部署到 Kubernetes

参考 GitHub Actions 的配置文件,将其中的环境变量替换成你自己的即可。

部署到 AWS Lambda

参考 GitHub Actions 的配置文件,将其中的环境变量替换成你自己的即可。主要是利用了 AWS SAM,详见《将免费架构进行到底,使用 AWS SAM 将 Koa 服务从 Cyclic 迁移到 Lambda - Jeff Tian的文章 - 知乎 》。

相关文章

bedrock's People

Contributors

imgbotapp avatar jeff-tian avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

ikobehan

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.