AlbertDuvan commited on
Commit
32802b5
·
verified ·
1 Parent(s): 83f1eb5

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +97 -14
  2. requirements.txt +4 -1
app.py CHANGED
@@ -1,24 +1,107 @@
1
- from transformers import pipeline
 
2
  import gradio as gr
 
 
 
 
3
 
4
- # Cargar un modelo de lenguaje médico de Hugging Face
5
- modelo_medico = pipeline("text-generation", model="microsoft/BioGPT-Large")
6
 
7
- # Función para hacer preguntas al bot
8
- def pregunta_medica(pregunta):
9
- respuesta = modelo_medico(
10
- f"Eres un experto médico con vasto conocimiento en fisiología, bioquímica, farmacología y otras áreas médicas. Responde de manera sarcástica y directa, como el Dr. House. Pregunta: {pregunta}",
11
- max_length=150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  )
13
- return respuesta[0]['generated_text']
 
14
 
15
  # Crear la interfaz web con Gradio
 
 
 
 
 
 
16
  interfaz = gr.Interface(
17
- fn=pregunta_medica,
18
- inputs="text",
19
- outputs="text",
20
- title="Dr. House Bot",
21
- description="Pregúntale al Dr. House sobre medicina."
 
22
  )
23
 
24
  # Lanzar la interfaz
 
1
+ from transformers import AutoModelForCausalLM, AutoTokenizer
2
+ import torch
3
  import gradio as gr
4
+ from Bio import Entrez
5
+ import requests
6
+ from functools import lru_cache
7
+ import logging
8
 
9
+ # Configurar logging
10
+ logging.basicConfig(level=logging.INFO)
11
 
12
+ # Cargar un modelo de lenguaje médico optimizado (usando quantización)
13
+ model_name = "microsoft/BioGPT"
14
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
15
+ model = AutoModelForCausalLM.from_pretrained(model_name, load_in_8bit=True, device_map="auto")
16
+
17
+ # Configurar PubMed
18
+ Entrez.email = "[email protected]" # Proporciona un correo válido
19
+
20
+ # Función para buscar en PubMed con caché
21
+ @lru_cache(maxsize=100)
22
+ def buscar_en_pubmed(pregunta):
23
+ try:
24
+ handle = Entrez.esearch(db="pubmed", term=pregunta, retmax=1) # Buscar solo 1 artículo
25
+ record = Entrez.read(handle)
26
+ handle.close()
27
+
28
+ if record["IdList"]:
29
+ referencias = []
30
+ for id_articulo in record["IdList"]:
31
+ handle = Entrez.efetch(db="pubmed", id=id_articulo, rettype="abstract", retmode="text")
32
+ resumen = handle.read()
33
+ referencias.append(f"Artículo {id_articulo}:\n{resumen[:300]}...\n") # Limitar a 300 caracteres
34
+ handle.close()
35
+ return "\n".join(referencias)
36
+ else:
37
+ return "No encontré artículos relevantes en PubMed."
38
+ except Exception as e:
39
+ logging.error(f"Error al buscar en PubMed: {e}")
40
+ return f"Error al buscar en PubMed: {e}"
41
+
42
+ # Función para buscar en Internet con tiempo de espera
43
+ def buscar_en_internet(pregunta):
44
+ try:
45
+ url = f"https://api.duckduckgo.com/?q={pregunta}&format=json"
46
+ respuesta = requests.get(url, timeout=5) # Tiempo de espera de 5 segundos
47
+ datos = respuesta.json()
48
+
49
+ if "Abstract" in datos and datos["Abstract"]:
50
+ return datos["Abstract"][:200] # Limitar a 200 caracteres
51
+ else:
52
+ return "No encontré información en Internet."
53
+ except Exception as e:
54
+ logging.error(f"Error al buscar en Internet: {e}")
55
+ return f"Error al buscar en Internet: {e}"
56
+
57
+ # Función para generar respuestas del modelo
58
+ def generar_respuesta(pregunta):
59
+ inputs = tokenizer(
60
+ f"Eres un profesor médico con vasto conocimiento en fisiología, bioquímica, farmacología y otras áreas médicas. "
61
+ f"Explica de manera clara, sencilla y didáctica. Utiliza términos médicos y explícalos dentro de tus respuestas. "
62
+ f"Si no estás seguro de algo, di 'No tengo suficiente información para responder a eso'. Pregunta: {pregunta}",
63
+ return_tensors="pt"
64
+ ).to("cuda")
65
+
66
+ outputs = model.generate(**inputs, max_length=150) # Reducir max_length para mayor velocidad
67
+ return tokenizer.decode(outputs[0], skip_special_tokens=True)
68
+
69
+ # Función principal para hacer preguntas al bot
70
+ def pregunta_medica_con_carga(pregunta):
71
+ yield "Procesando tu pregunta..." # Mensaje de carga
72
+
73
+ # Respuesta del modelo médico
74
+ respuesta_modelo = generar_respuesta(pregunta)
75
+
76
+ # Buscar en PubMed
77
+ referencias_pubmed = buscar_en_pubmed(pregunta)
78
+
79
+ # Buscar en Internet
80
+ respuesta_internet = buscar_en_internet(pregunta)
81
+
82
+ # Combinar respuestas
83
+ respuesta_final = (
84
+ f"Respuesta del Profesor Médico:\n{respuesta_modelo}\n\n"
85
+ f"Referencias de PubMed:\n{referencias_pubmed}\n\n"
86
+ f"Información de Internet:\n{respuesta_internet}"
87
  )
88
+
89
+ yield respuesta_final
90
 
91
  # Crear la interfaz web con Gradio
92
+ css = """
93
+ .gradio-container {
94
+ background-color: #f0f8ff;
95
+ }
96
+ """
97
+
98
  interfaz = gr.Interface(
99
+ fn=pregunta_medica_con_carga,
100
+ inputs=gr.Textbox(label="Pregunta"),
101
+ outputs=gr.Textbox(label="Respuesta"),
102
+ title="Profesor Médico Bot",
103
+ description="Pregúntale al Profesor Médico sobre medicina. Te explicará de manera clara y didáctica.",
104
+ css=css
105
  )
106
 
107
  # Lanzar la interfaz
requirements.txt CHANGED
@@ -3,4 +3,7 @@ transformers
3
  gradio
4
  requests
5
  biopython
6
- sacremoses
 
 
 
 
3
  gradio
4
  requests
5
  biopython
6
+ sacremoses
7
+ bitsandbytes
8
+ sentencepiece
9
+ accelerate