# 文章图片智能匹配系统 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**: ```bash sudo apt-get update sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei ``` **CentOS/RHEL**: ```bash sudo yum install wqy-zenhei-fonts wqy-microhei-fonts # 或安装 Google Noto 字体 sudo yum install google-noto-sans-cjk-fonts ``` **验证字体安装**: ```bash fc-list :lang=zh ``` ### 2. Python 虚拟环境 本项目使用共享虚拟环境:`/home/work/keyword_crawl/venv` 如需创建新环境: ```bash 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` 中的数据库连接信息: ```python DB_CONFIG = { 'host': 'your_host', 'user': 'your_user', 'password': 'your_password', 'database': 'ai_articles', 'charset': 'utf8mb4' } ``` ## 使用方法 ### 快速启动(推荐) **1. 赋予执行权限**: ```bash chmod +x start_article_auto_image_matching.sh ``` **2. 前台运行**(查看实时输出): ```bash ./start_article_auto_image_matching.sh ``` **3. 后台运行**: ```bash nohup ./start_article_auto_image_matching.sh > /dev/null 2>&1 & ``` **4. 查看运行状态**: ```bash # 查看进程 ps aux | grep article_auto_image_matching # 查看最新日志 ls -lt logs/start_*.log | head -1 tail -f logs/start_*.log ``` ### 手动运行 ```bash source /home/work/keyword_crawl/venv/bin/activate python article_auto_image_matching.py ``` ### 导出数据 导出审核通过的文章: ```bash python export_approved_articles.py ``` 导出图片标签数据: ```bash python export_image_tags.py ``` ## 核心功能说明 ### 1. 文章图片匹配流程 1. **查询待匹配文章**:status='pending_review' 且 review_user_id=152,无图片关联 2. **获取可用图片**:根据文章科室ID查询可用图片(image_attached_article_count < 5 且 status='generate') 3. **图片优先级排序**:实拍图(image_source=2)> 模板图(image_source=1),按挂载次数升序 4. **通义千问评估**:调用API评估匹配度,阈值0.6 5. **匹配成功**:插入关联记录,更新图片状态为published 6. **匹配失败**:根据当前图片数量采用不同策略生成图片 ### 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个字符 - ✅ 跨平台支持:自动检测操作系统并加载对应字体 **处理流程**: 1. Gemini生成封面图片 2. 本地压字花处理(添加文章标题) 3. 上传到通用图片接口 4. 插入数据库关联记录(image_source=12) **技术优势**: - 绕过网络接口的 IncompleteRead 问题 - 本地处理更快更稳定 - 完全符合视觉规范 ### 4. Gemini图片生成流程 1. 根据文章标题和标签生成提示词 2. 调用Gemini API生成图片(模型:gemini-3-pro-image-preview) 3. 插入 `ai_images` 表 4. 插入 `ai_image_tags` 表(image_source=3表示AI生成) 5. 上传图片到服务器(获取真实URL) 6. 更新数据库中的图片URL 7. 插入 `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**: 部门表 ## 配置参数 ### 核心常量 ```python 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调用结果 ## 注意事项 1. **运行平台**:仅支持Linux服务器,不支持Windows 2. **中文字体**:封面图压字花功能必须安装中文字体(文泉驿正黑/微米黑) 3. **虚拟环境**:使用共享虚拟环境 `/home/work/keyword_crawl/venv` 4. **API密钥**:妥善保管Gemini和通义千问的API密钥 5. **数据库密码**:生产环境建议使用环境变量管理敏感信息 6. **并发控制**:默认4个worker并行处理,可根据服务器性能调整 7. **图片生成策略**:所有图片生成完成后才调用RPA审核接口 8. **网络稳定性**:封面图上传已本地化处理,避免 IncompleteRead 错误 ## 常见问题 ### 1. 字体加载失败 **错误**:`无法加载任何中文字体` **解决**: ```bash # 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密钥配置 ## 许可证 内部项目,保密使用。