結論:ECサイトの商品説明文生成は、Claude Code + Anthropic Batch API の組み合わせにより、5,000 SKU規模でも1日以内に高品質な文面を一括生成できる。A/Bテストで CV率 23%改善(試算)を達成可能な実装パターンを、コピペ可能なコード付きで解説する。
要点3つ:
- Claude Code のサブエージェント + Hooks 機能で「商品データ取得→プロンプト生成→品質チェック→CMS反映」を自動化
- Anthropic Message Batches API(50%コスト削減)で 5,000商品を非同期一括処理
- A/Bテスト統合により、AI生成文 vs 既存文の CV率差分を定量計測する仕組み
対象読者:EC開発エンジニア / PM / マーケティングエンジニア(Shopify・自社EC問わず)
今日やること:記事内のコードをローカルで動かし、10商品分のサンプル生成を試す
本記事は実装パターン解説です。具体的な数値(CV率改善幅・コスト削減額等)は想定モデルケースに基づく試算であり、実測値ではありません。実際の効果は商材・ターゲット・既存文の品質によって大きく変動します。
なぜ今、商品説明文のAI生成が必要なのか
EC事業者が抱える「コンテンツ負債」
商品数 3,000〜10,000 SKU のECサイトで、全商品に質の高い説明文が書けているケースは少ないです。実際に導入を検討するEC開発チームからよく聞くのが、以下のような状況です:
- 新商品の追加時に「タイトル + スペック表」だけで公開し、説明文は後回し
- 外注ライターに1商品あたり 500〜1,500円で依頼すると、5,000商品で 250万〜750万円
- 既存の説明文が2年前のまま放置され、SEOスコアも低下
- 季節・キャンペーンに合わせた文面更新が物理的に追いつかない
Adobe の2026年Q1レポートによると、AIアシスタント経由のEC流入は前年比393%増加し、AI経由の訪問者はCV率が42%高い(TechCrunch, 2026年4月16日報道)。つまり、AI検索に最適化された商品説明文を持っているかどうかが、今後のEC売上に直結する構造になりつつあります。
Claude Code がこの問題に適している理由
単純な「APIを叩いて文章生成」ではなく、Claude Code を使う理由は3つあります:
- サブエージェントによる並列処理 — カテゴリごとに異なるトーン・構成ルールを持つプロンプトを、サブエージェントに委任して並列実行できる
- Hooks による品質ゲート — 生成後に自動で「禁止表現チェック」「文字数チェック」「重複チェック」を走らせ、基準未達なら再生成
- ファイルシステム統合 — 商品マスタCSV、既存説明文、画像メタデータを直接読み込み、コンテキストとして活用できる
実装アーキテクチャの全体像
システム構成図
以下が今回の実装パターンの全体構成です:
# 動作環境:
# OS: Ubuntu 22.04 LTS (EC2 t3.medium)
# Claude Code: v2.1.140
# Node.js: v22.x LTS
# Python: 3.12 (venv)
# Anthropic SDK: anthropic 1.x (Python)
# アーキテクチャ概要:
# [商品マスタDB] → [Claude Code スクリプト] → [Batch API] → [品質チェック] → [CMS API]
# ↑ ↓
# [A/Bテスト結果] ← [GA4 BigQuery Export] ← [ECサイト本番] ← [反映]
ディレクトリ構成
# 動作環境: Claude Code v2.1.140 / macOS or Linux
# このプロジェクト構成を claude code で生成・管理する
ec-product-descriptions/
├── CLAUDE.md # プロジェクトルール定義
├── src/
│ ├── extract_products.py # 商品マスタからデータ抽出
│ ├── generate_prompts.py # バッチ用プロンプト生成
│ ├── submit_batch.py # Anthropic Batch API送信
│ ├── quality_gate.py # 品質チェック(Hooks連携)
│ ├── deploy_to_cms.py # CMS反映スクリプト
│ └── ab_test_analyzer.py # A/Bテスト結果分析
├── prompts/
│ ├── base_template.md # 基本プロンプトテンプレート
│ ├── fashion.md # ファッションカテゴリ特化
│ ├── electronics.md # 家電カテゴリ特化
│ └── food.md # 食品カテゴリ特化
├── data/
│ ├── products.csv # 商品マスタエクスポート
│ └── existing_descriptions/ # 既存説明文バックアップ
├── output/
│ ├── batch_requests.jsonl # Batch APIリクエスト
│ └── generated/ # 生成結果
└── tests/
├── test_quality_gate.py
└── test_prompt_generation.py
Step 1: CLAUDE.md によるプロジェクトルール定義
Claude Code に「ECコピーライター」としての制約を与える
Claude Code で最も重要なのは、CLAUDE.md でプロジェクト固有のルールを定義することです。これが品質の土台になります。
# ファイル: CLAUDE.md
# 動作環境: Claude Code v2.1.140 以降で自動読み込みされる
cat <<'EOF' > CLAUDE.md
# EC商品説明文生成プロジェクト
## 基本ルール
- 薬機法に抵触する表現は絶対に使わない(「治る」「効く」「改善する」等の効能表現禁止)
- 景品表示法の優良誤認に該当する表現禁止(「業界No.1」「最安値」等は裏付けなしで使わない)
- 商品スペックの数値は商品マスタの値をそのまま使う(AIが推測した数値は禁止)
- 生成した文章に「AIが生成しました」等のメタ表現を含めない
## 文体ルール
- です・ます調で統一
- 1文は60字以内を目安に
- 専門用語には()で補足説明を入れる
- 箇条書きは5項目以内
## カテゴリ別トーン
- ファッション: 感性的・ライフスタイル提案型
- 家電: スペック訴求 + 使用シーン提案
- 食品: 五感描写 + 産地・製法ストーリー
- 日用品: 課題解決型・比較優位性
## 品質基準
- 1商品あたり 200〜400字
- 主要キーワードを自然に2-3回含む
- 既存説明文と 30% 以上の表現差分があること(重複ペナルティ回避)
EOF
なぜ CLAUDE.md が効果的か
Claude Code はセッション開始時に CLAUDE.md を自動読み込みします。つまり、毎回プロンプトに「薬機法に注意して」と書く必要がなく、プロジェクト全体で一貫したルールが適用されます。これは API 直叩きでは得られない Claude Code 固有のメリットです。
Step 2: 商品データ抽出とプロンプト生成
商品マスタからの構造化データ抽出
# src/extract_products.py
# 動作環境: Python 3.12 / pandas 2.x / Claude Code v2.1.140
# 用途: Shopify or 自社DB から商品データを構造化抽出
import pandas as pd
import json
from pathlib import Path
def extract_products(csv_path: str, category: str = None) -> list[dict]:
"""商品マスタCSVから説明文生成に必要なフィールドを抽出"""
df = pd.read_csv(csv_path)
if category:
df = df[df["category"] == category]
products = []
for _, row in df.iterrows():
product = {
"sku": row["sku"],
"name": row["product_name"],
"category": row["category"],
"price": int(row["price"]),
"specs": row.get("specifications", ""),
"materials": row.get("materials", ""),
"target_keywords": row.get("seo_keywords", "").split(","),
"existing_description": row.get("description", ""),
"image_alt": row.get("main_image_alt", ""),
}
products.append(product)
return products
def generate_batch_prompts(products: list[dict], template_dir: str = "prompts/") -> list[dict]:
"""各商品に対してカテゴリ別テンプレートを適用したプロンプトを生成"""
base_template = Path(f"{template_dir}/base_template.md").read_text()
batch_requests = []
for product in products:
# カテゴリ別テンプレートがあれば読み込み
category_file = Path(f"{template_dir}/{product['category']}.md")
category_rules = category_file.read_text() if category_file.exists() else ""
prompt = f"""あなたはECサイトの商品説明文を書くプロのコピーライターです。
## 基本ルール
{base_template}
## カテゴリ固有ルール
{category_rules}
## 商品情報
- 商品名: {product['name']}
- カテゴリ: {product['category']}
- 価格: {product['price']:,}円
- スペック: {product['specs']}
- 素材・原材料: {product['materials']}
- SEOキーワード: {', '.join(product['target_keywords'])}
## 指示
上記の商品情報をもとに、200〜400字の商品説明文を1つ生成してください。
SEOキーワードを自然に2-3回含めてください。
薬機法・景表法に抵触する表現は絶対に使わないでください。
不足している情報があれば、仮定した点を「仮定」と明記してください。
"""
batch_requests.append({
"custom_id": f"product-{product['sku']}",
"params": {
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": prompt}]
}
})
return batch_requests
if __name__ == "__main__":
products = extract_products("data/products.csv")
requests = generate_batch_prompts(products)
# JSONL形式で出力(Batch API仕様)
output_path = Path("output/batch_requests.jsonl")
output_path.parent.mkdir(parents=True, exist_ok=True)
with open(output_path, "w") as f:
for req in requests:
f.write(json.dumps(req, ensure_ascii=False) + "n")
print(f"Generated {len(requests)} batch requests → {output_path}")
カテゴリ別プロンプトテンプレート例
# prompts/fashion.md
# 用途: ファッションカテゴリの商品説明文生成ルール
## トーン
- ライフスタイル提案型(「こんなシーンで活躍します」)
- 感性的な表現OK(「上品な光沢」「こなれた印象」)
- ただし主観的すぎる表現は避ける(「誰もが振り返る」等はNG)
## 必須要素
1. 素材の特徴と着心地
2. 推奨シーン(通勤/デート/カジュアル等)
3. サイズ感の参考情報
4. お手入れ方法の簡潔な案内
## 禁止表現
- 「痩せて見える」「体型カバー」(景表法リスク)
- 「高級ブランドと遜色ない」(優良誤認リスク)
- 具体的なブランド名との比較
Step 3: Anthropic Batch API による一括処理
Message Batches API の活用
Anthropic の Message Batches API は、最大10,000リクエストを非同期で処理し、通常料金の50%で利用できます(Anthropic公式ドキュメント, 2026年5月確認)。ECの商品説明文生成のように「リアルタイム性は不要だが大量処理が必要」なユースケースに最適です。
# src/submit_batch.py
# 動作環境: Python 3.12 / anthropic SDK 1.x
# 前提: ANTHROPIC_API_KEY が環境変数にセット済み
# Batch API仕様: https://docs.anthropic.com/en/docs/build-with-claude/batch-processing
import anthropic
import json
import time
from pathlib import Path
client = anthropic.Anthropic() # ANTHROPIC_API_KEY から自動読み込み
def submit_batch(jsonl_path: str) -> str:
"""JSONL ファイルを Batch API に送信し、batch_id を返す"""
requests = []
with open(jsonl_path) as f:
for line in f:
requests.append(json.loads(line))
print(f"Submitting {len(requests)} requests to Batch API...")
# バッチ作成
batch = client.messages.batches.create(requests=requests)
print(f"Batch created: {batch.id}")
print(f"Status: {batch.processing_status}")
return batch.id
def poll_batch(batch_id: str, interval: int = 60) -> dict:
"""バッチの完了をポーリングで待機"""
while True:
batch = client.messages.batches.retrieve(batch_id)
status = batch.processing_status
print(f"[{time.strftime('%H:%M:%S')}] Status: {status}")
if status == "ended":
print(f"Batch completed!")
print(f" Succeeded: {batch.request_counts.succeeded}")
print(f" Errored: {batch.request_counts.errored}")
print(f" Expired: {batch.request_counts.expired}")
return batch
time.sleep(interval)
def download_results(batch_id: str, output_dir: str = "output/generated/"):
"""完了したバッチの結果をダウンロード"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
results = {}
for result in client.messages.batches.results(batch_id):
custom_id = result.custom_id
if result.result.type == "succeeded":
content = result.result.message.content[0].text
results[custom_id] = {
"status": "success",
"description": content,
"tokens_used": result.result.message.usage.output_tokens
}
else:
results[custom_id] = {
"status": "error",
"error": str(result.result)
}
output_path = Path(output_dir) / "batch_results.json"
with open(output_path, "w") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
success_count = sum(1 for r in results.values() if r["status"] == "success")
print(f"Downloaded {success_count}/{len(results)} successful results → {output_path}")
return results
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Usage: python submit_batch.py ")
sys.exit(1)
batch_id = submit_batch(sys.argv[1])
batch = poll_batch(batch_id)
download_results(batch_id)
コスト試算
以下は5,000商品を Claude Sonnet 4.6 で処理した場合の試算です(Anthropic公式価格表, 2026年5月時点):
| 項目 | 通常API | Batch API(50% OFF) |
|---|---|---|
| 入力トークン(1商品平均800トークン × 5,000) | $12.00 | $6.00 |
| 出力トークン(1商品平均400トークン × 5,000) | $30.00 | $15.00 |
| 合計 | $42.00(約6,500円) | $21.00(約3,250円) |
※ 試算条件: Claude Sonnet 4.6 の入力 $3/MTok, 出力 $15/MTok(Batch 50%割引適用)。為替155円/ドル想定。実際の料金は Anthropic 公式価格ページで最新を確認してください。
外注ライター費用(5,000商品 × 500〜1,500円 = 250万〜750万円)と比較すると、コスト差は圧倒的です。ただし、AI生成文には人間によるスポットチェック(全体の5〜10%をサンプリング確認)が必須であり、その工数も考慮する必要があります。
Step 4: Hooks による品質ゲート自動化
Claude Code Hooks で生成後の自動チェックを組み込む
Claude Code の Hooks 機能を使うと、特定のアクション(ファイル書き込み等)の前後に自動でスクリプトを実行できます。これを品質チェックに活用します。
// .claude/settings.json
// 動作環境: Claude Code v2.1.140+
// Hooks機能: ファイル保存後に品質チェックスクリプトを自動実行
{
"hooks": {
"postToolUse": [
{
"matcher": "Write",
"command": "python3 src/quality_gate.py "$CLAUDE_FILE_PATH"",
"description": "生成結果の品質チェック"
}
]
}
}
品質チェックスクリプト
# src/quality_gate.py
# 動作環境: Python 3.12
# 用途: 生成された商品説明文の品質を自動チェック
# Claude Code Hooks から呼び出される
import sys
import re
import json
from pathlib import Path
# 薬機法NGワード(主要なもの)
PROHIBITED_WORDS = [
"治る", "治す", "治療", "改善する", "効く", "効果がある",
"痩せる", "ダイエット効果", "美白効果",
"医学的", "臨床", "処方",
]
# 景表法リスクワード
RISK_WORDS = [
"業界No.1", "最安値", "世界初", "日本初",
"誰もが", "絶対", "必ず", "100%",
]
def check_quality(text: str, sku: str = "") -> dict:
"""商品説明文の品質チェック"""
issues = []
# 1. 文字数チェック(200-400字)
char_count = len(text)
if char_count < 200:
issues.append(f"文字数不足: {char_count}字 (最低200字)")
elif char_count > 400:
issues.append(f"文字数超過: {char_count}字 (最大400字)")
# 2. 薬機法チェック
for word in PROHIBITED_WORDS:
if word in text:
issues.append(f"薬機法NG: 「{word}」を含む")
# 3. 景表法チェック
for word in RISK_WORDS:
if word in text:
issues.append(f"景表法リスク: 「{word}」を含む")
# 4. 1文の長さチェック(60字超の文がないか)
sentences = re.split(r'[。!?n]', text)
long_sentences = [s for s in sentences if len(s.strip()) > 60]
if long_sentences:
issues.append(f"長文あり: {len(long_sentences)}文が60字超")
# 5. AIメタ表現チェック
ai_meta = ["AIが生成", "自動生成", "ChatGPT", "Claude", "機械学習"]
for phrase in ai_meta:
if phrase in text:
issues.append(f"AIメタ表現: 「{phrase}」を含む")
return {
"sku": sku,
"char_count": char_count,
"passed": len(issues) == 0,
"issues": issues
}
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python quality_gate.py ")
sys.exit(1)
file_path = sys.argv[1]
# output/generated/ 内のファイルのみチェック
if "output/generated" not in file_path:
sys.exit(0)
text = Path(file_path).read_text()
result = check_quality(text)
if not result["passed"]:
print(f"❌ QUALITY GATE FAILED:")
for issue in result["issues"]:
print(f" - {issue}")
sys.exit(1)
else:
print(f"✅ QUALITY GATE PASSED ({result['char_count']}字)")
sys.exit(0)
Step 5: A/Bテスト統合による効果測定
生成文と既存文のCV率比較
AI生成文を「良さそうだから」で全面差し替えするのはリスクが高いです。必ずA/Bテストで効果を定量検証してから全面展開するべきです。
# src/ab_test_analyzer.py
# 動作環境: Python 3.12 / scipy / pandas
# 用途: GA4 BigQuery Export からA/Bテスト結果を集計
# 前提: GA4のBigQueryエクスポートが設定済み
import pandas as pd
from scipy import stats
from google.cloud import bigquery
def analyze_ab_test(
project_id: str,
dataset: str,
start_date: str,
end_date: str,
target_skus: list[str]
) -> dict:
"""
GA4 BigQuery データからA/Bテストの結果を分析
variant_a: 既存の説明文(コントロール)
variant_b: AI生成の説明文(トリートメント)
"""
client = bigquery.Client(project=project_id)
query = f"""
WITH product_views AS (
SELECT
event_date,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'item_id') as sku,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'ab_variant') as variant,
user_pseudo_id
FROM `{project_id}.{dataset}.events_*`
WHERE _TABLE_SUFFIX BETWEEN '{start_date}' AND '{end_date}'
AND event_name = 'view_item'
),
purchases AS (
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'item_id') as sku,
user_pseudo_id
FROM `{project_id}.{dataset}.events_*`
WHERE _TABLE_SUFFIX BETWEEN '{start_date}' AND '{end_date}'
AND event_name = 'purchase'
)
SELECT
pv.variant,
COUNT(DISTINCT pv.user_pseudo_id) as viewers,
COUNT(DISTINCT p.user_pseudo_id) as purchasers,
SAFE_DIVIDE(COUNT(DISTINCT p.user_pseudo_id), COUNT(DISTINCT pv.user_pseudo_id)) as conversion_rate
FROM product_views pv
LEFT JOIN purchases p ON pv.sku = p.sku AND pv.user_pseudo_id = p.user_pseudo_id
WHERE pv.sku IN UNNEST(@target_skus)
GROUP BY pv.variant
"""
job_config = bigquery.QueryJobConfig(
query_parameters=[
bigquery.ArrayQueryParameter("target_skus", "STRING", target_skus)
]
)
df = client.query(query, job_config=job_config).to_dataframe()
# 統計的有意差の検定(カイ二乗検定)
if len(df) == 2:
control = df[df["variant"] == "control"].iloc[0]
treatment = df[df["variant"] == "treatment"].iloc[0]
contingency = [
[int(treatment["purchasers"]), int(treatment["viewers"] - treatment["purchasers"])],
[int(control["purchasers"]), int(control["viewers"] - control["purchasers"])]
]
chi2, p_value, _, _ = stats.chi2_contingency(contingency)
lift = (treatment["conversion_rate"] - control["conversion_rate"]) / control["conversion_rate"]
return {
"control_cr": float(control["conversion_rate"]),
"treatment_cr": float(treatment["conversion_rate"]),
"lift": float(lift),
"p_value": float(p_value),
"significant": p_value < 0.05,
"sample_size": int(control["viewers"] + treatment["viewers"])
}
return {"error": "Insufficient data for comparison"}
A/Bテストの実装パターン
ECプラットフォーム別の推奨実装方法:
| プラットフォーム | A/B実装方法 | 必要な設定 |
|---|---|---|
| Shopify | Shopify Scripts + メタフィールドでバリアント管理 | Shopify Plus プラン推奨 |
| 自社EC(Next.js等) | Edge Middleware でユーザーをランダム振り分け | GA4 カスタムディメンション設定 |
| EC-CUBE | プラグインで商品説明フィールドを2面持ち | twig テンプレート改修 |
Step 6: CMS反映の自動化
Shopify REST API への反映例
# src/deploy_to_cms.py
# 動作環境: Python 3.12 / requests
# 用途: 品質チェック済みの説明文をShopify APIで反映
# 注意: 本番反映前に必ずステージング環境でテストすること
import json
import requests
import time
from pathlib import Path
SHOPIFY_STORE = "your-store.myshopify.com" # 環境変数から読み込み推奨
API_VERSION = "2024-10"
def deploy_descriptions(
results_path: str,
api_key: str,
dry_run: bool = True
) -> dict:
"""生成結果をShopify商品説明に反映"""
results = json.loads(Path(results_path).read_text())
deployed = {"success": 0, "skipped": 0, "failed": 0}
for custom_id, data in results.items():
if data["status"] != "success":
deployed["skipped"] += 1
continue
sku = custom_id.replace("product-", "")
description = data["description"]
if dry_run:
print(f"[DRY RUN] Would update SKU {sku}: {description[:50]}...")
deployed["success"] += 1
continue
# Shopify GraphQL API で商品更新
# 実装時は product_id の事前マッピングが必要
try:
# rate limit対策: 2リクエスト/秒
time.sleep(0.5)
# ここに実際のAPI呼び出しを実装
# response = requests.put(...)
deployed["success"] += 1
except Exception as e:
print(f"Failed to deploy SKU {sku}: {e}")
deployed["failed"] += 1
return deployed
if __name__ == "__main__":
# デフォルトは dry_run=True(安全側に倒す)
result = deploy_descriptions(
"output/generated/batch_results.json",
api_key="SHOPIFY_API_KEY", # 環境変数から取得すること
dry_run=True
)
print(f"Deploy results: {json.dumps(result)}")
Step 7: Claude Code サブエージェントによる並列処理
カテゴリ別に並列で品質チェック+改善を回す
Claude Code v2.1.x のサブエージェント機能を使うと、カテゴリごとに独立した品質チェック・改善ループを並列実行できます。これにより、5,000商品の後処理を大幅に効率化できます。
# Claude Code 内で実行するコマンド例
# 動作環境: Claude Code v2.1.140 / サブエージェント機能有効
# CLAUDE.md に以下を追記してサブエージェント活用を宣言:
cat <<'EOF' >> CLAUDE.md
## サブエージェント運用ルール
- カテゴリ単位でサブエージェントを起動(fashion / electronics / food / daily)
- 各サブエージェントは自カテゴリの output/generated/{category}/ のみ操作
- 品質ゲート不合格のファイルは output/rejected/{category}/ に移動
- 再生成は最大3回まで。3回不合格なら人間レビューキューへ
EOF
# Claude Code セッション内での指示例:
# 「fashionカテゴリの生成結果 200件を並列で品質チェックし、
# 不合格のものは改善案を提示してください。
# サブエージェントを使って electronics と food も同時に処理してください。」
サブエージェント活用時の注意点
サブエージェントは強力ですが、以下に注意が必要です:
- コンテキスト共有なし:各サブエージェントは独立したコンテキストで動作するため、CLAUDE.md のルールは自動読み込みされるが、親エージェントとの会話履歴は引き継がれない
- ファイル競合防止:同じファイルを複数のサブエージェントが同時に書き込むとデータ破損リスクがある。カテゴリ別にディレクトリを分離する設計が重要
- トークン消費:並列実行するとトークン消費も並列に発生する。Claude Max プランの rate limit に注意
【要注意】よくある失敗パターンと回避策
失敗1:プロンプトにスペック情報を入れ忘れる
❌ 失敗パターン:商品名だけをプロンプトに渡し、AIに「想像で」スペックを書かせる
# ❌ NG: スペック情報なしのプロンプト
"商品名「ワイヤレスイヤホン XZ-500」の説明文を書いてください"
# → AIが「連続再生30時間」等を勝手に生成 → 景表法違反リスク
⭕ 正しいアプローチ:商品マスタから全スペックを構造化して渡し、「記載されていない性能は書くな」と明示する
# ⭕ OK: スペック情報を完全に渡す + 制約明示
"以下のスペック情報のみを使って説明文を書いてください。
記載されていない性能・数値は絶対に追加しないでください。
- 商品名: ワイヤレスイヤホン XZ-500
- 連続再生: 8時間
- 充電時間: 1.5時間
- 防水等級: IPX4
- 重量: 5.2g(片耳)"
なぜこれが重要か:AIは「もっともらしい数値」を生成する傾向があります。ECの商品スペックで虚偽記載をすると、景品表示法の優良誤認(措置命令・課徴金の対象)に該当する可能性があります。商品マスタの値だけを使う制約を CLAUDE.md レベルで定義するのが鉄則です。
失敗2:全商品を一括で差し替える
❌ 失敗パターン:生成した5,000商品の説明文を、A/Bテストなしで一斉に差し替える
⭕ 正しいアプローチ:
- まず100商品(全体の2%)でA/Bテストを2週間実施
- 統計的有意差(p < 0.05)を確認
- CV率が改善したカテゴリから段階的に展開
- CV率が悪化したカテゴリは原因分析→プロンプト改修→再テスト
なぜこれが重要か:AI生成文が「読みやすい」からといって、必ずしも購買につながるとは限りません。特に高単価商品では、人間が書いた「不完全だが情熱が伝わる文章」のほうがCVする場合があります。データで判断することが重要です。
失敗3:Batch API のエラーハンドリング不足
❌ 失敗パターン:Batch API の結果を全件成功前提で処理し、エラーレスポンスを無視する
# ❌ NG: エラーチェックなし
results = client.messages.batches.results(batch_id)
for r in results:
description = r.result.message.content[0].text # エラー時に AttributeError
⭕ 正しいアプローチ:
# ⭕ OK: エラーハンドリング付き
# 動作環境: Python 3.12 / anthropic SDK 1.x
for result in client.messages.batches.results(batch_id):
if result.result.type == "succeeded":
description = result.result.message.content[0].text
# 正常処理
elif result.result.type == "errored":
error = result.result.error
print(f"Error for {result.custom_id}: {error.type} - {error.message}")
# リトライキューに追加
elif result.result.type == "expired":
print(f"Expired: {result.custom_id} — resubmit needed")
# 24時間以内に処理されなかった → 再送信
なぜこれが重要か:Batch API は24時間以内の処理を保証しますが、個別リクエストが content policy 違反やトークン上限超過でエラーになることがあります。5,000件中 50〜100件程度のエラーは想定内として、リトライロジックを組み込む必要があります。
失敗4:SEOキーワードの過剰挿入
❌ 失敗パターン:プロンプトで「キーワードを5回以上含めて」と指示し、不自然なキーワード詰め込み文を生成する
⭕ 正しいアプローチ:「SEOキーワードを自然に2〜3回含める」と指示し、品質チェックで keyword density が 3% を超えていないか確認する
# 品質チェックに追加: キーワード密度チェック
# 動作環境: Python 3.12
def check_keyword_density(text: str, keywords: list[str], max_density: float = 0.03) -> bool:
"""キーワード密度が閾値以下かチェック"""
total_chars = len(text)
keyword_chars = sum(text.count(kw) * len(kw) for kw in keywords)
density = keyword_chars / total_chars if total_chars > 0 else 0
if density > max_density:
print(f"⚠️ Keyword density too high: {density:.1%} (max: {max_density:.0%})")
return False
return True
なぜこれが重要か:Google の SpamBrain はキーワードスタッフィングを高精度で検出します。AI生成文は指示に忠実すぎるため、「5回含めて」と書くと本当に5回詰め込みます。人間が読んで自然かどうかを品質ゲートで機械的にチェックする仕組みが必要です。
失敗5:既存説明文のバックアップを取らない
❌ 失敗パターン:AI生成文で上書きした後、「やっぱり元に戻したい」時にロールバックできない
⭕ 正しいアプローチ:差し替え前に必ず全商品の既存説明文をエクスポートし、日付付きでバックアップを取る。Gitリポジトリで差分管理するのが最善。
想定効果の試算
試算モデル(想定シナリオ)
以下は5,000 SKU規模のECサイトで本実装パターンを適用した場合の試算です。実際の効果は商材・市場・既存文の品質によって大きく変動します。
| 指標 | 導入前(想定) | 導入後(試算) | 改善幅 |
|---|---|---|---|
| 商品説明文カバー率 | 40%(2,000/5,000商品に説明文あり) | 95%(4,750/5,000商品) | +55pt |
| 説明文作成コスト | 250万〜750万円(外注) | 約3,250円(Batch API)+ 人的QA工数 | -99%(試算) |
| 商品ページ CV率 | 2.1%(業界平均水準) | 2.6%(試算・A/Bテスト前提) | +23%(試算) |
| 1商品あたり作成時間 | 30分(ライター) | 0.5分(生成+QA按分) | -98%(試算) |
試算根拠と前提条件:
- CV率改善 +23% は、Adobe 2026 Q1レポートの「AI最適化コンテンツは非最適化比でエンゲージメント12%向上」データを参考にした楽観シナリオ(TechCrunch, 2026-04-16)
- 実際の効果はA/Bテストで検証するまで不確定であり、悪化する可能性もある
- コスト比較は「全商品を新規作成する場合」の比較であり、既存文の部分改修とは条件が異なる
段階的導入ロードマップ
Phase 1: PoC(1〜2週間)
目標:10〜50商品で品質とワークフローを検証
- CLAUDE.md を定義し、カテゴリ1つ(最も商品数が多いもの)に絞る
- Claude Code セッション内で手動生成→品質確認→CMS反映を繰り返す
- 品質ゲートのルール(NGワードリスト等)を調整
- 生成文を社内レビュー(MD・法務)に回し、薬機法/景表法チェック
Phase 2: パイプライン構築(2〜4週間)
目標:500商品規模で自動パイプラインを構築
- Batch API 連携スクリプトを完成させる
- 品質ゲートを Hooks で自動化
- A/Bテスト基盤を構築(GA4 + BigQuery)
- CI/CD に品質チェックを組み込む(GitHub Actions等)
Phase 3: 全面展開(1〜2ヶ月)
目標:全SKUに展開し、定期更新サイクルを確立
- A/Bテストで効果確認済みカテゴリから順次展開
- 月次で「季節キーワード更新」「新商品追加」の定期バッチを設定
- GA4データを基にパフォーマンス低下商品を自動検出→再生成
適用余地のある業界・規模
本パターンが特に有効なケース
- SKU 1,000以上のECサイト:手動で全商品に説明文を書くコストが見合わない規模
- 多言語EC:日本語で生成→Claude APIで多言語翻訳のパイプラインに拡張可能
- 季節商材のEC:季節ごとの訴求変更(夏→「涼しさ」、冬→「暖かさ」)を自動化
- マーケットプレイス出品者:Amazon・楽天・Yahoo!ショッピング等の複数モール向けに、各モールのルールに合わせた文面を一括生成
注意が必要なケース
- 高級ブランド品:ブランドストーリーは人間のコピーライターが書くべき(AIでは「魂」が伝わりにくい)
- 医薬品・健康食品:薬機法の規制が厳しく、AI生成文の法務チェックコストが高い
- SKU 100未満の小規模EC:パイプライン構築コストに見合わない可能性
まとめ:EC商品説明文 × Claude Code の実装チェックリスト
- ☐ CLAUDE.md に薬機法・景表法ルールを定義
- ☐ 商品マスタから構造化データを抽出するスクリプトを作成
- ☐ カテゴリ別プロンプトテンプレートを設計
- ☐ Batch API 送信→結果取得→品質チェックのパイプラインを構築
- ☐ A/Bテスト基盤を設定(少数商品から開始)
- ☐ 品質ゲート(薬機法/景表法/文字数/キーワード密度)を Hooks で自動化
- ☐ 既存説明文のバックアップ+ロールバック手順を確認
- ☐ 本番展開前に法務レビューを実施
FAQ
Q1: Claude Code と Claude API の直叩き、どちらを使うべき?
A: 10商品以下のスポット生成ならClaude Code セッション内で直接指示するのが早いです。100商品以上のバッチ処理では、Claude Code でスクリプトを書き、Batch API で非同期実行する組み合わせが最適です。Claude Code は「開発環境」として使い、本番処理は API 経由で実行する設計を推奨します。
Q2: 生成した文章の著作権はどうなる?
A: Anthropic の利用規約(2026年5月時点)では、API 経由で生成したコンテンツの権利はユーザーに帰属します。ただし、入力に第三者の著作物(競合他社の商品説明文等)を含めた場合は別途リスクがあります。詳細は法務に確認してください。
Q3: 薬機法チェックはAIだけで十分?
A: いいえ。AI による薬機法チェックは「明らかなNGワード検出」には有効ですが、文脈依存の表現(「健康をサポート」が許容されるケースとされないケース等)は人間の法務担当者による確認が必須です。AIは一次スクリーニングとして使い、最終判断は専門家に委ねてください。
Q4: Batch API の処理時間はどのくらい?
A: Anthropic 公式ドキュメントでは「24時間以内」と記載されていますが、実運用では5,000件規模のバッチが2〜6時間で完了するケースが多いです(未検証・参考値。処理時間は負荷状況により変動)。急ぎの場合は通常API(リアルタイム)を使い、コスト優先の場合はBatch APIを選択してください。
Q5: 既存の説明文がある商品もAI生成で上書きすべき?
A: 一律上書きは推奨しません。まず既存文のパフォーマンス(CV率・直帰率・滞在時間)を GA4 で確認し、パフォーマンスが低い商品群を優先的にAI生成文で A/B テストするアプローチが安全です。パフォーマンスが高い商品の説明文は「勝ちパターン」としてプロンプトの参考例に活用する方が価値があります。
参考・出典
- Anthropic Message Batches API ドキュメント(参照: 2026-05-14)
- TechCrunch「AI traffic to US retailers rose 393% in Q1」(2026-04-16)
- Anthropic「Introducing the Message Batches API」公式ブログ(参照: 2026-05-14)
- Claude Code Changelog(v2.1.140)(参照: 2026-05-14)
- Anthropic「Enabling Claude Code to work more autonomously」(参照: 2026-05-14)
- TechCrunch「Shopify says AI traffic is up 7x since January」(2025-11-04)
あわせて読みたい
- 製造業の生産管理データを自動化|大手工場が工数85%削減した実装事例
- 銀行コンプライアンス審査の書類処理をClaude Codeで85%削減した実装事例
- 物流配車の最適化でルート工数55%削減|Claude Code導入の中堅物流業者事例
次のステップ
- まず試す:上記のコードをローカル環境にクローンし、10商品分でテスト生成を実行してみてください。Claude Code の無料枠(Claude Pro / Max)で十分試せます。
- 個別指導で加速する:「自社ECに最適化したプロンプト設計がわからない」「Batch APIのエラーハンドリングで詰まった」等、実装上の壁がある場合は Claude Code 個別指導 で1on1サポートしています。
- パイプライン構築を任せる:PoC〜本番パイプライン構築を丸ごと任せたい場合は、Uravation受託開発にご相談ください。EC特化のAI実装チームが対応します。
最終確認日:2026年5月19日
EC商品説明文をClaude Codeで一括生成|CV率23%改善の実装パターンとは
Claude Codeによる業務自動化とは、既存のコード、ログ、業務データ、手順書をもとに、Claude Codeで実装・検証・改善を進める開発ワークフローです。この記事のテーマである「EC商品説明文をClaude Codeで一括生成|CV率23%改善の実装パターン」も、AIの出力をそのまま正解にするのではなく、人が確認する前提で使うことで実務に落とし込みやすくなります。 この記事では、Claude CodeとBatch APIを使い、ECサイト5,000商品の説明文を一括生成・A/Bテストした実装パターン解説。プロンプト設計からCI/CD統合まで再現可能なコード付き。という観点を中心に整理しています。
まず結論
まず結論として、AIは作業を速くする道具ですが、事実確認、個人情報・機密情報の扱い、外部公開前の確認は人が担うべきです。小さな業務から始め、確認手順を残すことで、記事内の手順を現場で再現しやすくなります。
比較・整理表
| 観点 | AIで軽くできること | 人が確認すること |
|---|---|---|
| 要件整理 | 業務フロー、入力、出力、制約を文章化する | 個人情報、契約情報、権限範囲を確認する |
| 実装 | スクリプト、テスト、連携処理を作る | 本番データで直接試さない |
| 運用 | ログ、失敗時の通知、再実行手順を整える | 人が確認するレビュー境界を残す |
実務で使う手順
- 対象業務と成果物を1つに絞ります。
- 入力してよい情報と入力してはいけない情報を分けます。
- AIの下書きを作り、事実・日付・数字・固有名詞を確認します。
- 公開または社内共有の前に、担当者が最終確認します。
- 使ったプロンプトと修正点を残し、次回のテンプレートに反映します。
公式ソース
FAQ
Claude Codeの事例をそのまま自社に使えますか?
業務データ、権限、既存システムが異なるため、要件と安全確認を自社向けに調整します。
本番導入前に何を確認しますか?
テストデータでの再現性、ログ、権限、失敗時の戻し方、担当者のレビュー手順を確認します。