Spaces:
Runtime error
Runtime error
| import os | |
| import glob | |
| import json | |
| import tempfile | |
| from langchain_core.documents import Document | |
| def crear_prompt_resumen_parcial(tipo, red, serie, fecha, bloque): | |
| """ | |
| Genera el prompt según el tipo de resumen y el contenido del bloque. | |
| """ | |
| base_prompt = f"Red: {red}\nSerie: {serie}\nFecha: {fecha}\n" | |
| instrucciones = { | |
| "resumen_diario_temas": """ | |
| A partir del siguiente conjunto de posteos de usuarios en redes sociales, identifica los temas principales que se discuten. Redacta un resumen temático claro, bien estructurado y más extenso, explicando cada tema identificado con suficiente detalle. | |
| Incluye ejemplos representativos de posteos o comentarios (pueden ser frases textuales o reformuladas) que ilustren claramente cada tema. Si no hay ejemplos relevantes para algún tema, evita inventarlos. | |
| ⚠️ Cíñete estrictamente al contenido proporcionado. No agregues información externa ni realices inferencias fuera de lo observado en los textos. | |
| Organiza el resumen con subtítulos para cada tema, utilizando un lenguaje claro y evitando repeticiones innecesarias. | |
| """, | |
| "resumen_diario_preocupaciones": """ | |
| Analiza el siguiente conjunto de posteos de usuarios en redes sociales y redacta un resumen enfocado en las principales preocupaciones expresadas. Describe cada preocupación de manera clara, explicando a qué aspectos sociales, políticos, económicos o cotidianos se refiere. | |
| Incluye ejemplos concretos de comentarios o frases representativas que evidencien las preocupaciones mencionadas, resaltando el tono o la gravedad expresada por los usuarios. | |
| ⚠️ No infieras preocupaciones que no estén reflejadas en los textos. Cíñete únicamente a lo que se menciona explícitamente. | |
| Organiza el resumen con subtítulos por tipo de preocupación y evita repeticiones. | |
| """, | |
| "resumen_diario_atributos_emociones": """ | |
| A partir del conjunto de posteos proporcionado, identifica los principales atributos políticos discutidos (como honestidad, corrupción, eficacia, liderazgo) y las emociones más relevantes expresadas (como esperanza, enojo, miedo, entusiasmo). | |
| Redacta un resumen detallado, diferenciando claramente los atributos políticos de las emociones. Para cada atributo o emoción, incluye ejemplos representativos de comentarios o frases textuales que muestren cómo los usuarios lo expresan. | |
| ⚠️ No agregues interpretaciones externas ni inventes atributos o emociones que no estén presentes en el texto. | |
| Utiliza subtítulos diferenciados para “Atributos Políticos” y “Emociones Expresadas”, evitando redundancias y priorizando claridad. | |
| """, | |
| "resumen_diario_hashtags_menciones": """ | |
| Analiza el siguiente conjunto de posteos y elabora un resumen interpretativo sobre los hashtags y menciones a usuarios más destacados. | |
| Lista los hashtags más mencionados junto con una breve interpretación de su uso, y menciona los usuarios o cuentas más citadas, aclarando en qué contexto se los menciona. Incluye ejemplos concretos de posteos que utilicen los hashtags o mencionen a los usuarios destacados. | |
| ⚠️ No inventes hashtags o menciones, ni infieras contextos que no estén reflejados en el texto. Ceñite estrictamente a lo observable. | |
| Organiza el resumen con subtítulos diferenciados para “Hashtags Principales” y “Usuarios Mencionados”, y redactá de manera clara y estructurada. | |
| """ | |
| } | |
| return base_prompt + instrucciones[tipo] + "\n\n" + bloque | |
| def crear_prompt_resumen_global(tipo, res_parciales, red, serie, fecha): | |
| """ | |
| Usa los parciales para crear un resumen final consolidado, extenso y completo. | |
| """ | |
| base_prompt = f"Red: {red}\nSerie: {serie}\nFecha: {fecha}\n\n" | |
| instrucciones = { | |
| "resumen_diario_temas": ( | |
| "Tu tarea es unificar los siguientes resúmenes temáticos parciales en un resumen global EXTENSO, " | |
| "mantené la información completa, sin eliminar detalles. Ampliá la redacción para que el resumen sea largo, " | |
| "profundo y descriptivo, evitando repeticiones textuales pero conservando todos los conceptos y ejemplos relevantes. " | |
| "Si es necesario, podés desarrollar ejemplos o contextualizar algunos temas para darle mayor riqueza al texto." | |
| ), | |
| "resumen_diario_preocupaciones": ( | |
| "Unificá los siguientes resúmenes de preocupaciones en una síntesis extensa, descriptiva y comprensiva. " | |
| "No reduzcas el nivel de detalle; mantené la totalidad de los puntos y expandí el contenido explicando mejor " | |
| "las preocupaciones cuando sea posible. El objetivo es que el texto sea largo, claro y con profundidad." | |
| ), | |
| "resumen_diario_atributos_emociones": ( | |
| "Sintetizá los siguientes resúmenes de atributos y emociones en un texto global extenso. No omitas ninguna mención " | |
| "y procurá desarrollar los conceptos con más ejemplos y descripciones. El resumen debe ser largo y cubrir " | |
| "todos los aspectos emocionales y atributos observados, aclarando matices cuando sea posible." | |
| ), | |
| "resumen_diario_hashtags_menciones": ( | |
| "Unificá los siguientes resúmenes de hashtags y menciones en una interpretación global extensa, completa y bien explicada. " | |
| "Ampliá las explicaciones de los hashtags y mencioná todos los ejemplos. Mantené la riqueza informativa y procurá " | |
| "extender las descripciones para lograr un resumen largo y detallado." | |
| ) | |
| } | |
| texto_parciales = "\n\n---\n\n".join(res_parciales) | |
| return base_prompt + instrucciones[tipo] + "\n\n" + texto_parciales | |
| def cargar_documentos_resumenes(session_id): | |
| base_dir = os.path.join(tempfile.gettempdir(), f"knowledge-base-resumenes-{session_id}") | |
| if not os.path.exists(base_dir): | |
| return None, ( | |
| "⚠️ No se encontró una base de conocimiento para esta sesión.\n\n" | |
| "👉 Para comenzar, dirigite a la pestaña **Redes Sociales**, elige un cliente, red y series, " | |
| "establece un rango de fechas y haz clic en **Consultar y Descargar Eventos**.\n" | |
| "Luego, vuelve a esta pestaña y genera la base de conocimientos con el botón **Crear y Descargar Knowledge Base**. " | |
| "Una vez hecho esto, podrás continuar haciendo clic en el botón **Inicializar el chat**." | |
| ) | |
| paths = glob.glob(os.path.join(base_dir, "*", "*", "*.json")) | |
| documentos = [] | |
| for path in paths: | |
| try: | |
| with open(path, "r", encoding="utf-8") as f: | |
| data = json.load(f) | |
| contenido = data.get("resumen", "") | |
| except Exception as e: | |
| contenido = f"⚠️ Error al leer resumen: {e}" | |
| red = os.path.basename(os.path.dirname(os.path.dirname(path))) | |
| serie = os.path.basename(os.path.dirname(path)) | |
| archivo = os.path.basename(path) | |
| fecha = archivo.split("_")[0] | |
| tipo = "_".join(archivo.replace(".json", "").split("_")[1:]) | |
| doc = Document( | |
| page_content=contenido, | |
| metadata={ | |
| "red": red.upper(), | |
| "serie": serie.replace("_", " ").title(), | |
| "fecha": fecha, | |
| "tipo": tipo | |
| } | |
| ) | |
| documentos.append(doc) | |
| # print(f"Primer documento ejemplo: {documentos[0]}...") | |
| return documentos, None | |