DanielRN commited on
Commit
6163952
·
verified ·
1 Parent(s): 4c1db70

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -43
app.py CHANGED
@@ -10,24 +10,25 @@ model_name = "microsoft/DialoGPT-small"
10
  device = "cuda" if torch.cuda.is_available() else "cpu"
11
  tokenizer = AutoTokenizer.from_pretrained(model_name)
12
  model = AutoModelForCausalLM.from_pretrained(model_name).to(device)
13
- model.eval() # Modo evaluación para mayor rapidez
 
 
14
 
15
- # Cargar alojamientos en memoria con preprocesamiento
16
  def cargar_alojamientos():
17
  with open("alojamientos.txt", "r", encoding="utf-8") as file:
18
- alojamientos = file.read().split("\n\n") # Separar por alojamientos
19
  return {idx: alojamiento for idx, alojamiento in enumerate(alojamientos)}
20
 
21
  alojamientos_info = cargar_alojamientos()
22
 
23
- # Índice invertido optimizado
24
  indice_palabras = defaultdict(set)
25
  for idx, alojamiento in alojamientos_info.items():
26
  for palabra in re.split(r'\W+', alojamiento.lower()):
27
- if len(palabra) > 2: # Ignorar palabras cortas
28
  indice_palabras[palabra].add(idx)
29
 
30
- # Caché LRU con límite de tamaño
31
  class LRUCache:
32
  def __init__(self, capacity=100):
33
  self.cache = OrderedDict()
@@ -52,45 +53,50 @@ class LRUCache:
52
  cache_respuestas = LRUCache()
53
  cache_paginas = LRUCache()
54
 
55
- # Función de búsqueda optimizada
56
  def buscar_alojamiento(consulta):
57
  consulta = consulta.lower()
58
  cached = cache_respuestas.get(consulta)
59
  if cached is not None:
60
  return cached
61
 
62
- # Extraer número de plazas si existe
63
  match_plazas = re.search(r"\b(\d+)\s*(personas|plazas)\b", consulta)
64
  plazas = int(match_plazas.group(1)) if match_plazas else None
65
 
66
- # Búsqueda por palabras clave
67
  palabras = set(re.split(r'\W+', consulta))
68
  indices = set()
69
  for palabra in palabras:
70
  if palabra in indice_palabras:
71
  indices.update(indice_palabras[palabra])
72
 
73
- # Filtrar por plazas si aplica
74
  resultados = [
75
  alojamientos_info[idx] for idx in indices
76
  if not plazas or f"Plazas: {plazas}" in alojamientos_info[idx]
77
  ]
78
 
79
  cache_respuestas.put(consulta, resultados)
80
- cache_paginas.put(consulta, 0) # Reiniciar paginación
81
  return resultados
82
 
83
- # Formateo visual optimizado
84
  def formatear_alojamiento(texto):
85
  lineas = texto.split("\n")
86
- resultado = ["----------------------------------------------------------"]
 
 
 
 
 
 
 
 
87
  iconos = {
88
- "Alojamiento:": "🏠", "Dirección:": "📍", "Teléfono:": "📞", "Email:": "📧",
89
  "Plazas:": "👤", "Mascotas": "🐾", "Wifi": "📶", "Directv": "📺",
90
  "Ropa blanca": "🛏️", "Habilitación provincial": "📝", "Servicios:": "🛠"
91
  }
92
 
93
- for linea in lineas:
94
  for clave, icono in iconos.items():
95
  if clave in linea:
96
  resultado.append(f"{icono} **{linea}**")
@@ -104,11 +110,11 @@ def formatear_alojamiento(texto):
104
  resultado.append("----------------------------------------------------------")
105
  return "\n".join(resultado)
106
 
107
- # Paginación y resultados
108
  def mostrar_resultados(consulta):
109
  resultados = buscar_alojamiento(consulta)
110
  if not resultados:
111
- return "Lo siento, no encontré información exacta. Intenta preguntar de otra manera.", ""
112
 
113
  pagina = cache_paginas.get(consulta) or 0
114
  inicio, fin = pagina * 3, (pagina + 1) * 3
@@ -126,11 +132,7 @@ def mostrar_resultados(consulta):
126
 
127
  # Generación con DialoGPT
128
  def generar_respuesta_dialoGPT(message):
