新调度规则: Phase 1 — 今日新文章优先(从新到旧轮询): - 从第1页开始拉取(接口返回最新优先) - 只保留今日发布的文章,按 createTime 降序排列(新→旧) - 最多扫描3页,发现非今日文章立即停止 - 对今日文章逐篇 validate_article 校验后返回 Phase 2 — 历史兜底(仅今日无新文章时触发): - 随机翻 1~10 页历史 - 热度+新鲜度加权采样(commentNum×3 + praiseNum×2 + readNum) - validate_article 校验后返回 两阶段均包含: - 本人发布文章过滤 - 静态+运行时无效ID过滤 - 文章有效性校验(不可开/正文<100字自动加入缓存黑名单)
AI虚拟用户新闻互动系统
基于AI驱动的虚拟用户新闻互动自动化平台,支持批量虚拟用户管理、AI人格生成、真实登录新闻平台、自动随机互动。
📁 项目结构
ai-virtual-news/
├── docker-compose.yml # Docker编排文件
├── docker/
│ └── mysql/
│ └── init.sql # 数据库初始化脚本
├── backend/ # Python FastAPI 后端
│ ├── Dockerfile
│ ├── requirements.txt
│ └── app/
│ ├── main.py # 应用入口
│ ├── api/ # API路由层
│ ├── core/ # 核心配置(DB/Redis/日志)
│ ├── models/ # SQLAlchemy ORM模型
│ ├── schemas/ # Pydantic数据模型
│ ├── services/ # 业务服务层
│ └── utils/ # 工具类(AES加密等)
└── frontend/ # Vue3 前端
├── Dockerfile
├── nginx.conf
├── src/
│ ├── views/ # 页面组件
│ ├── api/ # Axios API封装
│ ├── router/ # Vue Router
│ ├── layouts/ # 布局组件
│ └── styles/ # 全局样式
└── package.json
🚀 快速部署(1Panel Docker)
前置要求
- 已安装 1Panel 面板
- 已安装 Docker 及 Docker Compose
- 服务器内网可访问新闻平台接口(192.168.1.200:63120)
第一步:修改环境配置
编辑 docker-compose.yml,修改以下必须更改的安全参数:
environment:
- SECRET_KEY=your-secret-key-change-in-production # ⚠️ 必须修改
- AES_KEY=your-aes-key-32-chars-change-now! # ⚠️ 必须修改(必须32字符)
- DB_PASSWORD=AiVirtual@2024 # ⚠️ 建议修改
同时修改 MySQL 的 MYSQL_PASSWORD 与 DB_PASSWORD 保持一致。
第二步:通过 1Panel 部署
方式A:1Panel 应用商店(推荐)
- 登录 1Panel → 应用商店 → 搜索 "Docker Compose"
- 上传本项目目录
- 点击部署
方式B:SSH 命令行
# 1. 上传项目到服务器
scp -r ai-virtual-news/ root@your-server:/opt/
# 2. 进入项目目录
cd /opt/ai-virtual-news
# 3. 启动所有服务
docker-compose up -d
# 4. 查看启动日志
docker-compose logs -f
第三步:访问系统
| 服务 | 地址 |
|---|---|
| 前端控制台 | http://服务器IP:9000 |
| 后端API文档 | http://服务器IP:8000/api/docs |
| MySQL | 服务器IP:3306 |
| Redis | 服务器IP:6379 |
⚙️ 初始配置
1. 配置AI模型
访问控制台 → AI模型配置 → 添加模型:
| 字段 | 说明 | 示例 |
|---|---|---|
| 模型名称 | 自定义名称 | GPT-4生产 |
| 提供商 | 选择对应供应商 | OpenAI |
| API地址 | 留空用默认 | https://api.openai.com/v1 |
| API Key | 对应平台的Key | sk-... |
| 模型版本 | 具体模型名 | gpt-4-turbo |
配置完成后点击「设为默认」,系统将使用此模型进行所有AI操作。 点击「测试」验证模型可用性。
支持的国产模型配置:
| 提供商 | API地址 | 模型版本示例 |
|---|---|---|
| 智谱GLM | https://open.bigmodel.cn/api/paas/v4 | glm-4 |
| 文心一言 | https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat | ERNIE-Bot-4 |
| 通义千问 | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen-turbo |
2. 配置新闻平台地址
访问控制台 → 调度设置 → 修改「平台接口地址」为实际地址。
3. 创建虚拟用户
方式A:单个创建 控制台 → 虚拟用户 → 新增用户 → 填写账号密码 → 系统自动生成AI人格
方式B:Excel批量导入
- 下载导入模板
- 填写账号/密码/昵称等信息
- 上传Excel,系统自动校验并为每个用户生成AI人格
4. 启动自动互动
- 确认用户已登录(状态为「已登录」)
- 调度设置 → 确认互动时间段和概率配置
- 调度器默认启动,系统将在设定时间段自动执行互动
🔧 运维管理
Docker 常用命令
# 查看所有容器状态
docker compose ps
# 重启后端服务(后端代码更新后执行)
docker compose restart ai-virtual-backend
# 查看后端实时日志
docker compose logs -f ai-virtual-backend
# 停止所有服务
docker compose down
# 启动所有服务
docker compose up -d
# 进入后端容器
docker exec -it ai-virtual-backend bash
# 进入MySQL
docker exec -it ai-virtual-mysql mysql -u aivirtual -p ai_virtual_news
⚠️ 前端更新(重要:必须用此方式)
docker compose build存在缓存问题,前端代码修改后必须用以下方式重新 build,否则修改不会生效。
cd /opt/1panel/docker/compose/ai-virtual-news/frontend
# 第一步:清缓存并 build(使用 node 镜像直接 build 宿主机目录)
rm -rf dist node_modules/.vite
docker run --rm -v $(pwd):/app -w /app node:18-alpine sh -c "npm run build"
# 第二步:把 dist 复制到运行中的容器
docker cp dist/. ai-virtual-frontend:/usr/share/nginx/html/
# 第三步:重载 nginx(无需重启容器,立即生效)
docker exec ai-virtual-frontend nginx -s reload
数据备份(1Panel)
- 1Panel → 数据库 → MySQL → 定时备份
- 建议每天凌晨 3 点备份,保留 30 天
- 或手动备份:
docker exec ai-virtual-mysql mysqldump -u aivirtual -pAiVirtual@2024 ai_virtual_news > backup_$(date +%Y%m%d).sql
日志位置
| 日志类型 | 容器路径 | 宿主机路径 |
|---|---|---|
| 应用日志 | /app/logs/app_*.log | ./backend/logs/ |
| 错误日志 | /app/logs/error_*.log | ./backend/logs/ |
| AI调用日志 | /app/logs/ai_*.log | ./backend/logs/ |
🔒 安全注意事项
- AES密钥:
AES_KEY必须修改为32字符随机字符串,用于加密存储账号密码 - 数据库密码:生产环境务必修改默认密码
- 端口暴露:建议通过 Nginx 反向代理访问,不要直接暴露 8000 端口
- 防火墙:MySQL(3306)、Redis(6379) 端口不应对外暴露
- 互动频率:合理设置互动间隔,避免触发新闻平台风控
📊 功能模块说明
数据看板
- 实时展示用户总数、在线数、今日互动量
- Token消耗折线图(近30天/7天)
- 近12个月月度消耗柱状图
- 系统运行状态监控
虚拟用户管理
- 新增/编辑/删除用户,账号密码AES加密存储
- Excel批量导入(含格式校验、去重、错误详情)
- Excel批量导出(不含密码密文)
- AI人格生成:性格/语言风格/兴趣/互动倾向/字数偏好
- 编辑用户资料(昵称/真实姓名/性别/头像/简介/邮箱),支持同步到目标平台
- 头像上传:上传图片到平台 filecenter,自动更新用户头像
- 单个/批量启用、禁用、登出操作
- 手动触发登录/登出
AI互动模块
- 真实调用新闻平台登录接口获取会话Token
- 会话自动校验(10分钟/次),失效自动重登
- 随机翻页获取文章,按用户兴趣偏好筛选,自动过滤无效新闻
- AI生成贴合人格的评论/回复内容,内容完整不截断,自动过滤敏感词
- 按概率随机触发:评论/回复/点赞/收藏/转发
- 每日互动次数限额控制
- 互动记录支持手动重试、取消
AI模型配置
- 支持 OpenAI / 智谱GLM / 文心一言 / 通义千问 / 本地模型
- API Key AES加密存储
- 模型测试功能(验证可用性 + Token消耗预览)
- 多模型管理,设置默认模型
调度设置
- 互动时间段配置(北京时间)
- 最小互动间隔控制(秒),防止同一用户频繁互动
- 各互动类型概率独立配置
- 并发用户数上限(0=不限)
- 每日Token配额管控
- 一键暂停/启动调度器
- 立即触发互动(测试用)
日志管理
- 登录日志:登录/登出/失败记录
- 日志文件:应用日志/错误日志实时查看
- 日志下载
🐛 常见问题
Q: 容器启动失败,提示数据库连接失败?
A: MySQL 启动需要时间,后端依赖 healthcheck。等待 30-60 秒后重试:docker compose restart ai-virtual-backend
Q: 用户登录始终失败? A: 1) 检查新闻平台接口地址是否正确;2) 检查账号密码是否正确;3) 查看后端日志定位具体错误
Q: AI人格生成失败? A: 未配置AI模型时系统会随机生成人格作为兜底,这是正常行为。配置有效的AI模型后可重新生成。
Q: 调度器不执行互动? A: 检查:1) 调度器是否启用;2) 是否在设定的互动时间段内(北京时间);3) 是否有已登录状态的用户;4) Token是否已达每日上限;5) 用户最近互动时间是否超过最小间隔
Q: 前端修改后没有生效?
A: 不能用 docker compose build,必须用上方「前端更新」中的 node 镜像 build 方式。
Q: 互动报"服务器繁忙"? A: 通常是 orgId 为空导致。系统已自动从广场文章数据获取 orgId,如仍报错请检查文章是否有效。
Q: 评论报敏感词? A: AI 提示词已包含安全规则,偶发属正常,系统不重试敏感词失败。
Q: 后端 502 错误?
A: 查看日志定位原因:docker compose logs --tail=20 ai-virtual-backend | grep -E "Error|Exception"
📞 技术支持
- 后端API文档:
http://服务器IP:8000/api/docs - 接口健康检查:
http://服务器IP:8000/health