javier8306 commited on
Commit
cd30bad
·
verified ·
1 Parent(s): 8c8f9f9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -10
app.py CHANGED
@@ -30,21 +30,28 @@ ENRUTADOR_MODELOS = {
30
  }
31
 
32
  # ==========================================
33
- # 2. LÓGICA DEL ORÁCULO Y RAG AVANZADO
34
  # ==========================================
35
- def realizar_exegesis_web(consulta, canon_seleccionado):
36
  modelo_asignado = ENRUTADOR_MODELOS[canon_seleccionado]
37
  vector_query = modelo_vectorial.encode(consulta, convert_to_tensor=False).tolist()
38
 
 
 
 
 
 
 
39
  try:
40
- # MEJORA RAG: Extraemos 15 pasajes con un umbral más permisivo para no perder autores específicos
41
  respuesta_db = supabase.rpc(
42
  "buscar_pasajes_clasicos",
43
  {
44
  "query_embedding": vector_query,
45
- "match_threshold": 0.15,
46
  "match_count": 15,
47
- "tabla_destino": canon_seleccionado
 
48
  }
49
  ).execute()
50
 
@@ -53,20 +60,18 @@ def realizar_exegesis_web(consulta, canon_seleccionado):
53
  if not pasajes:
54
  return "❌ No database matches found. / No se hallaron testimonios. / 未找到匹配的文本。", ""
55
 
56
- # Construimos un bloque con los 15 pasajes recuperados
57
  contexto_documentos = ""
58
  for i, frag in enumerate(pasajes):
59
  obra = frag.get("obra", "Desconocida")
60
  texto = frag.get("texto_original", "")
61
  contexto_documentos += f"\n[Documento {i+1} - Obra: {obra}]\n{texto}\n"
62
 
63
- # PROMPT MASTER: Razonamiento, Reranking y Detección de Idioma
64
  prompt_sistema = """
65
  Eres un riguroso filólogo clásico e historiador.
66
 
67
  INSTRUCCIONES VITALES:
68
  1. IDIOMA: Detecta el idioma de la "Consulta del Usuario". Toda tu respuesta (razonamiento y exégesis) DEBE estar exclusivamente en ese idioma. Si es chino, usa obligatoriamente Chino Tradicional (繁體中文).
69
- 2. SELECCIÓN: Se te proporcionan hasta 15 [Documentos] antiguos. Evalúa atentamente cuál o cuáles son los más pertinentes para responder a la consulta (especialmente si se pide un autor concreto) y descarta el resto. Si no hay ninguno útil del autor pedido, indícalo.
70
  3. TRANSPARENCIA: Antes de dar tu respuesta final, debes escribir tu proceso lógico de selección y análisis filológico dentro de etiquetas <razonamiento> y </razonamiento>.
71
 
72
  FORMATO DE SALIDA ESPERADO:
@@ -92,7 +97,6 @@ def realizar_exegesis_web(consulta, canon_seleccionado):
92
 
93
  respuesta_completa = response.choices[0].message.content
94
 
95
- # Parseo con expresiones regulares para separar el razonamiento de la exégesis
96
  match = re.search(r'<razonamiento>(.*?)</razonamiento>', respuesta_completa, re.DOTALL | re.IGNORECASE)
97
 
98
  if match:
@@ -121,6 +125,12 @@ with gr.Blocks() as demo:
121
  value="textos_clasicos_latin_v3",
122
  label="📚 Canon / 經典"
123
  )
 
 
 
 
 
 
124
  consulta_input = gr.Textbox(
125
  label="✍️ Query / Consulta / 查詢",
126
  placeholder="Ask in English, Spanish or Traditional Chinese...",
@@ -134,9 +144,10 @@ with gr.Blocks() as demo:
134
 
135
  salida_markdown = gr.Markdown(label="Exegesis / 詮釋")
136
 
 
137
  boton_consultar.click(
138
  fn=realizar_exegesis_web,
139
- inputs=[consulta_input, canon_dropdown],
140
  outputs=[salida_markdown, salida_razonamiento]
141
  )
142
 
 
30
  }
31
 
32
  # ==========================================
33
+ # 2. LÓGICA DEL ORÁCULO Y BÚSQUEDA HÍBRIDA
34
  # ==========================================
35
+ def realizar_exegesis_web(consulta, canon_seleccionado, filtro_obra):
36
  modelo_asignado = ENRUTADOR_MODELOS[canon_seleccionado]
37
  vector_query = modelo_vectorial.encode(consulta, convert_to_tensor=False).tolist()
38
 
39
+ # Si el usuario deja el filtro vacío, lo convertimos en None para la base de datos
40
+ if not filtro_obra or filtro_obra.strip() == "":
41
+ filtro_obra = None
42
+ else:
43
+ filtro_obra = filtro_obra.strip()
44
+
45
  try:
46
+ # BÚSQUEDA HÍBRIDA: Mandamos tanto el vector matemático como el texto del filtro
47
  respuesta_db = supabase.rpc(
48
  "buscar_pasajes_clasicos",
49
  {
50
  "query_embedding": vector_query,
51
+ "match_threshold": 0.15,
52
  "match_count": 15,
53
+ "tabla_destino": canon_seleccionado,
54
+ "filtro_autor_obra": filtro_obra
55
  }
56
  ).execute()
57
 
 
60
  if not pasajes:
61
  return "❌ No database matches found. / No se hallaron testimonios. / 未找到匹配的文本。", ""
62
 
 
63
  contexto_documentos = ""
64
  for i, frag in enumerate(pasajes):
65
  obra = frag.get("obra", "Desconocida")
66
  texto = frag.get("texto_original", "")
67
  contexto_documentos += f"\n[Documento {i+1} - Obra: {obra}]\n{texto}\n"
68
 
 
69
  prompt_sistema = """
