Video Summary and Transcription
La masterclass de hoy presentó el concepto de los LLMs y su potencial para liberar tiempo para los ingenieros de software. Se discutió cómo configurar los LLMs para chatear con datos propietarios, utilizando la generación con recuperación mejorada para pequeñas conversaciones y construyendo una aplicación de recomendación de oradores utilizando este enfoque. La masterclass también abordó las preocupaciones sobre el manejo de datos en OpenAI y exploró el proceso de dividir y almacenar datos en una base de datos vectorial. Concluyó con el despliegue de una aplicación de extremo a extremo utilizando Genesio e invitó a los asistentes a proporcionar comentarios y mantenerse en contacto.
1. Introducción a LLMs y IA Generativa
Hoy vamos a hablar sobre LLMs y cómo pueden liberar tiempo para que los ingenieros de software se centren en el desarrollo de productos y arquitecturas robustas.
Bueno, hola a todos. Soy Andrea. Trabajo en Genesio y estoy muy feliz de estar aquí y emocionada de hablar sobre LLMs y IA generativa porque es un tema bastante interesante en este momento.
Hoy vamos a hablar sobre LLMs y estoy bastante seguro de que también están emocionados acerca del tema porque están aquí en el masterclass donde pueden aprender cómo integrar LLMs, OpenAI y modelos de IA en general en sus propias aplicaciones.
En realidad, estoy muy apasionada por este tema porque OpenAI nos está dando a nosotros, y los LLMs en general, nos están dando el regalo del tiempo. Así que voy a ser honesta, he tenido varias conversaciones con ChatGPT hasta ahora y me ha ahorrado bastante tiempo con la depuración y la escritura de código. Y ahora puedo enfocarme más en aprender, en diseñar arquitecturas, en cosas que ChatGPT no puede hacer pero yo sí puedo y tengo más tiempo para hacerlo. Así que en realidad estoy muy emocionada por este tema porque quiero ver los LLMs y los modelos de IA más integrados en nuestro trabajo como ingenieros de software para poder liberar nuestro tiempo para pensar en productos y en arquitecturas robustas, entre otras cosas.
2. Configuración de LLMs para chatear con datos propietarios
Hoy les mostraré cómo configurar un LLM, como OpenAI, para chatear con sus propios datos. Un desafío es que si tienen datos propietarios, el modelo no sabrá cómo responder. Para superar esto, podemos proporcionar los datos propietarios y el contexto al modelo. Hay diferentes enfoques, incluyendo el ajuste fino del modelo con datos propietarios, pero esto es costoso y requiere experiencia. Otro enfoque es incluir todos los datos propietarios en la propia solicitud.
Dicho esto y teniendo eso en cuenta, lo que quiero mostrarles hoy es cómo pueden configurar un LLM, como OpenAI, para chatear con sus propios datos.
Entonces, bien. Hasta ahora, cómo nos comunicamos con modelos LLM como OpenAI o LLAMA o cualquier otro modelo, simplemente hacemos algunas preguntas, tenemos un usuario, él tiene una pregunta y el modelo nos responderá. Pero el problema aquí es que si tenemos algunos datos propietarios, el modelo, desafortunadamente, no está entrenado con esos datos y no sabrá cómo responder a su pregunta.
Vi un ejemplo muy claro de esto estos días. Por ejemplo, si quieres preguntar sobre algunas políticas de tu empresa, por ejemplo, los días de vacaciones que tienes, no puedes preguntarle a un modelo. Tienes que ir a las directrices internas y políticas de tu empresa o a RRHH y tienes que preguntarle a una persona y tienes que invertir tiempo en todo este proceso de ida y vuelta. Entonces, lo que realmente podemos hacer es encontrar una manera de proporcionar los datos propietarios y dar un contexto al modelo para ayudarnos a hacer este tipo de preguntas.
Ahora hay algunos enfoques que podemos tomar. En primer lugar, quiero enfatizar cuando digo datos propietarios, algunos de ustedes probablemente piensen directamente en preocupaciones de privacidad. Entonces hay dos cosas que pueden hacer aquí. Si les preocupa la privacidad de sus datos, pueden usar un modelo que alojen ustedes mismos. Por ejemplo, pueden obtener modelos Lama tres que son de código abierto. Pueden alojarlos en cualquier proveedor de nube y así se aseguran de que sus datos nunca salgan de este entorno y esta arquitectura. Así tienen un control total y total privacidad para este masterclass. Yo uso Open AI solo por conveniencia porque ya es público. Ya está ahí y no tengo que invertir tiempo en configurarlo. Pero tengan en cuenta que si quieren total privacidad, pueden alojar su propio modelo. Pero no todos los datos propietarios son también datos sensibles. Así que en realidad podemos tener una documentación pública para un proyecto de código abierto y cosas como esa, que simplemente podemos proporcionar a un modelo de terceros. Así que no tienen que preocuparse por eso todo el tiempo.
Volviendo a la presentación y al enfoque en sí, lo primero que se me ocurre es que podemos ajustar finamente el modelo con los datos propietarios. Pero desafortunadamente, aunque esto es lo mejor que podemos hacer, porque entonces el modelo conocerá nativamente las cosas sobre los datos, esto es muy costoso y requiere experiencia en aprendizaje automático. Ajustar finamente es realmente un arte y tienes que saber cómo hacerlo para hacerlo correctamente. Y también tienes que tener muchos datos propietarios porque de lo contrario, si no tienes muchos datos sobre el tema, realmente no marcará la diferencia en el modelo en sí porque el modelo es enorme. Conoce muchos datos. Entonces, si solo agrego algunas oraciones sobre un tema en particular, se perderán en todos los datos que ya están allí. Entonces, para este tipo de aplicación, el ajuste fino puede que no sea realmente una solución. Así que podemos seguir y hacer el enfoque ingenuo y poner todos los datos propietarios en la propia solicitud. Así que antes de hacer una pregunta, podemos decirle al modelo, aquí están todos los datos de mi empresa, todas las directrices o todas las políticas.
3. Recuperación aumentada de generación para pequeñas conversaciones
Para superar el problema de los datos propietarios largos, podemos almacenarlos en un almacenamiento especializado y recuperar solo los párrafos relevantes para nuestras preguntas. Este enfoque, conocido como recuperación aumentada de generación, es ideal para aplicaciones pequeñas que requieren nueva información sin ajustar finamente el modelo.
Simplemente analiza estos datos y luego responde mi pregunta. ¿Cuántos días de vacaciones puedo tomar en esta empresa? El problema con este enfoque es que a veces los datos propietarios son tan largos que superarán la longitud máxima de una indicación. Entonces, cada modelo tiene una longitud máxima de indicación y realmente no podemos exceder eso. Y también la indicación se vuelve más y más costosa a medida que aumenta directamente con la longitud de la indicación.
Entonces, si los datos propietarios son largos, pero lo suficientemente cortos como para caber en una indicación, aún vamos a pagar mucho dinero. Vamos a pagar más por datos que no son relevantes para nuestra pregunta. Entonces, por ejemplo, si quiero saber sobre los días de vacaciones, es posible que no esté interesado en ninguna otra parte de las políticas o directrices de mi empresa que hablen de otros tipos de beneficios o ventajas. Así que puedo dejarlos de lado y simplemente decirle a la indicación y al modelo solo sobre los datos relevantes que estoy utilizando. Y así, como les dije, esto realmente no es el caso porque es fuerza bruta y es va a ser algo costoso. Va a llevar más tiempo porque el modelo tiene que analizar toda la documentación por nosotros. Y a veces será costoso porque tenemos muchos datos allí y el costo aumenta con la longitud de los datos. Entonces, lo que realmente queremos hacer es lo siguiente. Tenemos los datos propietarios y queremos almacenarlos en algún tipo de almacenamiento inteligente y especializado Y solo queremos, en base a nuestra pregunta, volviendo al ejemplo, los días de vacaciones. Queremos tomar solo los párrafos sobre vacaciones, sobre días, los párrafos que están lógicamente relacionados con mi pregunta.
Creación de una aplicación de recomendación de oradores
Crearemos una aplicación de recomendación de oradores utilizando la generación aumentada de recuperación. Al extraer datos del sitio web del festival C3, recuperaremos los tres principales oradores según tus intereses. La aplicación constará de un servicio backend que se comunica con un modelo de IA abierto y una interfaz de usuario para ingresar intereses y obtener recomendaciones. El stack será Node.js, React y TypeScript.
Y vamos a proporcionar estos datos relevantes en la indicación, solo estos datos y luego nuestra pregunta y lo ajustaremos al modelo. Entonces, toda esta arquitectura se llama en el ecosistema de IA ML, se llama generación aumentada de recuperación. Y en realidad es el mejor enfoque para aplicaciones pequeñas, pequeñas conversaciones que requieren conocer nueva información como documentación, políticas, directrices, y realmente no necesitan el poder de ajustar finamente el modelo.
Entonces, esto es lo que vamos a ver hoy en la masterclass, cómo crear una aplicación de generación aumentada de recuperación. Y veamos exactamente cómo y qué vamos a construir, porque quería darte un caso de uso muy relevante para esta masterclass y relevante para nuestro uso diario porque queremos hacer aplicaciones que sean relevantes para nosotros, no solo ejemplos de juguete.
En realidad, vamos a crear una aplicación de recomendación de oradores. Así que lo que hice fue ir al sitio web del festival C3 y recuperé, obtuve, extraje básicamente todos los oradores y charlas que van a suceder estos días. Y en base a esta información y a tus intereses, vamos a recuperar los tres principales oradores que debes ver en estos días porque estás interesado o apasionado por las charlas que están dando. Así que vamos a hacer esto en un stack completo. Básicamente, vamos a tener un servicio backend que va a comunicarse con un modelo de IA abierto. Y también vamos a tener una interfaz de usuario o una interfaz de cliente frontend donde podemos ingresar nuestros intereses, nuestro nombre y podemos hacer clic en enviar, etc.
Y el stack técnico será Node.js y React. Básicamente, me estoy enfocando en TypeScript porque es mi lenguaje preferido cuando estoy desarrollando este tipo de cosas. Y voy a usar IA abierta solo por conveniencia. Puedes usar cualquier otro modelo que desees alojar o probar desde Hugging Face o cualquier otro servicio que ofrezca modelos. Haré una pausa aquí porque veo que tengo dos preguntas.
Abordando inquietudes y discutiendo los recuperadores
Para abordar las preocupaciones sobre la ejecución de datos en OpenAI, las empresas pueden utilizar otros modelos o alojar los suyos propios. Discutiremos la arquitectura de la generación aumentada de recuperación y cómo recupera el contexto para las preguntas de los usuarios. También se explicarán las diferentes versiones de los recuperadores.
Entonces, la primera pregunta es, ¿qué hay de las empresas que no quieren que sus data se ejecuten en Open AI? Sí. Para esta pregunta, puedes usar cualquier otro modelo. Puedes, como dije, obtener un modelo de terceros, obtener otro modelo de terceros que ya esté alojando modelos de AI, LLMs, o puedes alojarlo tú mismo. Así que hay muchos tutoriales en este momento sobre cómo alojarlo localmente o en proveedores de la nube como AWS, Google, etc., donde puedes obtener las GPUs y puedes alojar el modelo en sí. Así que realmente no tienes que usar una empresa de terceros para hacer preguntas.
Y la segunda pregunta es, hay dos tipos de recuperadores, uno y dos, ¿cuál es mejor, cuál vamos a discutir hoy? No estoy seguro de lo que quieres decir con versión uno y dos. Tal vez si puedes darme algunos ejemplos en el chat, puedo decirte exactamente de qué vamos a hablar hoy. Pero como dije aquí. Vamos a discutir este tipo de arquitectura donde tenemos un almacenamiento de incrustación, veremos en un momento qué es eso, donde vamos a recuperar el contexto que es valioso para nuestra pregunta y vamos a concatenar tanto los datos relevantes como la pregunta del usuario y se lo vamos a dar al modelo. Así que realmente no sé si esta es la versión uno o la segunda de un rack.
Construyendo la Aplicación de Recomendación de Oradores
Construiremos una interfaz de usuario donde podamos ingresar nuestro nombre e intereses. La arquitectura implica pasar la entrada a través de una interfaz de usuario React y almacenar la información del Festival C3 antes de crear la solicitud para OpenAI.
sistema. De acuerdo, genial. Gracias por la pregunta. Es genial ver que también estás participando en la masterclass. Entonces, como adelanto, esto es lo que vamos a construir realmente. Este es el UI final, la interfaz final aquí. Podemos ingresar nuestro nombre y nuestros intereses, y cuando hagamos clic en enviar, vamos a obtener la recomendación de oradores y qué charlas deberíamos ver estos días en el Festival C3.
Veamos un poco de la arquitectura antes de sumergirnos en el código en sí. Como dije, vamos a ingresar los intereses. Por ejemplo, si te apasiona el código abierto o la IA generativa, vas a escribir una solicitud que te describa a ti mismo y tu rol en la empresa. Vamos a pasar esto a través de una interfaz de usuario React.
Demo and Deployment with Genesio
Pasaremos la entrada a través del almacenamiento, crearemos una solicitud para OpenAI y luego procederemos a la demostración. Puedes programar junto con nosotros accediendo al repositorio y configurando el entorno en Gitpod. Utilizaremos la plataforma sin servidor Genesio para el despliegue, asegurando una experiencia de codificación rápida y sin errores. Al iniciar sesión con nuestra cuenta de Genesio, podemos abrir un servidor local para el desarrollo y las pruebas.
Luego lo pasaremos a través del almacenamiento del que vamos a hablar en un momento. Este almacenamiento contiene toda la información sobre los oradores y las charlas del Festival C3. Y luego crearemos la solicitud y se la daremos a OpenAI. Y ahora veamos la demostración o la parte de esta masterclass. Así que puedes, espero que lo hagas, programar junto conmigo. Por favor, levanta la mano si tienes una computadora portátil y quieres programar junto conmigo. Y si es así, simplemente ve a este repositorio. Acabo de hacerlo de memoria. Así que voy a copiar y pegar este repositorio para que puedas tomar el código.
Lo que ya hice aquí es que podemos abrir un Gitpod, que es básicamente un editor en el navegador, y simplemente haz clic en Continuar aquí e ir a GitHub. Y ya tendremos todo el entorno configurado para nuestra masterclass aquí. Así que simplemente configúralo. Y en un momento, también se está instalando todo lo que necesitamos aquí. Y vamos a tener el lado del backend y del frontend. Y en un momento veremos cómo programar esto. Cosas aquí. Lo que olvidé decirte es qué vamos a usar para desplegar esto, porque al final de la masterclass, quiero que tengas una aplicación funcional que esté disponible públicamente y que puedas compartir con tus amigos y colegas. Así que volvamos un poco a la arquitectura. Todo lo que acabo de decirte aquí será un proyecto de Genesio. Genesio es una plataforma sin servidor y estoy muy apasionado por lo sin servidor, especialmente para este caso de uso, porque no tengo que preocuparme por mantener servidores o involucrar a un DevOps para ayudarme con el despliegue de un servidor o con la escalabilidad. Así que puedo usar Genesio para desplegar, probarlo localmente, y así sucesivamente.
Using Genesio for Development and Testing
Iniciaremos sesión con Genesio para codificar y probar nuestra aplicación en tiempo real. Los datos extraídos del sitio web del Festival C3 son demasiado grandes para ser utilizados como un estímulo para chat.gpt. En su lugar, almacenaremos la información en una base de datos vectorial. Te guiaré a través del código y explicaré el proceso. Primero, necesito crear una clave de API de OpenAI y generar una nueva. Esta clave se utilizará para Genesio Local.
Y esto es muy conveniente porque verás que podemos codeprogramar realmente rápido y sin errores con Genesio. Entonces, para hacer esto, vamos a iniciar sesión con Genesio. Gitpod nos preguntará si puede abrir un nuevo navegador, nuevas pestañas, y podemos ver que ahora estamos conectados con la cuenta de Genesio. Así que he iniciado sesión con mi correo electrónico de la empresa. Ahora puedo abrir un servidor local para comenzar a desarrollar. Y mientras desarrollo, también puedo probar la aplicación. Este flujo de trabajo es muy conveniente porque cada vez que hago un cambio, Genesio Local actualizará el estado y el servidor, y puedo probarlo en tiempo real.
Genial. Ahora tenemos este servidor local iniciado. Solo lo minimizaré y ahora podemos comenzar a revisar el code y entender un poco la plantilla y cómo vamos a construir esta aplicación. Primero que nada, quiero mostrarte los data que acabo de extraer del sitio web del Festival C3. Aquí tengo una lista, un archivo largo que contiene los títulos de los talleres y charlas, la descripción, los oradores y la descripción de los oradores. Como puedes ver, este es un archivo bastante grande. Sería imposible proporcionar todo esto como contexto en el estímulo y simplemente decirle a chat.gpt, descúbrelo y dame una recomendación de oradores y charlas. Básicamente, el problema aquí es que el estímulo sería demasiado largo y chat.gpt generaría un error, lanzaría un error. Así que lo que quiero hacer es almacenar toda esta información en una database vectorial. Veamos cómo lo hice. Y te guiaré a través del code. Ya escribí el code para que sea más fácil ver el code y luego verlo en acción. Primero que nada, necesito una clave de API de AI abierta. La crearé ahora mismo. .env aquí. Tendré una API de AI abierta. Solo copiaré y pegaré para no equivocarme. Y voy a generar una nueva clave de API, nueva dos. Y voy a revelarla brevemente. Pero para ser honesto, esto no es realmente un problema porque tengo algunos límites estrictos. Así que no tengo miedo de la denegación de servicio y después de esta masterclass, simplemente la eliminaré para asegurarme de que todo esté bien con ella. Primero que nada, vamos a tener AI abierta y la clave de Genesio local ya. El cambio.
División y Almacenamiento de Datos en la Base de Datos Vectorial
Estoy recargando los cambios y cargando la clave de API de Open AI. Después de abrir el archivo, lo dividiré en varios documentos para la base de datos vectorial, que funciona utilizando fragmentos de incrustaciones. Estas incrustaciones son vectores de números que los modelos comprenden. Al recuperar fragmentos con incrustaciones, nos aseguramos de obtener la información correcta, como oraciones o párrafos.
Cambio detectado, recargando. Ya vi que creé el nuevo archivo .env. Y ahora la clave de API de AI está cargada en el propio proceso. Entonces, lo que realmente estoy haciendo aquí es abrir el archivo data slash talks que toma el archivo porque quiero cargarlo y guardarlo en la base de datos vectorial. En el almacenamiento especial del que hablé.
Entonces, lo primero que quiero hacer es que solo tengo un documento aquí, pero es bastante largo en sí mismo. Entonces, lo que realmente quiero hacer es dividirlo en varios documentos porque la forma en que funciona una base de datos vectorial es la siguiente. La base de datos vectorial va a tener fragmentos de incrustaciones. Estas incrustaciones son básicamente vectores de números.
Y esta es la forma en que nos comunicamos con cualquier LLM, no solo con Open AI. Los modelos realmente comprenden matemáticas. Por lo tanto, comprenden números. Entonces, de alguna manera, tenemos que tener una función que transforme el lenguaje natural en números. Y esta función, si quieres, es la función de incrustaciones. Y cada vez que queremos recuperar fragmentos con incrustaciones de una base de datos vectorial, queremos que contengan solo la información correcta. Entonces, realmente no queremos que sean todo el documento. Tal vez solo queremos oraciones o párrafos.
División y Almacenamiento de Información
Estoy dividiendo la información en fragmentos de máximo 1024 caracteres, idealmente después de párrafos, saltos de línea o frases. Dividir frases o palabras por separado no tiene sentido. Inicializo las incrustaciones, que transforman el lenguaje en números, y creo la base de datos vectorial como un archivo local, eliminando la necesidad de consultas en red. Esto hace que el proceso de recuperación sea mucho más rápido.
Entonces, lo que realmente estoy haciendo aquí es dividir toda mi información en párrafos, en líneas de texto. Y si es posible, después de una coma o en realidad aquí tengo que poner un punto. Entonces, después de frases o después de palabras. Lo que realmente quiero son fragmentos que tengan un máximo de 1024 caracteres de longitud. Y si es posible, quiero dividirlo después de párrafos, saltos de línea o frases.
Porque es muy diferente si tengo la siguiente frase. Puedo tomar 21 días de vacaciones y puedo dividirlo en dos. Y puedo tomar 21 y luego días de vacaciones. Y estos son dos fragmentos separados. Pero si los tomo por separado, no tienen sentido por sí mismos. Así que en realidad quiero que toda la frase sea un solo vector. Así que voy a dividir esto. Y luego solo registro la longitud de los documentos divididos para entender cuántos fragmentos tengo en la base de datos vectorial.
Luego, como les dije, estoy inicializando las incrustaciones, que es la función que transforma el lenguaje en números. Y luego estoy creando la base de datos vectorial como un archivo local. Entonces, la base de datos vectorial es un poco más especial que una simple base de datos. Solo porque puedo incrustarla en el código del servidor, por ejemplo, o en los archivos del servidor como un archivo local. Y esto es genial porque realmente no tengo que hacer una consulta en red para obtener cosas. Puedo leerlo de la consulta como si lo estuviera leyendo desde un archivo local. Entonces esto va a ser mucho más rápido.
Conexión, Almacenamiento y Recuperación
Me conecto al archivo local en el directorio de almacenamiento de vectores para crear una tabla con archivos binarios que contienen las incrustaciones. El esquema consiste en vectores con incrustaciones, texto correspondiente, origen y líneas de contexto incrustadas. Esto es útil para analizar la documentación del producto en la base de datos vectorial. Al generar el contexto de referencia, podemos verificar si el modelo alucinó o hacer referencia a la documentación. Luego guardo toda la información en los documentos, incrustaciones y tabla.
Entonces, estoy conectando esto, conectar básicamente significa simplemente abrir el archivo que está local. Por lo tanto, el archivo en realidad estará aquí localmente en el directorio de almacenamiento de vectores. Y voy a crear una tabla que esencialmente va a crear algunos archivos binarios que contendrán las incrustaciones en sí. Y aquí, en esta línea, hay otro truco que es muy útil para los sistemas de recuperación de texto.
Entonces, esta cosa, el consejo aquí es que cuando realmente lo estamos dividiendo, esto es un esquema. Por lo tanto, esto es muy similar a un esquema de Postgres o un esquema de MongoDB o cualquier otro esquema para bases de datos. Entonces, esencialmente, el vector en sí va a contener las incrustaciones. Esto significa solo números. El texto va a contener el texto que fue incrustado. Por ejemplo, para este ejemplo tonto, el texto aquí sería una cadena. Si estoy incrustando un hola mundo, el texto o contenido correspondiente será hola mundo. El origen aquí va a ser en realidad el origen del que se tomó el texto. Y en nuestro caso, será directamente data slash talks que lo toma. Y aquí están las líneas de texto de las que se incrustó este contexto.
Entonces, el truco aquí es que esto es especialmente útil cuando estamos analizando la documentación de un producto en una base de datos vectorial. Porque luego el origen sería algún tipo de URL. La URL de la página que estamos buscando. Y las líneas serían las líneas donde se encontró la información. Entonces, lo que realmente podemos hacer cuando estamos codificando este tipo de aplicación, también podemos decirle al modelo que simplemente genere el contexto de referencia que aprendió. Básicamente, si le preguntas al modelo, ¿cómo puedo configurar un cierto campo en el archivo de configuración YAML? Te dará el fragmento de código real o ejemplo o pasos. Y luego puede decirte, aprendí esto de un sitio web, de y de exactamente estas líneas de código o estas líneas de la documentación. Entonces, en realidad podemos cerrar el ciclo de retroalimentación y podemos verificar si el modelo alucinó o no. O podemos examinar más en profundidad la documentación en sí. Entonces, no solo confiamos en el conocimiento del modelo en sí. Esto fue solo un pequeño truco. Veremos más sobre esto en un momento.
Luego, simplemente voy a guardar toda la información. Esencialmente, los documentos son la fuente desde la que estoy guardando. Las incrustaciones son la función entre el lenguaje y los números.
Ejecución del Script y Modificación del Almacenamiento de Vectores
La tabla en el Almacenamiento de Vectores es el destino para guardar las incrustaciones. El script se ejecuta antes de la aplicación, instalando TS6 y dividiendo el archivo de entrada en fragmentos. El Almacenamiento de Vectores se modifica y contiene nuevos datos de los archivos .txt.
Y la tabla es el destino, la tabla real en el Almacenamiento de Vectores. Por lo tanto, podemos ver esto en acción. Básicamente, este es un script que simplemente ejecutamos antes de nuestra aplicación.
Estoy bastante seguro de que tengo que ejecutar un npm install aquí. Así que simplemente voy a ejecutar este script como cualquier otro script. Sí, quiero instalar TS6. Y lo que realmente podemos ver son los registros que acabo de pegar en el code en sí mismo. Entonces, mi documento o el original tiene una longitud porque solo tengo un archivo, TOX.txt. Y luego lo divido en fragmentos. Y tengo casi 140 fragmentos resultantes que se guardarán como incrustaciones en mi Almacenamiento de Vectores.
Aquí puedes ver que el Almacenamiento de Vectores se modificó porque ahora está en amarillo. Y eso significa que lo sobrescribí. Y contiene nuevos data de los archivos .txt. Ahora puedo ir al backend.
Alternativas Gratuitas a OpenAI y Agregar Crédito
Además de OpenAI, el modelo Lama de Meta es una alternativa gratuita que se puede alojar y ejecutar en un dispositivo con 8 gigabytes de RAM. Para tener una idea de ello, prueba usando Lama 2, un modelo más antiguo que se ajusta a 8 gigabytes de RAM. Asegúrate de agregar crédito a tu cuenta de OpenAI para evitar exceder tu cuota actual.
Pero antes, ¿qué otras alternativas gratuitas recomiendas además de OpenAI? Me resulta difícil encontrar una adecuada con una máquina de 8 GB de RAM. Entonces, lo que realmente puedes hacer es que OpenAI no es realmente gratuito en este momento. Tienes que pagar según lo que uses. Así que no te dejes engañar por eso. Pero en base a mi experiencia, el modelo Lama de Meta es gratuito y puedes alojarlo. Puedes ejecutarlo en un dispositivo. Si solo tienes 8 gigabytes de RAM, esto será un poco complicado para la última versión. Pero creo que Lama 2, que es un modelo más antiguo, se puede ajustar a 8 gigas de RAM. Creo que es algo así como 2 o 3 gigas, el modelo en sí. Así que puedes probar eso para tener una idea al menos. Así que excediste tu cuota actual. Sí, tienes que, Alexei, tienes que agregar crédito a tu cuenta de OpenAI. Genial. Muchas gracias por tus preguntas.
Configuración del Backend y la Interfaz de Pruebas
Tenemos la tienda de vectores, la base de datos de vectores y un servidor local configurados. Descomentaremos el código e imprimiremos algo para verificar si todo funciona correctamente. Podemos utilizar la interfaz de pruebas para enviar solicitudes al servidor local.
Ahora, volvamos al code en sí. Entonces, lo que estamos hablando aquí es de la tienda de vectores. En realidad, tenemos la database de vectores y la tienda de vectores en su lugar. Ahora queremos tener un backend con el que podamos chatear con nuestros usuarios. OpenAI. Entonces, lo que vamos a hacer aquí es descomentar el code siempre y cuando lo entendamos. No olvides que aquí tengo el servidor local que podemos probar. Entonces, lo que voy a hacer aquí es, para empezar, voy a imprimir algo para ver que todo funciona correctamente. Lo guardo. Ya puedo ver que Genisio detectó la modificación. Y lo que puedo hacer aquí es abrir esta interfaz de testing, que es básicamente como un cliente de correo donde puedo enviar solicitudes a mi servidor local. Y mi descripción es ingeniero full-stack apasionado por la AI generativa. Y simplemente voy a hacer clic en enviar. En este momento, mi aplicación no está haciendo nada.
Conexión a la Base de Datos y Recuperación de Contexto
Nos conectamos a la base de datos y creamos un objeto de almacenamiento de vectores. El almacenamiento de vectores nos permite recuperar contexto relevante utilizando una búsqueda de similitud basada en palabras clave. Podemos registrar el contexto y dividirlo para ver los datos extraídos. Al aumentar el número de fragmentos, obtenemos más datos relacionados con la IA generativa y filtramos la información irrelevante de los datos propietarios.
Volvamos aquí. ¿Qué es... Lo primero que quiero hacer es conectarme y abrir la base de datos. Así que quiero conectarme a ella. Recuerda que esto solo lee un archivo local y quiero abrir la tabla de vectores.
Luego voy a... En realidad, voy a crear el objeto de almacenamiento de vectores. Y esto va a ser importante porque este almacenamiento de vectores va a ayudarme a recuperar el contexto importante aquí. Y ahora veamos exactamente a qué me refiero con esto.
Este almacenamiento de vectores es capaz de realizar una búsqueda de similitud. Eso significa que puedo pegar algunas palabras clave aquí. Por ejemplo, puedo poner IA generativa. Y luego puedo decirle el número de fragmentos de datos relevantes que quiero extraer de la propia base de datos. Solo para probarlo, voy a poner aquí uno. Esto me dará la primera oración y la oración más importante relacionada con la IA generativa, especialmente estas palabras clave.
Lo que voy a hacer aquí es registrar el contexto y registrar el fragmento. Así que... Esto va a registrar los primeros 100 caracteres del fragmento. Y ahora que hice esto, enviemos otra solicitud aquí para ver el registro de la consola, los registros. Así que, comenzando, estoy recuperando algo de datos que lo toma. Esta es la fuente. Las líneas son de las líneas 200 y algo. Y el contexto en sí es Goran, lo que sea, es el CTO y cofundador de Synthetic AI, una empresa startup. Básicamente, seleccionó el concepto de IA y coincidió con la primera oración relevante de ella.
Ahora, si aumento estos números, obtendré más datos relacionados con la IA generativa. Así que probemos con cinco. Vamos... Genial. Y ahora podemos echar un vistazo y ver que tenemos más oraciones sobre la IA generativa, pero no tenemos otras oraciones sobre otras charlas o otros oradores que no estén relacionados con la IA generativa. Así que estamos filtrando información de los datos propietarios que en realidad no necesitamos.
Creación de una Pregunta y Definición del Modelo
Queremos un recuperador que nos ayude a obtener datos del almacén de vectores. Creamos una pregunta para que OpenAI nos proporcione los tres mejores oradores basados en nuestra descripción e intereses. Podemos instruir al modelo para que responda como un objeto JSON, lo que nos permite integrar las respuestas de OpenAI en casos de uso programáticos. Definimos el modelo como GPT-40 y ajustamos la temperatura para garantizar respuestas precisas.
Esto fue solo por razones de debugging. Realmente no tienes que hacer esto en la propia aplicación. Solo quería que entendieras lo que puede hacer una database de vectores.
Ahora realmente queremos algún tipo de recuperador. Este será el objeto que nos ayudará a obtener cosas del almacén de vectores. Entonces, K es un número de documentos de contexto. Básicamente, son los números de fragmentos que quiero. El tipo de búsqueda es similitud, y lo voy a usar en modo verbose para ver todo y poder debug y entender los conceptos.
Ahora, lo que podemos hacer a continuación es crear la pregunta y toda la cadena con ella. Así que voy a, déjame solo, genial. Déjame descomentar todo. Y comencemos con la pregunta porque tiene mucho sentido. La pregunta aquí es lo que voy a darle a OpenAI en primer lugar. Les estoy indicando que su tarea es darme los tres mejores oradores que debería ver en la conferencia según mi descripción y mis intereses. Otra información interesante aquí es la siguiente.
En realidad, puedo instruir al propio modelo para que responda como un objeto JSON. Y le voy a dar una estructura. La estructura es una lista de oradores con el campo orador y la razón por la que lo eligió para mí. Y esto es genial porque ahora podemos integrar las respuestas de OpenAI en casos de uso programáticos. Estoy 100% seguro de que me dará un objeto JSON para poder analizarlo e integrarlo en mi UI o en otros microservicios y demás. Esto es lo que hará por mí. El objeto JSON.
Y aquí, otra información muy importante. Le voy a dar el contexto. Debajo de este contexto, cuando construya la pregunta, este contexto se reemplazará con los datos data propietarios que acabo de obtener del database de vectores. Y luego agregaré el mensaje humano que básicamente es solo mi descripción. Este signo de interrogación se reemplazará por mis intereses. Entonces, lo que sucede a continuación es que voy a definir el propio modelo que es GPT-40 porque es el más reciente y el más preciso y rápido. Y lo que voy a hacer en realidad es ajustar esta temperatura porque quiero que el modelo sea lo más preciso posible y no alucine ni me dé mensajes sorprendentes. Entonces, si la temperatura es muy baja, si le hago la misma pregunta a chat-GPT una y otra vez, obtendré más o menos la misma respuesta.
Creación de la Cadena y Sanitización de la Respuesta
Quiero preguntas y respuestas basadas en hechos, por lo que usaré una temperatura baja. La salida será una cadena simple. Crearé una cadena para recuperar el contexto, ingresarlo en la solicitud, dárselo al modelo y obtener la respuesta como una cadena. Sanitizo la respuesta eliminando las comillas triples invertidas y la analizo para asegurar el tipo esperado. Defino los tipos para la lista de recomendaciones con orador y razón, y lo registro y devuelvo para realizar pruebas.
No será creativo en absoluto. Y esto es lo que realmente quiero con preguntas y respuestas basadas en hechos. Entonces, si tengo hechos, quiero una temperatura baja. Si quiero creatividad sobre escritura o cosas así, querría una temperatura alta. Pasemos al siguiente paso. Esto es muy sencillo. También quiero una salida. La salida será simplemente una cadena simple. Y luego puedo hacer la parte principal de esta aplicación, que es crear la cadena que hará lo siguiente. Recuperará el contexto y lo ingresará en la solicitud como contexto. Lo dará al modelo y luego me dará la respuesta como una cadena. Básicamente, esto se puede ver como una sola línea o como una cadena de tareas para crear la solicitud y dársela al modelo. Luego puedo invocar esta cadena y obtendré una respuesta sin procesar. Lo que debes tener en cuenta es que OpenAI responderá de esta manera con comillas triples invertidas y el contenido, que será un JSON, pero porque se lo indiqué así, y luego tendrá comillas triples invertidas nuevamente al final. Entonces, básicamente, lo que estoy haciendo aquí es un poco de sanitización y limpieza.
Sanitización de la Respuesta y Recomendación de Oradores
Reemplazo las comillas triples invertidas en la respuesta para asegurar el tipo correcto. La lista de recomendaciones contiene el orador y la razón. La registro y la devuelvo para realizar pruebas. Durante las masterclass en vivo, pueden ocurrir pequeños errores. Después de volver a abrirlo, chat-GPT responde con la respuesta. El JSON contiene oradores reales. Chat-GPT proporcionó una charla relevante sobre IA generativa. Si pregunto sobre código abierto, devuelve diferentes oradores.
Así que simplemente voy a reemplazar estas comillas triples invertidas por nada porque realmente no quiero que estén en mi salida, porque quiero poder analizar la respuesta y tener un tipo real y asegurarme de que este sea el tipo que estoy esperando. Si observamos esta lista de recomendaciones, podemos ver aquí arriba que he definido mis tipos, que es una recomendación que tiene el orador y la razón que solicité. Y será una lista de tales tipos. Ahora puedo simplemente registrarla y también la devolveré para ver algo relevante cuando la probemos. Guardé todo. Ya vemos que podemos hacer solicitudes. Vuelvo a la interfaz de testing aquí. Está bien, acabo de ver que en el chat no hay ninguna pregunta y en realidad enviaré esta clase no encontrada. Esto no es bueno. Permítanme simplemente volver a abrir esto. Esto es lo que sucede con las masterclass en vivo y las demostraciones. Probé esto antes de la demostración, como tres o cuatro veces, todo salió sin problemas y correctamente desde la primera vez, y ahora, porque es en vivo, también me está dando un pequeño error. Así que permítanme actualizar esto e intentarlo de nuevo. Ahora obviamente hace algo. Esperamos un poco porque chat-GPT tarda un poco en responder porque tiene que analizar los datos. Y ahora podemos ver la respuesta en sí. Como prometí, esto es un JSON, una lista de oradores y razones, y podemos verificar realmente si chat-GPT alucinó aquí y estas personas nunca existieron. Volvamos al festival C3 aquí y veamos esto. Y podemos ver que es una persona real y está hablando de Star Wars. Permítanme verificar si tiene algo sobre AI aquí. Sí. El droide puede realizar AI, aprender sobre Azure AI. Básicamente, chat-GPT realmente me dio una charla relevante a la que debería asistir porque estoy interesado en la IA generativa. También podemos hacer aquí una pregunta sobre código abierto y podemos intentarlo nuevamente.
Creación de una Aplicación de Extremo a Extremo con Genesio
Se nos presentan nuevos oradores sobre temas de código abierto. Necesitamos verificar su existencia y descripciones. Nuestro trabajo aún no ha terminado. Debemos crear una aplicación de extremo a extremo. Genesio genera un SDK para importar el servicio backend como una dependencia en el frontend. El IDE autocompleta y proporciona una comunicación segura en cuanto a tipos.
Y espero que nos den nuevos oradores que hablen sobre código abierto y cosas así. Como pueden ver, ya nos están dando diferentes oradores. Tomemos este nombre y verifiquemos si realmente existe. Permítanme. Sí. Y probablemente, si nos fijamos en la descripción en sí, vamos a ver algo sobre código abierto o tal vez solo source.
Nada aquí. Bueno, supongo que probablemente se dio cuenta de que trabaja con GitHub, y eso significa que de alguna manera está relacionado con cosas de código abierto. Pero nuestro trabajo aún no ha terminado. Lo que realmente tenemos que hacer, como prometí al comienzo de la masterclass, es tener una aplicación de extremo a extremo, y esto es solo el lado backend. Tenemos la interfaz de testing aquí, pero solo estamos haciendo solicitudes sin una UI. Así que echemos un vistazo a la UI en sí. Lo que es bastante genial aquí acerca de Genesio es que si echamos un vistazo aquí, desafortunadamente, tengo que instalar las dependencias nuevamente. Solo un momento. npm install aquí, para instalar todo. Solo un momento.
Si tienen alguna otra pregunta o curiosidad, estaré encantado de responder. Simplemente escríbanlas en el chat. Bien, ya sé qué está sucediendo. Voy a iniciar el entorno local una vez más. Creo que esto se debe a que de alguna manera no puede encontrar React. Veremos en un momento por qué sucede esto, y veremos si podemos implementar sin esto. Pero aún así, lo que realmente quería mostrarles es que Genesio está generando un SDK a partir de su servicio backend. Entonces, básicamente, lo que puedo hacer es importar el servicio backend como si fuera una dependencia en este frontend. Esencialmente, lo que puedo hacer es simplemente llamar a los métodos aquí como si fueran parte de mi backend, como si fueran locales. Pero en realidad, no son realmente locales. Están implementados en algún lugar, y puedo llamarlos muy fácilmente. Y si solo echamos un vistazo aquí, podemos ver que el propio IDE va a autocompletar todo por nosotros. Y si paso el cursor, vemos que ask recibe un argumento, y este argumento es de tipo descripción de usuario. Entonces, en realidad, Genesio nos ayuda a tener una comunicación de extremo a extremo segura en cuanto a tipos.
Despliegue de la Aplicación y Resumen
Puedo evitar muchos errores seguros de tipo utilizando el objeto de tipo descripción de usuario. El despliegue de la aplicación implica instalar dependencias, cargar el servicio backend, crear y publicar el SDK, y construir el frontend. Podemos importar el SDK en cualquier frontend y acceder al servicio backend. La aplicación es una recomendación personalizada de oradores que recupera información relevante de una base de datos vectorial, la agrega a un mensaje y utiliza un modelo de OpenAI para proporcionar oradores y un resumen de las charlas.
Básicamente, no se me permite poner aquí nada más que el objeto de tipo descripción de usuario. Así que puedo poner aquí descripción de usuario, y ya podemos ver que esto está subrayado en rojo. Por lo tanto, esto no se puede asignar a un parámetro de tipo descripción de usuario. Con esta función, en realidad puedo evitar muchos errores seguros de tipo. Básicamente, esto me va a evitar algunos dolores de cabeza. Así de simple es llamar al servicio backend que acabamos de escribir. Y ahora veamos, aunque esta aplicación está tan en rojo y realmente no entiendo por qué, si podemos simplemente implementarla. Vamos a ejecutar Genesio deploy. Esto va a instalar las dependencias tanto del backend como del frontend. Y vamos a esperar un poco aquí. Una vez que esté empaquetando nuestro code, tengan paciencia, porque genial. Cargó el servicio backend. Así que empaquetó el code. Lo cargó en el proveedor de cloud. Creó y publicó el SDK en un registro de NPM. Ahora mismo, podemos importarlo en cualquier frontend. Y ahora está construyendo el frontend, y aquí se nos dan dos URL. La primera URL, si navegamos a ella, podemos ver que es un panel de control donde podemos ver los componentes de nuestro proyecto. Así que podemos ver que el servicio backend se implementó hace unos segundos. Y podemos ver que la clave de la API de OpenAI está configurada y es secreta. Y podemos echar un vistazo a los dominios. Estos dominios son básicamente, esta es la aplicación de extremo a extremo. Así que ahora mismo, esta es la aplicación de React que he codificado, y podemos decirle Soy un ingeniero full-stack interesado en el backend y en cosas nativas de la nube. Quiero probar muchas solicitudes para ver qué se me va a dar. Así que voy a enviar, y ahora mismo, lo que espero es obtener los tres oradores.
Nuevamente, Bassem apareció más tarde, antes, y aquí tengo la aplicación de extremo a extremo. No profundicé demasiado en el React en sí, porque básicamente son solo divs, botones, y un formulario de entrada que está aquí. Así que quería mostrarles el resultado final. Básicamente, para resumir, lo que tenemos aquí es una recomendación personalizada de oradores que va a recuperar la información relevante sobre nuestros intereses de una base de datos vectorial, la va a agregar a un mensaje y junto con nuestra pregunta de `dame los tres oradores`, los tres principales oradores y charlas, la va a pasar a un modelo de OpenAI, y el modelo nos va a devolver los oradores, y nos va a dar un resumen de por qué deberíamos asistir a las charlas. En resumen, esta es la aplicación.
Conclusión e Invitación a Mantenerse en Contacto
Puedes utilizar la aplicación como plantilla y comunicarte para cualquier problema o pregunta sobre IA generativa y sin servidor. Por favor, proporciona comentarios para mejorar el masterclass. Gracias por asistir.
Fue bastante sencillo de construir y es de código abierto. En realidad, puedes utilizar esto como plantilla. Si encuentras algún problema, simplemente puedes crear un problema en GitHub o contactarme directamente. Y ahora, me gustaría finalizar este masterclass con una invitación a mantenernos en contacto. Puedes contactarme en cualquier momento con cualquier tipo de pregunta sobre IA generativa o sobre serverless, dos temas sobre los que estoy muy apasionado. Y si tienes dos minutos, estaría muy agradecido si pudieras proporcionar comentarios sobre este masterclass para mejorarlo la próxima vez, o simplemente para decirme qué te gustó o qué te gustaría que se explicara más. Así que puedes hacerlo, solo voy a pegar esto, solo un momento. Voy a pegarlo en el chat mismo. Y por supuesto, por último, también me interesa saber si tienes alguna pregunta al final del masterclass. Sí, claro, puedes echar un vistazo al data de entrenamiento. De hecho, puedo mostrártelo. Así que obtuve el data utilizando algunos scripts de Python. Esto es en realidad el data. Lo que hice fue tomar información de aquí y de aquí, y simplemente lo pegué en un archivo grande. Espero estar respondiendo a tu pregunta, Carl. Este data de entrenamiento, si echas un vistazo al repositorio mismo, está aquí en el servidor, puedes verlo aquí. Porque quería que el repositorio contenga toda la información para que tengas una experiencia de extremo a extremo. Así que puedes implementar todo fácilmente, y con Genies, tu implementación estará disponible públicamente, y puedes probar y jugar con ello. De acuerdo, muchas gracias. Si no tienes ninguna otra pregunta, espero que tengas un buen día, al final del día, y realmente espero que escribas tu propia aplicación LLM y envoltorios, y veamos estas nuevas capacidades de AI en acción, incorporemos en nuestro trabajo para hacerlo más fácil y productivo. Muchas gracias por venir.
Comments