Responder a las reseñas demuestra a los clientes que alguien los escucha, y los futuros compradores también leen esas respuestas. Sin embargo, escribir cientos de respuestas cuidadas en varios idiomas lleva horas cada semana. Esta guía usa un modelo de lenguaje local para redactar un borrador de respuesta a cada reseña en el idioma de quien la escribió, siguiendo sus notas de marca y un conjunto estricto de reglas. Marca las reseñas que requieren la intervención de una persona, como las de valoración baja, problemas de seguridad, amenazas legales o sospecha de fraude, y lo guarda todo en una hoja de cálculo para su aprobación. Nada se publica automáticamente.
Use el entorno /opt/reviews con Ollama de analizar reseñas de clientes con un LLM local. El mismo CSV de reseñas sirve aquí; el script necesita las columnas id y text, y usa rating cuando existe.
El modelo usa estas notas para el tono, los datos de contacto y los hechos que puede mencionar. Manténgalas breves y objetivas:
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
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
Una reseña se marca para revisión humana cuando el modelo lo pide, cuando la valoración es de 2 o menos, o cuando el texto coincide con la lista de palabras clave ESCALATE. Las reseñas procesadas se guardan de inmediato y se omiten en la siguiente ejecución.
cd /data/reviews
/opt/reviews/bin/python /opt/reviews/replies.py reviews.csv
El resultado es replies.csv, con las columnas id, rating, text, draft_reply, needs_human, reason, approved y final_reply.
replies.csv en Excel o Google Sheets y filtre primero por needs_human = yes. Ocúpese usted mismo de estas reseñas: contacte con el cliente en privado a través de la plataforma, resuelva el problema y después responda públicamente.final_reply con los cambios que necesite y ponga approved en yes.ESCALATE con palabras en los idiomas que usan sus clientes, por ejemplo en tailandés, español o japonés.Técnicamente sí, mediante las API de las plataformas, pero recomendamos la aprobación humana. Una respuesta pública equivocada es difícil de deshacer, y muchas plataformas responsabilizan al vendedor de cada palabra.
Las reglas piden al modelo que varíe la redacción, y la temperatura de 0.5 aporta variedad. Lo que más ayuda es incluir en las notas de marca respuestas de ejemplo con estructuras diferentes.
Dé prioridad a las reseñas negativas y detalladas, en las que una buena respuesta puede hacer cambiar de opinión a un comprador. Las reseñas positivas breves necesitan, como mucho, un breve agradecimiento. Para entender de qué se quejan los clientes en general, consulte descubrir de qué hablan los clientes con embeddings.
¿Sigue sin resolverlo después de seguir estos pasos? Abra un ticket de soporte y el equipo técnico de IMIDC, disponible 24/7, le ayudará. Incluya la IP del servidor, el modelo que usa y la salida del error para que podamos localizar el problema más rápido.