angelsg213 commited on
Commit
6e58e9b
·
verified ·
1 Parent(s): 66f3039

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +122 -151
app.py CHANGED
@@ -660,149 +660,135 @@ with gr.Blocks(title="Extractor de Facturas con IA Avanzada") as demo:
660
  with gr.Tab("Más información"):
661
  resumen_tecnico = gr.Markdown(label="Estructura de datos y metadatos")
662
 
663
- # ============= TAB 2: VISUAL QUESTION ANSWERING =============
664
- with gr.Tab("🔍 Visual Question Answering"):
665
  gr.Markdown("""
666
- ### 🤖 Pregúntale a la IA sobre la imagen de tu factura
667
- Los modelos VQA analizan visualmente el documento y responden preguntas específicas.
668
  """)
669
 
670
  with gr.Row():
671
- with gr.Column():
672
- pdf_vqa_input = gr.File(label="PDF para VQA (o usa el ya cargado)", file_types=[".pdf"], type="filepath")
673
- pregunta_vqa = gr.Textbox(
674
  label="Tu pregunta sobre la factura",
675
- placeholder="¿Cuál es el total de la factura?",
676
- value="¿Qué información importante contiene esta factura?"
 
677
  )
678
- btn_vqa = gr.Button("🔍 Analizar con VQA", variant="primary")
 
 
 
 
 
 
 
 
 
 
 
679
 
680
- with gr.Column():
681
- resultado_vqa = gr.Markdown(label="Respuestas de modelos VQA")
 
682
 
 
683
  gr.Markdown("""
684
  **Modelos utilizados:**
685
- - `dandelin/vilt-b32-finetuned-vqa` - Vision-and-Language Transformer
686
- - `Salesforce/blip-vqa-base` - BLIP VQA Base
687
- - `Salesforce/blip2-opt-2.7b` - BLIP-2 con OPT-2.7B
688
- """)
689
-
690
- # ============= TAB 3: DOCUMENT QUESTION ANSWERING =============
691
- with gr.Tab("📝 Document Question Answering"):
692
- gr.Markdown("""
693
- ### 💬 Pregunta sobre el contenido del texto
694
- Los modelos Document QA extraen información específica del texto de la factura.
695
- """)
696
 
697
- with gr.Row():
698
- with gr.Column():
699
- pregunta_doc_qa = gr.Textbox(
700
- label="Pregunta sobre el documento",
701
- placeholder="¿Cuál es el NIF del emisor?",
702
- value="¿Cuál es el total de la factura?"
703
- )
704
- btn_doc_qa = gr.Button("📝 Analizar con Document QA", variant="primary")
705
-
706
- with gr.Column():
707
- resultado_doc_qa = gr.Markdown(label="Respuestas de modelos Document QA")
708
-
709
- gr.Markdown("""
710
- **Modelos utilizados:**
711
- - `deepset/roberta-base-squad2` - RoBERTa entrenado en SQuAD 2.0
712
- - `distilbert-base-cased-distilled-squad` - DistilBERT optimizado
713
- - `bert-large-uncased-whole-word-masking-finetuned-squad` - BERT Large
714
  """)
715
 
716
- # ============= TAB 4: LAYOUT DOCUMENT QA =============
717
- with gr.Tab("📐 Layout Document QA"):
718
  gr.Markdown("""
719
- ### 🏗️ Análisis con comprensión del layout visual
720
- Los modelos LayoutLM entienden la estructura visual del documento (tablas, columnas, etc.)
721
  """)
722
 
723
  with gr.Row():
724
- with gr.Column():
725
- pregunta_layout = gr.Textbox(
726
- label="Pregunta sobre el documento",
727
- placeholder="¿Cuál es el número de factura?",
728
- value="¿Cuál es el número de factura?"
 
729
  )
730
- btn_layout_qa = gr.Button("📐 Analizar con Layout QA", variant="primary")
 
 
 
 
 
 
 
 
 
 
731
 
732
- with gr.Column():
733
- resultado_layout = gr.Markdown(label="Respuestas de modelos Layout QA")
 
734
 
 
735
  gr.Markdown("""
736
- **Modelos utilizados:**
737
- - `impira/layoutlm-document-qa` - LayoutLM para Document QA
738
- - `microsoft/layoutlmv2-base-uncased` - LayoutLM v2 Base
739
- - `nielsr/layoutlmv3-finetuned-funsd` - LayoutLM v3 Fine-tuned
740
- """)
741
-
742
- # ============= TAB 5: VISUAL DOCUMENT UNDERSTANDING =============
743
- with gr.Tab("🖼️ Visual Document Understanding"):
744
- gr.Markdown("""
745
- ### 🎯 Comprensión visual completa del documento
746
- Modelos multimodales que procesan la imagen del documento directamente.
747
- """)
748
 
