企业微信 AI 自动回复系统实战排障记录(Docker + FastAPI + Redis)
这次问题排查覆盖了一个典型的“企业级 AI 消息链路系统”,从 Webhook → Redis 队列 → Worker → AI → 企业微信发送,全链路几乎都踩了一遍坑。
整套问题最终可以总结为一句话:
不是系统没跑,而是“多层结构 + 配置 + 缩进 + import + 启动方式”叠加导致链路断裂。
一、系统架构设计(目标状态)
整体系统设计如下:
企业微信消息
↓
FastAPI Webhook(wecom-bot)
↓
Redis Queue(解耦)
↓
Worker 消费队列
↓
DeepSeek / AI分析
↓
企业微信发送接口
二、初始现象
系统启动后出现以下问题:
- ❌ 企业微信收不到自动回复
- ❌ worker 容器频繁重启
- ❌ Redis 队列有数据但无反馈
- ❌ FastAPI 接口日志正常但无结果
三、问题排查全过程(关键坑点)
1️⃣ Worker 直接崩溃:缺少 Python 包
错误日志:
ModuleNotFoundError: No module named 'app'
原因:
Docker 中 Python 没有设置模块路径
修复:
environment:
PYTHONPATH: /app
2️⃣ docker-compose build 结构错误
错误:
services.wecom-worker.build must be a string
原因:
旧版 Compose 不支持:
build:
context: .
dockerfile: Dockerfile
修复:
build: .
3️⃣ YAML 缩进灾难(最致命问题)
错误:
did not find expected '-' indicator
根因:
- Tab + 空格混用
- environment / command / depends_on 层级错位
- worker 模块整体缩进破坏
4️⃣ worker 未执行发送逻辑
虽然 worker 能消费队列,但:
- 没有日志输出 send
- 没有企业微信响应
5️⃣ internal_reply 接口设计错误
问题:
token = get_access_token()
但函数未定义 → 直接 NameError
6️⃣ 架构混乱:双 worker 并存
系统中同时存在:
- worker.py(正确)
- worker_lead.py(旧逻辑)
导致:
- 消息路径不一致
- 发送链路混乱
- 调试困难
四、最终修复方案
✔ 统一 Worker
最终采用:
python app/worker.py
✔ docker-compose 标准化
wecom-worker:
build: .
container_name: wecom-worker
restart: always
working_dir: /app
volumes:
- ./app:/app/app
environment:
TZ: Asia/Shanghai
REDIS_HOST: redis
REDIS_PORT: 6379
PYTHONUNBUFFERED: 1
PYTHONPATH: /app
command: python app/worker.py
depends_on:
- redis
✔ Redis 解耦结构确认
- webhook 只负责入队
- worker 负责处理
- FastAPI 不做 AI 计算
五、最终运行状态
修复完成后系统进入稳定状态:
✔ webhook 正常接收
✔ Redis 队列正常流转
✔ worker 正常消费
✔ AI 正常返回
✔ 企业微信成功发送
日志示例:
processed: {'content': 'hello', 'intent': 'chat'}
🤖 reply: 收到,谢谢您的消息
📤 sent result: {"errcode":0}
六、关键经验总结(非常重要)
1️⃣ Docker 环境问题 > 代码问题
很多“代码 bug”,本质是:
- PYTHONPATH
- volume 覆盖
- working_dir 不一致
2️⃣ YAML 是生产环境第一坑
- 80% compose 问题是缩进
- Tab 永远是隐形炸弹
3️⃣ 多 worker 架构必须统一入口
否则:
- 消息路径分裂
- debug 不可控
- 状态不可预测
4️⃣ FastAPI + Worker 必须职责分离
正确结构:
| 模块 | 职责 |
|---|---|
| webhook | 收消息 |
| redis | 解耦 |
| worker | 处理逻辑 |
| sender | 发消息 |
七、最终架构建议(升级方向)
如果要生产化,建议升级为:
- worker 单入口
- Redis stream(替代 list)
- 统一日志 trace_id
- 重试队列机制
- dead letter queue
八、总结一句话
这次问题的本质不是“程序错了”,而是“系统在多个层(Docker + YAML + Python + 架构)同时发生小错误叠加,最终导致链路断裂”。
如果下一步想做升级版,可以直接做一个:
🚀 企业级 AI 获客系统 V2
- n8n + Redis stream + FastAPI
- 自动线索评分
- 企业微信智能分发
- 可接 DeepSeek / Claude / OpenAI
- 带监控 + 重试 + 失败队列