{"id":17868,"date":"2024-03-11T12:23:44","date_gmt":"2024-03-11T12:23:44","guid":{"rendered":"https:\/\/beta.bluetab.net\/?p=17868"},"modified":"2024-03-27T10:19:50","modified_gmt":"2024-03-27T10:19:50","slug":"usando-los-grandes-modelos-de-lenguaje-en-informacion-privada","status":"publish","type":"post","link":"https:\/\/bluetab.com\/es\/usando-los-grandes-modelos-de-lenguaje-en-informacion-privada\/","title":{"rendered":"Usando los Grandes Modelos de Lenguaje en informaci\u00f3n privada"},"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\/1621491062588.jpeg\" alt=\"\" class=\"wp-image-17929 size-full\" srcset=\"https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/1621491062588.jpeg 800w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/1621491062588-300x300.jpeg 300w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/1621491062588-150x150.jpeg 150w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/1621491062588-768x768.jpeg 768w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/1621491062588-75x75.jpeg 75w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p><strong>Roger Pou Lopez<br><\/strong>Data Scientist<\/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\/03\/chatgpt-1024x512.png\" alt=\"\" class=\"wp-image-17966 lazyload\" data-srcset=\"https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-1024x512.png 1024w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-300x150.png 300w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-768x384.png 768w, https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt.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<p class=\"has-text-color has-link-color wp-elements-1b87356bd0861afdd03544bdef67d7c3\" style=\"color:#010101\">Un RAG, acr\u00f3nimo de&nbsp;<strong>\u00abRetrieval Augmented Generation\u00bb<\/strong>, representa una estrategia innovadora dentro del procesamiento de lenguaje natural. Se integra con los&nbsp;<strong>Grandes Modelos de Lenguaje<\/strong>&nbsp;(LLM, por sus siglas en ingl\u00e9s), tales como los que usa ChatGPT internamente (GPT-3.5-turbo o GPT-4), con el objetivo de mejorar la calidad de la respuesta y reducir ciertos comportamientos no deseados, como las alucinaciones.<\/p>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-26216638 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen1-1024x563.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen1.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen1.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen1-1024x563.png\" alt=\"\" class=\"uag-image-17869 lazyload\" width=\"1802\" height=\"991\" title=\"Imagen1\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1802px; --smush-placeholder-aspect-ratio: 1802\/991;\" \/><figcaption class=\"uagb-image-caption\">https:\/\/www.superannotate.com\/blog\/rag-explained<\/figcaption><\/figure><\/div>\n\n\n\n<p>Estos sistemas combinan los&nbsp;<strong>conceptos de vectorizaci\u00f3n<\/strong> y&nbsp;<strong>b\u00fasqueda sem\u00e1ntica<\/strong>, junto con los LLMs para retroalimentar su conocimiento con informaci\u00f3n externa que no se incluy\u00f3 durante su fase de entrenamiento y que, por lo tanto, desconocen.<\/p>\n\n\n\n<p>Existen ciertos puntos a favor de utilizar RAGs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Permiten reducir el nivel de&nbsp;<em>alucinaciones<\/em>&nbsp;que presentan los modelos. A menudo, los LLM responden con informaci\u00f3n incorrecta (o inventada), aunque sem\u00e1nticamente su respuesta tenga sentido. A esto se le denomina&nbsp;<em>alucinaci\u00f3n<\/em>. Uno de los objetivos principales del RAG es intentar reducir al m\u00e1ximo este tipo de situaciones, especialmente cuando se pregunta por cosas concretas. Esto es de alta utilidad si se quiere utilizar un LLM de forma productiva.<\/li>\n\n\n\n<li>Utilizando un RAG,&nbsp;<strong>ya no es necesario reentrenar el LLM<\/strong>. Este proceso puede llegar a ser costoso econ\u00f3micamente, dado que necesitar\u00eda GPUs para su entrenamiento, adem\u00e1s de la complejidad que puede conllevar ese entrenamiento.<\/li>\n\n\n\n<li>Son sistemas econ\u00f3micos, r\u00e1pidos (utilizan informaci\u00f3n indexada) y adem\u00e1s, no dependen del modelo que se est\u00e1 utilizando (en cualquier momento podemos cambiarlo por de GPT-3.5 a Llama-2-70B).<\/li>\n<\/ul>\n\n\n\n<p>En contra:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se va a necesitar ayuda de c\u00f3digo, matem\u00e1ticas y no va a ser tan sencillo como lanzar un simple prompt modificado.<\/li>\n\n\n\n<li>En la evaluaci\u00f3n de los RAGs (veremos m\u00e1s adelante en el art\u00edculo) vamos a necesitar modelos potentes como GPT-4.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-4183c854f27772dc61e032fabcb3fa0d\" style=\"color:#000000\"><strong>Ejemplo de caso de uso<\/strong><\/h4>\n\n\n\n<p>Existen varios ejemplos donde los RAGs est\u00e1n siendo utilizados. El ejemplo m\u00e1s t\u00edpico es su uso con chatbots para consultar informaci\u00f3n muy espec\u00edfica del negocio.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En <em>call-centers<\/em>, los agentes est\u00e1n empezando a utilizar un chatbot con informaci\u00f3n sobre tarifas para poder responder de forma r\u00e1pida y eficaz a las llamadas que reciben.<\/li>\n\n\n\n<li>En <em>chatbots<\/em>, como asistentes de venta donde est\u00e1n ganando popularidad. Aqu\u00ed, los RAGs ayudan a responder a comparativas entre productos o cuando se consulta de manera espec\u00edfica sobre un servicio, haciendo recomendaciones de productos similares.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-3b8d5560559f931a826c239e94ef17ba\" style=\"color:#000000\"><strong>Componentes de un RAG<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-cb4016b0 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen3-1024x611.jpg ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen3.jpg 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen3.jpg 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen3-1024x611.jpg\" alt=\"\" class=\"uag-image-17873 lazyload\" width=\"1299\" height=\"775\" title=\"Imagen3\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1299px; --smush-placeholder-aspect-ratio: 1299\/775;\" \/><figcaption class=\"uagb-image-caption\">https:\/\/zilliz.com\/learn\/Retrieval-Augmented-Generation<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"has-text-color has-link-color wp-elements-13f76f1633a30ebd2cd72f923c88d880\" style=\"color:#000000\">Vamos a hablar en detalle sobre los distintos componentes que conforman un RAG para poder tener una idea aproximada, y luego vamos a hablar de c\u00f3mo interaccionan entre s\u00ed estos elementos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-5655d385f9baa56d4b8d0cfa5beeb552\" style=\"color:#000000\"><strong>Base de conocimiento<\/strong><\/h4>\n\n\n\n<p>Este elemento es un concepto un poco abierto pero tambi\u00e9n l\u00f3gico: se refiere al conocimiento objetivo del cual sabemos que el LLM no es consciente y que tiene un alto riesgo de alucinaci\u00f3n. Este conocimiento, en formato de texto, puede estar en muchos formatos: PDF, Excel, Word, etc&#8230; Los RAGs avanzados son capaces tambi\u00e9n de detectar conocimientos en im\u00e1genes y tablas.<\/p>\n\n\n\n<p>En general, todo contenido va a ser en formato de texto y&nbsp;<strong>va a necesitar ser indexado<\/strong>. Como los textos humanos son muchas veces desestructurados, se recurre a la subdivisi\u00f3n de los textos con estrategias llamadas chunking.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-09bc302fcc9032e38e09892b13396456\" style=\"color:#000000\"><strong>Modelo de Embeddings<\/strong><\/h4>\n\n\n\n<p>Un embedding es la representaci\u00f3n vectorial generada por una red neuronal entrenada sobre un cuerpo de datos (texto, im\u00e1genes, sonido, etc.) que es capaz de resumir la informaci\u00f3n de un objeto de ese mismo tipo hacia un vector dentro de un espacio vectorial concreto.<\/p>\n\n\n\n<p>Por ejemplo, en el caso de un texto que se refiere a \u201cMe gustan los patitos de goma azules\u201d y otro que dice \u201cAdoro los patitos de goma amarillos\u201d, al ser convertidos en vectores, estos estar\u00e1n m\u00e1s pr\u00f3ximos en distancia entre s\u00ed que un texto que se refiere a \u201cLos autom\u00f3viles del futuro son los coches el\u00e9ctricos\u201d.<\/p>\n\n\n\n<p>Este componente es el que, posteriormente, nos permitir\u00e1 indexar de forma correcta los distintos chunks de informaci\u00f3n de texto.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-3a3be8dc96d7d344d93e1fdc011b7893\" style=\"color:#000000\"><strong>Base de datos vectorial<\/strong><\/h4>\n\n\n\n<p>Es el lugar donde vamos a guardar y indexar la informaci\u00f3n vectorial de los chunks mediante los embeddings. Se trata de un componente muy importante y complejo donde, afortunadamente, ya existen varias soluciones open source muy v\u00e1lidas para poder desplegarlo de forma \u00abf\u00e1cil\u00bb, como <a href=\"https:\/\/milvus.io\/\" data-type=\"link\" data-id=\"https:\/\/milvus.io\/\">Milvus<\/a> o <a href=\"https:\/\/www.trychroma.com\/\" data-type=\"link\" data-id=\"https:\/\/www.trychroma.com\/\">Chroma<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-34e602c88c40f575b4bce7bbc8ccd2c9\" style=\"color:#000000\"><strong>LLM<\/strong><\/h4>\n\n\n\n<p>Es l\u00f3gico, puesto que el RAG es una soluci\u00f3n que nos permite ayudar a responder de forma m\u00e1s veraz a estos LLMs. No tenemos por qu\u00e9 restringirnos a modelos muy grandes y eficientes (pero no econ\u00f3micos como GPT-4), sino que pueden ser modelos m\u00e1s peque\u00f1os y m\u00e1s \u00absencillos\u00bb en cuanto a la calidad de respuestas y n\u00famero de par\u00e1metros.<\/p>\n\n\n\n<p>A continuaci\u00f3n podemos ver una imagen representativa del proceso de carga de informaci\u00f3n en la base de datos vectoriales.<\/p>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-16a8f9c3 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/imagen4-1024x516.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/imagen4.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/imagen4.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/imagen4-1024x516.png\" alt=\"\" class=\"uag-image-17875 lazyload\" width=\"1140\" height=\"574\" title=\"imagen4\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1140px; --smush-placeholder-aspect-ratio: 1140\/574;\" \/><figcaption class=\"uagb-image-caption\">https:\/\/python.langchain.com\/docs\/use_cases\/question_answering\/<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-b392dac67cc11cf3c57c6fd143e66ac5\" style=\"color:#000000\"><strong>Funcionamiento a Alto Nivel<\/strong><\/h2>\n\n\n\n<p>Ahora que tenemos un poco m\u00e1s claras las piezas del rompecabezas, surgen algunas dudas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00bfC\u00f3mo interact\u00faan estos componentes entre s\u00ed?<\/li>\n\n\n\n<li>\u00bfPor qu\u00e9 hace falta una base de datos vectorial?<\/li>\n<\/ul>\n\n\n\n<p>Vamos a intentar esclarecer un poco el asunto.<\/p>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-4a00e676 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen5.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen5.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen5.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen5.png\" alt=\"\" class=\"uag-image-17877 lazyload\" width=\"588\" height=\"415\" title=\"Imagen5\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 588px; --smush-placeholder-aspect-ratio: 588\/415;\" \/><figcaption class=\"uagb-image-caption\">https:\/\/www.hopsworks.ai\/dictionary\/retrieval-augmented-generation-llm<\/figcaption><\/figure><\/div>\n\n\n\n<p>La idea intuitiva del funcionamiento de un RAG es la siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>El usuario hace una pregunta<\/strong>. Transformamos la pregunta a un vector con el mismo sistema de embedding que hemos utilizado para guardar los chunks. Esto nos va a permitir comparar nuestra pregunta con toda la informaci\u00f3n que tenemos indexada en nuestra base de datos vectorial.<\/li>\n\n\n\n<li><strong>Calculamos las distancias entre la pregunta y todos los vectores que tenemos en la base de datos<\/strong>. Seleccionamos, con una estrategia, algunos de los chunks y a\u00f1adimos todas esas piezas de informaci\u00f3n dentro del prompt como contexto. La estrategia m\u00e1s sencilla es basarse en seleccionar un n\u00famero (K) de vectores m\u00e1s pr\u00f3ximos a la pregunta.<\/li>\n\n\n\n<li><strong>Se lo pasamos al LLM para que genere la respuesta en base a los contextos<\/strong>. Es decir, el prompt contiene instrucciones + pregunta + contexto devuelto por el sistema de Retrieval. Por este motivo, la parte de \u00abAugmentation\u00bb en las siglas del RAG, dado que estamos haciendo&nbsp;<em>prompt augmentation<\/em>.<\/li>\n\n\n\n<li>El LLM nos ha generado una respuesta en base a la pregunta que hacemos y el contexto que le hemos pasado.&nbsp;<strong>Esta ser\u00e1 la respuesta que el usuario va a visualizar<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Es por eso que necesitamos un embedding y la base de datos vectorial. Ah\u00ed est\u00e1 un poco el truco. Si eres capaz de encontrar informaci\u00f3n muy parecida a tu pregunta en tu base de datos vectorial, entonces puedes detectar contenido que puede ser de utilidad para tu pregunta. Pero para todo ello, necesitamos un elemento que nos permita poder comparar textos de forma objetiva y esa informaci\u00f3n no podemos tenerla guardada de forma desestructurada si necesitamos hacer preguntas de forma frecuente.<\/p>\n\n\n\n<p>Tambi\u00e9n, que al final todo esto termina en el prompt, que nos permite que sea un flujo independiente del modelo de LLM que vayamos a usar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-6730cb3f7da973c9e6846d9f5aad9041\" style=\"color:#000000\"><strong>Evaluaci\u00f3n de los RAG<\/strong><\/h2>\n\n\n\n<p>De igual manera que los modelos de estad\u00edstica o ciencias de datos m\u00e1s cl\u00e1sicos, tenemos una necesidad de cuantificar c\u00f3mo est\u00e1 funcionando un modelo antes de utilizarlo de manera productiva.<\/p>\n\n\n\n<p>La estrategia m\u00e1s b\u00e1sica (por ejemplo, para medir la efectividad de una regresi\u00f3n lineal) consiste en dividir el conjunto de datos en distintas partes como train y test (80 y 20% respectivamente), entrenando el modelo en train y evaluando en test con m\u00e9tricas como el root-mean-square error, dado que el conjunto de test son datos que no ha visto el modelo. Sin embargo, un RAG no consta de entrenamiento sino de un sistema compuesto de distintos elementos donde una de sus partes es usar un modelo de generaci\u00f3n de texto.<\/p>\n\n\n\n<p>M\u00e1s all\u00e1 de esto,&nbsp;<strong>aqu\u00ed ya no tenemos datos cuantitativos<\/strong>&nbsp;(es decir, n\u00fameros) y la naturaleza del dato consiste en texto generado que puede variar en funci\u00f3n de la pregunta que le hagamos, el contexto detectado por el sistema de Retrieval y incluso el comportamiento no determinista que tienen los modelos de redes neuronales.<\/p>\n\n\n\n<p>Una estrategia b\u00e1sica que podemos pensar es en ir analizando a mano qu\u00e9 tan bueno est\u00e1 funcionando nuestro sistema, en base a hacer preguntas y ver c\u00f3mo est\u00e1n funcionando las respuestas y los contextos devueltos. Pero este enfoque se vuelve impracticable cuando queremos evaluar todas las posibilidades de preguntas en documentos muy grandes y de forma recurrente.<\/p>\n\n\n\n<p>\u00bfEntonces, c\u00f3mo podemos hacer esta evaluaci\u00f3n?<\/p>\n\n\n\n<p><strong>El truco<\/strong>: Aprovechando los propios LLMs. Con ellos podemos construir un conjunto de datos sint\u00e9tico con el que se haya simulado la misma acci\u00f3n de hacer preguntas a nuestro sistema, tal como si un humano lo hubiera hecho. Incluso le podemos a\u00f1adir un nivel de fineza mayor: utilizar un modelo m\u00e1s inteligente que el anterior y que funcione como un cr\u00edtico, que nos indique si lo que est\u00e1 sucediendo tiene sentido o no.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-1b7360b630dee3221c9f2b5777ae6ecf\" style=\"color:#000000\"><strong>Ejemplo de conjunto de datos de evaluaci\u00f3n<\/strong><\/h4>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-de012fb3 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen6.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen6.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen6.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen6.png\" alt=\"\" class=\"uag-image-17879 lazyload\" width=\"777\" height=\"599\" title=\"Imagen6\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 777px; --smush-placeholder-aspect-ratio: 777\/599;\" \/><figcaption class=\"uagb-image-caption\">https:\/\/docs.ragas.io\/en\/stable\/getstarted\/evaluation.html<\/figcaption><\/figure><\/div>\n\n\n\n<p>Aqu\u00ed lo que tenemos son muestras de Pregunta-Respuesta de c\u00f3mo hubiera funcionado nuestro sistema de RAG simulando las preguntas que le podr\u00eda hacer un humano en comparativa al modelo que estamos evaluando. Para hacer esto, necesitamos dos modelos: el LLM que utilizar\u00edamos en nuestro RAG, por ejemplo, GPT-3.5-turbo (Answer) y otro modelo con mejor funcionamiento para generar una \u201cverdad\u201d (Ground Truth), como GPT-4.<\/p>\n\n\n\n<p>Es decir, en otras palabras, el ChatGPT 3.5 ser\u00eda el sistema generador de preguntas y el ChatGPT 4 ser\u00eda como la parte cr\u00edtica.<\/p>\n\n\n\n<p>Una vez generado nuestro conjunto de datos de evaluaci\u00f3n, lo que nos queda es cuantificar num\u00e9ricamente con alg\u00fan tipo de m\u00e9trica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-9a7d48ba9d9ad3744a3f4466111034a9\" style=\"color:#000000\"><strong>M\u00e9tricas de Evaluaci\u00f3n<\/strong><\/h2>\n\n\n\n<p>La evaluaci\u00f3n de las respuestas es algo nuevo pero ya existen proyectos de c\u00f3digo abierto que logran cuantificar de forma efectiva la calidad de los RAGs. Estos sistemas de evaluaci\u00f3n permiten medir la parte de \u00abRetrieval\u00bb y \u00abGeneration\u00bb por separado.<\/p>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-92241c2a wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen7.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen7.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen7.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Imagen7.png\" alt=\"\" class=\"uag-image-17883 lazyload\" width=\"567\" height=\"319\" title=\"Imagen7\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 567px; --smush-placeholder-aspect-ratio: 567\/319;\" \/><figcaption class=\"uagb-image-caption\">https:\/\/docs.ragas.io\/en\/stable\/concepts\/metrics\/index.html<\/figcaption><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-3dddf1914dfce73775711406fc7faa73\" style=\"color:#000000\"><strong>Faitfulness Score<\/strong><\/h4>\n\n\n\n<p>Mide la veracidad de nuestras respuestas dado un contexto.&nbsp;Es decir, con qu\u00e9 porcentaje lo que se pregunta es verdad en funci\u00f3n del contexto conseguido a trav\u00e9s de nuestro sistema.&nbsp; Esta m\u00e9trica sirve para intentar controlar las alucinaciones que pueden tener los LLMs.&nbsp;Un valor muy bajo en esta m\u00e9trica implicar\u00eda que el modelo se est\u00e1 inventando cosas, aunque se le d\u00e9 un contexto.&nbsp;Por lo tanto, es una m\u00e9trica que debe estar lo m\u00e1s cercano a uno.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-78a78d872f430596dd8d7ad1454a1db1\" style=\"color:#000000\"><strong>Answer Relevancy Score<\/strong><\/h4>\n\n\n\n<p>Cuantifica la relevancia de la respuesta en base a la pregunta que se le hace a nuestro sistema. Si la respuesta no es relevante a lo que le preguntamos, no nos est\u00e1 respondiendo adecuadamente. Por lo tanto cuanto m\u00e1s alta sea esta m\u00e9trica, mejor.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-da819aaf483d1f61d0a0b4cd9d325d4d\" style=\"color:#000000\"><strong>Context Precision Score<\/strong><\/h4>\n\n\n\n<p>Evalua si todos los elementos de nuestros ground-truth \u00edtems dentro de los contextos, son rankeados de forma prioritaria o no.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-d47480539dc63ea6bfbc959df26abeb1\" style=\"color:#000000\"><strong>Context Recall Score<\/strong><\/h4>\n\n\n\n<p>Cuantifica si el contexto devuelto se alinea con la respuesta anotada.&nbsp;En otras palabras, c\u00f3mo de relevante es el contexto respecto a la pregunta que hacemos. Una valor bajo indicar\u00eda que el contexto devuelto es poco relevante y no nos ayuda a responder la pregunta.<\/p>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-de063f64 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/n-image-8.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/n-image-8.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/n-image-8.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/n-image-8.png\" alt=\"\" class=\"uag-image-17933 lazyload\" width=\"443\" height=\"268\" title=\"n-image-8\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 443px; --smush-placeholder-aspect-ratio: 443\/268;\" \/><\/figure><\/div>\n\n\n\n<p>El c\u00f3mo todas estas m\u00e9tricas se est\u00e1n evaluando es un poco m\u00e1s complejo pero podemos encontrar ejemplos bien explicados <a href=\"https:\/\/docs.ragas.io\/en\/stable\/concepts\/metrics\/index.html\" data-type=\"link\" data-id=\"https:\/\/docs.ragas.io\/en\/stable\/concepts\/metrics\/index.html\">en la documentaci\u00f3n de RAGAS<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-e0c8146b2f3de05d9fb8690d78deaf30\" style=\"color:#000000\"><strong>Ejemplo pr\u00e1ctico utilizando LangChain, OpenAI y ChromaDB<\/strong><\/h4>\n\n\n\n<p>Vamos a utilizar el framework de LangChain que nos permite construir un RAG de forma muy f\u00e1cil.<\/p>\n\n\n\n<p>El dataset que vamos a utilizar es un ensayo de Paul Graham, un dataset t\u00edpico y peque\u00f1o en cuanto a tama\u00f1o.<\/p>\n\n\n\n<p>La base de datos vectorial que vamos a utilizar va a ser <a href=\"https:\/\/docs.trychroma.com\/\" data-type=\"link\" data-id=\"https:\/\/docs.trychroma.com\/\">Chroma<\/a>, open-source y con plena integraci\u00f3n con <a href=\"https:\/\/python.langchain.com\/docs\/get_started\/introduction\" data-type=\"link\" data-id=\"https:\/\/python.langchain.com\/docs\/get_started\/introduction\">LangChain<\/a>. El uso de esta va a ser completamente transparente, utilizando los par\u00e1metros por defecto.<\/p>\n\n\n\n<p>NOTA: Cada llamada a un modelo asociado, tiene un coste monetario y conviene revisar <a href=\"https:\/\/openai.com\/pricing\" data-type=\"link\" data-id=\"https:\/\/openai.com\/pricing\">el <em>pricing<\/em> de OpenAI<\/a>. Nosotros vamos a trabajar con un dataset peque\u00f1o de 10 preguntas pero si se escalase, el coste podr\u00eda incrementarse.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import os\nfrom dotenv import load_dotenv  \n\nload_dotenv() # Configurar OpenAI API Key\n\nfrom langchain_community.document_loaders import TextLoader\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\nfrom langchain_openai import OpenAIEmbeddings\nfrom langchain_community.vectorstores import Chroma\nfrom langchain.prompts import ChatPromptTemplate\n\nembeddings = OpenAIEmbeddings(\n    model=\"text-embedding-ada-002\"\n)\n\ntext_splitter = RecursiveCharacterTextSplitter(\n    chunk_size = 700,\n    chunk_overlap = 50\n)\n\nloader = TextLoader('paul_graham\/paul_graham_essay.txt')\ntext = loader.load()\ndocuments = text_splitter.split_documents(text)\nprint(f'N\u00famero de chunks generados gracias al documento: {len(documents)}')\n\nvector_store = Chroma.from_documents(documents, embeddings)\nretriever = vector_store.as_retriever()<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">N\u00famero de chunks generados gracias al documento: 158<\/pre>\n\n\n\n<p>Dado que el texto del libro est\u00e1 en ingl\u00e9s, debemos de hacer nuestro template de prompt est\u00e9 en ingl\u00e9s.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain.prompts import ChatPromptTemplate\n\ntemplate = \"\"\"Answer the question based only on the following context. If you cannot answer the question with the context, please respond with 'I don't know':\n\nContext:\n{context}\n\nQuestion:\n{question}\n\"\"\"\n\nprompt = ChatPromptTemplate.from_template(template)<\/pre>\n\n\n\n<p>Ahora vamos a definir nuestro RAG mediante <a href=\"https:\/\/python.langchain.com\/docs\/expression_language\/\" data-type=\"link\" data-id=\"https:\/\/python.langchain.com\/docs\/expression_language\/\">LCEL<\/a>. El modelo a utilizar que responder\u00e1 a las preguntas de nuestro RAG va a ser GPT-3.5-turbo.&nbsp; Importante es que el par\u00e1metro de la&nbsp;<strong>temperatura est\u00e9 a 0 para que el modelo no sea creativo<\/strong>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from operator import itemgetter\n\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.runnables import RunnablePassthrough \n\nprimary_qa_llm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n\nretrieval_augmented_qa_chain = (\n    {\"context\": itemgetter(\"question\") | retriever, \"question\": itemgetter(\"question\")}\n    | RunnablePassthrough.assign(context=itemgetter(\"context\"))\n    | {\"response\": prompt | primary_qa_llm, \"context\": itemgetter(\"context\")}\n)<\/pre>\n\n\n\n<p>.. y ahora es posible hacerle ya preguntas a nuestro sistema RAG.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">question = \"What was doing the author before collegue? \"\n\nresult = retrieval_augmented_qa_chain.invoke({\"question\" : question}) \n\nprint(f' Answer the question based: {result[\"response\"].content}')<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Answer the question based: The author was working on writing and programming before college.<\/pre>\n\n\n\n<p>Tambi\u00e9n podemos investigar cuales han sido los contextos devueltos por nuestro retriever.&nbsp;Como hemos mencionado, la estrategia de Retrieval es la por defecto y nos devolver\u00e1 los top 4 contextos para responder a una pregunta.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">display(retriever.get_relevant_documents(question))<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">display(retriever.get_relevant_documents(question))\n[Document(page_content=\"What I Worked On\\n\\nFebruary 2021\\n\\nBefore college the two main things I worked on, outside of school, were writing and programming. I didn't write essays. I wrote what beginning writers were supposed to write then, and probably still are: short stories. My stories were awful. They had hardly any plot, just characters with strong feelings, which I imagined made them deep.\", metadata={'source': 'paul_graham\/paul_graham_essay.txt'}),\n Document(page_content=\"Over the next several years I wrote lots of essays about all kinds of different topics. O'Reilly reprinted a collection of them as a book, called Hackers &amp; Painters after one of the essays in it. I also worked on spam filters, and did some more painting. I used to have dinners for a group of friends every thursday night, which taught me how to cook for groups. And I bought another building in Cambridge, a former candy factory (and later, twas said, porn studio), to use as an office.\", metadata={'source': 'paul_graham\/paul_graham_essay.txt'}),\n Document(page_content=\"In the print era, the channel for publishing essays had been vanishingly small. Except for a few officially anointed thinkers who went to the right parties in New York, the only people allowed to publish essays were specialists writing about their specialties. There were so many essays that had never been written, because there had been no way to publish them. Now they could be, and I was going to write them. [12]\\n\\nI've worked on several different things, but to the extent there was a turning point where I figured out what to work on, it was when I started publishing essays online. From then on I knew that whatever else I did, I'd always write essays too.\", metadata={'source': 'paul_graham\/paul_graham_essay.txt'}),\n Document(page_content=\"Wow, I thought, there's an audience. If I write something and put it on the web, anyone can read it. That may seem obvious now, but it was surprising then. In the print era there was a narrow channel to readers, guarded by fierce monsters known as editors. The only way to get an audience for anything you wrote was to get it published as a book, or in a newspaper or magazine. Now anyone could publish anything.\", metadata={'source': 'paul_graham\/paul_graham_essay.txt'})]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-232a9c3262f35292373e30661db17a18\" style=\"color:#000000\"><strong>Evaluando nuestro RAG<\/strong><\/h4>\n\n\n\n<p>Ahora que ya tenemos nuestro RAG montado gracias a LangChain, nos falta evaluarlo.&nbsp; <\/p>\n\n\n\n<p>Parece que tanto <a href=\"https:\/\/python.langchain.com\/docs\/get_started\/introduction\" data-type=\"link\" data-id=\"https:\/\/python.langchain.com\/docs\/get_started\/introduction\">LangChain<\/a> como <a href=\"https:\/\/docs.llamaindex.ai\/en\/stable\/getting_started\/installation.html\" data-type=\"link\" data-id=\"https:\/\/docs.llamaindex.ai\/en\/stable\/getting_started\/installation.html\">LlamaIndex<\/a> empiezan a tener maneras de evaluar de forma f\u00e1cil los RAGs sin moverse del framework.&nbsp;Sin embargo, por ahora, la mejor opci\u00f3n es utilizar <a href=\"https:\/\/docs.ragas.io\/en\/stable\/index.html\" data-type=\"link\" data-id=\"https:\/\/docs.ragas.io\/en\/stable\/index.html\">RAGAS<\/a>, una librer\u00eda que ya hab\u00edamos mencionado y est\u00e1 espec\u00edficamente dise\u00f1ada con ese prop\u00f3sito.&nbsp;Internamente, va a utilizar GPT-4 como modelo cr\u00edtico, tal y como hemos mencionado anteriormente.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from ragas.testset.generator import TestsetGenerator\nfrom ragas.testset.evolutions import simple, reasoning, multi_context\ntext = loader.load()\ntext_splitter = RecursiveCharacterTextSplitter(\n    chunk_size = 1000,\n    chunk_overlap = 200\n)\ndocuments = text_splitter.split_documents(text)\n\ngenerator = TestsetGenerator.with_openai()\ntestset = generator.generate_with_langchain_docs(\n    documents, \n    test_size=10, \n    distributions={simple: 0.5, reasoning: 0.25, multi_context: 0.25}\n)\ntest_df = testset.to_pandas()\ndisplay(test_df)<\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes has-small-font-size\"><table><thead><tr><th><\/th><th>question<br><\/th><th>contexts<\/th><th>ground_truth<\/th><th>evolution_type<\/th><th>episode_done<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>What is the batch model and how does it relate\u2026<\/td><td>[The most distinctive thing about YC is the ba\u2026<\/td><td>The batch model is a method used by YC (Y Comb\u2026<\/td><td>simple<\/td><td>True<\/td><\/tr><tr><td>1<\/td><td>How did the use of Scheme in the new version o&#8230;<br><\/td><td>[In the summer of 2006, Robert and I started w&#8230;<br><\/td><td>The use of Scheme in the new version of Arc co&#8230;<br><\/td><td>simple<\/td><td>True<\/td><\/tr><tr><td>2<\/td><td>How did learning Lisp expand the author&#8217;s conc&#8230;<\/td><td>[There weren&#8217;t any classes in AI at Cornell th&#8230;<\/td><td>Learning Lisp expanded the author&#8217;s concept of&#8230;<\/td><td>simple<\/td><td>True<\/td><\/tr><tr><td>3<\/td><td>How did Moore&#8217;s Law contribute to the downfall&#8230;<\/td><td>[[4] You can of course paint people like still&#8230;<\/td><td>Moore&#8217;s Law contributed to the downfall of com&#8230;<\/td><td>simple<\/td><td>True<\/td><\/tr><tr><td>4<\/td><td>Why did the creators of Viaweb choose to make &#8230;<\/td><td>[There were a lot of startups making ecommerce&#8230;<\/td><td>The creators of Viaweb chose to make their eco&#8230;<\/td><td>simple<\/td><td>True<\/td><\/tr><tr><td>5<\/td><td>During the author&#8217;s first year of grad school &#8230;<\/td><td>[I applied to 3 grad schools: MIT and Yale, wh&#8230;<\/td><td><\/td><td>reasoning<\/td><td>True<\/td><\/tr><tr><td>6<\/td><td>What suggestion from a grad student led to the&#8230;<\/td><td>[McCarthy didn&#8217;t realize this Lisp could even &#8230;<\/td><td><\/td><td>reasoning<\/td><td>True<\/td><\/tr><tr><td>7<\/td><td>What makes paintings more realistic than photos?<\/td><td>[life interesting is that it&#8217;s been through a &#8230;<\/td><td>By subtly emphasizing visual cues, paintings c&#8230;<\/td><td>multi_context<\/td><td>True<\/td><\/tr><tr><td>8<\/td><td>\u00abWhat led Jessica to compile a book of intervi&#8230;<\/td><td>[Jessica was in charge of marketing at a Bosto&#8230;<\/td><td>Jessica&#8217;s realization of the differences betwe&#8230;<\/td><td>multi_context<\/td><td>True<\/td><\/tr><tr><td>9<\/td><td>Why did the founders of Viaweb set their price&#8230;<\/td><td>[There were a lot of startups making ecommerce&#8230;<\/td><td>The founders of Viaweb set their prices low fo&#8230;<\/td><td>simple<\/td><td>True<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">test_questions = test_df[\"question\"].values.tolist()\ntest_groundtruths = test_df[\"ground_truth\"].values.tolist()\nanswers = []\ncontexts = []\nfor question in test_questions:\n  response = retrieval_augmented_qa_chain.invoke({\"question\" : question})\n  answers.append(response[\"response\"].content)\n  contexts.append([context.page_content for context in response[\"context\"]])\n\nfrom datasets import Dataset # HuggingFace\nresponse_dataset = Dataset.from_dict({\n    \"question\" : test_questions,\n    \"answer\" : answers,\n    \"contexts\" : contexts,\n    \"ground_truth\" : test_groundtruths\n})\nfrom ragas import evaluate\nfrom ragas.metrics import (\n    faithfulness,\n    answer_relevancy,\n    context_recall,\n    context_precision,\n)\n\nmetrics = [\n    faithfulness,\n    answer_relevancy,\n    context_recall,\n    context_precision,\n]\n\nresults = evaluate(response_dataset, metrics)\nresults_df = results.to_pandas().dropna()<\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes has-small-font-size\"><table><thead><tr><th><\/th><th>question<br><\/th><th>answer<\/th><th>contexts<\/th><th>ground_truth<\/th><th>faithfulness<\/th><th>answer_relevancy<\/th><th>context_recall<\/th><th>context_precision<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>What is the batch model and how does it relate&#8230;<\/td><td>The batch model is a system where YC funds a g&#8230;<br><\/td><td>[The most distinctive thing about YC is the ba&#8230;<br><\/td><td>The batch model is a method used by YC (Y Comb&#8230;<br><\/td><td>0.750000<\/td><td>0.913156<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><tr><td>1<\/td><td>How did the use of Scheme in the new version o&#8230;<br><\/td><td>The use of Scheme in the new version of Arc co&#8230;<br><\/td><td>[In the summer of 2006, Robert and I started w&#8230;<br><\/td><td>The use of Scheme in the new version of Arc co&#8230;<br><\/td><td>1.000000<\/td><td>0.910643<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><tr><td>2<\/td><td>How did learning Lisp expand the author&#8217;s conc&#8230;<br><\/td><td>Learning Lisp expanded the author&#8217;s concept of&#8230;<br><\/td><td>[So I looked around to see what I could salvag&#8230;<br><\/td><td>Learning Lisp expanded the author&#8217;s concept of&#8230;<br><\/td><td>1.000000<\/td><td>0.924637<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><tr><td>3<\/td><td>How did Moore&#8217;s Law contribute to the downfall&#8230;<\/td><td>Moore&#8217;s Law contributed to the downfall of com&#8230;<br><\/td><td>[[5] Interleaf was one of many companies that &#8230;<br><\/td><td>Moore&#8217;s Law contributed to the downfall of com&#8230;<br><\/td><td>1.000000<\/td><td>0.940682<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><tr><td>4<\/td><td>Why did the creators of Viaweb choose to make &#8230;<br><\/td><td>The creators of Viaweb chose to make their eco&#8230;<br><\/td><td>[There were a lot of startups making ecommerce&#8230;<br><\/td><td>The creators of Viaweb chose to make their eco&#8230;<br><\/td><td>0.666667<\/td><td>0.960447<\/td><td>1.0<\/td><td>0.833333<\/td><\/tr><tr><td>5<\/td><td>What suggestion from a grad student led to the&#8230;<br><\/td><td>The suggestion from grad student Steve Russell&#8230;<br><\/td><td>[McCarthy didn&#8217;t realize this Lisp could even &#8230;<br><\/td><td>The suggestion from a grad student, Steve Russ&#8230;<br><\/td><td>1.000000<\/td><td>0.931730<\/td><td>1.0<\/td><td>0.916667<\/td><\/tr><tr><td>6<\/td><td>What makes paintings more realistic than photos?<br><\/td><td>By subtly emphasizing visual cues such as the &#8230;<br><\/td><td>[copy pixel by pixel from what you&#8217;re seeing. &#8230;<br><\/td><td>By subtly emphasizing visual cues, paintings c&#8230;<br><\/td><td>1.000000<\/td><td>0.963414<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><tr><td>7<\/td><td>\u00abWhat led Jessica to compile a book of intervi&#8230;<\/td><td>Jessica was surprised by how different reality&#8230;<br><\/td><td>[Jessica was in charge of marketing at a Bosto&#8230;<br><\/td><td>Jessica&#8217;s realization of the differences betwe&#8230;<br><\/td><td>1.000000<\/td><td>0.954422<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><tr><td>8<\/td><td>Why did the founders of Viaweb set their price&#8230;<br><\/td><td>The founders of Viaweb set their prices low fo&#8230;<br><\/td><td>[There were a lot of startups making ecommerce&#8230;<br><\/td><td>The founders of Viaweb set their prices low fo&#8230;<br><\/td><td>1.000000<\/td><td>1.000000<\/td><td>1.0<\/td><td>1.000000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Visualizamos las distribuciones estad\u00edsticas que salen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">results_df.plot.hist(subplots=True,bins=20)<\/pre>\n\n\n\n<div class=\"wp-block-uagb-image uagb-block-b552e954 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\" data-srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Unknown.png ,https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Unknown.png 780w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Unknown.png 360w\" data-sizes=\"auto, (max-width: 480px) 150px\" data-src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2024\/03\/Unknown.png\" alt=\"\" class=\"uag-image-17896 lazyload\" width=\"554\" height=\"413\" title=\"Unknown\" role=\"img\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 554px; --smush-placeholder-aspect-ratio: 554\/413;\" \/><\/figure><\/div>\n\n\n\n<p>Podemos observar que el sistema no es perfecto aunque hemos generado solamente 10 preguntas (har\u00eda falta generar muchas m\u00e1s) y tambi\u00e9n se puede observar que en una de ellas, la pipeline del RAG ha fallado en crear el ground truth.<\/p>\n\n\n\n<p>Aun as\u00ed podr\u00edamos sacar algunas conclusiones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>algunas veces no es capaz de dar respuestas muy veraces (faithfulness)<\/li>\n\n\n\n<li>la relevancia de la respuesta es variable pero consistentmente buena (answer_relevancy)<\/li>\n\n\n\n<li>el context recall es perfecto pero el context precision ya no tanto<\/li>\n<\/ul>\n\n\n\n<p>Ahora aqu\u00ed nos podemos plantear probar con distintos elementos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cambiar el embedding utilizado por uno que podemos encontrar en <a href=\"https:\/\/huggingface.co\/spaces\/mteb\/leaderboard\" data-type=\"link\" data-id=\"https:\/\/huggingface.co\/spaces\/mteb\/leaderboard\">HuggingFace MTEB Leaderboard<\/a>.<\/li>\n\n\n\n<li>mejorar el sistema de retrieval con estrategias diferentes a la por defecto<\/li>\n\n\n\n<li>evaluar con otros LLMs<\/li>\n<\/ul>\n\n\n\n<p>Con estas posibilidades, es viable analizar cada una de esas estrategias anteriores y escoger la que mejor se ajuste a nuestros datos o criterios monetarios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-color has-link-color wp-elements-7ac06f669a3882f992d6f8260ffa8bce\" style=\"color:#000000\"><strong>Conclusiones<\/strong><\/h2>\n\n\n\n<p>En este art\u00edculos hemos visto en qu\u00e9 consiste un RAG y c\u00f3mo podemos evaluar un workflow completo.&nbsp;Todo esta materia est\u00e1 en auge ahora mismo dado que es una de las alternativas m\u00e1s eficaces y econ\u00f3micas para evitar el <em>fine-tuning<\/em> de los LLMs.&nbsp;<\/p>\n\n\n\n<p><br>Es posible que se encuentren nuevas m\u00e9tricas, nuevos frameworks, que hagan la evaluaci\u00f3n de estos m\u00e1s sencilla y eficaz; pero en los pr\u00f3ximos art\u00edculos no solo vamos a poder ver su evoluci\u00f3n, sino tambi\u00e9n c\u00f3mo llevar a production una arquitectura basada en RAGs.<\/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=\"#componentes-de-un-rag\" class=\"uagb-toc-link__trigger\">Componentes de un RAG<\/a><li class=\"uagb-toc__list\"><a href=\"#funcionamiento-a-alto-nivel\" class=\"uagb-toc-link__trigger\">Funcionamiento a Alto Nivel<\/a><li class=\"uagb-toc__list\"><a href=\"#evaluaci\u00f3n-de-los-rag\" class=\"uagb-toc-link__trigger\">Evaluaci\u00f3n de los RAG<\/a><li class=\"uagb-toc__list\"><a href=\"#m\u00e9tricas-de-evaluaci\u00f3n\" class=\"uagb-toc-link__trigger\">M\u00e9tricas de Evaluaci\u00f3n<\/a><li class=\"uagb-toc__list\"><a href=\"#conclusiones\" class=\"uagb-toc-link__trigger\">Conclusiones<\/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>Roger Pou LopezData Scientist Un RAG, acr\u00f3nimo de&nbsp;\u00abRetrieval Augmented Generation\u00bb, representa una estrategia innovadora dentro del procesamiento de lenguaje natural. Se integra con los&nbsp;Grandes Modelos de Lenguaje&nbsp;(LLM, por sus siglas en ingl\u00e9s), tales como los que usa ChatGPT internamente (GPT-3.5-turbo o GPT-4), con el objetivo de mejorar la calidad de la respuesta y reducir ciertos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":17966,"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-17868","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:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt.png",1200,600,false],"thumbnail":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-150x150.png",150,150,true],"medium":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-300x150.png",300,150,true],"medium_large":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-768x384.png",768,384,true],"large":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-1024x512.png",1024,512,true],"1536x1536":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt.png",1200,600,false],"2048x2048":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt.png",1200,600,false],"sidebar-featured":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-75x75.png",75,75,true],"genesis-singular-images":["https:\/\/bluetab.com\/wp-content\/uploads\/2024\/03\/chatgpt-702x526.png",702,526,true]},"uagb_author_info":{"display_name":"Bluetab","author_link":"https:\/\/bluetab.com\/es\/author\/user\/"},"uagb_comment_info":0,"uagb_excerpt":"Roger Pou LopezData Scientist Un RAG, acr\u00f3nimo de&nbsp;\u00abRetrieval Augmented Generation\u00bb, representa una estrategia innovadora dentro del procesamiento de lenguaje natural. Se integra con los&nbsp;Grandes Modelos de Lenguaje&nbsp;(LLM, por sus siglas en ingl\u00e9s), tales como los que usa ChatGPT internamente (GPT-3.5-turbo o GPT-4), con el objetivo de mejorar la calidad de la respuesta y reducir ciertos&hellip;","_links":{"self":[{"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/posts\/17868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/comments?post=17868"}],"version-history":[{"count":42,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/posts\/17868\/revisions"}],"predecessor-version":[{"id":17968,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/posts\/17868\/revisions\/17968"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/media\/17966"}],"wp:attachment":[{"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/media?parent=17868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/categories?post=17868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.com\/es\/wp-json\/wp\/v2\/tags?post=17868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}