749
- with gr.Row():
750
- with gr.Column():
751
- btn_visual_doc = gr.Button("🖼️ Analizar Documento Visualmente", variant="primary", size="lg")
752
-
753
- with gr.Column():
754
- resultado_visual_doc = gr.Markdown(label="Resultados de análisis visual")
755
- status_visual_doc = gr.Textbox(label="Estado", interactive=False)
756
-
757
- gr.Markdown("""
758
- **Modelos utilizados:**
759
- - `microsoft/trocr-large-printed` - TrOCR para texto impreso
760
- - `Salesforce/blip-image-captioning-large` - BLIP Image Captioning
761
- - `nlpconnect/vit-gpt2-image-captioning` - ViT + GPT2 Captioning
762
  """)
763
 
764
- # ============= TAB 6: DOCUMENT RETRIEVAL =============
765
- with gr.Tab("🔎 Document Retrieval"):
766
  gr.Markdown("""
767
- ### 🎯 Búsqueda semántica en el documento
768
- Encuentra fragmentos relevantes usando embeddings y similitud semántica.
769
  """)
770
 
771
  with gr.Row():
772
- with gr.Column():
773
- consulta_retrieval = gr.Textbox(
774
- label="¿Qué información buscas?",
775
- placeholder="información sobre el emisor",
776
- value="información sobre el emisor"
 
777
  )
778
- btn_retrieval = gr.Button("🔎 Buscar en Documento", variant="primary")
 
 
 
 
 
 
 
 
 
 
779
 
780
- with gr.Column():
781
- resultado_retrieval = gr.Markdown(label="Fragmentos relevantes encontrados")
782
 
783
  gr.Markdown("""
784
- **Modelos utilizados:**
785
- - `sentence-transformers/all-MiniLM-L6-v2` - Embeddings multilingües
786
- - `sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2` - Paraphrase ML
 
787
  """)
788
 
789
  gr.Markdown("---")
790
  gr.Markdown("""
791
- ### 📚 Información sobre los modelos
792
-
793
- **Visual Question Answering (VQA):** Responde preguntas sobre imágenes usando visión y lenguaje.
794
-
795
- **Document QA:** Extrae información específica del texto usando modelos de comprensión lectora.
796
-
797
- **Layout Document QA:** Entiende la estructura visual (tablas, columnas) además del texto.
798
-
799
- **Visual Document Understanding:** Procesa documentos como imágenes para OCR y comprensión completa.
800
-
801
- **Document Retrieval:** Búsqueda semántica de información relevante en el documento.
802
 
803
- ---
 
 
 
804
 
805
- 💡 **Tip:** Procesa primero la factura en la pestaña "Extracción Automática" y luego explora las demás funcionalidades de IA.
806
  """)
807
 
808
  # ============= CONECTAR EVENTOS =============
@@ -822,65 +808,50 @@ with gr.Blocks(title="Extractor de Facturas con IA Avanzada") as demo:
822
  outputs=[pdf_output, pdf_status]
823
  )
824
 
825
- # Visual Question Answering
826
- def ejecutar_vqa(pdf_vqa, pdf_auto, pregunta):
827
- pdf_path = pdf_vqa if pdf_vqa else pdf_auto
828
- if not pdf_path:
829
- return "❌ Por favor, sube un PDF primero"
830
- return analizar_con_vqa(pdf_path, pregunta)
831
-
832
- btn_vqa.click(
833
- fn=ejecutar_vqa,
834
- inputs=[pdf_vqa_input, pdf_path_state, pregunta_vqa],
835
- outputs=[resultado_vqa]
836
- )
837
-
838
- # Document Question Answering
839
- def ejecutar_doc_qa(texto, pregunta):
840
  if not texto:
841
  return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'"
842
  return analizar_con_document_qa(texto, pregunta)
843
 
844
- btn_doc_qa.click(
845
- fn=ejecutar_doc_qa,
846
- inputs=[texto_extraido, pregunta_doc_qa],
847
- outputs=[resultado_doc_qa]
848
  )
849
 
850
- # Layout Document QA
851
- def ejecutar_layout_qa(pdf_path, texto, pregunta):
852
- if not pdf_path or not texto:
853
  return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'"
854
- return analizar_con_layout_qa(pdf_path, texto, pregunta)
855
 
856
- btn_layout_qa.click(
857
- fn=ejecutar_layout_qa,
858
- inputs=[pdf_path_state, texto_extraido, pregunta_layout],
859
- outputs=[resultado_layout]
860
  )
861
 
862
- # Visual Document Understanding
863
- def ejecutar_visual_doc(pdf_path):
864
  if not pdf_path:
