2830908dae0f33337515742134d0fa93cedc3d9c
- 新增default_tag_id和default_tag_name字段,与tag_id和tag_name保持一致 - 设置status字段为'generate',确保生成的图片可被后续匹配使用 - 确保标签数据的一致性和完整性
文章图片智能匹配系统
AI驱动的文章与图片智能匹配系统,支持自动匹配现有图片、Gemini生成新图片、封面图压字花处理,并批量发布文章。
项目概述
本项目实现了以下核心功能:
- 从数据库读取待处理的文章数据(status='pending_review' 且 review_user_id=152)
- 基于文章标签和科室智能匹配现有图片库(优先实拍图,后模板图)
- 使用通义千问大模型评估文章与图片的匹配度(阈值0.6)
- 匹配失败时自动调用Gemini API生成图片(0张图:1封面+2详情;1张图:补充缺失类型)
- 封面图压字花处理:本地化图片文字融合(深褐色文字+白色描边,居中显示)
- 将图片信息插入数据库并上传到服务器
- 所有图片生成完成后统一调用RPA审核接口
技术栈
- Python 3.12
- 运行平台: Linux 服务器(不支持Windows)
- 数据库: MySQL (PyMySQL)
- AI服务:
- Google Gemini API (图片生成,模型:gemini-3-pro-image-preview)
- 通义千问 API (文章图片匹配评估,模型:qwen-max)
- 核心依赖库:
requests==2.31.0- HTTP请求google-genai==0.1.0- Gemini API调用pymysql- MySQL数据库连接Pillow==10.0.0- 图片处理和文字融合
项目结构
文字匹配图片/
├── article_auto_image_matching.py # 主程序:文章图片智能匹配
├── start_article_auto_image_matching.sh # 启动脚本
├── database_config.py # 数据库配置管理
├── log_config.py # 日志配置
├── export_approved_articles.py # 导出审核通过的文章
├── export_image_tags.py # 导出图片标签数据
├── push_article_published.py # 文章发布监控脚本
├── requirements.txt # 项目依赖
├── setup_env.bat # Windows环境初始化脚本
├── setup_env.sh # Linux/macOS环境初始化脚本
├── db/ # 数据库表结构
│ ├── split_tables/ # 按表拆分的SQL文件(24个表)
│ └── ai_articles.sql # 完整数据库结构
└── logs/ # 日志目录
├── article_image_matching.log # 匹配日志
├── article_image_matching_error.log # 错误日志
└── start_*.log # 启动日志
环境配置
1. Linux 中文字体安装(必需)
封面图压字花功能需要中文字体支持,请先安装:
Ubuntu/Debian:
sudo apt-get update
sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei
CentOS/RHEL:
sudo yum install wqy-zenhei-fonts wqy-microhei-fonts
# 或安装 Google Noto 字体
sudo yum install google-noto-sans-cjk-fonts
验证字体安装:
fc-list :lang=zh
2. Python 虚拟环境
本项目使用共享虚拟环境:/home/work/keyword_crawl/venv
如需创建新环境:
python3 -m venv /home/work/keyword_crawl/venv
source /home/work/keyword_crawl/venv/bin/activate
pip install -r requirements.txt
3. 数据库配置
编辑 database_config.py 中的数据库连接信息:
DB_CONFIG = {
'host': 'your_host',
'user': 'your_user',
'password': 'your_password',
'database': 'ai_articles',
'charset': 'utf8mb4'
}
使用方法
快速启动(推荐)
1. 赋予执行权限:
chmod +x start_article_auto_image_matching.sh
2. 前台运行(查看实时输出):
./start_article_auto_image_matching.sh
3. 后台运行:
nohup ./start_article_auto_image_matching.sh > /dev/null 2>&1 &
4. 查看运行状态:
# 查看进程
ps aux | grep article_auto_image_matching
# 查看最新日志
ls -lt logs/start_*.log | head -1
tail -f logs/start_*.log
手动运行
source /home/work/keyword_crawl/venv/bin/activate
python article_auto_image_matching.py
导出数据
导出审核通过的文章:
python export_approved_articles.py
导出图片标签数据:
python export_image_tags.py
核心功能说明
1. 文章图片匹配流程
- 查询待匹配文章:status='pending_review' 且 review_user_id=152,无图片关联
- 获取可用图片:根据文章科室ID查询可用图片(image_attached_article_count < 5 且 status='generate')
- 图片优先级排序:实拍图(image_source=2)> 模板图(image_source=1),按挂载次数升序
- 通义千问评估:调用API评估匹配度,阈值0.6
- 匹配成功:插入关联记录,更新图片状态为published
- 匹配失败:根据当前图片数量采用不同策略生成图片
2. 图片生成策略
- 0张图:生成1张封面图(image_source=12)+ 2张详情图(image_source=13)
- 1张图:
- 缺少实拍图:生成1张封面图(image_source=12)
- 缺少AI生成图:补充详情图至2张(image_source=13)
- ≥2张图:检查并补充缺失类型图片
3. 封面图压字花处理(本地化)
核心特性:
- ✅ 文字居中显示:自动计算居中坐标
- ✅ 深褐色文字:RGB(180, 60, 50)
- ✅ 白色描边效果:3像素宽度
- ✅ 自适应字体大小:基础120px,根据图片尺寸调整(40-150px)
- ✅ 自动换行:每行最多12个字符
- ✅ 跨平台支持:自动检测操作系统并加载对应字体
处理流程:
- Gemini生成封面图片
- 本地压字花处理(添加文章标题)
- 上传到通用图片接口
- 插入数据库关联记录(image_source=12)
技术优势:
- 绕过网络接口的 IncompleteRead 问题
- 本地处理更快更稳定
- 完全符合视觉规范
4. Gemini图片生成流程
- 根据文章标题和标签生成提示词
- 调用Gemini API生成图片(模型:gemini-3-pro-image-preview)
- 插入
ai_images表 - 插入
ai_image_tags表(image_source=3表示AI生成) - 上传图片到服务器(获取真实URL)
- 更新数据库中的图片URL
- 插入
ai_article_images表(sort_order自动递增)
5. RPA审核接口
所有图片(1封面+2详情)生成完成后,统一调用RPA审核接口:
- 端点:
POST /api/articles/rpa/review - 参数:
article_ids(文章ID列表)、image_source(图片来源类型)
数据库表结构
主要表说明
- ai_articles: 文章主表
- ai_images: 图片信息表
- ai_image_tags: 图片标签关联表
- ai_article_images: 文章图片关联表
- ai_tags: 标签表
- ai_keywords: 关键词表
- ai_departments: 部门表
配置参数
核心常量
WORKER_COUNT = 4 # 并行处理worker数量
BATCH_SIZE = 50 # 每批处理的文章数量
MATCH_THRESHOLD = 0.6 # 匹配分数阈值(0-1)
API配置
Gemini API:
- 端点:
https://work.poloapi.com - 模型:
gemini-3-pro-image-preview - API Key:配置在代码中
通义千问 API:
- 端点:
https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation - 模型:
qwen-max - API Key:配置在代码中
后端服务 API:
- 登录:
http://47.99.184.230:8324/api/auth/login - 图片上传:
http://47.99.184.230:8324/api/images/upload - RPA审核:
http://47.99.184.230:8324/api/articles/rpa/review
日志说明
日志文件位置
日志文件存储在 logs/ 目录下:
article_image_matching.log- 文章匹配主日志article_image_matching_error.log- 错误日志start_YYYYMMDD_HHMMSS.log- 启动脚本日志
日志级别
- INFO:正常流程信息
- WARNING:警告信息(如字体加载失败)
- ERROR:错误信息(如图片生成失败)
数据库日志
系统会将关键操作记录到 ai_logs 表:
- 启动/停止服务
- 文章匹配成功/失败
- 图片生成成功/失败
- API调用结果
注意事项
- 运行平台:仅支持Linux服务器,不支持Windows
- 中文字体:封面图压字花功能必须安装中文字体(文泉驿正黑/微米黑)
- 虚拟环境:使用共享虚拟环境
/home/work/keyword_crawl/venv - API密钥:妥善保管Gemini和通义千问的API密钥
- 数据库密码:生产环境建议使用环境变量管理敏感信息
- 并发控制:默认4个worker并行处理,可根据服务器性能调整
- 图片生成策略:所有图片生成完成后才调用RPA审核接口
- 网络稳定性:封面图上传已本地化处理,避免 IncompleteRead 错误
常见问题
1. 字体加载失败
错误:无法加载任何中文字体
解决:
# Ubuntu/Debian
sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei
# CentOS/RHEL
sudo yum install wqy-zenhei-fonts
# 验证安装
fc-list :lang=zh
2. 虚拟环境未找到
错误:[警告] 未找到虚拟环境
解决:检查虚拟环境路径是否正确,或使用系统Python
3. 图片上传失败
原因:网络不稳定导致的 IncompleteRead 错误
解决:已通过本地化处理解决,封面图使用本地压字花+通用上传接口
4. Gemini生成超时
解决:检查网络连接和API密钥配置
许可证
内部项目,保密使用。
Description
Languages
Python
98.1%
Shell
1.8%
Batchfile
0.1%