{"id":17984,"date":"2024-03-27T10:27:32","date_gmt":"2024-03-27T10:27:32","guid":{"rendered":"https:\/\/beta.bluetab.net\/?p=17984"},"modified":"2024-04-03T21:38:24","modified_gmt":"2024-04-03T21:38:24","slug":"potencia-tu-negocio-con-genai-y-gcp-simple-y-para-todos","status":"publish","type":"post","link":"https:\/\/www.bluetab.net\/es\/potencia-tu-negocio-con-genai-y-gcp-simple-y-para-todos\/","title":{"rendered":"Potencia Tu Negocio con GenAI y GCP: Simple y para Todos"},"content":{"rendered":"\n<div class=\"wp-block-uagb-container uagb-block-9ba6b6d9 alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-uagb-container uagb-block-848ac8a7\">\n<div class=\"wp-block-media-text\" style=\"grid-template-columns:15% auto\"><figure class=\"wp-block-media-text__media\"><img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/1698500926156.jpeg\" alt=\"\" class=\"wp-image-17985 size-full\" srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/03\/1698500926156.jpeg 800w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/03\/1698500926156-300x300.jpeg 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/03\/1698500926156-150x150.jpeg 150w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/03\/1698500926156-768x768.jpeg 768w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/03\/1698500926156-75x75.jpeg 75w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p><strong>Alfonso Zamora<br><\/strong>Cloud Engineer<\/p>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-1e307214\">\n<div class=\"wp-block-uagb-social-share uagb-social-share__outer-wrap uagb-social-share__layout-horizontal uagb-block-36ffec5a\">\n<div class=\"wp-block-uagb-social-share-child uagb-ss-repeater uagb-ss__wrapper uagb-block-687e9f5a\"><span class=\"uagb-ss__link\" data-href=\"https:\/\/twitter.com\/share?url=\" tabindex=\"0\" role=\"button\" aria-label=\"twitter\"><span class=\"uagb-ss__source-wrap\"><span class=\"uagb-ss__source-icon\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 448 512\"><path d=\"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8 .2 5.7 .2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3 .6 10.4 .8 15.8 .8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.45 65.45 0 0 1 -29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z\"><\/path><\/svg><\/span><\/span><\/span><\/div>\n\n\n\n<div class=\"wp-block-uagb-social-share-child uagb-ss-repeater uagb-ss__wrapper uagb-block-113dd1a5\"><span class=\"uagb-ss__link\" data-href=\"https:\/\/www.linkedin.com\/shareArticle?url=\" tabindex=\"0\" role=\"button\" aria-label=\"linkedin\"><span class=\"uagb-ss__source-wrap\"><span class=\"uagb-ss__source-icon\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 448 512\"><path d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z\"><\/path><\/svg><\/span><\/span><\/span><\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-73a8f54b alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-uagb-container uagb-block-dcd1baea\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"512\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-1024x512.png\" alt=\"\" class=\"wp-image-18014 lazyload\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-1024x512.png 1024w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-300x150.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-768x384.png 768w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP.png 1200w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/512;\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-27e501d57a7dbd379fe212522162a2d8\" style=\"color:#000000\"><strong>Introducci\u00f3n<\/strong><\/h3>\n\n\n\n<p>El objetivo principal de este art\u00edculo es presentar una soluci\u00f3n para el an\u00e1lisis y la ingenier\u00eda de datos desde el punto de vista del personal de negocio, sin requerir unos conocimientos t\u00e9cnicos especializados.&nbsp;<\/p>\n\n\n\n<p>Las compa\u00f1\u00edas disponen de una gran cantidad de procesos de ingenier\u00eda del dato para sacarle el mayor valor a su negocio, y en ocasiones, soluciones muy complejas para el caso de uso requerido. Desde aqu\u00ed, proponemos simplificar la operativa para que un usuario de negocio, que anteriormente no pod\u00eda llevar a cabo el desarrollo y la implementaci\u00f3n de la parte t\u00e9cnica, ahora ser\u00e1 autosuficiente, y podr\u00e1 implementar sus propias soluciones t\u00e9cnicas con lenguaje natural.<\/p>\n\n\n\n<p>Para poder cumplir nuestro objetivo, vamos a hacer uso de distintos servicios de la plataforma Google Cloud para crear tanto la infraestructura necesaria como los distintos componentes tecnol\u00f3gicos para poder sacar todo el valor a la informaci\u00f3n empresarial.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-334797f94aaf8b8be1b695c857be1517\" style=\"color:#000000\"><strong>Antes de comenzar<\/strong><\/h3>\n\n\n\n<p>Antes de comenzar con el desarrollo del art\u00edculo, vamos a explicar algunos conceptos b\u00e1sicos sobre los servicios y sobre distintos frameworks de trabajo que vamos a utilizar para la implementaci\u00f3n:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Cloud Storage<\/strong><strong>[1]<\/strong><strong>: <\/strong>Es un servicio de almacenamiento en la nube proporcionado por Google Cloud Platform (GCP) que permite a los usuarios almacenar y recuperar datos de manera segura y escalable.<\/li>\n\n\n\n<li><strong>BigQuery<\/strong><strong>[2]<\/strong><strong>: <\/strong>Es un servicio de an\u00e1lisis de datos totalmente administrado que permite realizar consultas SQL en conjuntos de datos masivos en GCP. Es especialmente eficaz para el an\u00e1lisis de datos a gran escala.<\/li>\n\n\n\n<li><strong>Terraform<\/strong><strong>[3]<\/strong><strong>: <\/strong>Es una herramienta de infraestructura como c\u00f3digo (IaC) desarrollada por HashiCorp. Permite a los usuarios describir y gestionar la infraestructura utilizando archivos de configuraci\u00f3n en el lenguaje HashiCorp Configuration Language (HCL). Con Terraform, puedes definir recursos y proveedores de manera declarativa, facilitando la creaci\u00f3n y gesti\u00f3n de infraestructuras en plataformas como AWS, Azure y Google Cloud.<\/li>\n\n\n\n<li><strong>PySpark<\/strong><strong>[4]<\/strong><strong>: <\/strong>Es una interfaz de Python para Apache Spark, un marco de procesamiento distribuido de c\u00f3digo abierto. PySpark facilita el desarrollo de aplicaciones de an\u00e1lisis de datos paralelas y distribuidas utilizando la potencia de Spark.<\/li>\n\n\n\n<li><strong>Dataproc<\/strong><strong>[5]<\/strong><strong>: <\/strong>Es un servicio de gesti\u00f3n de cl\u00fasteres para Apache Spark y Hadoop en GCP que permite ejecutar eficientemente tareas de an\u00e1lisis y procesamiento de datos a gran escala. Dataproc admite la ejecuci\u00f3n de c\u00f3digo PySpark, facilitando la realizaci\u00f3n de operaciones distribuidas en grandes conjuntos de datos en la infraestructura de Google Cloud.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-15bbfd8fe2ddec0009d96b2d12412800\" style=\"color:#000000\"><strong>Qu\u00e9 es un LLM&nbsp;<\/strong><\/h3>\n\n\n\n<p>Un LLM (Large Language Model) es un tipo de algoritmo de inteligencia artificial (IA) que utiliza t\u00e9cnicas de deep learning y enormes conjuntos de datos para comprender, resumir, generar y predecir nuevos contenidos. Un ejemplo de LLM podr\u00eda ser ChatGPT que hace uso del modelo GPT desarrollado por OpenAI.&nbsp;<\/p>\n\n\n\n<p>En nuestro caso, vamos a hacer uso del modelo Codey[6] (code-bison) que es un modelo implementado por Google que est\u00e1 optimizado para generar c\u00f3digo ya que ha sido entrenado para esta especializaci\u00f3n que se encuentra dentro del stack de VertexAI[7]<\/p>\n\n\n\n<p>Y no solo es importante el modelo que vamos a utilizar, sino tambi\u00e9n el c\u00f3mo lo vamos a utilizar. Con esto, me refiero a que es necesario comprender los par\u00e1metros de entrada que afectan directamente a las respuestas que nos dar\u00e1 nuestro modelo, en los que podemos destacar los siguientes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Temperatura (temperature)<\/strong>: Este par\u00e1metro controla la aleatoriedad en las predicciones del modelo. Una temperatura baja, como 0.1, genera resultados m\u00e1s deterministas y enfocados, mientras que una temperatura alta, como 0.8, introduce m\u00e1s variabilidad y creatividad en las respuestas del modelo.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prefix (Prompt)<\/strong>: El prompt es el texto de entrada que se proporciona al modelo para iniciar la generaci\u00f3n de texto. La elecci\u00f3n del prompt es crucial, ya que gu\u00eda al modelo sobre la tarea espec\u00edfica que se espera realizar. La formulaci\u00f3n del prompt puede influir en la calidad y relevancia de las respuestas del modelo, aunque hay que tener en cuenta la longitud para que cumpla con el&nbsp; n\u00famero m\u00e1ximo de tokens de entrada que es 6144.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tokens de salida (max_output_tokens)<\/strong>: Este par\u00e1metro limita el n\u00famero m\u00e1ximo de tokens que se generar\u00e1n en la salida. Controlar este valor es \u00fatil para evitar respuestas excesivamente largas o para ajustar la longitud de la salida seg\u00fan los requisitos espec\u00edficos de la aplicaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Recuento de candidatos (candidate_count)<\/strong>: Este par\u00e1metro controla el n\u00famero de respuestas candidatas que el modelo genera antes de seleccionar la mejor opci\u00f3n. Un valor m\u00e1s alto puede ser \u00fatil para explorar diversas respuestas potenciales, pero tambi\u00e9n aumentar\u00e1 el costo computacional.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-a3943ea99eb069c4e15950db3b74dd84\" style=\"color:#000000\"><strong>Desarrollo del prompt<\/strong><\/h3>\n\n\n\n<p>Una vez que hemos definido los par\u00e1metros y sabemos bien para qu\u00e9 sirve cada uno de ellos y comprendemos lo que es un prompt, vamos a enfocarnos en c\u00f3mo utilizarlo e implementar uno que se pueda adaptar a nuestras necesidades.<\/p>\n\n\n\n<p>Como se ha comentado anteriormente, el objetivo es generar tanto c\u00f3digo Pyspark como terraform para poder realizar las tareas de creaci\u00f3n de infraestructura y tratamiento del dato. Como son tareas totalmente distintas, como primera decisi\u00f3n importante para nuestro prompt se ha optado por dividirlo en dos partes espec\u00edficas para que cada prompt est\u00e9 entrenado con ejemplos para generar un lenguaje u otro.<\/p>\n\n\n\n<p>Para cada uno de los prompt, se hace una introducci\u00f3n para especificar cu\u00e1l va a ser el objetivo y qu\u00e9 peticiones se van a realizar, y despu\u00e9s una serie de ejemplos en los que se le da un input en lenguaje natural simulando una petici\u00f3n, y posteriormente tambi\u00e9n se le da el output deseado para asignar el texto al c\u00f3digo espec\u00edfico. El objetivo es generar un prompt estructurado que pueda ser procesado de manera eficiente por el modelo para que en los siguientes casos, pueda asociar los ejemplos que tiene disponibles con respuestas adecuadas.<\/p>\n\n\n\n<p>Vamos a poner en pr\u00e1ctica estos peque\u00f1os tips para ver una de las entradas al prompt de terraform:<\/p>\n\n\n\n<div class=\"wp-block-uagb-blockquote uagb-block-36e1fe0a uagb-blockquote__skin-border uagb-blockquote__stack-img-none\"><blockquote class=\"uagb-blockquote\"><div class=\"uagb-blockquote__content\"><br>input: I need to read a file named `myfile.csv` inside the folder `data\/input` in a bucket called `application-data-input`, and I need to create a new dataset and table in BigQuery called `tst_tf_ai`. The process has to read the file, remove the first three characters of the name, and write the result in BigQuery. The schema of the table will be \u2018name\u2019 of String type and \u2018surname\u2019 of String type. The infrastructure has to be deployed in the project `project-cloud-223` in GCP, and region `europe-southwest1`.<br>output: \u00ab`hcl<br>terraform {<br>\u00a0required_version = \u00ab>= 0.15\u00bb<br>\u00a0required_providers {<br>\u00a0\u00a0google = \u00ab~> 5.0\u00bb<br>\u00a0}<br>}<br><br>resource \u00abgoogle_storage_bucket\u00bb \u00abtemporary_files\u00bb {\u00a0<br>\u00a0project \u00a0 \u00a0 \u00a0 = \u00abproject-cloud-223\u00bb\u00a0<br>\u00a0name\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = \u00abtemporary-files-dataproc\u00bb\u00a0<br>\u00a0location\u00a0 \u00a0 \u00a0 = \u00abeurope-southwest1\u00bb\u00a0<br>\u00a0force_destroy = true\u00a0<br>}\u00a0<br><br>resource \u00abgoogle_storage_bucket\u00bb \u00abbucket1\u00bb {\u00a0<br>\u00a0project \u00a0 \u00a0 \u00a0 = \u00abproject-cloud-223\u00bb\u00a0<br>\u00a0name\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = \u00abapplication-data-input\u00bb\u00a0<br>\u00a0location\u00a0 \u00a0 \u00a0 = \u00abeurope-southwest1\u00bb\u00a0<br>\u00a0force_destroy = true\u00a0<br>}\u00a0<br><br>resource \u00abgoogle_storage_bucket_object\u00bb \u00abfolder1\u00bb {<br>\u00a0name\u00a0 \u00a0 = \u00abdata\/input\/\u00bb<br>\u00a0bucket\u00a0 = google_storage_bucket.bucket1.name<br>\u00a0content = \u00bb \u00ab<br>}<br><br>resource \u00abgoogle_bigquery_dataset\u00bb \u00abdataset\u00bb {\u00a0<br>\u00a0project \u00a0 \u00a0 \u00a0 = \u00abproject-cloud-223\u00bb\u00a0<br>\u00a0dataset_id\u00a0 \u00a0 = \u00abtst_tf_ai\u00bb\u00a0<br>\u00a0friendly_name = \u00abtst_tf_ai\u00bb\u00a0<br>\u00a0description \u00a0 = \u00abDescription\u00bb\u00a0<br>\u00a0location\u00a0 \u00a0 \u00a0 = \u00abeurope-southwest1\u00bb\u00a0<br>}\u00a0<br><br>resource \u00abgoogle_bigquery_table\u00bb \u00abtable\u00bb {\u00a0<br>\u00a0project\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = \u00abproject-cloud-223\u00bb\u00a0<br>\u00a0dataset_id \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = google_bigquery_dataset.dataset.dataset_id\u00a0<br>\u00a0deletion_protection\u00a0 = false<br>\u00a0table_id \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = \u00abtst_tf_ai\u00bb\u00a0<br>\u00a0schema \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = &lt;&lt;EOF<br>[\u00a0<br>\u00a0{\u00a0<br>\u00a0\u00a0\u00abname\u00bb: \u00abname\u00bb,\u00a0<br>\u00a0\u00a0\u00abtype\u00bb: \u00abSTRING\u00bb,\u00a0<br>\u00a0\u00a0\u00abmode\u00bb: \u00abNULLABLE\u00bb,\u00a0<br>\u00a0\u00a0\u00abdescription\u00bb: \u00abThe name\u00bb\u00a0<br>\u00a0},\u00a0<br>\u00a0{\u00a0<br>\u00a0\u00a0\u00abname\u00bb: \u00absurname\u00bb,\u00a0<br>\u00a0\u00a0\u00abtype\u00bb: \u00abSTRING\u00bb,\u00a0<br>\u00a0\u00a0\u00abmode\u00bb: \u00abNULLABLE\u00bb,\u00a0<br>\u00a0\u00a0\u00abdescription\u00bb: \u00abThe surname\u00bb\u00a0<br>\u00a0}<br>]\u00a0<br>EOF\u00a0<br>}\u00a0<br>\u00ab`<\/div><footer><div class=\"uagb-blockquote__author-wrap uagb-blockquote__author-at-left\"><cite class=\"uagb-blockquote__author\">Author Name<\/cite><\/div><\/footer><\/blockquote><\/div>\n\n\n\n<p>Es importante implementar ejemplos lo m\u00e1s parecido posible a tu caso de uso para que las respuestas sean m\u00e1s precisas, y tambi\u00e9n que tenga bastantes ejemplos con variedad de peticiones para que sea m\u00e1s inteligente a la hora de devolver las respuestas. Una de las pr\u00e1cticas para que sea m\u00e1s interactiva la implementaci\u00f3n del prompt, puede ser ir probando con distintas peticiones, y si no es capaz de hacer lo que se le ha pedido, se deber\u00eda modificar las instrucciones.<\/p>\n\n\n\n<p>Como hemos podido observar, el desarrollo del prompt s\u00ed necesitamos conocimientos t\u00e9cnicos para poder traducir las peticiones a c\u00f3digo, por lo que esta tarea s\u00ed se deber\u00eda de abordar por una persona t\u00e9cnica para posteriormente evadir a la persona de negocio. En otras palabras, necesitamos que una persona t\u00e9cnica genere la primera base de conocimiento para que luego las personas de negocio puedan hacer uso de este tipo de herramientas.<\/p>\n\n\n\n<p>Tambi\u00e9n se ha podido ver, que la generaci\u00f3n de c\u00f3digo en terraform es m\u00e1s compleja que la generaci\u00f3n en Pyspark, por lo que se han requerido de m\u00e1s ejemplos de entrada en la realizaci\u00f3n del prompt de terraform para que se ajuste a nuestro caso de uso. Por ejemplo, hemos aplicado en los ejemplos que en terraform siempre cree un bucket temporal (temporary-files-dataproc) para que pueda ser utilizado por Dataproc.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-d9e0a66b4872799da4da1ad9adebf88f\" style=\"color:#000000\"><strong>Casos pr\u00e1cticos<\/strong><\/h3>\n\n\n\n<p>Se han realizado tres ejemplos con peticiones distintas, requiriendo m\u00e1s o menos infraestructura y transformaciones para ver si nuestro prompt es lo suficientemente robusto.&nbsp;<\/p>\n\n\n\n<p>En el archivo ai_gen.py vemos el c\u00f3digo necesario para hacer las peticiones y los tres ejemplos, en el que cabe destacar la configuraci\u00f3n escogida para los par\u00e1metros del modelo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se ha decidido darle valor 1 a candidate_count para que no tenga m\u00e1s que una respuesta final v\u00e1lida para devolver. Adem\u00e1s que como se ha comentado, aumentar este n\u00famero tambi\u00e9n lleva aumento de costes.<\/li>\n\n\n\n<li>El max_output_tokens se ha decidido 2048 que es el mayor n\u00famero de tokens para este modelo, ya que si se necesita generar una respuesta con diversas transformaciones, no falle por esta limitaci\u00f3n.<\/li>\n\n\n\n<li>La temperatura se ha variado entre el c\u00f3digo terraform y Pyspark, para terraform se ha optado por 0 para que siempre d\u00e9 la respuesta que se considera m\u00e1s cercana a nuestro prompt para que no genere m\u00e1s de lo estrictamente necesario para nuestro objetivo. En cambio para Pyspark se ha optado por 0.2 que es una temperatura baja para que no sea muy creativo, pero para que tambi\u00e9n pueda darnos diversas respuestas con cada llamada para tambi\u00e9n poder hacer pruebas de rendimiento entre ellas.<\/li>\n<\/ul>\n\n\n\n<p>Vamos a realizar un ejemplo de petici\u00f3n que est\u00e1 disponible en el siguiente repositorio github, en el que est\u00e1 detallado en el README paso por paso para poder ejecutarlo t\u00fa mismo. La petici\u00f3n es la siguiente:<\/p>\n\n\n\n<div class=\"wp-block-uagb-blockquote uagb-block-a240e6e2 uagb-blockquote__skin-border uagb-blockquote__stack-img-none\"><blockquote class=\"uagb-blockquote\"><div class=\"uagb-blockquote__content\"><br><em>In the realm of &#8216;customer_table,&#8217; my objective is the seamless integration of pivotal fields such as &#8216;customer_id&#8217;, &#8216;name&#8217;, and &#8216;email&#8217;. These components promise to furnish crucial insights into the essence of our valued customer base.<\/em><br><br><em>Conversely, when delving into the nuances of &#8216;sales_table,&#8217; the envisioned tapestry includes essential elements like &#8216;order_id&#8217; &#8216;product&#8217; &#8216;price&#8217;, &#8216;amount&#8217; and &#8216;customer_id&#8217;. Theseattributes, meticulously curated, will play a pivotal role in the nuanced exploration and analysis of sales-related data.<\/em><br><br><em>The &#8216;bigtable_info&#8217; table will have all the fields resulting from the union of the two tables, &#8216;customer_table&#8217; and &#8216;sales_table.&#8217; Here, the outcome of joining the two tables by the &#8216;customer_id&#8217; numeric field will be stored.<\/em><br><br><em>Furthermore, as part of our meticulous data collection strategy, I plan to inaugurate a dedicated Google Cloud Storage bucket christened &#8216;sales-etl-bucket.&#8217; This repository is strategically designed to serve as a robust container for collating data, particularly hailing from CSV files. This endeavor is set to enhance the efficiency and organizational prowess of our data management processes.<\/em><br><br><em>To enhance the structure, two distinct subfolders, &#8216;input\/sales&#8217; and &#8216;input\/customers&#8217; have been ingeniously incorporated within the &#8216;sales-etl-bucket,&#8217; ensuring a refined organization of the incoming data streams.<\/em><br><br><em>You will need to read the CSV files within the &#8216;input\/sales&#8217; folder to write the data into the &#8216;sales_table&#8217;. Additionally, you should perform the same operation with the files from the &#8216;input\/customers&#8217; folder to write the data into the &#8216;customer_table&#8217;. Finally, you are required to perform a join between the sales and customers information based on the &#8216;customer_id&#8217; number field and write the merged information into the &#8216;bigtable_info&#8217;.<\/em><\/div><footer><div class=\"uagb-blockquote__author-wrap uagb-blockquote__author-at-left\"><cite class=\"uagb-blockquote__author\">Author Name<\/cite><\/div><\/footer><\/blockquote><\/div>\n\n\n\n<p class=\"has-text-color has-link-color wp-elements-17f61f182ced37beb87f3b6a8e85bf4d\" style=\"color:#000000\">Ejecutamos&nbsp; y vamos a analizar las salidas generadas en las carpetas generated\/customers\/python\/etl.py y generated\/terraform\/main.tf.:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">terraform {\n required_version = \">= 0.15\"\n required_providers {\n   google = \"~> 5.0\"\n }\n}\n\n\nresource \"google_storage_bucket\" \"temporary_files\" {\n project       = \"my-cloud-project\"\n name          = \"temporary-files-dataproc\"\n location      = \"europe-southwest1\"\n force_destroy = true\n}\n\n\nresource \"google_storage_bucket\" \"sales_etl_bucket\" {\n project       = \"my-cloud-project\"\n name          = \"sales-etl-bucket\"\n location      = \"europe-southwest1\"\n force_destroy = true\n}\n\n\nresource \"google_storage_bucket_object\" \"sales_folder\" {\n name    = \"input\/sales\/\"\n bucket  = google_storage_bucket.sales_etl_bucket.name\n content = \" \"\n}\n\n\nresource \"google_storage_bucket_object\" \"customers_folder\" {\n name    = \"input\/customers\/\"\n bucket  = google_storage_bucket.sales_etl_bucket.name\n content = \" \"\n}\n\n\nresource \"google_bigquery_dataset\" \"raw_sales_data\" {\n project       = \"my-cloud-project\"\n dataset_id    = \"raw_sales_data\"\n friendly_name = \"Raw Sales Data\"\n description   = \"This dataset contains the raw sales data.\"\n location      = \"europe-southwest1\"\n}\n\n\nresource \"google_bigquery_table\" \"customer_table\" {\n project              = \"my-cloud-project\"\n dataset_id           = google_bigquery_dataset.raw_sales_data.dataset_id\n deletion_protection  = false\n table_id             = \"customer_table\"\n schema               = &lt;&lt;EOF\n[\n {\n   \"name\": \"customer_id\",\n   \"type\": \"INT64\",\n   \"mode\": \"REQUIRED\",\n   \"description\": \"The customer ID.\"\n },\n {\n   \"name\": \"name\",\n   \"type\": \"STRING\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The customer's name.\"\n },\n {\n   \"name\": \"email\",\n   \"type\": \"STRING\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The customer's email address.\"\n }\n]\nEOF\n}\n\n\nresource \"google_bigquery_table\" \"sales_table\" {\n project              = \"my-cloud-project\"\n dataset_id           = google_bigquery_dataset.raw_sales_data.dataset_id\n deletion_protection  = false\n table_id             = \"sales_table\"\n schema               = &lt;&lt;EOF\n[\n {\n   \"name\": \"order_id\",\n   \"type\": \"INT64\",\n   \"mode\": \"REQUIRED\",\n   \"description\": \"The order ID.\"\n },\n {\n   \"name\": \"product\",\n   \"type\": \"STRING\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The product name.\"\n },\n {\n   \"name\": \"price\",\n   \"type\": \"FLOAT64\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The product price.\"\n },\n {\n   \"name\": \"amount\",\n   \"type\": \"INT64\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The product amount.\"\n },\n {\n   \"name\": \"customer_id\",\n   \"type\": \"INT64\",\n   \"mode\": \"REQUIRED\",\n   \"description\": \"The customer ID.\"\n }\n]\nEOF\n}\n\n\nresource \"google_bigquery_dataset\" \"master_sales_data\" {\n project       = \"my-cloud-project\"\n dataset_id    = \"master_sales_data\"\n friendly_name = \"Master Sales Data\"\n description   = \"This dataset contains the master sales data.\"\n location      = \"europe-southwest1\"\n}\n\n\nresource \"google_bigquery_table\" \"bigtable_info\" {\n project              = \"my-cloud-project\"\n dataset_id           = google_bigquery_dataset.master_sales_data.dataset_id\n deletion_protection  = false\n table_id             = \"bigtable_info\"\n schema               = &lt;&lt;EOF\n[\n {\n   \"name\": \"customer_id\",\n   \"type\": \"INT64\",\n   \"mode\": \"REQUIRED\",\n   \"description\": \"The customer ID.\"\n },\n {\n   \"name\": \"name\",\n   \"type\": \"STRING\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The customer's name.\"\n },\n {\n   \"name\": \"email\",\n   \"type\": \"STRING\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The customer's email address.\"\n },\n {\n   \"name\": \"order_id\",\n   \"type\": \"INT64\",\n   \"mode\": \"REQUIRED\",\n   \"description\": \"The order ID.\"\n },\n {\n   \"name\": \"product\",\n   \"type\": \"STRING\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The product name.\"\n },\n {\n   \"name\": \"price\",\n   \"type\": \"FLOAT64\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The product price.\"\n },\n {\n   \"name\": \"amount\",\n   \"type\": \"INT64\",\n   \"mode\": \"NULLABLE\",\n   \"description\": \"The product amount.\"\n }\n]\nEOF\n}\n\n\n<\/pre>\n\n\n\n<p>Vemos que va a a\u00f1adir un bucket con dos carpetas para poder subir los datos a la carpeta correspondiente dependiendo si es sales o customer. Tambi\u00e9n ha creado dos datasets, uno para la capa de raw para tener los datos seg\u00fan nos han venido de origen con las tablas de customers y sales, y el segundo dataset para la tabla final que almacenar\u00e1 el resultado de juntar la informaci\u00f3n de ambas tablas.<\/p>\n\n\n\n<p>Vamos a revisar el c\u00f3digo pyspark:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from pyspark.sql import SparkSession\nfrom pyspark.sql import functions as F\n\n\n# Configure Spark session\nspark = SparkSession.builder.appName(\"SalesETL\").getOrCreate()\n\n\n# Define file paths\nsales_path = \"gs:\/\/sales-etl-bucket\/input\/sales\/*.csv\"\ncustomers_path = \"gs:\/\/sales-etl-bucket\/input\/customers\/*.csv\"\n\n\n# Read CSV files into DataFrames\nsales_df = spark.read.csv(sales_path, header=True, inferSchema=True)\ncustomers_df = spark.read.csv(customers_path, header=True, inferSchema=True)\n\n\n# Write tables to BigQuery\nsales_df.write.format(\"bigquery\") \\\n   .option(\"temporaryGcsBucket\", \"temporary-files-dataproc\") \\\n   .option(\"table\",  \"raw_sales_data.sales_table\") \\\n   .mode(\"overwrite\") \\\n   .save()\ncustomers_df.write.format(\"bigquery\") \\\n   .option(\"temporaryGcsBucket\", \"temporary-files-dataproc\") \\\n   .option(\"table\",  \"raw_sales_data.customer_table\") \\\n   .mode(\"overwrite\") \\\n   .save()\n\n\n# Join sales and customers tables\nbigtable_info_df = sales_df.join(customers_df, on=\"customer_id\", how=\"inner\")\n\n\n# Write joined table to BigQuery\nbigtable_info_df.write.format(\"bigquery\") \\\n   .option(\"temporaryGcsBucket\", \"temporary-files-dataproc\") \\\n   .option(\"table\",  \"master_sales_data.bigtable_info\") \\\n   .mode(\"overwrite\") \\\n   .save()\n\n\n# Stop the Spark session\nspark.stop()\n<\/pre>\n\n\n\n<p>Se puede observar que el c\u00f3digo generado realiza la lectura por cada una de las carpetas e inserta cada dato en su tabla correspondiente.&nbsp;<\/p>\n\n\n\n<p>Para poder asegurarnos de que el ejemplo est\u00e1 bien realizado, podemos seguir los pasos del README en el repositorio GitHub<strong>[8]<\/strong> para aplicar los cambios en el c\u00f3digo terraform, subir los ficheros de ejemplo que tenemos en la carpeta example_data y a ejecutar un Batch en Dataproc.&nbsp;<\/p>\n\n\n\n<p>Finalmente, vemos si la informaci\u00f3n que se ha almacenado en BigQuery es correcta:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tabla customer:<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"656\" height=\"183\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/04\/image2.png\" alt=\"\" class=\"wp-image-18005 lazyload\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image2.png 656w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image2-300x84.png 300w\" data-sizes=\"(max-width: 656px) 100vw, 656px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 656px; --smush-placeholder-aspect-ratio: 656\/183;\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tabla sales:<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"579\" height=\"183\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/04\/image1.png\" alt=\"\" class=\"wp-image-18007 lazyload\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image1.png 579w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image1-300x95.png 300w\" data-sizes=\"(max-width: 579px) 100vw, 579px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 579px; --smush-placeholder-aspect-ratio: 579\/183;\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tabla final:<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1081\" height=\"183\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/04\/image3.png\" alt=\"\" class=\"wp-image-18009 lazyload\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image3.png 1081w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image3-300x51.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image3-1024x173.png 1024w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/image3-768x130.png 768w\" data-sizes=\"(max-width: 1081px) 100vw, 1081px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1081px; --smush-placeholder-aspect-ratio: 1081\/183;\" \/><\/figure>\n\n\n\n<p>De esta forma, hemos conseguido de a trav\u00e9s de lenguaje natural, tener un proceso funcional totalmente operativo. Hay otro ejemplo que se puede ejecutar, aunque tambi\u00e9n animo a hacer m\u00e1s ejemplos, o incluso mejorar el prompt, para poder meterle ejemplos m\u00e1s complejos, y tambi\u00e9n adaptarlo a tu caso de uso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-1ed1197e79578e856a121883104832b3\" style=\"color:#000000\"><strong>Conclusiones y Recomendaciones<\/strong><\/h2>\n\n\n\n<p>Al ser ejemplos muy concretos sobre unas tecnolog\u00edas tan concretas, cuando se hace un cambio en el prompt en cualquier ejemplo puede afectar a los resultados, o tambi\u00e9n, modificar alguna palabra de la petici\u00f3n de entrada. Esto se traduce en que el prompt no es lo suficientemente robusto como para poder asimilar distintas expresiones sin afectar al c\u00f3digo generado. Para poder tener un prompt y un sistema productivo, se necesita m\u00e1s entrenamiento y distinta variedad tanto de soluciones, peticiones, expresiones,. \u2026 Con todo ello, finalmente podremos tener una primera versi\u00f3n que poder presentar a nuestro usuario de negocio para que sea aut\u00f3nomo.<\/p>\n\n\n\n<p>Especificar el m\u00e1ximo detalle posible a un LLM es crucial para obtener resultados precisos y contextuales. Aqu\u00ed hay varios consejos que debemos tener en cuenta para poder tener un resultado adecuado:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Claridad y Concisi\u00f3n:<\/strong>\n<ul class=\"wp-block-list\">\n<li>S\u00e9 claro y conciso en tu prompt, evitando oraciones largas y complicadas.<\/li>\n\n\n\n<li>Define claramente el problema o la tarea que deseas que el modelo aborde.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Especificidad:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Proporciona detalles espec\u00edficos sobre lo que est\u00e1s buscando. Cuanto m\u00e1s preciso seas, mejores resultados obtendr\u00e1s.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Variabilidad y Diversidad:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Considera incluir diferentes tipos de ejemplos o casos para evaluar la capacidad del modelo para manejar la variabilidad.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Feedback Iterativo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Si es posible, realiza iteraciones en tu prompt bas\u00e1ndote en los resultados obtenidos y el feedback del modelo.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Prueba y Ajuste:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Antes de usar el prompt de manera extensa, realiza pruebas con ejemplos y ajusta seg\u00fan sea necesario para obtener resultados deseados.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-31447f39435768e09924252ef9d334e1\" style=\"color:#000000\"><strong>Perspectivas Futuras<\/strong><\/h2>\n\n\n\n<p>En el \u00e1mbito de LLM, las l\u00edneas futuras de desarrollo se centran en mejorar la eficiencia y la accesibilidad de la implementaci\u00f3n de modelos de lenguaje. Aqu\u00ed se detallan algunas mejoras clave que podr\u00edan potenciar significativamente la experiencia del usuario y la eficacia del sistema:<\/p>\n\n\n\n<p><strong>1. Uso de distintos modelos de LLM:<\/strong><\/p>\n\n\n\n<p>La inclusi\u00f3n de una funci\u00f3n que permita a los usuarios comparar los resultados generados por diferentes modelos ser\u00eda esencial. Esta caracter\u00edstica proporcionar\u00eda a los usuarios informaci\u00f3n valiosa sobre el rendimiento relativo de los modelos disponibles, ayud\u00e1ndoles a seleccionar el modelo m\u00e1s adecuado para sus necesidades espec\u00edficas en t\u00e9rminos de precisi\u00f3n, velocidad y recursos requeridos.<\/p>\n\n\n\n<p><strong>2. Capacidad de retroalimentaci\u00f3n del usuario:<\/strong><\/p>\n\n\n\n<p>Implementar un sistema de retroalimentaci\u00f3n que permita a los usuarios calificar y proporcionar comentarios sobre las respuestas generadas podr\u00eda ser \u00fatil para mejorar continuamente la calidad del modelo. Esta informaci\u00f3n podr\u00eda utilizarse para ajustar y refinar el modelo a lo largo del tiempo, adapt\u00e1ndose a las preferencias y necesidades cambiantes de los usuarios.<\/p>\n\n\n\n<p><strong>3. RAG (<\/strong><strong>Retrieval-augmented generation<\/strong>)<\/p>\n\n\n\n<p>RAG (Retrieval-augmented generation) es un enfoque que combina la generaci\u00f3n de texto y la recuperaci\u00f3n de informaci\u00f3n para mejorar las respuestas de los modelos de lenguaje. Implica el uso de mecanismos de recuperaci\u00f3n para obtener informaci\u00f3n relevante de una base de datos o corpus textual, que luego se integra en el proceso de generaci\u00f3n de texto para mejorar la calidad y la coherencia de las respuestas generadas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-e67ba4d1b9590d004bec9244e2c54aa0\" style=\"color:#000000\"><strong>Enlaces de inter\u00e9s<\/strong><\/h2>\n\n\n\n<p><strong>Cloud Storage[1]:<\/strong> <a href=\"https:\/\/cloud.google.com\/storage\/docs\">https:\/\/cloud.google.com\/storage\/docs<\/a><\/p>\n\n\n\n<p><strong>BigQuery[2]:<\/strong> <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\">https:\/\/cloud.google.com\/bigquery\/docs<\/a><\/p>\n\n\n\n<p><strong>Terraform[3]:<\/strong> <a href=\"https:\/\/developer.hashicorp.com\/terraform\/docs\">https:\/\/developer.hashicorp.com\/terraform\/docs<\/a><\/p>\n\n\n\n<p><strong>PySpark[4]:<\/strong> <a href=\"https:\/\/spark.apache.org\/docs\/latest\/api\/python\/index.html\">https:\/\/spark.apache.org\/docs\/latest\/api\/python\/index.html<\/a><\/p>\n\n\n\n<p><strong>Dataproc<\/strong><strong>[5]<\/strong><strong>:<\/strong> <a href=\"https:\/\/cloud.google.com\/dataproc\/docs\">https:\/\/cloud.google.com\/dataproc\/docs<\/a><\/p>\n\n\n\n<p><strong>Codey[6]:<\/strong> <a href=\"https:\/\/cloud.google.com\/vertex-ai\/generative-ai\/docs\/model-reference\/code-generation\">https:\/\/cloud.google.com\/vertex-ai\/generative-ai\/docs\/model-reference\/code-generation<\/a><\/p>\n\n\n\n<p><strong>VertexAI<\/strong><strong>[7]<\/strong>: <a href=\"https:\/\/cloud.google.com\/vertex-ai\/docs\">https:\/\/cloud.google.com\/vertex-ai\/docs<\/a><\/p>\n\n\n\n<p><strong>GitHub[8]<\/strong>: <a href=\"https:\/\/github.com\/alfonsozamorac\/etl-genai\">https:\/\/github.com\/alfonsozamorac\/etl-genai<\/a><\/p>\n<\/div>\n\n\n\n<div class=\"uagb-position__sticky wp-block-uagb-container uagb-block-c13246b6\">\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-493dadc9      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"71\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tTabla de contenidos\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#introducci\u00f3n\" class=\"uagb-toc-link__trigger\">Introducci\u00f3n<\/a><li class=\"uagb-toc__list\"><a href=\"#antes-de-comenzar\" class=\"uagb-toc-link__trigger\">Antes de comenzar<\/a><li class=\"uagb-toc__list\"><a href=\"#qu\u00e9-es-un-llm\" class=\"uagb-toc-link__trigger\">Qu\u00e9 es un LLM\u00a0<\/a><li class=\"uagb-toc__list\"><a href=\"#desarrollo-del-prompt\" class=\"uagb-toc-link__trigger\">Desarrollo del prompt<\/a><li class=\"uagb-toc__list\"><a href=\"#casos-pr\u00e1cticos\" class=\"uagb-toc-link__trigger\">Casos pr\u00e1cticos<\/a><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Alfonso ZamoraCloud Engineer Introducci\u00f3n El objetivo principal de este art\u00edculo es presentar una soluci\u00f3n para el an\u00e1lisis y la ingenier\u00eda de datos desde el punto de vista del personal de negocio, sin requerir unos conocimientos t\u00e9cnicos especializados.&nbsp; Las compa\u00f1\u00edas disponen de una gran cantidad de procesos de ingenier\u00eda del dato para sacarle el mayor valor [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":18014,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_theme","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[21,667,631],"tags":[],"class_list":{"0":"post-17984","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-blog-es","8":"category-practices","9":"category-tech","10":"entry"},"uagb_featured_image_src":{"full":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP.png",1200,600,false],"thumbnail":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-150x150.png",150,150,true],"medium":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-300x150.png",300,150,true],"medium_large":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-768x384.png",768,384,true],"large":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-1024x512.png",1024,512,true],"1536x1536":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP.png",1200,600,false],"2048x2048":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP.png",1200,600,false],"sidebar-featured":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-75x75.png",75,75,true],"genesis-singular-images":["https:\/\/www.bluetab.net\/wp-content\/uploads\/2024\/04\/ai-GCP-702x526.png",702,526,true]},"uagb_author_info":{"display_name":"Bluetab","author_link":"https:\/\/www.bluetab.net\/es\/author\/user\/"},"uagb_comment_info":0,"uagb_excerpt":"Alfonso ZamoraCloud Engineer Introducci\u00f3n El objetivo principal de este art\u00edculo es presentar una soluci\u00f3n para el an\u00e1lisis y la ingenier\u00eda de datos desde el punto de vista del personal de negocio, sin requerir unos conocimientos t\u00e9cnicos especializados.&nbsp; Las compa\u00f1\u00edas disponen de una gran cantidad de procesos de ingenier\u00eda del dato para sacarle el mayor valor&hellip;","_links":{"self":[{"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/posts\/17984","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/comments?post=17984"}],"version-history":[{"count":15,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/posts\/17984\/revisions"}],"predecessor-version":[{"id":18018,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/posts\/17984\/revisions\/18018"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/media\/18014"}],"wp:attachment":[{"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/media?parent=17984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/categories?post=17984"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bluetab.net\/es\/wp-json\/wp\/v2\/tags?post=17984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}