865
- return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'", ""
866
- return analizar_documento_visual_hf(pdf_path)
867
-
868
- btn_visual_doc.click(
869
- fn=ejecutar_visual_doc,
870
- inputs=[pdf_path_state],
871
- outputs=[resultado_visual_doc, status_visual_doc]
872
- )
873
-
874
- # Document Retrieval
875
- def ejecutar_retrieval(texto, consulta):
876
- if not texto:
877
  return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'"
878
- return buscar_en_documento(texto, consulta)
 
 
 
 
 
 
 
 
 
 
879
 
880
- btn_retrieval.click(
881
- fn=ejecutar_retrieval,
882
- inputs=[texto_extraido, consulta_retrieval],
883
- outputs=[resultado_retrieval]
884
  )
885
 
886
  if __name__ == "__main__":
 
660
  with gr.Tab("Más información"):
661
  resumen_tecnico = gr.Markdown(label="Estructura de datos y metadatos")
662
 
663
+ # ============= TAB 2: CONSULTAS INTELIGENTES (TODO EN UNO) =============
664
+ with gr.Tab("🤖 Consultas con IA"):
665
  gr.Markdown("""
666
+ ### 💬 Pregunta lo que necesites sobre tu factura
667
+ Los modelos de IA responden preguntas específicas sobre el contenido de la factura.
668
  """)
669
 
670
  with gr.Row():
671
+ with gr.Column(scale=1):
672
+ pregunta_ia = gr.Textbox(
 
673
  label="Tu pregunta sobre la factura",
674
+ placeholder="Ejemplos: ¿Cuál es el total? ¿Quién es el emisor? ¿Cuál es el NIF?",
675
+ value="¿Cuál es el total de la factura?",
676
+ lines=3
677
  )
678
+
679
+ gr.Markdown("#### Ejemplos de preguntas:")
680
+ gr.Markdown("""
681
+ - ¿Cuál es el total de la factura?
682
+ - ¿Cuál es el número de factura?
683
+ - ¿Quién es el emisor?
684
+ - ¿Cuál es el NIF del emisor?
685
+ - ¿Cuántos productos hay?
686
+ - ¿Cuál es la fecha de emisión?
687
+ """)
688
+
689
+ btn_consulta_ia = gr.Button("🔍 Consultar", variant="primary", size="lg")
690
 
691
+ with gr.Column(scale=2):
692
+ gr.Markdown("### 📝 Respuestas de los modelos")
693
+ resultado_consulta = gr.Markdown(label="Respuestas")
694
 
695
+ gr.Markdown("---")
696
  gr.Markdown("""
697
  **Modelos utilizados:**
698
+ - `deepset/roberta-base-squad2` - RoBERTa especializado en QA
699
+ - `deepset/bert-base-cased-squad2` - BERT optimizado para preguntas
700
+ - `distilbert-base-cased-distilled-squad` - DistilBERT eficiente
 
 
 
 
 
 
 
 
701
 
702
+ Estos modelos están entrenados para extraer respuestas precisas del texto.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
703
  """)
704
 
705
+ # ============= TAB 3: BÚSQUEDA SEMÁNTICA =============
706
+ with gr.Tab("🔎 Búsqueda Inteligente"):
707
  gr.Markdown("""
708
+ ### 🎯 Encuentra información relevante en tu factura
709
+ Búsqueda semántica que entiende el significado de tu consulta.
710
  """)
711
 
712
  with gr.Row():
713
+ with gr.Column(scale=1):
714
+ consulta_busqueda = gr.Textbox(
715
+ label="¿Qué información buscas?",
716
+ placeholder="Ejemplos: información del emisor, detalles de productos, información de pago",
717
+ value="información sobre el emisor",
718
+ lines=3
719
  )
720
+
721
+ gr.Markdown("#### Ejemplos de búsquedas:")
722
+ gr.Markdown("""
723
+ - Información sobre el emisor
724
+ - Detalles de productos o servicios
725
+ - Información de pago
726
+ - Datos del cliente
727
+ - Fechas importantes
728
+ """)
729
+
730
+ btn_busqueda = gr.Button("🔎 Buscar", variant="primary", size="lg")
731
 
732
+ with gr.Column(scale=2):
733
+ gr.Markdown("### 📋 Fragmentos relevantes encontrados")
734
+ resultado_busqueda = gr.Markdown(label="Resultados")
735
 
736
+ gr.Markdown("---")
737
  gr.Markdown("""
738
+ **Modelos de embeddings utilizados:**
739
+ - `sentence-transformers/all-MiniLM-L6-v2` - Embeddings rápidos y precisos
740
+ - `sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2` - Soporte multilingüe
 
 
 
 
 
 
 
 
 
741
 
742
+ La búsqueda semántica encuentra información relevante aunque uses palabras diferentes.
 
 
 
 
 
 
 
 
 
 
 
 
743
  """)
