1. 项目概述打造你的专属AI微信助手最近在折腾一个挺有意思的开源项目叫wechat-chatgpt。简单来说它能把你的个人微信或者企业微信变成一个能说会道、甚至能画画的AI机器人。想象一下在你的微信群里有一个成员可以随时回答技术问题、帮你翻译文档、甚至根据你的描述生成一张创意图片这感觉是不是挺酷的这个项目就是基于 OpenAI 的 ChatGPT 和 Midjourney 的 API 来实现这些功能的。我自己部署了一个用了一段时间发现它确实能解决一些实际痛点。比如在技术社区群里总有人反复问一些基础问题或者需要快速翻译一段代码注释。有个机器人24小时待命能大大减轻群管理的负担。当然更吸引我的是它的可定制性你可以通过简单的配置让它扮演面试官、医生、翻译等不同角色而不仅仅是“另一个ChatGPT网页版”。这个项目适合谁呢如果你是对AI应用感兴趣的开发者、想为社群或团队提供一个智能助手的运营者或者单纯想体验一下把最新AI能力集成到日常通讯工具里的极客那么这个项目都值得一试。它不需要你从头去研究微信协议或AI模型的底层调用作者已经把核心的对接和调度逻辑都封装好了你只需要准备好必要的“钥匙”API Key和一些服务器资源就能快速搭建起来。接下来我会结合自己的部署和调试经验把这个项目的核心设计、详细配置、实操步骤以及我踩过的那些“坑”毫无保留地分享给你。目标是让你看完之后能独立、稳定地运行起一个属于你自己的微信AI机器人。2. 核心设计思路与架构解析2.1 为什么选择 Wechaty 官方 API 的方案这个项目的技术栈核心是Wechaty和OpenAI/Midjourney 官方 API。选择这个组合背后有很实际的考量。首先看Wechaty。它是一个开源的微信机器人框架最大的优势是提供了对微信、企业微信、钉钉等多个平台协议的抽象封装。这意味着开发者不需要去逆向工程研究微信的私有协议这本身就有风险且不稳定而是通过一个相对标准化的接口来操作微信。Wechaty 支持多种“傀儡”Puppet实现比如基于 Web 协议的wechaty-puppet-wechat和基于官方服务接口的wechaty-puppet-service。前者适合个人微信后者更适合企业微信因为企业微信有官方开放的机器人接口更稳定合规。项目选择 Wechaty相当于站在了巨人的肩膀上省去了最复杂、最易变的协议处理部分可以把精力集中在业务逻辑上。然后是AI 能力层。项目直接调用 OpenAI 的 Chat Completions API 和 Midjourney 的 Discord Bot API。为什么不使用一些封装好的SDK或者反向代理的二次封装接口原因在于可控性和稳定性。直接使用官方 API你能第一时间享受到模型更新比如从 GPT-3.5 升级到 GPT-4参数控制也最精细。对于 Midjourney虽然是通过模拟 Discord 用户操作的方式调用了midjourney-api这个库但本质上也是与官方服务交互能保证功能的最新性。这种设计让项目的核心 AI 能力与最上游的服务保持一致避免了中间层可能带来的功能延迟或损耗。注意这里需要特别强调一点由于项目直接连接 OpenAI 和 Midjourney 的海外服务因此部署项目的服务器必须能够正常访问这些服务。这是后续所有步骤的前提如果服务器网络受限整个项目将无法工作。通常你需要一台位于海外的云服务器VPS。2.2 关键特性背后的设计逻辑项目列表里那一大串功能特性并不是简单的堆砌每一条都对应着实际运营中会遇到的问题。负载均衡与错误重试OpenAI 的 API Key 有速率限制RPM。当你的机器人用户量上来一个 Key 很容易被打爆导致所有请求失败。项目支持配置多个 API Key 并以负载均衡的方式使用这就像给高速公路增加了多个车道显著提升了并发处理能力和整体稳定性。配合“错误重试”机制当某个请求因网络抖动或瞬时限流失败时系统会自动重试对于用户来说感知到的就是机器人更“可靠”了。场景模式与 Prompt 工程这是让机器人“专业化”的关键。通过PROMPT环境变量你可以给 ChatGPT 一个系统级的角色设定。比如设置为“你是一位资深的前端技术专家用简洁易懂的语言回答问题”那么机器人在所有对话中都会带着这个“人设”来回复而不是通用的聊天语气。这极大地扩展了机器人的应用场景。精细化的聊天控制不是所有群和所有人都需要机器人响应。enableGroup和enablePrivate配置项允许你使用布尔值或正则表达式来精确控制机器人的激活范围。例如你可以让机器人只在名为“技术讨论组”的群里工作或者只响应特定好友的私聊。这避免了机器人 spam 所有聊天场景减少对无关用户的打扰也便于管理。次数限制与商业化雏形DEFAULT_FREE_CREDIT和“红包解锁”功能是一个非常实用的设计。AI API 的调用是实实在在的成本尤其是 Midjourney 生成图片费用较高。通过限制每日免费次数可以防止被滥用导致巨额账单。而“红包解锁”则提供了一种轻量级的变现或成本分摊思路虽然项目目前可能只是简单模拟但这个设计方向对于想长期运营机器人的人来说很有启发。状态持久化与上下文项目使用 Redis 来存储对话状态和用户额度信息。这保证了两个重要特性1)连续对话ChatGPT 本身是无状态的通过 Redis 保存并每次携带上最近的对话历史才能实现多轮有记忆的聊天。2)跨会话计数用户的每日使用次数限制需要持久化存储不能因为机器人重启就清零Redis 很好地满足了这一需求。2.3 数据流与组件交互理解数据流有助于排查问题。一次完整的用户交互大致流程如下消息接收用户在你的微信上发送一条消息。Wechaty 框架捕获到这条消息事件。规则过滤项目核心逻辑 (src/index.ts等) 会检查这条消息是否来自被enableGroup或enablePrivate允许的聊天对象消息是否以配置的privatePrefix或groupPrefix开头如果不符合规则消息被忽略。意图识别对于通过过滤的消息判断其意图。是普通的文本聊天走 ChatGPT还是以“画”开头的绘图指令走 MidjourneyAI 处理ChatGPT 路径从配置的多个 API Key 中按策略选取一个结合 Redis 中取出的本对话历史上下文以及系统PROMPT组装成请求发送给 OpenAI API。收到回复后将本次问答存入 Redis 上下文。Midjourney 路径将用户指令如“画一只坐在咖啡馆里看书的小猫”通过 ChatGPT 翻译成英文提示词Prompt然后使用midjourney-api库模拟用户向配置好的 Discord 频道发送指令。随后轮询该频道直到获取到 Midjourney Bot 生成完成的图片。回复与发送将 AI 返回的文本或图片 URL通过 Wechaty 的接口原路发送回用户所在的微信聊天窗口。计数与日志本次调用成功后在 Redis 中将该用户的剩余次数减1或5并记录日志。整个过程中配置文件 (config.ts)、环境变量 (.env) 和 Redis 是三个核心的配置与状态存储中心。3. 前期准备与环境配置详解3.1 服务器与网络准备这是最基础也最容易出问题的一步。服务器选择作者明确建议使用Ubuntu 22.04系统并且是非 ARM 架构即 x86_64。这是因为项目依赖的 Wechaty 的某些底层组件如 Chromium在 ARM 架构上可能存在兼容性问题。所以请确保你的云服务器是 x86_64 的 Ubuntu 22.04。1核2GB内存是起步配置如果预计用户量较大或频繁使用 Midjourney涉及图片下载上传建议使用更高配置。网络配置这是重中之重。你的服务器必须能稳定访问以下两个服务OpenAI API (api.openai.com)这是 ChatGPT 服务的源头。Discord (discord.com)这是 Midjourney Bot 所在平台。如何测试在服务器上运行curl -s https://api.openai.com/v1/models -H Authorization: Bearer sk-test # 替换 sk-test 为任意字符串如果返回{error:{message:Incorrect API key provided...之类的认证错误说明网络是通的因为收到了OpenAI的响应。如果连接超时或完全无法解析说明网络不通。对于 Discord可以测试其网关或 CDNcurl -I https://discord.com应返回 HTTP 200 或 301 等状态码。实操心得我最初尝试在某个云服务商的香港节点部署发现访问 OpenAI 时好时坏。后来换到美国西海岸硅谷的节点延迟虽然高一点~150ms但稳定性极好。如果你的服务器在国内理论上需要配置网络代理但项目文档明确提示了相关风险且配置复杂、稳定性差强烈不建议这样做。最省心的方案就是直接使用海外服务器。3.2 核心账号与 Token 获取你需要准备三个关键的“钥匙”OpenAI API Key访问 OpenAI Platform 。登录后点击 “Create new secret key”。妥善保存这个以sk-开头的字符串。注意创建时页面显示一次关闭后就无法再次查看完整 Key只能重新生成。费用提醒这个 Key 关联你的 OpenAI 账户调用 API 会产生费用。请务必在账户设置中设置用量限制Usage Limits以防意外超支。Midjourney 相关 Token (MJ_SALAI_TOKEN, MJ_SERVER_ID, MJ_CHANNEL_ID)这个获取过程稍复杂因为 Midjourney 本身没有开放官方 API项目是通过模拟 Discord 用户操作实现的。前提你需要有一个付费的 Midjourney 订阅账号并已加入 Midjourney 的官方 Discord 服务器。创建自己的 Discord 服务器在 Discord 上创建一个新的服务器Server用于隔离机器人的活动。邀请 Midjourney Bot在你的 Discord 服务器中点击“邀请成员”搜索并邀请Midjourney Bot。获取 Token 和 IDMJ_SALAI_TOKEN这是你的 Discord 用户 Token。警告此 Token 等同于你的密码绝对不要泄露在 Discord 网页版按 F12 打开开发者工具进入“网络”(Network) 标签页。在 Discord 中任意操作一下如发送一个消息在网络请求中找到science或messages这类请求查看其请求头Headers找到authorization字段的值即为你的用户 Token。MJ_SERVER_ID在你的 Discord 服务器中右键点击服务器名称 - “复制服务器 ID”。MJ_CHANNEL_ID在你希望机器人发送绘图指令的文本频道中右键点击频道名称 - “复制频道 ID”。可选对象存储 OSS 配置Midjourney 生成的图片是 Discord 的临时链接可能会过期。项目支持将图片上传到阿里云 OSS 等对象存储提供永久链接。你需要提前在阿里云开通 OSS创建一个 Bucket并获取AccessKey ID、AccessKey Secret、Bucket名称和Region地域。3.3 本地开发环境准备以 Ubuntu 22.04 为例即使你计划用 Docker 部署在本地先跑通也是理解项目的好方法。# 1. 安装 Node.js 18 和 pnpm # 使用 NodeSource 仓库安装稳定版 Node.js curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs # 安装 pnpm (比 npm 更快更节省磁盘) sudo npm install -g pnpm # 验证安装 node --version # 应 v18.0.0 pnpm --version # 2. 安装 Redis sudo apt update sudo apt install redis-server -y # 启动 Redis 并设置开机自启 sudo systemctl start redis-server sudo systemctl enable redis-server # 测试 Redis redis-cli ping # 应返回 PONG # 3. 安装 Chromium 依赖Wechaty 的 Web 协议依赖浏览器环境 sudo apt install -y ca-certificates fonts-liberation libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils # 4. 克隆项目代码 git clone https://github.com/shfshanyue/wechat-chatgpt.git cd wechat-chatgpt # 5. 安装项目依赖 pnpm install # 6. 生成 Prisma 客户端项目使用 Prisma ORM 操作 Redis虽然主要用 Redis但结构定义需要生成 npx prisma generate完成以上步骤基础环境就准备好了。接下来就是最关键的配置环节。4. 配置文件与环境变量深度解析项目的配置主要通过config.ts和.env文件完成。理解每一个配置项的作用是定制化你机器人的关键。4.1 核心配置文件config.ts这个文件决定了机器人的行为规则。我们逐项分析export default { // 自动同意好友请求的口令。如果好友申请消息匹配这个正则则自动通过。 // 例如 /ChatGPT/ 表示申请信息里包含 “ChatGPT” 就自动通过。 acceptText: /ChatGPT/, // OpenAI API 的基础地址。如果你的服务器在海外直连即可保持默认。 // 如果在特殊网络环境可能需要配置为代理地址。但如前述不推荐。 baseURL: process.env.BASE_URL || https://api.openai.com/v1, // API Key从环境变量读取支持多个用逗号分隔。项目会自动做负载均衡。 apiKey: process.env.OPEN_API_KEY.split(,), // 使用的 GPT 模型默认是 gpt-3.5-turbo成本较低。可以改为 gpt-4 等但注意费用和速率限制。 model: process.env.GPT_MODEL || gpt-3.5-turbo, // 系统 Prompt定义机器人的角色和基础行为指令。这是塑造机器人个性的核心。 prompt: process.env.PROMPT || , // 群聊开关。可以是布尔值 true/false也可以是正则表达式。 // true: 在所有群聊中只要有人机器人或使用群聊前缀它就响应。 // /^(技术交流群|面试直通车)$/: 只在群名完全匹配“技术交流群”或“面试直通车”的群里工作。 enableGroup: /^(技术交流群|面试直通车|学习)$/, // enableGroup: true, // 私聊开关。规则同上。 // true: 所有好友私聊都会响应。 // /(山月)/: 只对昵称或备注中包含“山月”的好友响应私聊。 enablePrivate: /(山月)/, // enablePrivate: true, // 群聊触发前缀。在群里消息需要以这个前缀开头机器人才会处理。 // 例如设为 AI那么在群里需要发送“AI 今天天气如何”才会触发。 // 留空或设为 /^$/则默认在群里被时触发推荐。 groupPrefix: , // 私聊触发前缀。在私聊中消息需要以这个前缀开头。 // 例如设为 bot那么私聊时需要发送“bot 讲个笑话”。 // 留空则表示所有私聊消息都会触发可能造成干扰。 privatePrefix: 山月, // Sentry 错误监控的 DSN用于生产环境收集错误日志。非必需。 sentryDsn: process.env.SENTRY_DSN || }配置技巧enableGroup和enablePrivate使用正则表达式可以做到非常精细的控制。例如enableGroup: /^AI测试群|项目组$/只在这两个群里生效。privatePrefix非常有用。如果你不想让机器人响应私聊里的每一句话比如别人可能只是跟你打招呼设置一个前缀如“/ai”或“小助手”可以避免机器人过度介入私人对话。prompt是灵魂。一个精心设计的 Prompt 能让机器人表现天差地别。例如如果你想让它充当代码助手可以设置PROMPT你是一个专业的全栈程序员助手精通 JavaScript、Python、Go 和系统设计。你的回答应该准确、简洁并且优先提供可运行的代码片段。如果用户的问题不明确你会主动询问细节。你的名字叫‘CodeMate’。4.2 敏感信息与环境变量.env所有敏感信息和可能变动的配置都应放在.env文件中并通过process.env读取。# 复制示例文件 cp .example.env .env # 然后编辑 .env 文件.env文件内容示例及详解# 必填你的 OpenAI API Key多个用英文逗号隔开。这是项目运行的基础。 OPEN_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxybnC,sk-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy # 可选OpenAI API 代理地址。仅在你确实有可用的、稳定的代理服务时配置。 # BASE_URLhttps://your-proxy.com/v1 # 可选指定 GPT 模型。 GPT_MODELgpt-3.5-turbo # 可选系统 Prompt会覆盖 config.ts 中的 prompt。建议在这里写长文本。 PROMPT你是一个友好且乐于助人的AI助手名叫‘小智’。你是基于GPT-3.5的微信机器人。你的知识截止于2023年初。如果被问到不知道的事情你会诚实告知。在群聊中只有当被时你才会回复。在私聊中需要以‘小智’开头你才会回复。画图指令请以‘画’字开头。 # 必填如果要用MidjourneyWechaty 使用的协议。个人微信用默认的 wechaty-puppet-wechat。 WECHATY_PUPPETwechaty-puppet-wechat # 以下三项为 Midjourney 必填获取方法见上文。 MJ_SALAI_TOKEN你的_Discord_用户_Token MJ_SERVER_ID你的_Discord_服务器_ID MJ_CHANNEL_ID你的_Discord_频道_ID # 可选每日免费次数限制。ChatGPT问答1次Midjourney绘图5次。 DEFAULT_FREE_CREDIT30 # 可选阿里云OSS配置用于持久化Midjourney图片。 OSS_REGIONoss-cn-hangzhou OSS_ACCESS_KEY_ID你的AccessKeyId OSS_ACCESS_KEY_SECRET你的AccessKeySecret OSS_BUCKET你的Bucket名称 # 可选Sentry DSN用于错误追踪。 # SENTRY_DSNhttps://xxxxxoooo.ingest.sentry.io/xxxxx重要安全警告.env文件包含所有核心密钥绝对不能提交到 Git 仓库。项目根目录下的.gitignore文件通常已经包含了.env请务必确认。在服务器上部署时也应通过安全的方式如SSH隧道、配置管理工具传递此文件内容而非明文传输。4.3 企业微信配置切换如果你需要对接企业微信配置会更简单稳定因为走的是官方通道。在.env文件中修改WECHATY_PUPPET并添加WECHATY_PUPPET_SERVICE_TOKENWECHATY_PUPPETwechaty-puppet-service WECHATY_PUPPET_SERVICE_TOKENpuppet_workpro_xxxxxxxxxWECHATY_PUPPET_SERVICE_TOKEN需要从 Wechaty 的官方服务商处获取。你需要访问 Wechaty Puppet Service 查看支持的供应商如 padlocal并根据其指引购买和获取 Token。这个 Token 通常是付费的但换来的是更高的稳定性和不会封号的风险。切换到企业微信后config.ts中关于个人微信的某些配置可能不再需要但机器人行为控制如enableGroup,prompt等依然生效。5. 完整部署与启动流程实战这里我将分别介绍 Docker 部署和手动部署两种方式并分享其中的注意事项。5.1 方案一使用 Docker Compose 部署推荐这是最简洁、环境最统一的部署方式尤其适合生产环境。步骤 1准备docker-compose.yml文件项目通常已经提供了docker-compose.yml示例。如果没有可以创建一个version: 3.8 services: redis: image: redis:7-alpine container_name: wechat-chatgpt-redis restart: always volumes: - redis_data:/data networks: - wechatgpt-net wechat-chatgpt: build: . container_name: wechat-chatgpt-app restart: always depends_on: - redis environment: # 这里直接注入环境变量但更安全的做法是使用 env_file - REDIS_HOSTredis - REDIS_PORT6379 env_file: - .env # 确保 .env 文件在当前目录且内容正确 volumes: # 挂载日志和消息存储目录避免容器重启后丢失 - ./logs:/app/logs - ./message:/app/message # 挂载 Wechaty 的缓存避免每次重启都需重新扫码登录重要 - ./.wechaty:/app/.wechaty networks: - wechatgpt-net # 如果需要查看扫码二维码需要以交互模式运行并分配伪终端 stdin_open: true tty: true networks: wechatgpt-net: driver: bridge volumes: redis_data:步骤 2准备.env和config.ts确保在docker-compose.yml同级目录下已经按照第四章的说明配置好了.env文件和config.ts文件。步骤 3构建并启动服务# 进入项目目录 cd wechat-chatgpt # 使用 Docker Compose 构建镜像并启动所有服务-d 表示后台运行 docker compose up -d --build步骤 4查看日志并扫码登录# 查看应用容器的最后100行日志并持续跟踪 docker compose logs --tail 100 --follow wechat-chatgpt-app此时日志中应该会输出一行包含https://login.wechaty.js.org/qrcode/...的链接。将这个链接复制到浏览器中打开会出现一个二维码。关键操作使用你打算作为机器人的那个微信账号去扫描这个二维码。注意不是你的个人日常微信建议专门注册一个“小号”来充当机器人。扫码后手机微信上会确认登录确认后服务器日志会显示“登录成功”之类的信息。步骤 5验证服务登录成功后向这个机器人微信号发送消息/ping它应该会回复pong。这证明机器人已经就绪可以开始对话了。Docker 部署的优势与注意事项优势环境隔离依赖清晰一键启停非常适合在干净的服务器上快速部署。注意事项.wechaty缓存卷这个挂载至关重要。它保存了微信的登录态。如果没有挂载每次容器重启都需要重新扫码登录非常麻烦。时区问题如果容器内时间不对可能导致日志时间错乱。可以在docker-compose.yml的wechat-chatgpt服务下添加environment: - TZAsia/Shanghai。资源限制Midjourney 绘图涉及图片处理可以适当调高容器的内存限制。5.2 方案二手动在服务器部署如果你需要深度定制或者服务器环境特殊可以选择手动部署。步骤 1服务器基础环境参照第三章在 Ubuntu 22.04 服务器上安装 Node.js, pnpm, Redis 和 Chromium 依赖。步骤 2配置 Redis 主机映射项目代码中可能默认连接redis这个主机名。我们需要确保在服务器上能解析到这个主机名。# 编辑 hosts 文件 sudo nano /etc/hosts # 在文件末尾添加一行 127.0.0.1 redis如果无法修改/etc/hosts例如在一些容器化环境则需要修改项目代码中连接 Redis 的配置通常在src/lib/redis.ts或类似文件中将host改为127.0.0.1。步骤 3获取代码并安装依赖git clone https://github.com/shfshanyue/wechat-chatgpt.git cd wechat-chatgpt pnpm install npx prisma generate步骤 4配置环境变量与配置文件将本地配置好的.env和config.ts上传到服务器项目目录下。步骤 5启动服务# 开发模式启动输出详细日志 pnpm start # 或者生产模式启动可能需要先 build pnpm build pnpm start:prod同样首次启动会在终端输出二维码链接扫码登录即可。步骤 6使用进程守护PM2为了让服务在后台稳定运行即使崩溃也能自动重启推荐使用 PM2。# 全局安装 PM2 sudo npm install -g pm2 # 使用 PM2 启动应用假设你的入口文件是 dist/index.js pm2 start dist/index.js --name wechat-chatgpt # 设置开机自启 pm2 startup pm2 save # 查看日志 pm2 logs wechat-chatgpt5.3 部署后的基本测试无论哪种部署方式成功启动并登录后请进行以下测试以确保核心功能正常基础通信测试给机器人私发/ping应回复pong。ChatGPT 功能测试在允许的私聊或群聊中发送一个测试问题如“你好介绍一下你自己”。观察回复是否正常是否符合你在PROMPT中设定的角色。上下文测试连续问一个相关的问题比如先问“Python 怎么定义一个函数”再问“那它能返回多个值吗”。看第二个回答是否能基于第一个问题的上下文。Midjourney 功能测试如果配置了私聊机器人发送“画一只在太空中的柯基犬卡通风格”。这是一个比较简单的提示词。观察过程机器人会先回复“已收到绘画请求正在处理中...”或类似提示。等待1-2分钟后机器人应能成功发回一张图片。注意首次使用 Midjourney 可能会触发 Discord 的人机验证需要在 Discord 网页端手动点一下验证。次数限制测试反复发送消息超过DEFAULT_FREE_CREDIT限制后机器人应提示次数已用尽。6. 高级功能配置与使用技巧6.1 实现场景化机器人Prompt 工程实战PROMPT是塑造机器人个性的核心。一个好的 Prompt 需要清晰、具体并设定好边界。示例 1技术面试官PROMPT你现在是一名资深互联网公司的技术面试官专注于考察候选人的编程基础、系统设计能力和项目经验。你的名字叫‘面试官Bot’。你的行为准则如下 1. 每次只问一个问题等待候选人回答后再进行追问或评价。 2. 问题范围包括数据结构与算法、操作系统、网络、数据库、特定编程语言如Go/Java/Python特性、系统设计、项目深度挖掘。 3. 根据候选人的回答判断其知识深度和表达能力并给出简要的反馈如‘对概念理解清晰但可以更深入细节’。 4. 如果候选人回答‘我不知道’或明显错误你可以给出提示或纠正并继续下一个相关问题。 5. 对话结束时给候选人一个综合性的评价和建议。 现在面试开始请先做自我介绍并询问候选人的姓名和应聘职位。这样设置后当你对机器人说“开始面试”它就会进入面试官角色进行模拟面试。示例 2专业翻译官PROMPT你是一名专业的翻译官精通中英互译。你的任务是提供准确、流畅、符合目标语言习惯的翻译。规则 1. 当我用中文输入时你将其翻译成英文。 2. 当我用英文输入时你将其翻译成中文。 3. 如果输入是混合语言或指令如‘翻译这句话...’请识别主要需求并进行翻译。 4. 对于技术术语使用公认的译法。 5. 除了翻译结果不要添加任何额外的解释、评论或问候语。 现在请开始你的工作。Prompt 设计技巧角色设定开头明确“你是谁”。任务指令清晰说明“你要做什么”。格式要求指定输出格式如“用列表形式回答”、“代码用代码块包裹”。边界限制说明“不要做什么”如“不要自行创造信息”、“不要评价用户问题”。示例引导对于复杂任务在 Prompt 中给出一两个输入输出示例效果极佳。6.2 管理群聊与私聊正则表达式进阶用法config.ts中的enableGroup和enablePrivate支持正则表达式这提供了强大的过滤能力。精准匹配特定群名enableGroup: /^(AI实验室|前端开发组)$/。^代表开头$代表结尾这意味着群名必须完全等于“AI实验室”或“前端开发组”。匹配包含关键词的群名enableGroup: /(测试|临时)/。只要群名中包含“测试”或“临时”二字机器人就会在该群生效。排除某些群正则表达式本身不支持“非”逻辑但你可以通过逻辑反转在代码中实现。不过更简单的方法是只列出你想要的群。或者如果你开启了全局群聊 (enableGroup: true)但想在某个群里禁用目前项目没有直接配置可能需要修改代码逻辑在消息处理层判断群名是否在黑名单中。私聊按好友备注管理enablePrivate: /^(同事|客户)_/。假设你给好友的备注是“同事_张三”、“客户_李四”那么这个配置会让机器人只对备注以“同事_”或“客户_”开头的好友开启私聊回复。这是管理大量联系人的好方法。6.3 Midjourney 绘图功能优化与避坑Midjourney 功能强大但也是最不稳定的环节因为它依赖于模拟用户操作和 Discord 的服务。1. 提升出图成功率与质量提示词Prompt优化项目会自动将用户的中文指令通过 ChatGPT 翻译成英文。但翻译可能不精准。你可以引导用户使用更具体的英文提示词或者自己在PROMPT中为机器人增加提示词优化的指令例如“当用户请求画画时你需要将用户的中文描述优化成详细、富有画面感、包含艺术风格和渲染引擎关键词的英文 Midjourney 提示词。”参数支持你可以查看midjourney-api的文档看项目是否支持传递--ar(纵横比)、--v(版本) 等参数。通常可以在指令中加入如“画一个城堡 --ar 16:9 --v 5.2”。2. 应对 Midjourney 反爬与失败保持依赖更新定期运行pnpm update midjourney-api更新这个关键依赖作者会持续适配 Midjourney 的反爬策略。失败重试与超时设置查看项目代码中调用 Midjourney 的部分是否有超时timeout和重试retry机制。如果没有可以考虑自行添加。一个绘图请求等待2-3分钟是正常的超过5分钟很可能失败了。备用方案在代码中当 Midjourney 多次失败后可以降级为让 ChatGPT 用文字描述画面或者回复一个固定的提示而不是让用户无限等待。3. 图片存储与加速务必配置 OSSDiscord 的图片链接是临时的。配置阿里云 OSS 后机器人会将图片下载并上传到你的 OSS然后返回 OSS 的永久链接。这不仅链接永久有效还可以通过 CDN 加速国内访问更快。成本考量Midjourney 绘图消耗的DEFAULT_FREE_CREDIT是5次远高于 ChatGPT 的1次这是合理的因为绘图成本更高。你需要根据你的 Midjourney 订阅套餐和预计使用量合理设置总次数限制。7. 运维监控、问题排查与优化7.1 日志查看与监控日志是排查问题的第一手资料。日志位置项目日志默认输出到控制台 (stdout/stderr)。如果使用了 PM2日志在~/.pm2/logs/目录下。如果按照 Docker 部署示例挂载了./logs卷日志会在宿主机的./logs目录中。关键日志信息Login Success微信登录成功。Received Message收到消息并会打印消息来源和内容。Using API Key: ...切换或使用某个 OpenAI Key。ChatGPT Response: ...ChatGPT 的回复内容可能被截断。Midjourney Imagine Start.../Midjourney Upscale SuccessMidjourney 绘图进程的开始和成功。Error:或Failed to...错误信息需要重点关注。建议对于生产环境将日志收集到类似ELK(Elasticsearch, Logstash, Kibana) 或Grafana Loki这样的集中式日志系统中方便搜索和报警。7.2 常见问题与解决方案速查表以下是我在部署和运行过程中遇到的一些典型问题及解决方法问题现象可能原因排查步骤与解决方案扫码后无法登录提示“失败”或超时1. 服务器时间不同步。2. 服务器 IP 被微信风控。3. Wechaty 的 puppet 服务不稳定。1. 运行date检查服务器时间使用sudo ntpdate time.windows.com同步。2. 这个 IP 可能被微信限制。尝试更换服务器 IP或者使用企业微信协议 (wechaty-puppet-service)。3. 个人微信协议本身就不稳定重试几次或等待一段时间再试。机器人收不到消息或不回复1.enableGroup/enablePrivate配置错误。2. 群聊未 机器人 或私聊未使用前缀。3. Redis 服务未启动或连接失败。4. OpenAI API Key 失效或额度不足。1. 检查config.ts配置确保当前聊天对象匹配正则表达式。可以暂时设为true测试。2. 在群里确认 了机器人私聊确认使用了privatePrefix。3. 检查 Redis 服务状态 (systemctl status redis)并确认项目能连接上 Redis (redis-cli ping)。4. 登录 OpenAI 平台检查 Key 的状态和余额。ChatGPT 回复慢或经常超时1. 服务器到 OpenAI 网络延迟高或不稳定。2. 配置的 API Key 速率限制 (RPM) 已用尽。3. 请求的上下文太长。1. 使用curl或ping测试到api.openai.com的网络质量。考虑更换服务器区域。2. 配置多个 API Key 进行负载均衡。在 OpenAI 平台检查该 Key 的用量。3. 项目会保存上下文如果对话轮次太多每次请求携带的历史消息会很长导致响应慢。可以考虑在代码中限制上下文的最大 token 数。Midjourney 绘图始终失败1.MJ_SALAI_TOKEN等配置错误或过期。2. Discord 账号在目标服务器/频道没有权限。3. Midjourney 订阅已过期或达到限额。4.midjourney-api库版本过旧无法通过反爬。1. 重新获取并核对三项 ID 和 Token。Token 可能过期需要重新从 Discord 获取。2. 确认用于登录的 Discord 账号已加入你配置的MJ_SERVER_ID对应的服务器并且MJ_CHANNEL_ID频道存在且有发送消息权限。3. 登录 Discord 查看 Midjourney Bot 是否还能在频道中正常工作。4. 升级midjourney-api:pnpm update midjourney-api。机器人突然停止响应1. 进程崩溃。2. 微信网页版被踢下线。3. 服务器资源内存耗尽。1. 检查进程状态pm2 status或docker ps。使用进程守护工具PM2/Docker restart policy自动重启。2. 网页版微信长时间在线可能被要求重新扫码。这是一个固有风险考虑使用付费的、更稳定的协议如企业微信。3. 检查服务器内存和 CPU 使用率。Midjourney 图片处理可能较耗内存。“红包解锁”等功能不工作1. 相关代码逻辑可能只是示例或占位符。2. 需要额外的支付或消息处理集成。1. 查看项目源码src/目录下关于支付、次数验证的逻辑是否完整实现。很多开源项目的增值功能可能处于 TODO 状态。2. 如果需要完整功能可能需要自己实现微信支付回调、金额记录等逻辑或者寻找其他更成熟的商业化机器人框架进行集成。7.3 性能优化与成本控制建议OpenAI API 成本优化模型选择非必要不使用gpt-4gpt-3.5-turbo在大多数对话场景下性价比极高。上下文长度在代码中设置max_tokens参数限制单次回复的长度。同时可以限制保存在 Redis 中的对话历史轮数例如只保存最近10轮以减少每次请求的 Token 数量。缓存常见回答对于群聊中高频的、重复的问题如“项目地址是什么”可以在代码层面做内存缓存直接返回固定答案避免调用 API。机器人响应速度优化异步处理确保消息处理逻辑是异步的避免因为一个请求慢而阻塞整个机器人。Node.js 本身是异步的但要检查是否有同步阻塞操作。连接池与超时为 Redis 和 OpenAI HTTP 客户端配置连接池和合理的超时时间避免资源等待。监控与告警设置对 API 调用失败率、响应时间的监控。如果某个 Key 失败率突然升高可以自动将其暂时禁用。稳定性提升使用进程守护无论是 Docker 的restart: always还是 PM2都必须配置以应对进程意外退出。分离服务考虑将 Redis 部署在独立的、更稳定的服务上如云数据库 Redis 版而不是与应用同机部署。定期备份定期备份config.ts、.env和 Redis 的持久化数据如果配置了 RDB/AOF。部署和运行这样一个 AI 微信机器人就像养一个数字宠物。初期需要耐心地搭建环境、配置参数、解决各种兼容性问题。但一旦它稳定跑起来并能按照你的设想去回答问题、生成内容那种成就感和便利性是非常实在的。这个项目提供了一个功能强大且高度可定制的基础框架剩下的就看你如何发挥想象力用它来创造价值了。无论是服务一个小型社区还是作为个人效率工具它都是一个不错的起点。如果在实践中遇到上面没覆盖到的问题多看看日志多翻翻项目的 Issue 页面社区的力量往往能帮你找到答案。