|
|
import gradio as gr |
|
|
import json |
|
|
from llama_cpp import Llama |
|
|
import spacy |
|
|
|
|
|
class ProcesadorAutodiagnostico: |
|
|
def __init__(self): |
|
|
|
|
|
self.llm = Llama( |
|
|
model_path="./models/llama-2-7b-chat.gguf", |
|
|
n_ctx=2048, |
|
|
n_threads=4 |
|
|
) |
|
|
self.nlp = spacy.load("es_core_news_sm") |
|
|
|
|
|
def generar_prompt(self, texto: str) -> str: |
|
|
return f"""Analiza el siguiente texto y extrae informaci贸n estructurada para un autodiagn贸stico. |
|
|
El texto describe un reto o proyecto relacionado con tecnolog铆as cognitivas. |
|
|
|
|
|
Texto: {texto} |
|
|
|
|
|
Genera un JSON con la siguiente estructura, manteniendo solo la informaci贸n relevante encontrada en el texto: |
|
|
{{ |
|
|
"datos_generales": {{ |
|
|
"sector": "", |
|
|
"ubicacion": "" |
|
|
}}, |
|
|
"reto": {{ |
|
|
"descripcion": "", |
|
|
"contexto": "", |
|
|
"alcance": "" |
|
|
}}, |
|
|
"conocimientos_cogtech": {{ |
|
|
"terminos_desconocidos": [], |
|
|
"conceptos_dudosos": [], |
|
|
"areas_desconfianza": [] |
|
|
}}, |
|
|
"dominio_actual": {{ |
|
|
"aspectos_dominados": [], |
|
|
"experiencia_previa": [], |
|
|
"recursos_disponibles": [] |
|
|
}}, |
|
|
"entrampes": {{ |
|
|
"tecnicos": [], |
|
|
"implementacion": [], |
|
|
"organizacionales": [] |
|
|
}}, |
|
|
"objetivos": {{ |
|
|
"corto_plazo": [], |
|
|
"esperados_microtaller": [] |
|
|
}} |
|
|
}} |
|
|
|
|
|
Aseg煤rate de: |
|
|
1. Identificar t茅rminos t茅cnicos que generan dudas |
|
|
2. Detectar preocupaciones y 谩reas de desconfianza |
|
|
3. Identificar objetivos expl铆citos e impl铆citos |
|
|
4. Clasificar correctamente los entrampes |
|
|
5. Mantener el contexto del sector y ubicaci贸n |
|
|
|
|
|
JSON:""" |
|
|
|
|
|
def procesar_texto(self, texto: str) -> dict: |
|
|
|
|
|
prompt = self.generar_prompt(texto) |
|
|
|
|
|
|
|
|
response = self.llm( |
|
|
prompt, |
|
|
max_tokens=2048, |
|
|
temperature=0.1, |
|
|
top_p=0.9, |
|
|
stop=["```"] |
|
|
) |
|
|
|
|
|
try: |
|
|
|
|
|
resultado = json.loads(response['choices'][0]['text']) |
|
|
|
|
|
|
|
|
doc = self.nlp(texto) |
|
|
|
|
|
|
|
|
return resultado |
|
|
except json.JSONDecodeError: |
|
|
|
|
|
return { |
|
|
"error": "No se pudo procesar el texto correctamente", |
|
|
"texto_original": texto |
|
|
} |
|
|
|
|
|
def procesar_con_gradio(texto_input: str) -> str: |
|
|
"""Wrapper function for Gradio interface""" |
|
|
procesador = ProcesadorAutodiagnostico() |
|
|
try: |
|
|
resultado = procesador.procesar_texto(texto_input) |
|
|
return json.dumps(resultado, indent=2, ensure_ascii=False) |
|
|
except Exception as e: |
|
|
return json.dumps({ |
|
|
"error": f"Error en el procesamiento: {str(e)}", |
|
|
"texto_original": texto_input |
|
|
}, indent=2, ensure_ascii=False) |
|
|
|
|
|
|
|
|
with gr.Blocks() as app: |
|
|
gr.Markdown("# Autodiagn贸stico CogTech") |
|
|
gr.Markdown(""" |
|
|
## Instrucciones |
|
|
Describe tu situaci贸n considerando: |
|
|
- Tu reto o necesidad principal |
|
|
- Qu茅 conoces y qu茅 dudas tienes sobre tecnolog铆as cognitivas |
|
|
- Qu茅 obst谩culos o dificultades enfrentas |
|
|
- Qu茅 esperas lograr |
|
|
""") |
|
|
|
|
|
with gr.Row(): |
|
|
texto_input = gr.Textbox( |
|
|
label="Tu descripci贸n", |
|
|
placeholder="Describe tu situaci贸n...", |
|
|
lines=10 |
|
|
) |
|
|
json_output = gr.JSON(label="Autodiagn贸stico Estructurado") |
|
|
|
|
|
analizar_btn = gr.Button("Generar Autodiagn贸stico") |
|
|
analizar_btn.click( |
|
|
fn=procesar_con_gradio, |
|
|
inputs=texto_input, |
|
|
outputs=json_output |
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
app.launch(share=True) |
|
|
|