744
 
745
+ # ============= TAB 4: ANÁLISIS VISUAL (OPCIONAL) =============
746
+ with gr.Tab("🖼️ Análisis Visual (Beta)"):
747
  gr.Markdown("""
748
+ ### 📸 Análisis visual del documento
749
+ **Nota:** Esta funcionalidad requiere dependencias adicionales (poppler-utils o PyMuPDF).
750
  """)
751
 
752
  with gr.Row():
753
+ with gr.Column(scale=1):
754
+ pregunta_visual = gr.Textbox(
755
+ label="Pregunta sobre la imagen",
756
+ placeholder="¿Qué información contiene la factura?",
757
+ value="¿Qué información importante contiene esta factura?",
758
+ lines=3
759
  )
760
+
761
+ btn_visual = gr.Button("🖼️ Analizar Visualmente", variant="primary", size="lg")
762
+
763
+ gr.Markdown("---")
764
+ gr.Markdown("""
765
+ ⚠️ **Requisitos:**
766
+ - Poppler-utils instalado en el sistema
767
+ - O PyMuPDF (fitz) como alternativa
768
+
769
+ Si no funciona, usa las otras pestañas que trabajan con el texto.
770
+ """)
771
 
772
+ with gr.Column(scale=2):
773
+ resultado_visual = gr.Markdown(label="Análisis visual")
774
 
775
  gr.Markdown("""
776
+ **Modelos de visión utilizados:**
777
+ - `dandelin/vilt-b32-finetuned-vqa` - Vision-and-Language Transformer
778
+ - `Salesforce/blip-vqa-base` - BLIP para Visual QA
779
+ - `microsoft/trocr-large-printed` - OCR avanzado
780
  """)
781
 
782
  gr.Markdown("---")
783
  gr.Markdown("""
784
+ ### 📚 Guía rápida
 
 
 
 
 
 
 
 
 
 
785
 
786
+ 1. **Extracción Automática:** Sube tu PDF y extrae todos los datos automáticamente
787
+ 2. **Consultas con IA:** Haz preguntas específicas sobre la factura
788
+ 3. **Búsqueda Inteligente:** Encuentra información relevante por tema
789
+ 4. **Análisis Visual:** (Opcional) Analiza la imagen del documento
790
 
791
+ 💡 **Tip:** Empieza por la pestaña "Extracción Automática" para procesar tu factura.
792
  """)
793
 
794
  # ============= CONECTAR EVENTOS =============
 
808
  outputs=[pdf_output, pdf_status]
809
  )
810
 
811
+ # Consultas con IA (unificado Document QA)
812
+ def ejecutar_consulta_ia(texto, pregunta):
 
 
 
 
 
 
 
 
 
 
 
 
 
813
  if not texto:
814
  return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'"
815
  return analizar_con_document_qa(texto, pregunta)
816
 
817
+ btn_consulta_ia.click(
818
+ fn=ejecutar_consulta_ia,
819
+ inputs=[texto_extraido, pregunta_ia],
820
+ outputs=[resultado_consulta]
821
  )
822
 
823
+ # Búsqueda semántica
824
+ def ejecutar_busqueda_semantica(texto, consulta):
825
+ if not texto:
826
  return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'"
827
+ return buscar_en_documento(texto, consulta)
828
 
829
+ btn_busqueda.click(
830
+ fn=ejecutar_busqueda_semantica,
831
+ inputs=[texto_extraido, consulta_busqueda],
832
+ outputs=[resultado_busqueda]
833
  )
834
 
835
+ # Análisis visual (combinado VQA + Visual Document Understanding)
836
+ def ejecutar_analisis_visual(pdf_path, pregunta):
837
  if not pdf_path:
 
 
 
 
 
 
 
 
 
 
 
 
838
  return "❌ Por favor, procesa una factura primero en la pestaña 'Extracción Automática'"
839
+
840
+ # Intentar VQA primero
841
+ resultado_vqa = analizar_con_vqa(pdf_path, pregunta)
842
+
843
+ # Si VQA no funciona, intentar Visual Document Understanding
844
+ if "No se pudo convertir" in resultado_vqa or "Error" in resultado_vqa:
845
+ resultado_visual, status = analizar_documento_visual_hf(pdf_path)
846
+ if resultado_visual:
847
+ return f"{resultado_vqa}\n\n---\n\n### Análisis Visual Alternativo:\n\n{resultado_visual}"
848
+
849
+ return resultado_vqa
850
 
851
+ btn_visual.click(
852
+ fn=ejecutar_analisis_visual,
853
+ inputs=[pdf_path_state, pregunta_visual],
854
+ outputs=[resultado_visual]
855
  )
856
 
857
  if __name__ == "__main__":