Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -30,21 +30,28 @@ ENRUTADOR_MODELOS = {
|
|
| 30 |
}
|
| 31 |
|
| 32 |
# ==========================================
|
| 33 |
-
# 2. LÓGICA DEL ORÁCULO Y
|
| 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 |
-
#
|
| 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
|
| 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 |
|