| import spaces |
| import gradio as gr |
| import fitz |
| import os |
|
|
| from langchain_text_splitters import RecursiveCharacterTextSplitter |
| from langchain_huggingface import HuggingFaceEmbeddings |
| from langchain_community.vectorstores import FAISS |
| from groq import Groq |
|
|
| |
| embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") |
|
|
|
|
| |
| def load_and_index_pdf(pdf_file): |
| if pdf_file is None: |
| return "Por favor, sube un archivo PDF." |
|
|
| |
| |
| doc = fitz.open(pdf_file) |
| text = "" |
| for page in doc: |
| text += page.get_text() |
|
|
| |
| text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) |
| chunks = text_splitter.split_text(text) |
|
|
| |
| vectorstore = FAISS.from_texts(chunks, embeddings) |
|
|
| return vectorstore |
|
|
|
|
| |
| |
| |
| |
| @spaces.GPU |
| def _zerogpu_startup_check(): |
| return True |
|
|
|
|
| |
| def respond(vectorstore, user_query): |
| if not user_query: |
| return "Hazme una pregunta sobre el documento." |
|
|
| |
| docs = vectorstore.similarity_search(user_query, k=2) |
|
|
| |
| context = "\n\n".join([d.page_content for d in docs]) |
|
|
| prompt = f""" |
| Basado en el siguiente contexto, responde a la pregunta. |
| Si la respuesta no est谩 en el contexto, di "No tengo esa informaci贸n en el documento". |
| |
| Contexto: {context} |
| Pregunta: {user_query} |
| Respuesta: |
| """ |
|
|
| groq_client = Groq(api_key=os.environ.get("GROQ_API_KEY")) |
| completion = groq_client.chat.completions.create( |
| messages=[{"role": "user", "content": prompt}], |
| model="llama-3.3-70b-versatile", |
| temperature=0.7, |
| ) |
| return completion.choices[0].message.content |
|
|
|
|
| |
| def main(): |
| |
| vectorstore_state = None |
|
|
| def process_upload(pdf_file): |
| nonlocal vectorstore_state |
| if pdf_file: |
| vectorstore_state = load_and_index_pdf(pdf_file) |
| return "Documento procesado con 茅xito. 隆Pregunta lo que quieras!", gr.update(interactive=True) |
| return "Sube un PDF primero.", gr.update(interactive=False) |
|
|
| def process_query(query): |
| if vectorstore_state is None: |
| return "Por favor, sube un PDF primero." |
| return respond(vectorstore_state, query) |
|
|
| with gr.Blocks(title="RAG Demo - Dow Jones Style") as demo: |
| gr.Markdown("# 馃摎 Chat con tus Documentos (RAG + FAISS)") |
| gr.Markdown("Sube un PDF y pregunta sobre su contenido. 隆Sin alucinaciones!") |
|
|
| with gr.Row(): |
| with gr.Column(): |
| pdf_input = gr.File(label="Sube tu PDF aqu铆", file_types=[".pdf"]) |
| upload_btn = gr.Button("Procesar Documento", variant="primary") |
| status_msg = gr.Textbox(label="Estado", interactive=False) |
|
|
| with gr.Column(): |
| query_input = gr.Textbox(label="Tu pregunta", placeholder="驴De qu茅 trata este documento?") |
| submit_btn = gr.Button("Enviar Pregunta", interactive=False) |
| output_msg = gr.Textbox(label="Respuesta de la IA") |
|
|
| |
| upload_btn.click( |
| fn=process_upload, |
| inputs=pdf_input, |
| outputs=[status_msg, submit_btn], |
| ) |
|
|
| submit_btn.click( |
| fn=process_query, |
| inputs=query_input, |
| outputs=output_msg, |
| ) |
|
|
| demo.launch() |
|
|
|
|
| if __name__ == "__main__": |
| main() |