File size: 5,707 Bytes
6ed25d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d859fbb
6ed25d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import ollama
import time
import  streamlit as st 
import fitz  
from docx import Document
from io import BytesIO
from fpdf import FPDF

def get_response_from_mistral(query, context):
    prompt_text = f"""
    "Tú eres un asistente para tareas de respuesta a preguntas. "
    "Usa los siguientes fragmentos de contexto recuperado para responder la pregunta. "
    "Si el contexto está vacío o no contiene información relevante, responde: 'Disculpa, no tengo información para responder esa pregunta'. "
    "Si el contexto es válido, responde la pregunta usando un mínimo de 2 oraciones y un máximo de 4, manteniendo la respuesta clara y concisa. "
    "No inventes ni asumas nada que no esté explícitamente en el contexto."
    "\n\n"

    Usa solo este contexto:
    {context}
    **IMPORTANTE***
    "Ojo siempre que tu contexto es vacio, tu respuesta debe ser : Disculpa, no tengo información para responder esa pregunta"
    **
    Y Responde esta pregunta:
    {query}
    """

    respuesta = ollama.chat(
        model="mistral",
        messages=[
            {"role": "system", "content": "Eres un asistente especializado en análisis de datos."},
            {"role": "user", "content": prompt_text}
        ]
    )

    respuesta_texto = respuesta["message"]["content"] 
    
    for word in respuesta_texto.split():  
        yield word + " "
        time.sleep(0.05)

def generarPages():
    with st.sidebar:
        st.page_link("./src/chatbox_v1.py", label="Inicio", icon="🏠")
        st.page_link("./pages/resumen_word.py", label="Informe de PDF y Word", icon="📄")
        st.page_link("./pages/insertardocumentos.py", label="Documentos a vector", icon="🛢️")

def informes_mistral(context):
    prompt_text = f"""
        **Atención**: No generes una historia o narrativa, tu tarea es realizar un análisis detallado y preciso del documento legal. No se requiere creatividad, solo precisión.
        Eres un asistente experto en procesamiento y análisis de documentos. Tu tarea es leer y comprender el contenido proporcionado y generar un informe extenso, detallado y bien estructurado. 
        El informe debe incluir las siguientes secciones:

        1. **Resumen General**: Proporciona un resumen completo y detallado de todo el contenido del documento. Incluye los aspectos más relevantes, pero sin dejar de lado detalles importantes.
        
        2. **Puntos Clave**: Enumera los puntos más importantes del documento, resaltando las ideas principales y los aspectos críticos que se abordan.

        3. **Análisis Crítico**: Realiza un análisis en profundidad sobre el contenido del documento. Comenta sobre su calidad, lógica, coherencia, posibles fallos, aspectos positivos, y cualquier otro elemento que pueda ser relevante. 

        4. **Recomendaciones**: Proporciona sugerencias o recomendaciones para mejorar el contenido. Si el documento se trata de un informe técnico, análisis de datos, o investigación, incluye sugerencias de cómo se podría mejorar la interpretación de los datos, el análisis o la presentación.

        5. **Conclusiones**: Finaliza con una sección de conclusiones que recapitule los puntos clave del análisis y del documento en general, además de una visión global de las implicaciones del contenido.

        6: **En caso de**: En caso de que el contenido sea acerca de un decreto legislativo o algo acera de una ley incluye un seccion donde hables lo mas importante de todos los articulos y menciones cuales son los mas relevantes.

        7: **Documentos Analizados**: Menciona el nombre de todos los documentos que componen el contenido analizado. Si hay más de uno, asegúrate de listarlos todos y dejar claro que el análisis se basa en todos ellos en conjunto.

        Siempre deberás comenzar el informe con los nombres de los archivos que componen el contenido.
        Recuerda que siempre debes mantener la estructura que te mande

        Contenido del documento:
        {context}

        Utiliza un estilo claro y profesional en todo momento, y asegúrate de que cada sección esté claramente diferenciada. Tu informe debe ser extenso y abarcativo, no debe ser corto ni vago.
        recuerda siempre reponder en español
    """
    respuesta = ollama.chat(
        model="mistral",
        messages=[
            {"role": "system", "content": "Eres un asistente especializado en análisis detallado de documentos."},
            {"role": "user", "content": prompt_text}
        ]
    )

    respuesta_texto = respuesta["message"]["content"] 
    
    for word in respuesta_texto.split():  
        yield word + " "
        time.sleep(0.05)

def extraer_texto(archivo):
    if archivo.name.endswith(".pdf"):
        texto = ""
        with fitz.open(stream=archivo.read(), filetype="pdf") as doc:
            for page in doc:
                texto += page.get_text()
        return texto
    elif archivo.name.endswith(".txt"):
        return archivo.read().decode("utf-8")
    else:
        return ""

def extraer_texto_word(file):
    texto = ""
    doc = Document(file)
    for para in doc.paragraphs:
        texto += para.text + "\n"
    return texto

def generar_docx(texto):
    doc = Document()
    doc.add_heading("Resumen generado por IA", 0)
    for parrafo in texto.split("\n"):
        doc.add_paragraph(parrafo)
    buffer = BytesIO()
    doc.save(buffer)
    buffer.seek(0)
    return buffer

def generar_pdf(texto):
    pdf = FPDF()
    pdf.add_page()
    pdf.set_auto_page_break(auto=True, margin=15)
    pdf.set_font("Arial", size=12)
    for linea in texto.split("\n"):
        pdf.multi_cell(0, 10, linea)
    return bytes(pdf.output(dest='S').encode('latin-1'))