feat: Add Content Generation Engine v2 with quality scoring
Major improvements to AI content generation: ## New Components (app/services/ai/) - PromptLibrary: YAML-based prompt templates with inheritance - ContextEngine: Anti-repetition and best performers tracking - ContentGeneratorV2: Enhanced generation with dynamic parameters - PlatformAdapter: Platform-specific content adaptation - ContentValidator: AI-powered quality scoring (0-100) ## Prompt Library (app/prompts/) - 3 personalities: default, educational, promotional - 5 templates: tip_tech, product_post, service_post, thread, response - 4 platform configs: x, threads, instagram, facebook - Few-shot examples by category: ia, productividad, seguridad ## Database Changes - New table: content_memory (tracks generated content) - New columns in posts: quality_score, score_breakdown, generation_attempts ## New API Endpoints (/api/v2/generate/) - POST /generate - Generation with quality check - POST /generate/batch - Batch generation - POST /quality/evaluate - Evaluate content quality - GET /templates, /personalities, /platforms - List configs ## Celery Tasks - update_engagement_scores (every 6h) - cleanup_old_memory (monthly) - refresh_best_posts_yaml (weekly) ## Tests - Comprehensive tests for all AI engine components Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
82
app/prompts/templates/product_post.yaml
Normal file
82
app/prompts/templates/product_post.yaml
Normal file
@@ -0,0 +1,82 @@
|
||||
name: product_post
|
||||
description: Posts promocionales para productos
|
||||
personality: promotional
|
||||
|
||||
purpose: |
|
||||
Presentar productos de forma atractiva enfocándose en cómo
|
||||
resuelven problemas reales del cliente.
|
||||
|
||||
requirements:
|
||||
- Liderar con el problema que resuelve
|
||||
- Destacar 2-3 beneficios clave
|
||||
- Incluir precio como inversión
|
||||
- CTA claro pero no agresivo
|
||||
- NO inventar especificaciones
|
||||
|
||||
structure:
|
||||
hook: problem_or_benefit_hook
|
||||
benefits: 2_3_key_benefits
|
||||
specs: relevant_specs_only
|
||||
price: price_as_investment
|
||||
cta: soft_call_to_action
|
||||
hashtags: 2_3_relevant
|
||||
|
||||
variables:
|
||||
- name: product_name
|
||||
type: string
|
||||
required: true
|
||||
- name: product_description
|
||||
type: string
|
||||
required: true
|
||||
- name: price
|
||||
type: number
|
||||
required: true
|
||||
- name: category
|
||||
type: string
|
||||
required: true
|
||||
- name: specs
|
||||
type: object
|
||||
required: false
|
||||
- name: highlights
|
||||
type: array
|
||||
required: false
|
||||
|
||||
parameters:
|
||||
temperature: 0.7
|
||||
max_tokens: 400
|
||||
|
||||
template: |
|
||||
Genera un post promocional para este producto:
|
||||
|
||||
PRODUCTO: {product_name}
|
||||
DESCRIPCIÓN: {product_description}
|
||||
PRECIO: ${price:,.2f} MXN
|
||||
CATEGORÍA: {category}
|
||||
ESPECIFICACIONES: {specs}
|
||||
PUNTOS DESTACADOS: {highlights}
|
||||
|
||||
ESTRUCTURA:
|
||||
1. HOOK: Problema que resuelve O beneficio principal
|
||||
2. BENEFICIOS: 2-3 beneficios clave (no características)
|
||||
3. PRECIO: Presentado como inversión
|
||||
4. CTA: Invitación a saber más (no presión)
|
||||
5. HASHTAGS: 2-3 relevantes
|
||||
|
||||
REGLAS:
|
||||
- Beneficios > Características (no "8GB RAM", sino "edita video sin lag")
|
||||
- El precio es una inversión, no un gasto
|
||||
- CTA suave: "Más info en DM", "Conoce más", etc.
|
||||
- NO inventes especificaciones que no están en los datos
|
||||
- Usa emojis con propósito (máximo 3-4)
|
||||
|
||||
Responde SOLO con el texto del post.
|
||||
|
||||
tone_guidelines:
|
||||
do:
|
||||
- "Edita videos 4K sin esperar renderizados eternos"
|
||||
- "Inversión que se paga sola en productividad"
|
||||
- "¿Te interesa? Escríbenos para más detalles"
|
||||
dont:
|
||||
- "¡¡¡OFERTA INCREÍBLE!!!"
|
||||
- "ÚLTIMAS UNIDADES" (a menos que sea verdad)
|
||||
- "Compra ahora antes de que se acabe"
|
||||
97
app/prompts/templates/response.yaml
Normal file
97
app/prompts/templates/response.yaml
Normal file
@@ -0,0 +1,97 @@
|
||||
name: response
|
||||
description: Respuestas a interacciones de usuarios
|
||||
personality: default
|
||||
|
||||
purpose: |
|
||||
Generar respuestas apropiadas a comentarios, menciones y mensajes,
|
||||
manteniendo la voz de marca y fomentando la relación con el usuario.
|
||||
|
||||
requirements:
|
||||
- Responder al contexto específico del usuario
|
||||
- Mantener tono de marca
|
||||
- Fomentar continuación de conversación cuando apropiado
|
||||
- Ser útil sin ser condescendiente
|
||||
|
||||
response_types:
|
||||
question:
|
||||
priority: high
|
||||
goal: answer_helpfully
|
||||
follow_up: offer_more_help
|
||||
compliment:
|
||||
priority: medium
|
||||
goal: thank_genuinely
|
||||
follow_up: invite_engagement
|
||||
complaint:
|
||||
priority: critical
|
||||
goal: acknowledge_and_solve
|
||||
follow_up: take_to_dm_if_complex
|
||||
mention:
|
||||
priority: medium
|
||||
goal: engage_positively
|
||||
follow_up: depends_on_context
|
||||
|
||||
variables:
|
||||
- name: interaction_content
|
||||
type: string
|
||||
required: true
|
||||
- name: interaction_type
|
||||
type: string
|
||||
required: true
|
||||
options: ["comment", "mention", "reply", "dm"]
|
||||
- name: sentiment
|
||||
type: string
|
||||
required: false
|
||||
options: ["positive", "neutral", "negative", "question"]
|
||||
- name: context
|
||||
type: string
|
||||
required: false
|
||||
description: "Contexto adicional (post original, historial, etc.)"
|
||||
|
||||
parameters:
|
||||
temperature: 0.8
|
||||
max_tokens: 500
|
||||
|
||||
template: |
|
||||
Un usuario escribió esto en redes sociales:
|
||||
|
||||
"{interaction_content}"
|
||||
|
||||
TIPO DE INTERACCIÓN: {interaction_type}
|
||||
SENTIMIENTO DETECTADO: {sentiment}
|
||||
CONTEXTO: {context}
|
||||
|
||||
Genera 3 opciones de respuesta diferentes:
|
||||
|
||||
1. RESPUESTA CORTA: Directa y amigable (máx 100 caracteres)
|
||||
2. RESPUESTA CONVERSACIONAL: Invita a continuar el diálogo (máx 200 caracteres)
|
||||
3. RESPUESTA CON CTA: Dirige a más info o contacto (máx 200 caracteres)
|
||||
|
||||
REGLAS SEGÚN TIPO:
|
||||
|
||||
Si es PREGUNTA:
|
||||
- Responde de forma útil y específica
|
||||
- Si no sabes algo, admítelo honestamente
|
||||
- Ofrece investigar más si es necesario
|
||||
|
||||
Si es QUEJA:
|
||||
- Empatiza primero, no te defiendas
|
||||
- Ofrece solución o escalación
|
||||
- Sugiere continuar por DM si es complejo
|
||||
|
||||
Si es CUMPLIDO:
|
||||
- Agradece genuinamente (no genérico)
|
||||
- Comparte crédito si aplica
|
||||
- Invita a más engagement
|
||||
|
||||
Si es MENCIÓN:
|
||||
- Reconoce la mención
|
||||
- Aporta valor si es posible
|
||||
- Sé natural, no forzado
|
||||
|
||||
TONO:
|
||||
- Humano, no robótico
|
||||
- Amigable pero profesional
|
||||
- Útil sin ser condescendiente
|
||||
- Nunca defensivo o pasivo-agresivo
|
||||
|
||||
Responde con las 3 opciones numeradas, una por línea.
|
||||
87
app/prompts/templates/service_post.yaml
Normal file
87
app/prompts/templates/service_post.yaml
Normal file
@@ -0,0 +1,87 @@
|
||||
name: service_post
|
||||
description: Posts promocionales para servicios
|
||||
personality: promotional
|
||||
|
||||
purpose: |
|
||||
Presentar servicios enfocándose en el problema que resuelven
|
||||
y los resultados que el cliente puede esperar.
|
||||
|
||||
requirements:
|
||||
- Enfocarse en el problema/dolor del cliente
|
||||
- Mostrar resultados, no procesos
|
||||
- Incluir prueba social si está disponible
|
||||
- CTA consultivo (no de venta directa)
|
||||
|
||||
structure:
|
||||
hook: pain_point_or_result
|
||||
problem: what_client_struggles_with
|
||||
solution: how_service_helps
|
||||
results: expected_outcomes
|
||||
cta: consultative_invitation
|
||||
hashtags: 2_3_relevant
|
||||
|
||||
variables:
|
||||
- name: service_name
|
||||
type: string
|
||||
required: true
|
||||
- name: service_description
|
||||
type: string
|
||||
required: true
|
||||
- name: category
|
||||
type: string
|
||||
required: true
|
||||
- name: target_sectors
|
||||
type: array
|
||||
required: false
|
||||
- name: benefits
|
||||
type: array
|
||||
required: false
|
||||
- name: call_to_action
|
||||
type: string
|
||||
required: false
|
||||
default: "Contáctanos para una consulta sin compromiso"
|
||||
|
||||
parameters:
|
||||
temperature: 0.7
|
||||
max_tokens: 400
|
||||
|
||||
template: |
|
||||
Genera un post promocional para este servicio:
|
||||
|
||||
SERVICIO: {service_name}
|
||||
DESCRIPCIÓN: {service_description}
|
||||
CATEGORÍA: {category}
|
||||
SECTORES OBJETIVO: {target_sectors}
|
||||
BENEFICIOS: {benefits}
|
||||
CTA DESEADO: {call_to_action}
|
||||
|
||||
ESTRUCTURA:
|
||||
1. HOOK: Dolor del cliente O resultado transformador
|
||||
2. PROBLEMA: Lo que el cliente enfrenta (empatía)
|
||||
3. SOLUCIÓN: Cómo el servicio ayuda (sin tecnicismos)
|
||||
4. RESULTADOS: Qué puede esperar el cliente
|
||||
5. CTA: Invitación consultiva
|
||||
6. HASHTAGS: 2-3 relevantes
|
||||
|
||||
TONO:
|
||||
- Consultivo, no vendedor
|
||||
- Empático con el problema del cliente
|
||||
- Confiado pero no arrogante
|
||||
- Enfocado en resultados medibles
|
||||
|
||||
REGLAS:
|
||||
- Usa "tú" no "usted" (cercano)
|
||||
- Evita jerga técnica innecesaria
|
||||
- Si mencionas resultados, que sean realistas
|
||||
- CTA debe ser bajo compromiso
|
||||
|
||||
Responde SOLO con el texto del post.
|
||||
|
||||
examples:
|
||||
hooks:
|
||||
good:
|
||||
- "¿Tu equipo pierde 10+ horas/semana en tareas repetitivas?"
|
||||
- "Empresas que automatizan reducen errores un 80%"
|
||||
bad:
|
||||
- "Ofrecemos servicios de automatización"
|
||||
- "Somos expertos en IA"
|
||||
84
app/prompts/templates/thread.yaml
Normal file
84
app/prompts/templates/thread.yaml
Normal file
@@ -0,0 +1,84 @@
|
||||
name: thread
|
||||
description: Hilos educativos de múltiples posts
|
||||
personality: educational
|
||||
|
||||
purpose: |
|
||||
Crear hilos educativos que expliquen un tema en profundidad,
|
||||
manteniendo engagement a lo largo de todos los posts.
|
||||
|
||||
requirements:
|
||||
- Cada post debe poder funcionar solo pero mejor en conjunto
|
||||
- Progresión lógica de información
|
||||
- Hooks internos para mantener lectura
|
||||
- Valor concreto en cada post
|
||||
|
||||
structure:
|
||||
post_1: hook_and_promise
|
||||
posts_middle: educational_content
|
||||
post_final: conclusion_and_cta
|
||||
|
||||
variables:
|
||||
- name: topic
|
||||
type: string
|
||||
required: true
|
||||
- name: num_posts
|
||||
type: integer
|
||||
required: false
|
||||
default: 5
|
||||
min: 3
|
||||
max: 10
|
||||
- name: depth
|
||||
type: string
|
||||
required: false
|
||||
default: "intermedio"
|
||||
options: ["básico", "intermedio", "avanzado"]
|
||||
|
||||
parameters:
|
||||
temperature: 0.7
|
||||
max_tokens: 1500
|
||||
|
||||
template: |
|
||||
Genera un hilo educativo de {num_posts} posts sobre: {topic}
|
||||
|
||||
NIVEL DE PROFUNDIDAD: {depth}
|
||||
|
||||
ESTRUCTURA DEL HILO:
|
||||
|
||||
POST 1 (HOOK):
|
||||
- Captura atención con dato sorprendente, pregunta provocadora, o promesa de valor
|
||||
- Indica que es un hilo: "🧵 Hilo:"
|
||||
- Anticipa lo que van a aprender
|
||||
|
||||
POSTS 2 a {num_posts-1} (CONTENIDO):
|
||||
- Cada post = 1 concepto/punto
|
||||
- Empieza cada post con conexión al anterior
|
||||
- Incluye ejemplo práctico cuando sea posible
|
||||
- Usa formato escaneable (bullets, numeración)
|
||||
|
||||
POST {num_posts} (CIERRE):
|
||||
- Resume los puntos clave
|
||||
- Da un paso accionable
|
||||
- CTA de engagement (guardar, compartir, seguir)
|
||||
- Hashtags relevantes
|
||||
|
||||
REGLAS POR POST:
|
||||
- Máximo 280 caracteres cada uno
|
||||
- Numera cada post (1/, 2/, etc.)
|
||||
- Emojis con propósito (1-2 por post)
|
||||
- El último post lleva los hashtags
|
||||
|
||||
TÉCNICAS DE ENGAGEMENT:
|
||||
- "Pero aquí viene lo interesante..." (transiciones)
|
||||
- Preguntas retóricas entre posts
|
||||
- "La mayoría no sabe esto..." (curiosidad)
|
||||
- Ejemplos concretos y relatable
|
||||
|
||||
FORMATO DE RESPUESTA:
|
||||
Responde con cada post separado por una línea vacía.
|
||||
No incluyas explicaciones, solo los posts.
|
||||
|
||||
example_structure:
|
||||
post_1: "🧵 Hilo: 5 errores de productividad que cometes sin darte cuenta (y cómo evitarlos)"
|
||||
post_2: "1/ El primero: revisar email como primera tarea del día..."
|
||||
post_3: "2/ El segundo error es más sutil..."
|
||||
post_n: "5/ Para resumir: [puntos clave]. ¿Cuál vas a cambiar primero? #Productividad"
|
||||
85
app/prompts/templates/tip_tech.yaml
Normal file
85
app/prompts/templates/tip_tech.yaml
Normal file
@@ -0,0 +1,85 @@
|
||||
name: tip_tech
|
||||
description: Tips de tecnología cortos y accionables
|
||||
personality: default
|
||||
|
||||
purpose: |
|
||||
Generar tips prácticos que el lector pueda aplicar inmediatamente.
|
||||
El valor está en la accionabilidad, no en la teoría.
|
||||
|
||||
requirements:
|
||||
- Accionable en menos de 5 minutos
|
||||
- Un solo concepto por tip
|
||||
- Incluye el "por qué" importa
|
||||
- Específico, no genérico
|
||||
|
||||
structure:
|
||||
hook: attention_grabbing_first_line
|
||||
body: the_tip_with_context
|
||||
why: why_it_matters
|
||||
close: hashtags_only
|
||||
|
||||
variables:
|
||||
- name: category
|
||||
type: string
|
||||
required: true
|
||||
examples: ["productividad", "ia", "seguridad", "python", "automatización"]
|
||||
- name: difficulty_level
|
||||
type: string
|
||||
required: false
|
||||
default: "principiante"
|
||||
options: ["principiante", "intermedio", "avanzado"]
|
||||
- name: target_audience
|
||||
type: string
|
||||
required: false
|
||||
default: "profesionales tech"
|
||||
|
||||
parameters:
|
||||
temperature: 0.8
|
||||
max_tokens: 300
|
||||
|
||||
template: |
|
||||
Genera un tip de tecnología sobre: {category}
|
||||
|
||||
NIVEL DE DIFICULTAD: {difficulty_level}
|
||||
AUDIENCIA: {target_audience}
|
||||
|
||||
ESTRUCTURA REQUERIDA:
|
||||
1. HOOK: Primera línea que capture atención (pregunta, dato sorprendente, o afirmación bold)
|
||||
2. TIP: El consejo concreto y específico
|
||||
3. POR QUÉ: Una línea explicando el beneficio
|
||||
4. HASHTAGS: 2-3 hashtags relevantes
|
||||
|
||||
CRITERIOS DE CALIDAD:
|
||||
- El lector debe poder aplicarlo HOY
|
||||
- Debe ser específico (no "usa IA para ser más productivo", sino "usa ChatGPT para resumir emails largos")
|
||||
- El hook debe generar curiosidad o resonar con un dolor común
|
||||
|
||||
EVITAR:
|
||||
- Tips genéricos que todos conocen
|
||||
- Consejos que requieran comprar algo
|
||||
- Jerga técnica sin explicación
|
||||
|
||||
Responde SOLO con el texto del post, sin explicaciones ni meta-comentarios.
|
||||
|
||||
examples:
|
||||
good:
|
||||
- |
|
||||
¿Pasas horas en reuniones improductivas?
|
||||
|
||||
La regla 2-2-2: máximo 2 temas, 2 decisiones, 2 acciones.
|
||||
|
||||
Mis reuniones ahora duran la mitad.
|
||||
|
||||
#Productividad #Tips
|
||||
- |
|
||||
El 90% ignora esto en Python:
|
||||
|
||||
Usa enumerate() en lugar de range(len()).
|
||||
|
||||
Código más limpio y 0 errores de índice.
|
||||
|
||||
#Python #Programming
|
||||
bad:
|
||||
- "Usa IA para ser más productivo" # Muy genérico
|
||||
- "Compra una segunda pantalla para trabajar mejor" # Requiere compra
|
||||
- "El machine learning es útil" # No es accionable
|
||||
Reference in New Issue
Block a user