Розробка AI-системи автоматичної генерації описів товарів

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-системи автоматичної генерації описів товарів
Середній
~3-5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка системи AI-генерації описів товарів

Автоматична генерація описів товарів для e-commerce: маркетплейси (Wildberries, Ozon, Amazon), інтернет-магазини, B2B-каталоги. Продуктивність: 1000–10000 описів на день проти 50–200 у копірайтера.

Архітектура системи

from openai import AsyncOpenAI
from dataclasses import dataclass
from typing import Optional
import asyncio

client = AsyncOpenAI()

@dataclass
class ProductData:
    name: str
    category: str
    brand: str
    sku: str
    attributes: dict          # {color: "red", size: "M", material: "cotton"}
    images: list[str] = None  # URL зображень
    price: float = None
    target_audience: str = ""

@dataclass
class GeneratedDescription:
    title: str              # SEO заголовок
    short_description: str  # 150–200 символів (превью на маркетплейсі)
    full_description: str   # HTML з форматуванням
    bullet_points: list[str]  # 3–7 ключових переваг
    seo_keywords: list[str]
    meta_description: str   # 160 символів для SEO

class ProductDescriptionGenerator:
    def __init__(self, platform: str = "general"):
        self.platform = platform
        self.platform_configs = {
            "wildberries": {"max_title": 60, "max_desc": 4000, "bullet_count": 5},
            "ozon": {"max_title": 100, "max_desc": 6000, "bullet_count": 7},
            "amazon": {"max_title": 200, "max_desc": 2000, "bullet_count": 5},
            "general": {"max_title": 80, "max_desc": 3000, "bullet_count": 5},
        }

    async def generate(
        self,
        product: ProductData,
        tone: str = "professional",
        language: str = "uk"
    ) -> GeneratedDescription:
        config = self.platform_configs.get(self.platform, self.platform_configs["general"])

        # Якщо є зображення — використовуємо GPT-4 Vision
        if product.images:
            return await self.generate_from_images(product, config, tone, language)
        else:
            return await self.generate_from_text(product, config, tone, language)

    async def generate_from_text(
        self,
        product: ProductData,
        config: dict,
        tone: str,
        language: str
    ) -> GeneratedDescription:
        attributes_str = "\n".join([f"- {k}: {v}" for k, v in product.attributes.items()])

        response = await client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": f"""Ви - експерт з написання продаючих описів для {self.platform}.
                Тон: {tone}.
                Мова: {language}.
                Обмеження: заголовок до {config['max_title']} символів,
                опис до {config['max_desc']} символів,
                {config['bullet_count']} буллетів переваг.

                Створіть опис товару. Повертайте JSON з полями:
                title, short_description, full_description (HTML),
                bullet_points (масив), seo_keywords (масив), meta_description."""
            }, {
                "role": "user",
                "content": f"""Товар: {product.name}
                Бренд: {product.brand}
                Категорія: {product.category}
                Характеристики:
                {attributes_str}
                ЦА: {product.target_audience or 'не вказана'}"""
            }],
            response_format={"type": "json_object"}
        )

        data = json.loads(response.choices[0].message.content)
        return GeneratedDescription(**data)

    async def generate_from_images(
        self,
        product: ProductData,
        config: dict,
        tone: str,
        language: str
    ) -> GeneratedDescription:
        """Використовуємо Vision для аналізу фото товару"""
        import base64

        image_contents = [
            {"type": "image_url", "image_url": {"url": url}}
            for url in product.images[:3]  # Максимум 3 зображення
        ]

        response = await client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "user",
                "content": [
                    {"type": "text", "text": f"""Проаналізуй зображення товару та створи опис.
                    Платформа: {self.platform}. Тон: {tone}. Мова: {language}.
                    Додаткові дані: Категорія: {product.category}, Бренд: {product.brand}.
                    Повертай JSON: title, short_description, full_description, bullet_points, seo_keywords, meta_description."""},
                ] + image_contents
            }],
            response_format={"type": "json_object"}
        )

        data = json.loads(response.choices[0].message.content)
        return GeneratedDescription(**data)

Пакетна генерація з Excel/CSV

import pandas as pd
import asyncio

async def process_product_catalog(
    catalog_path: str,
    platform: str = "wildberries",
    batch_size: int = 20
) -> pd.DataFrame:
    df = pd.read_csv(catalog_path)
    generator = ProductDescriptionGenerator(platform=platform)
    results = []

    for i in range(0, len(df), batch_size):
        batch = df.iloc[i:i+batch_size]
        tasks = []

        for _, row in batch.iterrows():
            product = ProductData(
                name=row["name"],
                category=row["category"],
                brand=row.get("brand", ""),
                sku=row.get("sku", ""),
                attributes={k: row[k] for k in row.index if k not in ["name", "category", "brand", "sku"]}
            )
            tasks.append(generator.generate(product))

        batch_results = await asyncio.gather(*tasks, return_exceptions=True)
        for j, result in enumerate(batch_results):
            if isinstance(result, GeneratedDescription):
                row_data = batch.iloc[j].to_dict()
                row_data.update({
                    "generated_title": result.title,
                    "generated_short_desc": result.short_description,
                    "generated_full_desc": result.full_description,
                    "generated_bullets": " | ".join(result.bullet_points),
                    "seo_keywords": ", ".join(result.seo_keywords),
                })
                results.append(row_data)

    return pd.DataFrame(results)

Адаптація під майданчики

class WildberriesFormatter:
    def format(self, desc: GeneratedDescription) -> dict:
        return {
            "naimenovanie": desc.title[:60],
            "opisanie": desc.full_description[:4000],
            "harakteristiki": "\n".join(desc.bullet_points),
        }

class OzonFormatter:
    def format(self, desc: GeneratedDescription) -> dict:
        return {
            "name": desc.title[:100],
            "description": desc.full_description,
            "short_description": desc.short_description,
            "keywords": desc.seo_keywords,
        }

Терміни: базовий генератор описів з пакетною обробкою CSV — 1–2 тижні. Інтеграція з API Wildberries/Ozon для прямої загрузки — додатково 1–2 тижні.