129
- prompt = f"""
130
- Eres un asistente virtual de turismo especializado en alojamientos.
131
- Responde de manera clara y concisa a: "{message}"
132
- Si no tiene relación con alojamientos, di: "Lo siento, no puedo ayudarte con esta consulta."
133
- """
134
  with torch.no_grad():
135
  inputs = tokenizer.encode(prompt + tokenizer.eos_token, return_tensors="pt").to(device)
136
  reply_ids = model.generate(
@@ -139,29 +141,15 @@ def generar_respuesta_dialoGPT(message):
139
  )
140
  return tokenizer.decode(reply_ids[:, inputs.shape[-1]:][0], skip_special_tokens=True)
141
 
142
- # Lógica del chat
143
- historial_respuestas = []
144
-
145
  def chat(message):
146
- global historial_respuestas
147
  message = message.strip().lower()
148
-
149
- if message == "" and historial_respuestas:
150
- consulta = historial_respuestas[-1]["consulta"]
151
- respuesta, pregunta_mas = mostrar_resultados(consulta)
152
- elif message == "atrás" and historial_respuestas:
153
- consulta = historial_respuestas[-1]["consulta"]
154
- pagina = cache_paginas.get(consulta)
155
- if pagina > 0:
156
- cache_paginas.put(consulta, pagina - 1)
157
  respuesta, pregunta_mas = mostrar_resultados(consulta)
158
  else:
159
  resultados = buscar_alojamiento(message)
160
- if resultados:
161
- respuesta, pregunta_mas = mostrar_resultados(message)
162
- else:
163
- respuesta = generar_respuesta_dialoGPT(message)
164
- pregunta_mas = ""
165
 
166
  historial_respuestas.append({"consulta": message, "respuesta": respuesta})
167
  if len(historial_respuestas) > 10:
@@ -170,14 +158,14 @@ def chat(message):
170
  return "\n\n".join(f"**Pregunta:** {h['consulta']}\n\n{h['respuesta']}" for h in historial_respuestas), pregunta_mas
171
 
172
  # Interfaz con Gradio
 
173
  with gr.Blocks(title="Chat de Turismo") as iface:
174
  gr.Markdown("### Asistente de Turismo - Alojamientos")
175
  output_box = gr.Textbox(label="Historial", lines=15, interactive=False)
176
- input_box = gr.Textbox(label="Consulta", placeholder="Escribe aquí y presiona Enter...")
177
  extra_box = gr.Textbox(label="Opciones", interactive=False)
178
  send_button = gr.Button("Enviar")
179
-
180
  send_button.click(chat, inputs=input_box, outputs=[output_box, extra_box])
181
  input_box.submit(chat, inputs=input_box, outputs=[output_box, extra_box])
182
 
183
- iface.launch(share=True, inbrowser=True)
 
10
  device = "cuda" if torch.cuda.is_available() else "cpu"
11
  tokenizer = AutoTokenizer.from_pretrained(model_name)
12
  model = AutoModelForCausalLM.from_pretrained(model_name).to(device)
13
+ model.eval()
14
+
15
+ # Cargar alojamientos en memoria
16
 
 
17
  def cargar_alojamientos():
18
  with open("alojamientos.txt", "r", encoding="utf-8") as file:
19
+ alojamientos = file.read().split("\n\n")
20
  return {idx: alojamiento for idx, alojamiento in enumerate(alojamientos)}
21
 
22
  alojamientos_info = cargar_alojamientos()
23
 
24
+ # Índice invertido
25
  indice_palabras = defaultdict(set)
26
  for idx, alojamiento in alojamientos_info.items():
27
  for palabra in re.split(r'\W+', alojamiento.lower()):
28
+ if len(palabra) > 2:
29
  indice_palabras[palabra].add(idx)
30
 
31
+ # Caché LRU
32
  class LRUCache:
33
  def __init__(self, capacity=100):
34
  self.cache = OrderedDict()
 
53
  cache_respuestas = LRUCache()
54
  cache_paginas = LRUCache()
55
 
56
+ # Función de búsqueda
57
  def buscar_alojamiento(consulta):
58
  consulta = consulta.lower()
59
  cached = cache_respuestas.get(consulta)
60
  if cached is not None:
61
  return cached
62
 
 
63
  match_plazas = re.search(r"\b(\d+)\s*(personas|plazas)\b", consulta)