70
  Eres un riguroso filólogo clásico e historiador.
71
 
72
  INSTRUCCIONES VITALES:
73
  1. IDIOMA: Detecta el idioma de la "Consulta del Usuario". Toda tu respuesta (razonamiento y exégesis) DEBE estar exclusivamente en ese idioma. Si es chino, usa obligatoriamente Chino Tradicional (繁體中文).
74
+ 2. SELECCIÓN: Se te proporcionan varios [Documentos] antiguos. Evalúa atentamente cuál o cuáles son los más pertinentes para responder a la consulta y descarta el resto.
75
  3. TRANSPARENCIA: Antes de dar tu respuesta final, debes escribir tu proceso lógico de selección y análisis filológico dentro de etiquetas <razonamiento> y </razonamiento>.
76
 
77
  FORMATO DE SALIDA ESPERADO:
 
97
 
98
  respuesta_completa = response.choices[0].message.content
99
 
 
100
  match = re.search(r'<razonamiento>(.*?)</razonamiento>', respuesta_completa, re.DOTALL | re.IGNORECASE)
101
 
102
  if match:
 
125
  value="textos_clasicos_latin_v3",
126
  label="📚 Canon / 經典"
127
  )
128
+ # NUEVO CAMPO: Filtro opcional
129
+ filtro_input = gr.Textbox(
130
+ label="🔍 Author or Work (Optional) / Autor u Obra (Opcional) / 作者或作品(可選)",
131
+ placeholder="Ej: Salustio, Ab urbe condita, 忠經...",
132
+ lines=1
133
+ )
134
  consulta_input = gr.Textbox(
135
  label="✍️ Query / Consulta / 查詢",
136
  placeholder="Ask in English, Spanish or Traditional Chinese...",
 
144
 
145
  salida_markdown = gr.Markdown(label="Exegesis / 詮釋")
146
 
147
+ # Actualizamos el click para enviar las 3 variables (consulta, canon, y filtro)
148
  boton_consultar.click(
149
  fn=realizar_exegesis_web,
150
+ inputs=[consulta_input, canon_dropdown, filtro_input],
151
  outputs=[salida_markdown, salida_razonamiento]
152
  )
153