用 AI 批量生成电商商品详情页:从 SKU 表到可发布内容的完整工作流
文章摘要
用 AI 批量生成商品详情页,看似只需要把商品参数交给大模型,实际上最容易出现虚构卖点、规格混乱、不同 SKU 文案重复、违禁词失控和渠道格式不兼容等问题。真正可投入生产的方案,不是“批量复制提示词”,而是建立一条由商品数据清洗、事实约束、结构化生成、规则校验、人工抽检和多渠道发布组成的内容流水线。本文给出可直接实施的数据字段、提示词模板、JSON 输出结构、Python 批处理示例和质量控制清单。
---
一、为什么直接让 AI 写商品详情页通常会失败?
最常见的做法是把 Excel 中的商品名称和几个参数粘贴给大模型,然后要求:
请生成一个吸引人的商品详情页。
这种方法可以快速得到文字,却很难得到可靠的商品内容,原因主要有五个。
1. 原始商品数据不完整
很多商品表只包含:
- SKU;
- 商品名称;
- 价格;
- 一两项规格。
但详情页还需要适用人群、使用场景、材质、尺寸、包装、注意事项、售后规则和可验证卖点。如果数据缺失,模型会倾向于补全看似合理的信息,从而产生幻觉。
2. “卖点”和“事实”没有分开
“采用 304 不锈钢”是事实,“更耐用”是基于事实的表达,“行业第一、绝对安全、永久不坏”则可能属于无法验证或违规的承诺。
如果不区分事实字段和营销表达,模型很容易把推断写成事实。
3. 不同渠道要求不同
同一个商品在不同平台可能需要:
- 独立站 SEO 标题和 Meta Description;
- 淘宝、京东式卖点段落;
- 亚马逊 Bullet Points;
- 短视频口播文案;
- 社交媒体短标题;
- 广告平台限制字数的素材。
只生成一段通用长文,后续仍需要大量人工改写。
4. 批量生成会放大重复和错误
单篇文案看起来不错,不代表 5,000 个 SKU 也能稳定。批量任务中常见的问题包括:
- 标题结构高度重复;
- 所有商品都使用“匠心打造”“品质之选”;
- 参数单位被改写;
- 型号和颜色错位;
- 某一行脏数据污染大量结果;
- API 超时导致部分 SKU 缺失;
- 重试后产生重复记录。
5. 没有质量门禁
如果 AI 输出直接发布,企业就把内容风险交给了模型。正确做法是让模型生成候选内容,再由规则、程序和人工审核决定是否发布。
---
二、正确的系统结构:六层内容流水线
一条可生产化的商品内容流程,可以拆成六层:
```text
商品主数据
↓
数据清洗与标准化
↓
事实锁定与内容策略
↓
AI 结构化生成
↓
规则校验与风险评分
↓
人工审核 / 自动发布
```
每一层解决不同问题。
第一层:商品主数据
商品事实必须来自 PIM、ERP、商品数据库或经过确认的 Excel,而不是由模型猜测。
第二层:数据清洗
统一单位、空值、枚举值、颜色名称、尺寸格式和品牌术语。
第三层:事实锁定
明确哪些字段可以直接使用,哪些字段可以合理改写,哪些字段绝不能生成。
第四层:结构化生成
让模型输出 JSON,而不是一整段不可控文本。
第五层:规则校验
通过程序检查字数、违禁词、参数一致性、重复度和字段完整性。
第六层:审核与发布
低风险商品可自动通过,高风险品类和低置信度结果进入人工审核队列。
---
三、先设计商品数据表
建议至少准备以下字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| sku_id | 唯一商品编号 | CUP-500-BLK |
| product_name | 标准商品名 | 500ml 真空保温杯 |
| brand | 品牌 | Example |
| category | 类目 | 水杯 / 保温杯 |
| material | 材质 | 304 不锈钢、食品接触级 PP |
| size | 尺寸 | 7.2 × 22.5 cm |
| capacity | 容量 | 500 ml |
| color | 颜色 | 曜石黑 |
| package_contents | 包装清单 | 保温杯 ×1、说明书 ×1 |
| verified_features | 已确认特性 | 双层真空结构、防滑杯底 |
| target_users | 适用人群 | 通勤人群、学生 |
| usage_scenarios | 使用场景 | 办公、通勤、短途出行 |
| restrictions | 禁止表达 | 不得宣称医疗功效,不得写永久保温 |
| warranty | 售后信息 | 7 天无理由,质量问题一年保修 |
| keywords | SEO 关键词 | 保温杯、500ml 保温杯、通勤水杯 |
| channel | 发布渠道 | 独立站、亚马逊、京东 |
还应增加三个重要字段:
`source_of_truth`
记录事实来自哪里,例如 ERP、检测报告、供应商确认单或人工录入。这有助于后续追责和更新。
`missing_fields`
在生成前列出缺失信息。缺失关键字段的 SKU 不应进入自动发布流程。
`content_version`
每次重新生成时增加版本号,避免新旧文案混淆。
---
四、建立“可写、可推导、禁止写”三类规则
在调用模型前,先将字段划分为三类。
1. 可直接写入
这些内容有明确数据来源:
- 材质;
- 规格;
- 尺寸;
- 容量;
- 包装;
- 型号;
- 颜色;
- 已验证功能;
- 售后规则。
2. 可基于事实表达
这些内容允许从事实推导,但不能夸大:
- “双层真空结构”可表达为“帮助减少热量交换”;
- “防滑杯底”可表达为“放置更稳”;
- “500ml 容量”可表达为“适合日常通勤携带”。
模型应在语言层面优化,而不是发明新功能。
3. 禁止生成
包括:
- 未提供的认证;
- 医疗、治疗或保健效果;
- “第一、顶级、绝对、百分之百”等无法证明的表述;
- 未确认的成分和材质;
- 未提供的赠品;
- 虚假的销量与用户评价;
- 不存在的售后承诺;
- 与法律法规或平台规则冲突的词语。
这三类规则应该作为系统提示词的一部分固定下来。
---
五、让模型返回结构化 JSON
不要只要求“写一个详情页”,而应定义明确输出结构。
```json
{
"sku_id": "CUP-500-BLK",
"seo_title": "500ml 真空保温杯|曜石黑通勤水杯",
"short_title": "500ml 曜石黑保温杯",
"summary": "适合办公与通勤使用的轻便保温杯。",
"selling_points": [
{
"title": "双层真空结构",
"description": "帮助减少热量交换,满足日常饮水需求。"
}
],
"specifications": [
{"name": "容量", "value": "500 ml"}
],
"usage_scenarios": ["办公", "通勤", "短途出行"],
"care_instructions": ["首次使用前请清洗"],
"meta_description": "500ml 曜石黑真空保温杯,采用 304 不锈钢内胆,适合办公、通勤与短途出行。",
"risk_flags": [],
"missing_information": []
}
```
结构化输出有四个明显优势:
1. 可以直接写入 CMS 或商品数据库;
2. 可以逐字段检查长度和违禁词;
3. 可以针对不同渠道重新组合;
4. 失败时容易定位是哪一部分出现问题。
---
六、可直接使用的提示词模板
下面是一套适合批量任务的提示词结构。
```text
你是一名电商商品内容编辑。请仅根据输入的商品事实生成内容,不得补充输入中不存在的材质、功能、认证、赠品、销量、评价、售后承诺或功效。
任务目标:
1. 生成真实、清晰、不过度夸张的商品内容;
2. 保留型号、尺寸、容量、材质和数量的原始精度;
3. 禁止使用“最、第一、顶级、绝对、永久、100%”等无法验证的表达;
4. 如果关键信息缺失,将其写入 missing_information,不得猜测;
5. 输出必须是合法 JSON,不要使用 Markdown 代码块。
内容要求:
- seo_title:不超过 60 个中文字符;
- short_title:不超过 30 个中文字符;
- summary:60 至 100 个中文字符;
- selling_points:3 至 5 项,每项必须能追溯到 verified_features;
- specifications:完整保留输入参数;
- meta_description:不超过 120 个中文字符;
- risk_flags:记录可能存在风险的表达或数据问题。
输入商品:
{{PRODUCT_JSON}}
输出 JSON Schema:
{{OUTPUT_SCHEMA}}
```
批量生成时,system prompt 应固定,商品数据放在 user prompt 中。这样有利于缓存、版本控制和一致性。
---
七、Python 批处理示例
下面的示例使用 OpenAI 兼容格式的 API。只需通过环境变量替换接口地址、模型和密钥,就可以适配多个供应商。
```python
import csv
import json
import os
import time
from pathlib import Path
import requests
API_BASE = os.environ["LLM_API_BASE"].rstrip("/")
API_KEY = os.environ["LLM_API_KEY"]
MODEL = os.environ.get("LLM_MODEL", "your-model")
INPUT_FILE = Path("products.csv")
OUTPUT_FILE = Path("generated-products.jsonl")
ERROR_FILE = Path("generation-errors.jsonl")
SYSTEM_PROMPT = """
你是一名电商商品内容编辑。
仅根据输入事实生成内容,不得虚构材质、功能、认证、赠品、销量、
评价、售后承诺或功效。输出必须是合法 JSON。
"""
def call_model(product: dict, retries: int = 3) -> dict:
payload = {
"model": MODEL,
"messages": [
{"role": "system", "content": SYSTEM_PROMPT},
{
"role": "user",
"content": json.dumps(product, ensure_ascii=False)
}
],
"response_format": {"type": "json_object"},
"temperature": 0.2
}
for attempt in range(retries):
try:
response = requests.post(
f"{API_BASE}/chat/completions",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json=payload,
timeout=90
)
response.raise_for_status()
content = response.json()["choices"][0]["message"]["content"]
result = json.loads(content)
result["sku_id"] = product["sku_id"]
return result
except (requests.RequestException, KeyError, json.JSONDecodeError) as exc:
if attempt == retries - 1:
raise RuntimeError(f"Generation failed: {exc}") from exc
time.sleep(2 ** attempt)
raise RuntimeError("Unexpected retry state")
def append_jsonl(path: Path, data: dict) -> None:
with path.open("a", encoding="utf-8") as file:
file.write(json.dumps(data, ensure_ascii=False) + "\n")
def main() -> None:
processed = set()
if OUTPUT_FILE.exists():
with OUTPUT_FILE.open("r", encoding="utf-8") as file:
for line in file:
if line.strip():
processed.add(json.loads(line)["sku_id"])
with INPUT_FILE.open("r", encoding="utf-8-sig", newline="") as file:
reader = csv.DictReader(file)
for product in reader:
sku_id = product.get("sku_id", "").strip()
if not sku_id or sku_id in processed:
continue
try:
result = call_model(product)
append_jsonl(OUTPUT_FILE, result)
print(f"OK: {sku_id}")
except Exception as exc:
append_jsonl(
ERROR_FILE,
{"sku_id": sku_id, "error": str(exc)}
)
print(f"FAILED: {sku_id}")
if __name__ == "__main__":
main()
```
这个示例包含三个生产环境中非常重要的设计:
- 断点续跑:已经成功生成的 SKU 不重复执行;
- 指数退避重试:临时网络错误不会立即导致任务失败;
- 错误独立记录:失败记录进入单独文件,便于重新处理。
正式系统还应增加限流、并发控制、token 记录、成本统计和幂等键。
---
八、生成后必须做的八类检查
1. JSON 合法性
确认字段存在、类型正确、数组没有被输出为字符串。
2. 参数一致性
模型输出中的尺寸、容量、材质、型号和数量必须与商品主数据一致。可以将这些字段做精确匹配,而不是交给人工阅读。
3. 违禁词检查
维护按国家、行业和平台划分的词库。食品、保健品、化妆品、医疗器械和儿童用品应采用不同规则。
4. 幻觉检查
从输出中提取材质、认证、功能和售后承诺,与输入字段比对。任何无法在原始数据中找到的事实,都应进入人工审核。
5. 重复度检查
计算不同 SKU 标题和卖点的相似度。若大量内容只替换颜色和型号,搜索引擎和用户都会认为内容质量较低。
6. 长度与渠道格式检查
不同渠道分别设定标题、描述、Bullet Points 和关键词长度,不要用一套规则覆盖所有平台。
7. 品牌语气检查
品牌可以定义禁止词、常用句式、语气强度和标点规范。模型输出应在品牌规范内变化,而不是每次自由发挥。
8. 人工抽检
建议按风险分层:
- 普通低风险品类:抽检 5% 至 10%;
- 高客单价商品:提高抽检比例;
- 食品、健康、美妆和儿童用品:默认人工审核;
- 新模型、新提示词或新数据源上线初期:至少全量审核一个批次。
---
九、如何降低 1,000 个 SKU 的生成成本?
真正有效的优化并不是一味换最便宜的模型,而是减少无效 token 和返工。
1. 固定 system prompt,利用缓存
所有 SKU 共用一套稳定规则,避免每次加入大段不同说明。支持提示词缓存的供应商可以显著降低重复输入成本。
2. 先用便宜模型清洗,再用强模型生成
可以采用两级流程:
```text
低成本模型:字段清洗、分类、缺失检测
↓
主力模型:生成标题、卖点和描述
↓
低成本模型或规则程序:风险检查
```
不需要让最强模型承担每一步工作。
3. 控制输出长度
商品内容不是越长越好。明确每个字段的最大长度,避免模型输出大量无法发布的废话。
4. 使用 Batch 或离线任务
不要求实时返回的商品内容,可以使用供应商提供的 Batch、Flex 或异步处理模式,通常比实时标准调用更便宜。
5. 只重新生成失败字段
如果标题通过而卖点不合格,只重做 `selling_points`,不要重新生成整个详情页。
6. 建立内容指纹
根据商品事实、提示词版本和模型版本生成哈希值。当输入没有变化时,不重复调用模型。
---
十、用 n8n 或 Make 搭建无代码版本
不写 Python,也可以实现相同流程。
n8n 工作流
```text
读取 Google Sheets / Excel
→ Split in Batches
→ 数据清洗
→ LLM 结构化生成
→ JSON Schema 校验
→ 违禁词检查
→ 风险分支
→ 写入 CMS 或审核表
→ 记录 token 与费用
```
n8n 适合需要自托管、代码节点、数据库接入和精细异常处理的团队。
Make 场景
```text
Watch Rows
→ Iterator
→ Text / JSON Mapping
→ AI Module
→ Parse JSON
→ Router
→ 低风险:写入 CMS
→ 高风险:创建审核任务
```
Make 更适合运营团队和需要清晰可视化流程的自动化项目。
无论使用哪个平台,都不要把“模型调用成功”当成“内容可以发布”。
---
总结
AI 批量生成商品详情页的核心,不是文案生成速度,而是如何保证每一条内容都能追溯到真实商品数据,并在规模扩大后仍然可检查、可恢复、可审核。
一个可靠方案至少应做到:
- 商品事实与营销表达分离;
- 缺失信息不允许模型猜测;
- 输出采用稳定 JSON Schema;
- 参数、违禁词和幻觉由程序检查;
- 批量任务支持断点续跑和失败重试;
- 不同渠道采用不同内容模板;
- 高风险结果进入人工审核;
- 每次调用记录模型、提示词、token 和版本。
当这些基础设施建立起来,AI 才真正从“帮忙写文案”升级为可控的商品内容生产系统。
想了解更多适合内容生产、电商运营和自动化流程的 AI 工具,可以访问 智元选:https://www.zyentorpicks.com/。这里会持续发布工具对比、使用教程和实际落地方案。
---
📌 原文链接: 本文首发于 [智元选 AI 工具指南](https://www.zyentorpicks.com),未经许可不得转载。