64
  plazas = int(match_plazas.group(1)) if match_plazas else None
65
 
 
66
  palabras = set(re.split(r'\W+', consulta))
67
  indices = set()
68
  for palabra in palabras:
69
  if palabra in indice_palabras:
70
  indices.update(indice_palabras[palabra])
71
 
 
72
  resultados = [
73
  alojamientos_info[idx] for idx in indices
74
  if not plazas or f"Plazas: {plazas}" in alojamientos_info[idx]
75
  ]
76
 
77
  cache_respuestas.put(consulta, resultados)
78
+ cache_paginas.put(consulta, 0)
79
  return resultados
80
 
81
+ # Función de formateo
82
  def formatear_alojamiento(texto):
83
  lineas = texto.split("\n")
84
+ if not lineas:
85
+ return ""
86
+
87
+ nombre_alojamiento = lineas[0].strip()
88
+ resultado = [
89
+ f"🏠 **{nombre_alojamiento}**",
90
+ "----------------------------------------------------------"
91
+ ]
92
+
93
  iconos = {
94
+ "Dirección:": "📍", "Teléfono:": "📞", "Email:": "📧",
95
  "Plazas:": "👤", "Mascotas": "🐾", "Wifi": "📶", "Directv": "📺",
96
  "Ropa blanca": "🛏️", "Habilitación provincial": "📝", "Servicios:": "🛠"
97
  }
98
 
99
+ for linea in lineas[1:]:
100
  for clave, icono in iconos.items():
101
  if clave in linea:
102
  resultado.append(f"{icono} **{linea}**")
 
110
  resultado.append("----------------------------------------------------------")
111
  return "\n".join(resultado)
112
 
113
+ # Mostrar resultados
114
  def mostrar_resultados(consulta):
115
  resultados = buscar_alojamiento(consulta)
116
  if not resultados:
117
+ return "Lo siento, no encontré información exacta.", ""
118
 
119
  pagina = cache_paginas.get(consulta) or 0
120
  inicio, fin = pagina * 3, (pagina + 1) * 3
 
132
 
133
  # Generación con DialoGPT
134
  def generar_respuesta_dialoGPT(message):
135
+ prompt = f"Eres un asistente de turismo especializado en alojamientos.\nResponde de manera clara y concisa a: '{message}'"
 
 
 
 
136
  with torch.no_grad():
137
  inputs = tokenizer.encode(prompt + tokenizer.eos_token, return_tensors="pt").to(device)
138
  reply_ids = model.generate(
 
141
  )
142
  return tokenizer.decode(reply_ids[:, inputs.shape[-1]:][0], skip_special_tokens=True)
143
 
144
+ # Chat
 
 
145
  def chat(message):
 
146
  message = message.strip().lower()
147
+ if message in ["sí", "atrás"]:
148
+ consulta = historial_respuestas[-1]["consulta"] if historial_respuestas else ""
 
 
 
 
 
 
 
149
  respuesta, pregunta_mas = mostrar_resultados(consulta)
150
  else:
151
  resultados = buscar_alojamiento(message)
152
+ respuesta, pregunta_mas = mostrar_resultados(message) if resultados else (generar_respuesta_dialoGPT(message), "")
 
 
 
 
153
 
154
  historial_respuestas.append({"consulta": message, "respuesta": respuesta})
155
  if len(historial_respuestas) > 10:
 
158
  return "\n\n".join(f"**Pregunta:** {h['consulta']}\n\n{h['respuesta']}" for h in historial_respuestas), pregunta_mas
159
 
160
  # Interfaz con Gradio
161
+ historial_respuestas = []
162
  with gr.Blocks(title="Chat de Turismo") as iface:
163
  gr.Markdown("### Asistente de Turismo - Alojamientos")
164
  output_box = gr.Textbox(label="Historial", lines=15, interactive=False)
165
+ input_box = gr.Textbox(label="Consulta", placeholder="Escribe aquí...")
166
  extra_box = gr.Textbox(label="Opciones", interactive=False)
167
  send_button = gr.Button("Enviar")
 
168
  send_button.click(chat, inputs=input_box, outputs=[output_box, extra_box])
169
  input_box.submit(chat, inputs=input_box, outputs=[output_box, extra_box])
170
 
171
+ iface.launch(share=True, inbrowser=True)