Сценарии использования и решения

Ответы на отзывы с помощью ИИ: черновики в стиле бренда, эскалация и проверка человеком

6 шагов 16 мин чтения 57 просмотров 0
Содержание

Ответы на отзывы показывают покупателям, что их слышат, а будущие покупатели тоже читают эти ответы. Однако написать сотни продуманных ответов на нескольких языках — это часы работы каждую неделю. В этой статье локальная языковая модель готовит черновик ответа на каждый отзыв на языке его автора, следуя заметкам о вашем бренде и строгому набору правил. Она отмечает отзывы, которыми должен заняться человек, например с низкой оценкой, жалобами на безопасность, угрозами обратиться в суд или подозрением на мошенничество, и записывает всё в таблицу для согласования. Ничего не публикуется автоматически.

Соблюдайте правила каждой платформы в отношении ответов на отзывы: никогда не предлагайте возврат денег, подарки или скидки в обмен на изменение или удаление отзыва, никогда не раскрывайте данные покупателей и проверьте, разрешает ли платформа публичные ответы вообще. Каждый ответ перед публикацией должен одобрить человек.

Шаг 1: Подготовка окружения

Используйте окружение /opt/reviews с Ollama из статьи анализ отзывов покупателей с помощью локальной LLM. Подойдёт тот же CSV-файл с отзывами: скрипту нужны столбцы id и text, а rating он использует, если этот столбец есть.

Шаг 2: Заметки о бренде

Из этих заметок модель берёт тон, контактные данные и факты, которые ей разрешено упоминать. Пишите их кратко и по существу:

cat > /data/reviews/brand.txt <<'EOF2'
Business: ACME Home, sells bamboo office accessories online.
Tone: warm and simple, no slang, no emoji.
Support contact: the "Contact seller" button on the order page, or [email protected].
Facts you may mention: 12-month warranty on all stands.
Sign off as: The ACME Home team
EOF2

Шаг 3: Скрипт ответов

cat > /opt/reviews/replies.py <<'EOF2'
import csv, json, os, re, sys
import ollama

MODEL = os.environ.get("MODEL", "qwen2.5:7b")
BRAND = open(os.environ.get("BRAND_FILE", "brand.txt"), encoding="utf-8").read()
ESCALATE = re.compile(os.environ.get("ESCALATE",
    r"refund|chargeback|injur|burn|fire|smoke|allerg|lawyer|lawsuit|scam|fraud|fake|police|退款|投诉|受伤|起火|过敏|律师|骗"), re.I)
SCHEMA = {"type": "object", "properties": {
    "reply": {"type": "string"}, "needs_human": {"type": "boolean"}, "reason": {"type": "string"}},
    "required": ["reply", "needs_human", "reason"]}
SYSTEM = """You draft public replies to customer reviews for the business described in the brand notes.
Rules:
- Reply in the same language as the review, in 2 to 4 sentences.
- Thank the customer and respond to the specific point they made. Vary your wording.
- Never admit legal liability. Never promise refunds, replacements, discounts or compensation.
- Never ask the customer to change or remove their review, and never offer anything in return for a review.
- Never include order numbers, names or other personal data.
- For problems, apologise briefly and invite the customer to contact support as described in the brand notes.
- Set needs_human to true for safety issues, legal threats, suspected fraud, abuse, or if you are unsure,
  and give the reason. Otherwise leave reason empty.

Brand notes:
""" + BRAND

src, out = sys.argv[1], "replies.csv"
done = set()
if os.path.exists(out):
    with open(out, encoding="utf-8-sig") as f:
        done = {r["id"] for r in csv.DictReader(f)}
with open(src, encoding="utf-8-sig") as f:
    reviews = [r for r in csv.DictReader(f) if r.get("text", "").strip()]

new_file = not os.path.exists(out)
with open(out, "a", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    if new_file:
        w.writerow(["id", "rating", "text", "draft_reply", "needs_human", "reason", "approved", "final_reply"])
    for r in reviews:
        if r["id"] in done:
            continue
        res = ollama.chat(model=MODEL, format=SCHEMA, options={"temperature": 0.5}, messages=[
            {"role": "system", "content": SYSTEM},
            {"role": "user", "content": f"Rating: {r.get('rating', '?')} of 5\nReview: {r['text'][:3000]}"}])
        d = json.loads(res.message.content)
        reasons = [d["reason"]] if d["needs_human"] and d["reason"] else []
        if r.get("rating", "").isdigit() and int(r["rating"]) <= 2:
            reasons.append("low rating")
        if ESCALATE.search(r["text"]):
            reasons.append("keyword: " + ESCALATE.search(r["text"]).group(0))
        w.writerow([r["id"], r.get("rating", ""), r["text"], d["reply"].strip(),
                    "yes" if reasons or d["needs_human"] else "no", "; ".join(reasons), "", ""])
        f.flush()
        print(r["id"], "NEEDS HUMAN" if reasons or d["needs_human"] else "draft ok", flush=True)
print("done: replies.csv")
EOF2

Отзыв помечается для человека, если об этом просит сама модель, если оценка 2 или ниже либо если в тексте встречается слово из списка ESCALATE. Обработанные отзывы сохраняются сразу и пропускаются при следующем запуске.

Шаг 4: Генерация черновиков

cd /data/reviews
/opt/reviews/bin/python /opt/reviews/replies.py reviews.csv

Результат — файл replies.csv со столбцами id, rating, text, draft_reply, needs_human, reason, approved и final_reply.

Шаг 5: Согласование и публикация

  1. Откройте replies.csv в Excel или Google Таблицах и сначала отфильтруйте строки, где needs_human = yes. Ими займитесь сами: свяжитесь с покупателем в личных сообщениях через платформу, решите проблему, а затем ответьте публично.
  2. В остальных строках прочитайте черновик, скопируйте его в final_reply с нужными правками и укажите в approved значение yes.
  3. Опубликуйте одобренные ответы через личный кабинет продавца или через официальный API платформы, если он есть.
  4. Сохраните файл как запись о том, на какие отзывы и кем был дан ответ.

Шаг 6: Настройка под ваш бизнес

  • Дополните ESCALATE словами на языках ваших покупателей, например на тайском, испанском или японском.
  • Добавьте в заметки о бренде часто нужные факты, например условия гарантии или рекомендации по уходу, чтобы черновики правильно отвечали на типичные вопросы.
  • Вставьте в заметки о бренде два-три ответа, которые вы считаете идеальными, в качестве примеров — модель будет следовать их стилю.
  • Чтобы сразу оповещать команду об отзывах, требующих участия человека, отправляйте помеченные строки в группу Telegram с помощью инструмента автоматизации, см. создание Telegram-бота в n8n.

Частые вопросы

Можно ли публиковать ответы автоматически?

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

Все черновики звучат одинаково

Правила требуют от модели разнообразить формулировки, а температура 0.5 добавляет вариативности. Больше всего помогают примеры ответов с разной структурой в заметках о бренде.

На какие отзывы стоит отвечать?

В первую очередь — на негативные и подробные отзывы: хороший ответ на них может изменить мнение покупателя. На короткие положительные отзывы достаточно максимум краткой благодарности. Чтобы понять, на что покупатели жалуются в целом, см. кластеризация отзывов по темам с помощью эмбеддингов.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, используемую модель и текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства