bentosmau commited on
Commit
827185c
·
1 Parent(s): c69311b

Vary responses to avoid repetition and sound more natural

Browse files

Modify `logica.py` to implement a response variation system using a pool of intros, connectors, and outros, and shuffle middle content blocks. Update `respuestas.json` to reflect a minor name change in the creator's alias.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: e3ff2484-bbd8-4aba-bea0-1940769b874a
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: e3ff8583-c2ae-45ef-908d-ca30da3a9652
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1739408b-93a5-479b-a658-30f2493b0467/e3ff2484-bbd8-4aba-bea0-1940769b874a/gspaGFo
Replit-Helium-Checkpoint-Created: true

Files changed (2) hide show
  1. chat-app/logica.py +92 -3
  2. chat-app/respuestas.json +1 -1
chat-app/logica.py CHANGED
@@ -1,6 +1,7 @@
1
  import os
2
  import re
3
  import json
 
4
  import unicodedata
5
  from roblox_api import buscar_jugador, buscar_juego, formatear_jugador, formatear_juego
6
  from matematicas import (
@@ -8,6 +9,92 @@ from matematicas import (
8
  resolver_operacion, formatear_resultado, extraer_nombre_usuario,
9
  )
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  GENEROS_ROBLOX = {
12
  "Town and City": "un juego de vida urbana y roleplay social",
13
  "Adventure": "un juego de aventura y exploración",
@@ -84,7 +171,9 @@ def similitud_tokens(tokens_entrada, tokens_patron):
84
 
85
  def buscar_respuesta_personalizada(mensaje):
86
  """
87
- Busca la mejor respuesta usando similitud de tokens.
 
 
88
  Umbral mínimo: 0.20 (al menos 20% de overlap Jaccard)
89
  """
90
  tokens_entrada = tokenizar(mensaje)
@@ -100,8 +189,8 @@ def buscar_respuesta_personalizada(mensaje):
100
  mejor_score = score
101
  mejor_respuesta = entrada.get("respuesta")
102
 
103
- if mejor_score >= UMBRAL:
104
- return mejor_respuesta
105
  return None
106
 
107
  # ── UTILIDADES ─────────────────────────────────────────────────────────────────
 
1
  import os
2
  import re
3
  import json
4
+ import random
5
  import unicodedata
6
  from roblox_api import buscar_jugador, buscar_juego, formatear_jugador, formatear_juego
7
  from matematicas import (
 
9
  resolver_operacion, formatear_resultado, extraer_nombre_usuario,
10
  )
11
 
12
+ # ── BANCO DE VARIACIONES DE LENGUAJE ──────────────────────────────────────────
13
+
14
+ INTROS = [
15
+ "",
16
+ "¡Claro! ",
17
+ "¡Con gusto! ",
18
+ "¡Buena pregunta! ",
19
+ "Te cuento: ",
20
+ "Por supuesto. ",
21
+ "Aquí va: ",
22
+ "Déjame explicarte. ",
23
+ ]
24
+
25
+ CONECTORES = [
26
+ "Además, ",
27
+ "También vale mencionar que ",
28
+ "Por otro lado, ",
29
+ "Cabe añadir que ",
30
+ "Algo importante: ",
31
+ "No te olvides de que ",
32
+ ]
33
+
34
+ CIERRES = [
35
+ "",
36
+ "\n\n¿Tienes alguna otra pregunta? 😊",
37
+ "\n\n¿Quieres que profundice en algo? 🤔",
38
+ "\n\n¿Necesitas más detalles sobre esto?",
39
+ "\n\n¿Algo más en lo que pueda ayudarte?",
40
+ "\n\n¡Espero que te sea útil! 😄",
41
+ ]
42
+
43
+ # Palabras que indican que un bloque es intro/cierre y no debe moverse
44
+ _MARCAS_FIJAS = (
45
+ "aquí tienes", "aquí va", "te cuento", "soy ", "¡hola", "claro 😀",
46
+ "de acuerdo", "fue un placer", "con mucho gusto",
47
+ )
48
+
49
+ def _es_bloque_fijo(bloque):
50
+ """Devuelve True si el bloque debe mantenerse en su posición original."""
51
+ bl = bloque.lower()
52
+ return any(marca in bl for marca in _MARCAS_FIJAS)
53
+
54
+ def generar_variacion(respuesta):
55
+ """
56
+ Genera una versión variada de la respuesta para que NEO-1 no suene
57
+ repetitivo. Estrategia:
58
+ 1. Divide la respuesta en párrafos/bloques (separados por \\n\\n).
59
+ 2. Mantiene el primer bloque fijo si parece una intro.
60
+ 3. Mezcla aleatoriamente los bloques del medio.
61
+ 4. Opcionalmente añade un cierre diferente.
62
+ 5. Con cierta probabilidad inserta un conector antes de un bloque.
63
+ """
64
+ bloques = [b.strip() for b in respuesta.split("\n\n") if b.strip()]
65
+
66
+ if len(bloques) <= 2:
67
+ intro = random.choice(INTROS[:4])
68
+ cierre = random.choice(CIERRES)
69
+ texto = intro + respuesta + cierre
70
+ return texto.strip()
71
+
72
+ # Separar intro, medio y cierre
73
+ inicio = bloques[0]
74
+ fin = bloques[-1]
75
+ medio = bloques[1:-1]
76
+
77
+ # Mezclar secciones del medio solo si hay más de una y ninguna es fija
78
+ shuffleable = [b for b in medio if not _es_bloque_fijo(b)]
79
+ fijos = [b for b in medio if _es_bloque_fijo(b)]
80
+
81
+ random.shuffle(shuffleable)
82
+ medio_nuevo = fijos + shuffleable # los fijos siempre primero
83
+
84
+ # Con 40% de probabilidad insertar un conector antes de un bloque
85
+ if len(medio_nuevo) > 1 and random.random() < 0.40:
86
+ idx = random.randint(1, len(medio_nuevo) - 1)
87
+ conector = random.choice(CONECTORES)
88
+ # Solo añadir si el bloque no empieza ya con negrita/emoji
89
+ if not medio_nuevo[idx].startswith(("**", "🌞", "🌑", "☀️", "💧", "🟢", "🌬️")):
90
+ medio_nuevo[idx] = conector + medio_nuevo[idx]
91
+
92
+ # Cierre variable (50% de probabilidad de añadir uno)
93
+ cierre = random.choice(CIERRES) if random.random() < 0.50 else ""
94
+
95
+ partes = [inicio] + medio_nuevo + [fin]
96
+ return "\n\n".join(partes) + cierre
97
+
98
  GENEROS_ROBLOX = {
99
  "Town and City": "un juego de vida urbana y roleplay social",
100
  "Adventure": "un juego de aventura y exploración",
 
171
 
172
  def buscar_respuesta_personalizada(mensaje):
173
  """
174
+ Busca la mejor respuesta usando similitud de tokens y devuelve
175
+ una variación generada automáticamente para que NEO-1 no repita
176
+ siempre las mismas palabras.
177
  Umbral mínimo: 0.20 (al menos 20% de overlap Jaccard)
178
  """
179
  tokens_entrada = tokenizar(mensaje)
 
189
  mejor_score = score
190
  mejor_respuesta = entrada.get("respuesta")
191
 
192
+ if mejor_score >= UMBRAL and mejor_respuesta:
193
+ return generar_variacion(mejor_respuesta)
194
  return None
195
 
196
  # ── UTILIDADES ─────────────────────────────────────────────────────────────────
chat-app/respuestas.json CHANGED
@@ -20,7 +20,7 @@
20
  "quién te creó",
21
  "quien te hizo"
22
  ],
23
- "respuesta": "Soy EYES-1.13.1, un modelo de inteligencia artificial creado por mauriminuano125-a11y. Estoy aquí para ayudarte con tus preguntas y conversaciones."
24
  },
25
  {
26
  "preguntas": [
 
20
  "quién te creó",
21
  "quien te hizo"
22
  ],
23
+ "respuesta": "Soy EYES-1.13.1, un modelo de inteligencia artificial creado por MDFJ (Mau). Estoy aquí para ayudarte con tus preguntas y conversaciones."
24
  },
25
  {
26
  "preguntas": [