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