EC・小売

EC商品説明文をClaude Codeで一括生成|CV率23%改善の実装パターン

Claude CodeとBatch APIを使い、ECサイト5,000商品の説明文を一括生成・A/Bテストした実装パターン解説。プロンプト設計からCI/CD統合まで再現可能なコード付き。

EC商品説明文をClaude Codeで一括生成|CV率23%改善の実装パターン


結論:ECサイトの商品説明文生成は、Claude Code + Anthropic Batch API の組み合わせにより、5,000 SKU規模でも1日以内に高品質な文面を一括生成できる。A/Bテストで CV率 23%改善(試算)を達成可能な実装パターンを、コピペ可能なコード付きで解説する。

要点3つ

  1. Claude Code のサブエージェント + Hooks 機能で「商品データ取得→プロンプト生成→品質チェック→CMS反映」を自動化
  2. Anthropic Message Batches API(50%コスト削減)で 5,000商品を非同期一括処理
  3. 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つあります:

  1. サブエージェントによる並列処理 — カテゴリごとに異なるトーン・構成ルールを持つプロンプトを、サブエージェントに委任して並列実行できる
  2. Hooks による品質ゲート — 生成後に自動で「禁止表現チェック」「文字数チェック」「重複チェック」を走らせ、基準未達なら再生成
  3. ファイルシステム統合 — 商品マスタ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テストなしで一斉に差し替える

正しいアプローチ

  1. まず100商品(全体の2%)でA/Bテストを2週間実施
  2. 統計的有意差(p < 0.05)を確認
  3. CV率が改善したカテゴリから段階的に展開
  4. 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商品で品質とワークフローを検証

  1. CLAUDE.md を定義し、カテゴリ1つ(最も商品数が多いもの)に絞る
  2. Claude Code セッション内で手動生成→品質確認→CMS反映を繰り返す
  3. 品質ゲートのルール(NGワードリスト等)を調整
  4. 生成文を社内レビュー(MD・法務)に回し、薬機法/景表法チェック

Phase 2: パイプライン構築(2〜4週間)

目標:500商品規模で自動パイプラインを構築

  1. Batch API 連携スクリプトを完成させる
  2. 品質ゲートを Hooks で自動化
  3. A/Bテスト基盤を構築(GA4 + BigQuery)
  4. CI/CD に品質チェックを組み込む(GitHub Actions等)

Phase 3: 全面展開(1〜2ヶ月)

目標:全SKUに展開し、定期更新サイクルを確立

  1. A/Bテストで効果確認済みカテゴリから順次展開
  2. 月次で「季節キーワード更新」「新商品追加」の定期バッチを設定
  3. 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 テストするアプローチが安全です。パフォーマンスが高い商品の説明文は「勝ちパターン」としてプロンプトの参考例に活用する方が価値があります。

参考・出典

あわせて読みたい


著者: 佐藤傑(さとう・すぐる)

株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー約10万人)。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆。


次のステップ

  1. まず試す:上記のコードをローカル環境にクローンし、10商品分でテスト生成を実行してみてください。Claude Code の無料枠(Claude Pro / Max)で十分試せます。
  2. 個別指導で加速する:「自社ECに最適化したプロンプト設計がわからない」「Batch APIのエラーハンドリングで詰まった」等、実装上の壁がある場合は Claude Code 個別指導 で1on1サポートしています。
  3. パイプライン構築を任せる: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. 対象業務と成果物を1つに絞ります。
  2. 入力してよい情報と入力してはいけない情報を分けます。
  3. AIの下書きを作り、事実・日付・数字・固有名詞を確認します。
  4. 公開または社内共有の前に、担当者が最終確認します。
  5. 使ったプロンプトと修正点を残し、次回のテンプレートに反映します。

公式ソース

FAQ

Claude Codeの事例をそのまま自社に使えますか?

業務データ、権限、既存システムが異なるため、要件と安全確認を自社向けに調整します。

本番導入前に何を確認しますか?

テストデータでの再現性、ログ、権限、失敗時の戻し方、担当者のレビュー手順を確認します。

Next Step

この事例を、自社の業務に置き換える。

対象業務、利用データ、評価基準、社内展開の順番まで整理すると、Claude Code導入の失敗を減らせます。

導入を相談する