# Ответы на отзывы покупателей через API

> Нейросеть отвечает на каждый отзыв с маркетплейса или сайта, ставит тему и отдаёт человеку то, что модели решать нельзя: брак, деньги, безопасность. Один скрипт и ключ Polza.ai, оплата в рублях.

- 1 000 ответов — от 41,52 ₽, оценка по ценам каталога
- Жалобы на брак уходят человеку
- Тема отзыва для отчёта
- Счёт и УПД для юрлиц

## Отзыв · 1 из 5

**Электрочайник Boil Steel 1,7 л**

> Из-под подставки пошёл дым и запах горелой проводки. Выключили из розетки. Страшно пользоваться.

**Ответ модели:** Вы описали появление дыма и запаха горелой проводки из-под подставки чайника. Такая ситуация требует немедленной проверки для обеспечения безопасности. Напишите, пожалуйста, в чат поддержки магазина и укажите номер вашего заказа.

Передать человеку · тема: безопасность

Реальный ответ DeepSeek V4 Pro из теста, отзыв тестовый. [Как тестировали](#test)

## Задача

Селлер с тысячей SKU получает сотни отзывов в неделю. Отвечать нужно на все: покупатели читают ответы перед заказом. Шаблон «Спасибо за отзыв» видно сразу, а живой ответ на каждый отнимает у менеджера часы.

Через API модель пишет ответ на каждый отзыв, опираясь на его текст и характеристики товара. Отзывы с браком, требованием денег или угрозой здоровью она помечает, и их разбирает человек.

## Для кого

Везде, где отзывов больше, чем успевает прочитать один человек.

- **Селлер на маркетплейсе.** Отзывы с Wildberries, Ozon или Яндекс Маркета — выгрузкой из кабинета площадки. Ответ, тема и флаг для менеджера на каждый. Сотни ответов за минуту.
- **Интернет-магазин.** Отзывы на сайте и в карточках. Модель видит характеристики товара и не путает размеры и материалы. Ответ опирается на данные товара.
- **Отели, кафе, сервисы.** Отзывы в картах и агрегаторах. Тон под бренд задаётся промптом один раз. Одинаковый тон во всех ответах.
- **Отдел качества.** Тема каждого отзыва: брак, комплектация, доставка, ожидания. Из неё собирается отчёт по товарам. Видно, какой товар чаще ломается.

## Сколько стоят 1 000 ответов

Замер — фактический расход по полю `cost_rub` ответа API на 8 одинаковых отзывах, пересчитанный на 1 000. В запрос входят промпт, характеристики товара и сам отзыв. Стоимость «сейчас» Polza.ai оценивает по текущим ценам [каталога](https://polza.ai/models).

| Модель | 1 000 ответов, замер 6 октября | Ответ | Знаков в ответе | 1 000 ответов, оценка сейчас |
| --- | --- | --- | --- | --- |
| [GPT-5 Mini](https://polza.ai/models/openai/gpt-5-mini.md) | 51 ₽ | 5,6 с | 278 | 41,52 ₽ |
| [Gemini 2.5 Flash](https://polza.ai/models/google/gemini-2.5-flash.md) | 45 ₽ | 3,1 с | 216 | 51,31 ₽ |
| [DeepSeek V4 Pro](https://polza.ai/models/deepseek/deepseek-v4-pro.md) | 7,4 ₽ | 6,2 с | 242 | 147 ₽ |
| [Claude Sonnet 5](https://polza.ai/models/anthropic/claude-sonnet-5.md) | 474 ₽ | 4,3 с | 239 | 486 ₽ |

Замер — 6 октября 2026, по ценам того дня.

«Оценка сейчас» — по текущим ценам каталога для объёмов, которые оценила редакция, а не замерил тест: 800 токенов на входе (промпт, характеристики, отзыв) и 250 на выходе (ответ в JSON) на один отзыв.

Рассуждение у всех моделей отключено: для ответа на отзыв оно не нужно и умножает цену. У DeepSeek провайдер закреплён — без этого часть запросов уходит к дорогим провайдерам. Подробно оба приёма — в сценарии про SEO-тексты: [как не переплатить за рассуждение и провайдера](https://polza.ai/use-cases/seo-content#stoimost).

## Как устроен конвейер

Пять этапов. Модель пишет и размечает, решения про деньги и брак остаются за человеком.

- **Этап 1. Выгрузка.** Отзывы без ответа — выгрузкой из кабинета площадки или через её API, если площадка его даёт. Плюс характеристики товара из вашего каталога. (CSV: отзыв + характеристики)
- **Этап 2. Ответ и разметка.** Модель пишет ответ, ставит тему и решает, нужен ли человек. Ответ приходит JSON по схеме. (DeepSeek V4 Pro)
- **Этап 3. Очередь человеку.** Отзывы с флагом `escalate` уходят менеджеру вместе с черновиком ответа и причиной. (escalate = true)
- **Этап 4. Публикация.** Остальные ответы публикуются в кабинете площадки или через её API. Выборку вычитывает редактор. (replies.jsonl)
- **Этап 5. Отчёт.** Темы складываются в отчёт по товарам: где брак, где неполная комплектация, где ожидания расходятся с карточкой. (topic)

## Готовый скрипт на Python

Читает таблицу отзывов, отвечает параллельно, повторяет запросы при ошибках 429 и 5xx и печатает фактический расход. Нужен пакет `openai` и ключ в переменной `POLZA_API_KEY`.

### Вход: reviews.csv

Отзыв, оценка и характеристики товара. Без характеристик модель придумывает вес и размеры — в тесте так случилось в 3 ответах из 40.

reviews.csv:

```
id,product,specs,rating,text
R16,Настольная лампа Lumo 10 Вт,"светодиодная; 3 режима цветовой температуры 3000/4500/6000 K; 5 уровней яркости; сенсорное управление; питание от сети",5,"Свет приятный, глаза не устают. Сенсор срабатывает чётко."
R35,Электрочайник Boil Steel 1,7 л,"нержавеющая сталь; 2200 Вт; скрытый нагревательный элемент; автоотключение; защита от включения без воды",1,"Из-под подставки пошёл дым и запах горелой проводки. Выключили из розетки. Страшно пользоваться."
```

### Выход: replies.jsonl

Ответ, флаг для человека, причина и тема. Реальные ответы из теста.

replies.jsonl:

```
{"id": "R16", "reply": "Рады, что сенсорное управление срабатывает чётко, а настройка цветовой температуры позволяет подобрать комфортный свет. В лампе доступно три температурных режима от 3000 до 6000 K и пять уровней яркости для разных сценариев.", "escalate": false, "reason": "", "topic": "похвала"}
{"id": "R35", "reply": "Вы описали появление дыма и запаха горелой проводки из-под подставки чайника. Такая ситуация требует немедленной проверки для обеспечения безопасности. Напишите, пожалуйста, в чат поддержки магазина и укажите номер вашего заказа.", "escalate": true, "reason": "задымление и запах горелой проводки, угроза безопасности", "topic": "безопасность"}
```

Python · answer_reviews.py:

```
# answer_reviews.py — ответы на отзывы из CSV через Polza
import asyncio, csv, json, os
from openai import AsyncOpenAI, APIStatusError

MODEL = "deepseek/deepseek-v4-pro"
PROVIDER = "streamlake/fp8"  # самый дешёвый провайдер модели: top_provider.name в каталоге
CONCURRENCY = 10

ai = AsyncOpenAI(base_url="https://polza.ai/api/v1", api_key=os.environ["POLZA_API_KEY"])
SYSTEM = open("prompt.txt", encoding="utf-8").read()
TOPICS = ["похвала", "качество", "брак", "комплектация", "доставка", "ожидания", "безопасность", "другое"]

SCHEMA = {
    "name": "review_reply",
    "strict": True,
    "schema": {
        "type": "object",
        "properties": {
            "reply": {"type": "string"},
            "escalate": {"type": "boolean"},
            "reason": {"type": "string"},
            "topic": {"type": "string", "enum": TOPICS},
        },
        "required": ["reply", "escalate", "reason", "topic"],
        "additionalProperties": False,
    },
}

async def answer(row, sem, stats):
    prompt = f"Товар: {row['product']}\nХарактеристики: {row['specs']}\nОценка: {row['rating']} из 5\nОтзыв: {row['text']}"
    async with sem:
        for attempt in range(5):
            try:
                r = await ai.chat.completions.create(
                    model=MODEL,
                    messages=[{"role": "system", "content": SYSTEM},
                              {"role": "user", "content": prompt}],
                    response_format={"type": "json_schema", "json_schema": SCHEMA},
                    extra_body={"reasoning": {"effort": "none"},
                                "provider": {"only": [PROVIDER], "allow_fallbacks": False}},
                )
                break
            except APIStatusError as e:
                if e.status_code in (429, 500, 502, 503) and attempt < 4:
                    await asyncio.sleep(2 ** attempt)
                    continue
                raise
    stats["rub"] += r.usage.model_extra.get("cost_rub", 0)
    return {"id": row["id"], **json.loads(r.choices[0].message.content)}

async def main():
    rows = list(csv.DictReader(open("reviews.csv", encoding="utf-8")))
    sem, stats = asyncio.Semaphore(CONCURRENCY), {"rub": 0}
    results = await asyncio.gather(*(answer(r, sem, stats) for r in rows), return_exceptions=True)
    ok = 0
    with open("replies.jsonl", "w", encoding="utf-8") as out, \
         open("errors.txt", "w", encoding="utf-8") as err:
        for row, res in zip(rows, results):
            if isinstance(res, Exception):
                err.write(f"{row['id']}\t{res}\n")
            else:
                out.write(json.dumps(res, ensure_ascii=False) + "\n")
                ok += 1
    print(f"Готово {ok} из {len(rows)}, расход {stats['rub']:.2f} ₽")

asyncio.run(main())
```

## Промпт для ответов

Промпт задаёт четыре вещи: тон, запреты, когда звать человека и что вернуть. Запреты важнее тона: модель не обещает деньги, не признаёт вину за ущерб и не просит поменять оценку.

Вторая версия промпта запрещает объяснять причину проблемы и давать советы, которых нет в характеристиках. В первом прогоне модель писала «механизм разработается» и «запах выветрится» — это обещания от имени магазина. Поэтому [характеристики товара идут в запрос — как в описаниях](https://polza.ai/use-cases/seo-content).

Тон бренда добавляется одной строкой в начало: «Мы — семейный магазин, обращаемся тепло, но без панибратства».

prompt.txt:

```
Ты отвечаешь на отзывы покупателей от имени
интернет-магазина.

Правила ответа:
- Обращайся на «вы», без имени покупателя.
- Первое предложение — по сути отзыва. Не начинай со
  «Спасибо за отзыв».
- Упомяни конкретную деталь из отзыва, чтобы было
  видно, что его прочитали.
- 2–4 предложения, до 400 символов.
- Не обещай возврат денег, замену, компенсацию и
  сроки. Не признавай вину за ущерб. Вместо этого
  попроси написать в чат поддержки магазина и
  указать номер заказа.
- Не проси изменить оценку или удалить отзыв.
- Не спорь и не оправдывайся.
- Про товар пиши только то, что есть в строке
  «Характеристики». Цифр, материалов, конструкции и
  правил ухода, которых там нет, не называй.
- Не объясняй причину проблемы и не советуй, как её
  устранить, если этого нет в характеристиках. Не
  говори, что магазин что-то уже сделал или изменил.
- Без восклицательных знаков и фраз «Нам очень жаль
  это слышать», «Ваше мнение очень важно для нас».

Передай отзыв человеку (escalate = true), если в
нём: брак или поломка, угроза здоровью или
имуществу, пришёл не тот товар или бывший в
употреблении, требование денег или замены, жалоба в
госорганы или суд. Ответ всё равно напиши.

Верни JSON:
- reply — текст ответа;
- escalate — true или false;
- reason — почему нужен человек, коротко; пустая
  строка, если не нужен;
- topic — одно из: похвала, качество, брак,
  комплектация, доставка, ожидания, безопасность,
  другое.
```

## Когда отвечает человек

Модель пишет черновик на каждый отзыв, но публиковать без проверки можно не всё. В тесте 9 отзывов из 40 требовали человека по разметке редактора. [Жалобы — менеджеру, как в письмах](https://polza.ai/use-cases/pisma-klientam).

- **Брак и поломка.** Треснула крышка, оторвалась лямка, не работает зарядка. Нужен разбор и решение о замене — модель его не принимает.
- **Угроза здоровью и имуществу.** Дым из-под чайника, порванная трубочка в детской кружке, залитый ноутбук. Такие отзывы читают первыми.
- **Деньги и замена.** «Верните деньги», «требую замену», «компенсируйте». Модель отправляет в поддержку и ничего не обещает.
- **Пересорт и б/у.** Пришла другая модель, товар без коробки и с вмятиной, лампа без линзы.
- **Жалобы в органы.** «Напишу в Роспотребнадзор», «мошенники». Ответ — спокойный и короткий, решение — за юристом или руководителем.
- **Лишние флаги — не страшно.** Модель иногда зовёт человека там, где можно ответить самой: заедает молния, мерцает лампа. В тесте таких было 1–4 на 40. Это лишняя минута менеджера, а не ошибка в публичном ответе.

## Через Claude, OpenAI и Grok — или без кода

Скрипт напишет и запустит ИИ-агент. Модели для ответов выбираются в том же каталоге Polza.ai.

- **Claude Code и Claude Desktop.** Положите таблицу отзывов и промпт в папку и отдайте Claude задание ниже. Агент напишет скрипт, покажет первые 20 ответов и отдельно — отзывы для человека. Claude Sonnet 5: 1 000 ответов — 486 ₽, оценка по ценам каталога.
- **Codex и ChatGPT Desktop.** То же задание выполняет Codex CLI. Модели GPT подключаются тем же ключом Polza. GPT-5 Mini: 1 000 ответов — 41,52 ₽, оценка по ценам каталога.
- **Grok.** Модели xAI доступны в том же API: `MODEL = "x-ai/grok-4.3"` в скрипте. Grok в этом тесте не участвовал.

### Задание для агента

Подходит для Claude Code, Codex и других агентов из [интеграций](https://polza.ai/integrations). Перед полным прогоном агент покажет 20 ответов, поэтому качество вы проверите до публикации.

задание для Claude Code или Codex:

```
В папке лежат reviews.csv и prompt.txt.
Напиши и запусти скрипт на Python:
для каждого отзыва запрос к https://polza.ai/api/v1
через OpenAI SDK, ключ — в переменной POLZA_API_KEY,
модель deepseek/deepseek-v4-pro без рассуждений
(reasoning: {effort: none}), провайдер streamlake/fp8,
системный промпт — prompt.txt,
в запрос — товар, характеристики, оценка и текст отзыва,
ответ — JSON с полями reply, escalate, reason, topic.
Сначала прогони 20 отзывов и покажи ответы,
отдельно — те, где escalate = true.
После моего «ок» — всю таблицу.
```

### Без кода: n8n и Dify

Сценарий по расписанию: новые отзывы из таблицы или выгрузки площадки, нода OpenAI Chat Model с адресом `https://polza.ai/api/v1`, ответы — обратно в таблицу, отзывы с флагом — в Telegram менеджеру.

- **n8n.** Каждое утро: новые отзывы — черновики ответов — сообщение менеджеру о жалобах. Нода OpenAI Chat Model с адресом Polza.
- **Dify.** Workflow с ответом и проверкой, запуск пачкой из интерфейса. Облако или self-hosted.

## Тест редакции: 40 отзывов

Мы написали 40 отзывов на товары из тестового каталога: от «держит тепло весь день» до «из-под подставки пошёл дым». В 9 из них редактор заранее отметил, что нужен человек. Модель этой разметки не видела. Замер 6 октября 2026: весь тест стоил 5,6 ₽ по ценам того дня.

- Отзывов: 40
- Время: 22 с
- Расход: 0,37 ₽
- Готовы без правок: 32 из 40

### Два прогона DeepSeek V4 Pro

| Прогон | Расход | Время | Нашла отзывы для человека | Лишние флаги | Ответы с выдумкой | Неверные цифры |
| --- | --- | --- | --- | --- | --- | --- |
| v1: только название товара | 0,3 ₽ | 25 с | 9 из 9 | 1 | 14 | 3 |
| v2: характеристики и запрет объяснений | 0,37 ₽ | 22 с | 8 из 9 | 3 | 7 | 0 |

Выдумки и цифры — по вычитке редактора всех 40 ответов. Обещаний денег, просьб изменить оценку, восклицательных знаков и фраз «Спасибо за отзыв» в начале не было ни в одном прогоне. Расход — по ценам 6 октября 2026.

- **Цифры стали верными.** В v1 модель видела только название товара и писала «вес 800 г» про термос на 650 г. С характеристиками в запросе таких ошибок не было.
- **Выдумок вдвое меньше.** 14 ответов с придуманными объяснениями в v1, 7 в v2. Остались советы вроде «запах выветрится» — их ловит выборочная вычитка.
- **Одна пропущенная жалоба.** На «Продавец, верните деньги» v2 ответила вежливо, но не передала отзыв человеку. Страховка — правило в коде: оценка 1 и слова «верните», «замена», «деньги» — всегда в очередь.

### Четыре модели на 8 трудных отзывах

| Модель | 1 000 ответов, замер | Передала человеку | Что увидел редактор |
| --- | --- | --- | --- |
| DeepSeek V4 Pro | 7,4 ₽ | 1 из 8 | Иногда объясняет причину проблемы, которой нет в данных: «особенность работы на 2200 Вт». |
| Gemini 2.5 Flash | 45 ₽ | 1 из 8 | Фактов не выдумывает, но пишет шаблонно: «Сожалеем», «Мы рады». Реже всех зовёт человека. |
| GPT-5 Mini | 51 ₽ | 5 из 8 | Безопасна, но многословна и придумывает процессы: «передадим в службу качества». Зовёт человека чаще всех. |
| Claude Sonnet 5 | 474 ₽ | 4 из 8 | Самый живой текст. Но в ответе на «верните деньги» написала про «возврат средств» — это уже обещание. |

Трудные отзывы — те, где в первом прогоне модель придумывала объяснения, плюс требование вернуть деньги. Его все четыре модели передали человеку. Стоимость — замер 6 октября 2026 по ценам того дня, текущая — в [разделе «Стоимость»](#stoimost).

**Вывод.** Для потока отзывов — DeepSeek V4 Pro с характеристиками товара в запросе: 32 из 40 ответов можно публиковать без правок, по оценке на текущих ценах каталога 1 000 ответов — 147 ₽. Поверх модели — правило в коде для оценок 1–2 со словами про деньги и выборочная вычитка. Если важен тон бренда — Claude Sonnet 5, но ответы на жалобы всё равно читает человек.

## Вопросы

### Можно ли публиковать ответы без проверки?

Позитивные и нейтральные — да, после того как редактор вычитал первые 50–100. Отзывы с флагом escalate и оценки 1–2 читает человек. В тесте без правок можно было опубликовать 32 ответа из 40.

### Не будет ли видно, что отвечает нейросеть?

Шаблонные фразы запрещены промптом, а ответ опирается на детали отзыва: «подстаканник Камри», «поход на 60 км». В тесте ни один ответ не начинался со «Спасибо за отзыв».

### Сколько отзывов можно обработать в час?

В тесте при 10 параллельных запросах 40 ответов заняли 22 секунды — это около 6 500 в час.

### Что если покупатель пишет о здоровье или пожаре?

Модель ставит флаг для человека и в ответе просит написать в поддержку, ничего не обещая. В тесте все такие отзывы — дым из чайника, порванная трубочка в детской кружке — ушли человеку.

### Как задать тон бренда?

Одной-двумя строками в начале промпта: к кому обращаемся, насколько формально, какие слова не используем. Тон проверяйте на 20 отзывах разных оценок до полного прогона.

### Можно ли платить юрлицом?

Да. Polza.ai работает по договору: счёт, УПД и НДС. Расход виден в кабинете по ключам и моделям.

## Ссылки

- Сценарий «SEO-тексты»: https://polza.ai/use-cases/seo-content.md
- Сценарий «Объявления для Авито»: https://polza.ai/use-cases/obyavleniya-avito.md
- Сценарий «Тесты по урокам»: https://polza.ai/use-cases/testy-po-urokam.md
- Сценарий «Письма клиентам»: https://polza.ai/use-cases/pisma-klientam.md
- Сценарий «Протоколы встреч»: https://polza.ai/use-cases/protokoly-vstrech.md
- Документация: https://polza.ai/docs
- Каталог моделей: https://polza.ai/models/llms.txt
- Страница: https://polza.ai/use-cases/otvety-na-otzyvy
- Обновлено: 2026-10-14; замер теста — 6 октября 2026
