| 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')) |
|
|