Разбор
ИИ пишет описания для 1000 товаров за ночь: Python + Claude Batch API без копирайтера
1000 уникальных описаний товаров — 80 000 рублей копирайтеру и месяц работы или 400–800 рублей на API и одна ночь. Схема Python + CSV + Claude Batch API, три стиля для разных категорий, кейс магазина стройматериалов: 2400 SKU за 2 ночи, SEO-трафик +67% за 3 месяца.
Менеджер интернет-магазина стройматериалов позвонил мне в марте. Говорит: «Нам нужно написать описания для 2400 товаров. Копирайтеры дали смету — 180 000 рублей и шесть недель». Я спросил, когда им нужно. «Желательно к следующей пятнице».
Следующая пятница наступила через 9 дней. К тому моменту все 2400 описаний уже стояли на сайте — уникальные, с SEO-ключами, в трёх разных стилях под разные категории. Потрачено: 2 ночи работы скрипта и около 1 200 рублей на API.
Почему копирайтер — не решение для тысячи SKU
80 рублей за описание звучит дёшево. Но умножь на тысячу — и уже 80 000 рублей. Умножь на 2400, как у того магазина стройматериалов — 192 000 рублей. Это половина месячного рекламного бюджета небольшого интернет-магазина.
И это только деньги. Ещё есть время. Хороший копирайтер пишет 40–60 описаний в день — при условии что вы дали ему исходник. Если исходник неполный или характеристики у всех товаров в разных форматах, темп падает вдвое. Тысяча SKU — три–четыре недели. Две с половиной тысячи — полтора месяца.
За это время конкуренты с нормальными описаниями уже собирают трафик по тем запросам, где вы пока светите дублем с сайта поставщика.
Дубли — отдельная боль. 60–70% интернет-магазинов в нишах с оптовыми поставщиками (стройматериалы, электроника, хозтовары) используют одни и те же описания от производителя. Яндекс это видит. Уникальный контент — один из немногих реальных способов отличиться в SEO без покупки ссылок.
Что такое Batch API и почему он сделан для этой задачи
Обычный Claude API работает синхронно: отправил запрос — получил ответ за секунды. Отлично для чат-ботов и интерактивных сценариев. Для генерации тысячи описаний — неудобно и дорого.
Batch API устроен иначе. Ты отправляешь пакет из нескольких тысяч запросов одним вызовом. Anthropic обрабатывает их асинхронно и возвращает все результаты когда готово — обычно меньше чем за час, максимум 24 часа. За это получаешь скидку 50% от стандартных цен.
Для тысячи описаний это меняет всё. Вместо синхронного цикла с управлением rate limits и обработкой таймаутов — один вызов create, потом poll статуса, потом collect results.
Технические ограничения API: до 100 000 запросов в одном батче, максимум 256 МБ. Тысяча описаний товаров укладывается в эти рамки с огромным запасом.
Три стиля описаний под три типа аудитории
Это то, о чём копирайтерам на аутсорсе обычно не говорят — и потом получают каталог в одном монотонном тоне. У разных категорий товаров разные покупатели с разными ожиданиями от текста.
В скрипте каждой категории товаров назначается свой системный промпт. Claude получает стиль на входе и применяет его ко всем товарам этой категории.
Код: Python + CSV + Claude Batch API
Скрипт принимает CSV с характеристиками, формирует батч-запросы по одному на товар, отправляет всё одним вызовом и сохраняет результаты обратно в CSV.
Сначала — структура входного файла:
sku,name,category,material,size,purpose,brand
SKU-001,Дрель ударная ProMax 800,tools,металл/пластик,30×23×8 см,сверление бетона кирпича дерева,ProMax
SKU-002,Розетка двойная с заземлением,electrical,поликарбонат,8.5×8.5 см,скрытая установка,Schneider
SKU-003,Свитер мериносовый оверсайз,clothing,мериносовая шерсть 100%,S/M/L/XL,повседневная носка,Теперь основной скрипт генерации:
import anthropic
import pandas as pd
import time
import json
from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request
CLAUDE_API_KEY = "YOUR_ANTHROPIC_API_KEY"
# Системные промпты для каждого стиля категории
STYLE_PROMPTS = {
"tools": (
"Ты пишешь технические описания товаров для интернет-магазина. "
"Стиль: факты и характеристики, профессиональный тон, конкретные цифры. "
"Длина: 300–450 символов. Без восклицательных знаков. "
"Включи: назначение, ключевые характеристики, применение."
),
"electrical": (
"Ты пишешь потребительские описания товаров. "
"Стиль: выгода для покупателя, простой язык, что даёт дома. "
"Длина: 280–420 символов. "
"Включи: главную выгоду, простоту установки, надёжность."
),
"clothing": (
"Ты пишешь эмоциональные описания одежды для интернет-магазина. "
"Стиль: образ и ощущение, покупатель видит себя в вещи. "
"Длина: 300–450 символов. Материал и уход — ненавязчиво в конце."
),
}
# Дефолтный промпт для неизвестных категорий
DEFAULT_PROMPT = (
"Ты пишешь описания товаров для интернет-магазина. "
"Стиль: чёткий и информативный. "
"Длина: 300–450 символов. "
"Включи: назначение, ключевые характеристики, преимущества."
)
def make_product_prompt(row: dict) -> str:
"""Формируем промпт для конкретного товара из строки CSV."""
parts = [f"Товар: {row['name']}"]
if row.get('material'):
parts.append(f"Материал: {row['material']}")
if row.get('size'):
parts.append(f"Размер/характеристики: {row['size']}")
if row.get('purpose'):
parts.append(f"Назначение: {row['purpose']}")
if row.get('brand'):
parts.append(f"Бренд: {row['brand']}")
parts.append("Напиши описание товара для карточки в интернет-магазине.")
return "\n".join(parts)
def submit_batch(df: pd.DataFrame) -> str:
"""Отправляем батч-запрос и возвращаем batch_id."""
client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)
requests = []
for _, row in df.iterrows():
system_prompt = STYLE_PROMPTS.get(row.get("category", ""), DEFAULT_PROMPT)
user_prompt = make_product_prompt(row.to_dict())
requests.append(Request(
custom_id=str(row["sku"]),
params=MessageCreateParamsNonStreaming(
model="claude-haiku-4-5", # Haiku — оптимум для описаний
max_tokens=600,
system=system_prompt,
messages=[{"role": "user", "content": user_prompt}],
),
))
batch = client.messages.batches.create(requests=requests)
print(f"Батч создан: {batch.id} — запросов: {len(requests)}")
return batch.id
def poll_until_done(batch_id: str, poll_interval: int = 60) -> None:
"""Ждём пока батч обработается. Проверяем каждые N секунд."""
client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)
while True:
batch = client.messages.batches.retrieve(batch_id)
status = batch.processing_status
if status == "ended":
counts = batch.request_counts
print(f"Готово. Успешно: {counts.succeeded}, ошибок: {counts.errored}")
return
elif status == "canceling":
raise RuntimeError("Батч отменён")
print(f"Статус: {status} — ждём {poll_interval} с...")
time.sleep(poll_interval)
def collect_results(batch_id: str, df: pd.DataFrame) -> pd.DataFrame:
"""Собираем результаты и добавляем описания в датафрейм."""
client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)
results = {}
for result in client.messages.batches.results(batch_id):
if result.result.type == "succeeded":
text = result.result.message.content[0].text
results[result.custom_id] = text.strip()
else:
results[result.custom_id] = ""
print(f"Ошибка для {result.custom_id}: {result.result.type}")
df["description"] = df["sku"].astype(str).map(results).fillna("")
return df
if __name__ == "__main__":
# 1. Загружаем CSV
df = pd.read_csv("products.csv")
print(f"Загружено товаров: {len(df)}")
# 2. Можно обрабатывать по 1000 — одним батчем
batch_id = submit_batch(df)
# 3. Сохраняем batch_id — на случай если скрипт упадёт
with open("batch_id.txt", "w") as f:
f.write(batch_id)
# 4. Ждём завершения
poll_until_done(batch_id)
# 5. Собираем результаты
df = collect_results(batch_id, df)
# 6. Сохраняем в новый CSV
df.to_csv("products_with_descriptions.csv", index=False)
print(f"Готово. Сохранено: products_with_descriptions.csv")Несколько практических моментов.
batch_id.txt — не случайная деталь. Батч обрабатывается от 15 минут до нескольких часов. Если скрипт упадёт или компьютер уснёт, ID сохранён и можно подключиться к уже запущенному батчу через retrieve(batch_id).
poll_interval=60 — раз в минуту достаточно. Дёргать API каждые 5 секунд бессмысленно: батч не обрабатывается быстрее от этого.
claude-haiku-4-5 — для описаний товаров это правильный выбор. Sonnet пишет лучше для сложных текстов, но для структурированных карточек с чёткими вводными Haiku справляется отлично и стоит в 3 раза дешевле.
Есть вопрос по теме?
Пришлю чеклист запуска товара и разберу стратегию продвижения
Контроль качества: что проверять после генерации
После получения результатов — три быстрые проверки перед загрузкой на сайт.
Длина. Слишком короткие описания (меньше 200 символов) — либо Haiku не получил достаточно исходных данных, либо что-то пошло не так в промпте. Фильтруем:
import pandas as pd
df = pd.read_csv("products_with_descriptions.csv")
# 1. Пустые описания
empty = df[df["description"].str.len() == 0]
print(f"Пустые: {len(empty)}")
# 2. Слишком короткие (< 200 символов)
short = df[df["description"].str.len() < 200]
print(f"Слишком короткие: {len(short)}")
print(short[["sku", "name", "description"]].to_string())
# 3. Подозрительные дубли — сравниваем первые 60 символов
df["desc_start"] = df["description"].str[:60]
dupes = df[df["desc_start"].duplicated(keep=False)]
print(f"Похожих по началу: {len(dupes)}")
# 4. Базовая статистика
print(f"\nСредняя длина: {df['description'].str.len().mean():.0f} символов")
print(f"Минимум: {df['description'].str.len().min()}")
print(f"Максимум: {df['description'].str.len().max()}")На практике при 1000 товарах получаешь 3–8 пустых или коротких описаний — обычно у товаров с минимальным набором характеристик в CSV. Их перегенерировать отдельно через обычный API за пару минут.
Дублей по первым 60 символам — как правило 0–2 на тысячу. Claude по умолчанию строит разные конструкции предложений.
Выборочный просмотр. Прочитай 20–30 случайных описаний из каждой категории. Это занимает 10 минут, но позволяет понять нужно ли скорректировать системный промпт перед следующим батчем.
Кейс: магазин стройматериалов, 2400 SKU
Возвращаемся к тому магазину. Три категории: строительные смеси, крепёж и инструменты, электрика. Под каждую — свой промпт с техническими деталями.
Первая ночь — 1200 SKU категории «крепёж и инструменты». Вторая — 1200 SKU «смеси + электрика». Ручная правка потребовалась для 34 позиций с неполными данными в исходном CSV.
Трафик +67% — это не только от описаний. Параллельно шла работа с метатегами и структурой каталога. Но конкретные карточки товаров стали ранжироваться по тем низкочастотным запросам, которых раньше не было вообще: «цементная смесь М400 25 кг применение», «болт М8 нержавеющий DIN 933 купить». Это длинный хвост, который невозможно покрыть вручную даже за деньги — просто некому формулировать тысячи специфических запросов.
Сколько у тебя товаров и сколько это будет стоить
Считаем стоимость генерации
3 вопроса — получишь оценку
Сравнение подходов
| Параметр | Копирайтер | Claude Batch API |
|---|---|---|
| Стоимость 1000 описаний | 80 000–150 000 ₽ | 400–800 ₽ |
| Время на 1000 SKU | 3–4 недели | 1–3 часа |
| Разные стили под категории | Нужно отдельно оговаривать | В промпте автоматически |
| Масштабирование на 10 000 SKU | ×10 стоимость и времени | Ещё один батч-запрос |
| Обновление при смене ассортимента | Каждый раз заново | Скрипт переиспользуется |
| Живой авторский голос | Да — с хорошим копирайтером | Зависит от промпта |
| Контроль качества | Редактура входит в цену | Нужна выборочная проверка |
Одна строка в таблице, на которую стоит смотреть честно: «Живой авторский голос». Claude пишет хорошо, но не пишет так, как пишет человек с экспертизой в нише. Для премиальных товаров, где каждая карточка — это продающий текст с историей, копирайтер лучше. Для каталогов с сотнями однотипных позиций — Claude и дешевле, и быстрее, и стабильнее.
Как запустить за один вечер
Минимальный набор: sku, name, category. Остальное (material, size, purpose) — чем больше, тем лучше результат. Проверь что нет строк с пустым name — они дадут пустые описания.
pip install anthropic pandas. API-ключ — на console.anthropic.com. Для первого запуска хватит 5 долларов на счёте. На 1000 товаров с Haiku потратишь меньше одного.
Это самая важная часть. Сначала напиши промпт для одной категории, запусти тест на 10–15 товарах через обычный API, прочитай результаты и скорректируй. Только потом запускай батч на всё.
python generate_descriptions.py — и оставить работать. Скрипт сохранит batch_id в файл. При 1000 товарах Haiku обрабатывает батч обычно за 15–40 минут.
Запустить check_quality.py, просмотреть 20–30 случайных описаний из каждой категории. Перегенерировать проблемные. Итоговый CSV с описаниями импортировать через CMS или прямую загрузку в базу.
Три месяца назад тот магазин стройматериалов получил +67% трафика. Сейчас они прогоняют новые поступления через тот же скрипт каждые две недели — описания встают на сайт раньше чем конкуренты успевают скопировать карточки поставщика.
Скрипт лежит у них в репозитории. Запускает его менеджер по каталогу — без программиста, без копирайтера, без очереди на две недели.
Есть вопрос по теме?
Пришлю чеклист запуска товара и разберу стратегию продвижения
Источники
AI-агенты · Персональная карта
4 часа потратил — не работает?
Покажу где ты пошёл не туда и как сделать правильно за 2 недели
Получить разбор бесплатно →AI-агенты · 10 мест
Ты работаешь до полуночи — AI-агент будет работать вместо тебя
Покажу какой агент закроет твою главную операционную боль
Узнать свой маршрут →Есть вопрос по теме?
Пришлю чеклист запуска товара и разберу стратегию продвижения
Источники
Читайте также
Часто задаваемые вопросы
- Сколько стоит сгенерировать 1000 описаний товаров через Claude API?
- 400–800 рублей при использовании Claude Haiku 4.5 через Batch API (скидка 50% от обычной цены). Для Sonnet 4.6 — 1 500–2 500 рублей. Точная сумма зависит от длины промптов и описаний. Для сравнения: копирайтер берёт 80–150 рублей за одно описание, итого 80 000–150 000 рублей за тысячу.
- Что такое Claude Message Batches API и зачем он нужен?
- Batch API позволяет отправить до 100 000 запросов одним пакетом и получить результаты асинхронно — обычно в течение 1 часа, максимум 24 часов. Главный плюс: стоимость в два раза ниже обычного API. Для массовой генерации контента — оптимальный выбор, поскольку срочность не нужна.
- Можно ли использовать разные стили описаний для разных категорий товаров?
- Да, это одно из ключевых преимуществ подхода. В скрипте каждой категории назначается свой системный промпт: технический стиль для электроники и B2B-товаров, потребительский для бытовых вещей, эмоциональный для одежды и lifestyle. Claude получает промпт категории + характеристики товара и пишет в нужном регистре.
- Как убедиться что описания уникальны и не дублируют друг друга?
- Claude генерирует уникальные тексты по умолчанию — одинаковые характеристики он описывает разными словами. Для дополнительной проверки после генерации запустите простую проверку на совпадение первых 50 символов: в практике на 1000 описаний обычно находят 0–3 случайных совпадения, которые легко переформировать.
- Сколько времени занимает настройка скрипта с нуля?
- 3–4 часа для человека с базовым знанием Python. Основные шаги: установка зависимостей (pip install anthropic pandas), подготовка CSV с характеристиками, настройка промптов под категории, тестовый прогон на 10–20 товарах, запуск полного батча. Большую часть времени занимает именно написание хороших промптов под каждую категорию.
- Работает ли этот подход для товаров с похожими характеристиками?
- Да, для этого в промпте важно добавить инструкцию использовать разные синонимы и структуры предложений. Для категорий с очень похожими товарами (например, болты разных размеров) хорошо работает добавление в промпт нескольких запрещённых фраз из предыдущего описания — это заставляет модель искать другие формулировки.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.