电商 AI 生图爆款流水线 — 输入新品平铺图,自动检索相似爆款、分析风格,生成专业宣传图。
跨境电商场景中,商家每出一款新品都需要制作宣传图(模特穿着商品的照片)。传统方式需要请模特、搭场景、拍摄修图,成本高、周期长。
本项目实现了一套全自动的 AI 生图流水线:
- 以图搜爆款 — 将新品平铺图与历史爆款库做混合检索(视觉相似 + 关键词匹配 + 销量过滤),找到风格最接近的爆款
- AI 分析风格 — 将爆款参考图发给大语言模型,自动分析场景、灯光、姿势、氛围,生成风格描述 prompt
- AI 生成宣传图 — 将新品图 + 爆款参考 + 风格描述一起发给图像生成模型,输出专业宣传图
项目灵感来源于教程:Nano Banana2+ Milvus+ qwen3.5,打造电商生图爆款流水线 文章参考来源:https://mp.weixin.qq.com/s/itMVbtZDW0IzIBhp6e9OHw
这个项目解决的是「新品宣传图生成」问题。
如果你生成素材后准备拿去 TikTok Ads / TikTok Shop 测试,可以顺手看一下:
TikTok Offers Hub
https://ttoh.app
收集 TikTok 的广告优惠券,适合跨境卖家、TikTok Shop 商户和投手。
电商最核心的资产是大量经过市场验证的爆款图。模特表现力、场景构图、光影质感,都是花钱试出来的。与其每次从零写 prompt,不如直接从历史爆款中检索最相似的视觉特征,让 AI 继承"爆款基因"。这正是 Milvus 混合检索发挥作用的地方。
使用方式:
- 将真实商品图片放入 images/(替换占位图),新品放入 new_products/
- python main.py setup — 建库 + 编码 + 入库
- python main.py search --new-id NEW001 — 测试检索
- python main.py generate --new-id NEW001 — 完整生图流水线
单一检索方式有盲区:
| 检索方式 | 擅长 | 弱点 |
|---|---|---|
| Dense 向量(图片 Embedding) | 视觉相似度(颜色、款式、风格) | 不擅长精确关键词匹配 |
| Sparse 向量(TF-IDF) | 关键词语义("floral"、"midi"、"chiffon") | 不理解视觉特征 |
| 标量筛选 | 品类过滤、销量排序 | 无法理解语义 |
三者结合 + RRF(Reciprocal Rank Fusion)重排序,检索精度远超单一方式。
新品平铺图
│
▼
llama-nemotron-embed-vl-1b-v2 (Embedding API)
│
├── Dense 向量 (2048d) ──────────────────┐
│ ▼
└── 文本 → TF-IDF → Sparse 向量 ──→ Milvus 混合检索
│
Dense (视觉相似)
+ Sparse (关键词匹配)
+ Scalar (品类 + 销量过滤)
+ RRF 重排序
│
▼
Top-K 相似爆款宣传图
│
▼
Qwen 3.5 (多模态 LLM)
分析场景/灯光/姿势/氛围
输出风格描述 prompt
│
▼
Gemini 3.1 Flash / Nano Banana 2
(新品图 + 爆款参考 + 风格prompt)
│
▼
生成的宣传图 → output/
所有模型通过 OpenRouter API 调用,无需本地 GPU。
| 模型 | 用途 | 说明 |
|---|---|---|
nvidia/llama-nemotron-embed-vl-1b-v2 |
图片/文本 Embedding | 免费,输出 2048 维向量,支持图文同空间 |
qwen/qwen3.5-397b-a17b |
爆款风格分析 | 多模态,可同时理解图片和文本 |
宣传图生成模型(通过 --model 参数切换):
| 别名 | 模型 | 说明 |
|---|---|---|
nano-banana(默认) |
google/gemini-3.1-flash-image-preview |
支持多参考图融合、多比例(含 8:1/1:8 超宽超高)、文字渲染,单张约 $0.067,无地区限制 |
gpt-image |
openai/gpt-5.4-image-2 |
OpenAI 最新生图模型,人像融合效果好,需海外网络环境 |
gpt-image-pro |
openai/gpt-5-image |
OpenAI 生图 Pro 版,质量更高,需海外网络环境 |
gpt-image-mini |
openai/gpt-5-image-mini |
OpenAI 生图轻量版,成本更低,需海外网络环境 |
Collection: fashion_products
├── id INT64 (主键,自增)
├── product_id VARCHAR — 商品编号
├── category VARCHAR — 品类 (maxi_dress, midi_dress, casual_top)
├── color VARCHAR — 颜色
├── style VARCHAR — 风格 (bohemian, floral, bodycon, ...)
├── season VARCHAR — 季节 (spring, summer, autumn)
├── sales_count INT64 — 销量(用于标量过滤)
├── description VARCHAR — 商品描述(用于 TF-IDF)
├── price FLOAT — 价格
├── dense_vector FLOAT_VECTOR(2048) — 图片 Embedding
└── sparse_vector SPARSE_FLOAT_VECTOR — TF-IDF 稀疏向量
cloth-milvus/
├── main.py # CLI 入口 (setup / search / generate)
├── config.py # 配置管理,从 .env 读取
├── utils.py # 工具函数 (图片编解码)
├── embeddings.py # Dense/Sparse 向量生成
├── milvus_store.py # Milvus 建库、插入、混合检索
├── style_analyzer.py # Qwen3.5 风格分析
├── image_generator.py # Nano Banana 2 宣传图生成
├── data_setup.py # 示例数据生成 (CSV + 占位图)
├── requirements.txt # Python 依赖
├── .env # API Key 配置 (需自行填写)
│
├── images/ # 历史爆款商品图片
├── new_products/ # 新品平铺图
├── products.csv # 历史商品元数据 (40条示例)
├── new_products.csv # 新品元数据 (4条示例)
└── output/ # 生成的宣传图输出目录
- Python 3.10+
- Zilliz Cloud 账号(免费 tier 即可)
- OpenRouter 账号和 API Key
pip install -r requirements.txtOPENROUTER_API_KEY=sk-or-v1-xxxxx
MILVUS_HOST=https://xxx.gcp.zillizcloud.com
MILVUS_TOKEN=your-zilliz-api-key
COLLECTION_NAME=fashion_products- OPENROUTER_API_KEY — 在 openrouter.ai/keys 获取
- MILVUS_HOST / MILVUS_TOKEN — 在 Zilliz Cloud 控制台创建集群后获取
将商品图片放入对应目录:
images/
├── SKU001.jpg # 历史爆款商品图
├── SKU002.jpg
├── ...
└── SKU040.jpg
new_products/
├── NEW001.jpg # 新品平铺图
├── NEW002.jpg
├── NEW003.jpg
└── NEW004.jpg
编辑 products.csv 和 new_products.csv 填入你的真实商品信息。首次运行 setup 时程序会自动创建 CSV 模板和占位图。
编辑 CSV 文件,字段格式:
products.csv(历史爆款库):
product_id,image_path,category,color,style,season,sales_count,description,price
SKU001,SKU001.jpg,maxi_dress,pink,bohemian,summer,3200,Bohemian pink maxi dress with tassel tie detail,29.99category— 品类,自由填写,会作为检索过滤条件sales_count— 历史销量,默认只检索销量 > 1500 的description— 英文描述,用于 TF-IDF 关键词匹配
new_products.csv(新品):
new_id,image_path,category,style,season,prompt_hint
NEW001,NEW001.jpg,midi_dress,casual,spring,Knit cardigan on a sunlit cafe terraceprompt_hint— 场景提示词,告诉 AI 你希望生成什么样的宣传场景
# Step 1: 建库入库(首次运行或数据更新时执行)
python main.py setup
# Step 2: 测试检索(可选,验证混合检索是否正常)
python main.py search --new-id NEW001
# Step 3: 完整流水线(检索 → 风格分析 → 生图)
# 默认使用 Nano Banana 2 生图
python main.py generate --new-id NEW001
# 使用 GPT-5.4 Image 2 生图
python main.py generate --new-id NEW001 --model gpt-image
# 使用 GPT-5 Image Pro 生图
python main.py generate --new-id NEW001 --model gpt-image-pro生成的宣传图保存在 output/ 目录。
初始化数据,生成向量,创建 Milvus Collection 并入库。
python main.py setup无需额外参数。重复运行会重建 Collection。
为新品检索相似爆款。
python main.py search [OPTIONS]| 参数 | 默认值 | 说明 |
|---|---|---|
--new-id |
全部 | 指定新品 ID,如 --new-id NEW001 |
--top-k |
3 | 返回结果数量 |
--sales-threshold |
1500 | 最低销量过滤门槛 |
完整流水线:混合检索 → 风格分析 → 宣传图生成。
python main.py generate [OPTIONS]| 参数 | 默认值 | 说明 |
|---|---|---|
--new-id |
全部 | 指定处理某个新品 |
--top-k |
3 | 参考爆款数量 |
--sales-threshold |
1500 | 最低销量过滤门槛 |
--aspect-ratio |
3:4 |
生成图宽高比(支持 1:1, 3:4, 4:1, 9:16 等) |
--image-size |
2K |
生成图分辨率(512px, 1K, 2K, 4K) |
--model |
nano-banana |
生图模型:nano-banana, gpt-image, gpt-image-pro, gpt-image-mini |
| 文件 | 职责 |
|---|---|
config.py |
所有配置集中管理,从 .env 读取敏感信息 |
embeddings.py |
图片 → Dense 向量(OpenRouter API)、文本 → TF-IDF Sparse 向量 |
milvus_store.py |
Milvus Collection CRUD 和混合检索(Dense + Sparse + RRF) |
style_analyzer.py |
调用 Qwen3.5 多模态 LLM 分析爆款图片风格 |
image_generator.py |
调用 Gemini/Nano Banana 2 生成宣传图 |
utils.py |
图片 base64 编解码、OpenRouter 响应解析 |
1. 混合检索流程
# 两路并行检索
dense_req = AnnSearchRequest(data=[query_dense], anns_field="dense_vector", ...)
sparse_req = AnnSearchRequest(data=[query_sparse], anns_field="sparse_vector", ...)
# RRF 融合
results = client.hybrid_search(reqs=[dense_req, sparse_req], ranker=RRFRanker(k=60))RRF(Reciprocal Rank Fusion)算法公式:score(d) = Σ 1/(k + rank(d)),将两路检索的排名融合为一个综合分数。
2. 多生图模型支持
所有生图模型统一通过 OpenRouter /api/v1/chat/completions 调用,格式一致:
payload = {
"model": model_id, # 如 "google/gemini-3.1-flash-image-preview" 或 "openai/gpt-5.4-image-2"
"messages": [{"role": "user", "content": [...]}],
"modalities": ["image", "text"], # 声明输出包含图片
}
# Gemini 系列额外支持 image_config 控制分辨率
if "google" in model_id:
payload["image_config"] = {"aspect_ratio": "3:4", "image_size": "2K"}
# OpenAI 系列支持 aspect_ratio
elif "openai" in model_id:
payload["image_config"] = {"aspect_ratio": "3:4"}模型差异:
| 特性 | Nano Banana 2 (Gemini) | GPT Image 系列 |
|---|---|---|
| 超宽/超高比例 | 支持 4:1, 1:4, 8:1, 1:8 | 标准比例 |
| 分辨率控制 | 支持 0.5K~4K | 自动 |
| 文字渲染 | 支持多语言、手写体 | 支持 |
| 参考图融合 | 支持 14 张(10对象+4角色) | 支持多张 |
| 人像融合 | 偶有服装贴合问题 | 更自然 |
通过 --model 参数自由切换,同一套代码适配两种生图引擎。
3. Qwen 3.x Thinking 模式
Qwen 3.x 默认启用 thinking,会将推理过程放在 reasoning_content 而非 content。本项目通过 enable_thinking: False 关闭该行为,确保直接返回结果。
- 换模型 — 修改
config.py中的模型名称,所有模型均走 OpenRouter,无需改动调用代码 - 新增品类 — 直接在 CSV 中添加新 category,程序自动适配
- 调整检索策略 — 修改
milvus_store.py中的filter_expr、RRFRanker参数或limit值 - 批量处理 —
generate不带--new-id即可批量处理所有新品
| 模型 | 单次调用成本 |
|---|---|
| Embedding (nvidia) | 免费 |
| Qwen 3.5 | ~$0.001/次 |
| Gemini 3.1 Flash (Nano Banana 2) | ~$0.067/张 |
处理一个新品(1次检索 + 1次风格分析 + 1张生图)约 $0.07。
- 占位图无法用于实际检索和生图,必须替换为真实商品照片
- 图片分辨率影响 Embedding 质量,建议商品图不低于 800x800
- Nano Banana 2 在服装与人体融合上偶尔不自然,可通过分步生图(先生成场景背景,再生成模特)或使用 Pro 版本改善
- Milvus Lite 不支持 Windows,本项目使用 Zilliz Cloud 替代
pymilvus>=2.4.0
openai>=1.0.0
requests>=2.31.0
pillow>=10.0.0
scikit-learn>=1.3.0
tqdm>=4.65.0
python-dotenv>=1.0.0
numpy>=1.24.0
linux.do社区佬友支持: https://linux.do , 感谢 佬友 trader 提供 api支持