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