paint-brush
¿Quieres aprender Warhammer 40K? Cree este chatbot con vectores y RAG en hardware básicoby@datastax
521
521

¿Quieres aprender Warhammer 40K? Cree este chatbot con vectores y RAG en hardware básico

DataStax11m2024/02/26
Read on Terminal Reader

Conozca un método simple para combinar almacenes de vectores, búsqueda léxica e ingeniería rápida para realizar RAG preciso en hardware básico.
featured image - ¿Quieres aprender Warhammer 40K? Cree este chatbot con vectores y RAG en hardware básico
DataStax HackerNoon profile picture
0-item


Al crear una aplicación de IA generativa que necesita llamar a un modelo de lenguaje grande (LLM) varias veces para completar una tarea, un problema común es que las consultas repetidas al LLM pueden ser costosas e impredecibles. Los modelos grandes como GPT-3.5/4 consumen muchísimos recursos para entrenar y ejecutar inferencias; esto se refleja en los cargos de API, así como en interrupciones ocasionales del servicio. ChatGPT se lanzó originalmente como una vista previa de investigación y no estaba destinado a ser utilizado en aplicaciones de producción. Sin embargo, su utilidad en una amplia gama de aplicaciones es indiscutible, por lo que el interés en los LLM se ha disparado.


Desde el inicio de ChatGPT, los usuarios han estado buscando formas de solucionar la falta de privacidad y la incapacidad de controlar el tiempo de actividad o la configuración de inferencia al usar GPT. Esto ha llevado a la popularidad de modelos públicos y gratuitos como Meta's Llama 2 y, más tarde, a la creación de versiones cuantificadas y de parámetros más bajos de Llama que pueden ejecutarse en hardware de consumo. Estos modelos públicos son capaces de proporcionar gran parte de la misma funcionalidad que GPT con mucha menos potencia informática, aunque a costa de menos parámetros y menos resultados detallados.


Si su aplicación no depende necesariamente del procesamiento de contextos excesivamente grandes o de la producción de resultados detallados, entonces alojar su propia inferencia en las instancias que controla puede ser una opción más rentable. Y cuando se trata de aplicaciones del mundo real de generación aumentada de recuperación (RAG), las diferencias de costos pueden volverse aún más significativas.


Demostraré un método simple para combinar almacenes de vectores, búsqueda léxica e ingeniería rápida para realizar RAG preciso en hardware básico. Con este método, puede reducir la complejidad de grandes volúmenes de información y hacer que la ejecución de aplicaciones de IA generativa sea más precisa, eficiente y rentable a escala. Al utilizar RAG en almacenes de información específicos, puede obtener la capacidad de eliminar alucinaciones y crear agentes efectivos y bien informados a partir de cualquier material fuente sin necesidad de pagar API de terceros.


Para comenzar, necesitará una instancia de DataStax Enterprise 7 o DataStax Astra DB para almacenar los vectores y datos de texto, así como un LLM y un modelo de transformador de oraciones para generar respuestas y codificar sus datos con vectores. Dependiendo de la complejidad de sus datos o de las indicaciones del usuario, también puede considerar combinar esto con una base de datos DataStax Enterprise 6.8 que pueda realizar búsquedas Solr para hacer coincidir rangos más amplios de datos, que es lo que usé en este ejemplo. DataStax trabaja continuamente en mejoras para permitir todas estas operaciones con una sola base de datos, pero por ahora uso dos bases de datos.


Resolviendo las alucinaciones

Independientemente del LLM que elijas, todos siguen sufriendo alucinaciones . Por ahora, esa limitación debe resolverse aportando información veraz en el contexto de las indicaciones del LLM, también conocido como RAG. El método mediante el cual localiza su información y la transforma para las indicaciones depende completamente de su modelo de datos, pero puede encontrar información más pertinente de una manera más eficiente utilizando bases de datos vectoriales.


Digamos, por ejemplo, que tienes una colección de libros electrónicos sobre un tema que te gustaría explorar, como por ejemplo cómo jugar a Warhammer 40,000 . En circunstancias normales, se necesitarían años para leer la literatura de respaldo y adquirir suficiente experiencia de juego para alcanzar un nivel experto.

Una pregunta específica como: "¿Qué puedes decirme sobre Morvenn Vahl de Adepta Sororitas?" La mejor respuesta sería un jugador veterano o cualquier empleado de una tienda de Warhammer. Si bien ChatGPT puede responder muchas preguntas sobre el juego, lamentablemente no tiene datos de entrenamiento que cubran este personaje en particular:

Compare esto con un LLM de parámetro Llama 2 13B alojado en una estación de trabajo de consumo con una tarjeta gráfica Nvidia RTX A4000. De manera similar, el modelo puede demostrar conocimientos básicos del universo de Warhammer, pero debido a la puesta a punto, al modelo no le importa que no se encuentre al personaje y, en cambio, proporciona una alucinación del mejor esfuerzo:

Si desea crear un chatbot que pueda ayudar tanto a los recién llegados como a los veteranos a jugar Warhammer 40,000, entonces estos resultados son inaceptables. Para ser una guía de juego eficaz, el chatbot necesita conocer las reglas del juego, las reglas de cada unidad, algunos fragmentos de la historia y algo de estrategia y comentarios. Afortunadamente, toda esa información sobre las reglas de la décima edición está disponible de forma gratuita en Games Workshop y en los sitios web de fans, y todo lo que necesitas hacer es permitir búsquedas en tu aplicación de chatbot.


Compare esto con el mismo modelo 13B Llama, donde con RAG, se le pide comparar un par de fuentes sobre Morvenn Vahl y diseñar una respuesta relevante basada en la pregunta del usuario. En esta ocasión, el chatbot tiene acceso a una base de datos de búsqueda y a una base de datos vectorial repleta de toda la información pública sobre cómo jugar a Warhammer 40,000, 10ª Edición:

¡Que diferencia! No solo encuentra información pertinente sobre este personaje de nicho, sino que también mantiene sus resultados en línea con el contexto de cómo jugar con las reglas de la décima edición.

La parte más difícil de todo esto es realizar una búsqueda eficaz para encontrar las páginas relevantes para incluir en el LLM. Aquí es donde las bases de datos vectoriales pueden resultar particularmente útiles.

Aplicando vectores

En este ejemplo, usaremos DSE 7 y DSE 6.8 ejecutándose en instancias de Docker para satisfacer los requisitos de la base de datos de la aplicación chatbot, que debe poder comparar vectores y realizar búsquedas léxicas. DSE 7 y Astra DB han introducido la capacidad de almacenar vectores y realizar búsquedas de vectores, así como filtrar por coincidencias de texto. Solo necesitamos buscar este ejemplo en unas pocas docenas de libros, por lo que ejecutar instancias de DSE en Docker será suficiente para la mayoría del hardware de consumo.


El uso de vectores en sus bases de datos le ayudará a encontrar documentos que sean similares a una consulta determinada, o pueden usarse para comparar resultados obtenidos de otra búsqueda. Esto puede ayudarle a superar las limitaciones de la búsqueda léxica y mejorar la eficacia de los modelos de datos.


Por ejemplo, algo como los archivos PDF de libros electrónicos puede beneficiarse de estar codificados con transformadores de oraciones como miniLM , y los vectores se pueden usar para ejecutar una comparación de similitud entre una consulta y una fuente determinada. En este caso, se utiliza un modelo de transformador de oraciones para crear incrustaciones del texto de una página en un libro electrónico, y esto puede permitirle comparar con la solicitud del usuario para determinar si un resultado es relevante para la consulta. Las páginas relevantes deben contener una o más instancias de términos que sean similares a la consulta del usuario y que den como resultado mejores puntuaciones de similitud desde el punto de vista del modelo.


Dicho esto, los vectores se aplican mejor como complemento de un modelo de búsqueda léxico existente. Si busca únicamente por vectores, es posible que termine recuperando inesperadamente documentos no relacionados y proporcionándolos como contexto donde no se aplican.

En este ejemplo, la consulta "¿Qué puedes decirme sobre Morvenn Vahl de Adepta Sororitas?" Un LLM puede transformarlo en un conjunto de términos de búsqueda simples:


Morvenn, Vahl, Adepta, Sororitas


El primer paso para encontrar documentos relevantes sería buscar documentos que contengan esos términos básicos. Esto se puede hacer filtrando primero las coincidencias de texto en la base de datos para encontrar palabras clave en el texto de la página que coincidan con dicha consulta. La razón para utilizar un LLM para generar palabras clave es proporcionar una gama más amplia de palabras clave posibles para buscar, ya que a menudo intenta agregar más palabras clave que están relacionadas pero que no están en el texto del mensaje original. Sin embargo, tenga cuidado con esto, ya que los LLM también pueden generar caracteres especiales y secuencias extrañas que deberá desinfectar.


Una vez que tenga al menos un resultado, puede vectorizar la consulta del usuario y compararla con los vectores de la búsqueda léxica, creando puntuaciones de qué tan relevante es cada resultado. Esto le permite verificar la precisión de los resultados de la búsqueda y establecer un umbral para rechazar resultados no relacionados cuando se trata de presentar finalmente sus resultados al LLM.


En este caso, el primer paso debe coincidir con páginas que muestren específicamente la ficha de Morvenn Vahl o la mecánica de juego porque describen la unidad del personaje en términos de cómo se juega en el juego. Si la página alcanza un cierto umbral de relevancia para la consulta del usuario, determinado por la aplicación, se resume y se coloca en una lista de resultados.


Finalmente, los resultados de la búsqueda se pueden compilar en una lista y enviar al LLM, donde se le pide que utilice los contextos más relevantes para responder la consulta original. Aquí hay una visualización del flujo:



Como puede ver, se llama al LLM con bastante frecuencia para este flujo. El LLM es responsable de transformar las indicaciones del usuario en palabras clave, resumir los resultados aplicables y elegir qué contexto responde mejor a una consulta. Cada fuente a verificar agrega otra invocación de LLM, lo que puede resultar bastante costoso al realizar consultas a GPT. Pero si ya tiene la información que necesita y sólo desea resumirla o transformarla, es posible que no necesite utilizar un modelo tan grande. De hecho, cambiar a modelos más pequeños puede aportar una serie de beneficios.


Al utilizar un LLM más pequeño, puede reducir el costo computacional de cada consulta, lo que puede generar ahorros significativos con el tiempo. Esto también puede dar lugar a tiempos de respuesta más rápidos para los usuarios, lo que puede mejorar su experiencia general. En este ejemplo, donde RAG se realiza utilizando un LLM pequeño y bases de datos pequeñas, todas alojadas en la misma instancia de GPU, se necesitan unos 30 segundos para recuperar 15 fuentes, analizar su relevancia y proporcionar una respuesta final. Y cuanto más breves sean las indicaciones (fuentes), más rápido se podrán devolver los resultados.


Además, este método permite una mayor seguridad y escalabilidad. Con una ingeniería rápida y una serie de llamadas al LLM, usted tiene el control total de cómo se accede a los datos y qué obtendrán los usuarios en sus respuestas. En términos de uso de recursos, el modelo de parámetro 13B de ejemplo solo consume un poco más de 8 GB de VRAM y aún proporciona respuestas relevantes. Dependiendo de las necesidades, esto muestra potencial incluso para ejecutar RAG en muchas otras plataformas, como estaciones de trabajo de usuarios y dispositivos móviles.

Controlando la salida

La ingeniería rápida es clave para que RAG haga exactamente lo que usted desea. Usted tiene el control de cómo el chatbot interpreta los datos y el contexto bajo el cual debería pensar. En este ejemplo, queremos asegurarnos de que el chatbot sepa que estamos buscando específicamente información de Warhammer, por lo que primero podemos pedirle que nos ayude a proporcionar un contexto de apoyo a la consulta del usuario:


Consulta: “<consulta de usuario>”

Dame una lista mínima, separada por comas, de palabras clave de Warhammer 40K para un motor de búsqueda. Responda solo con la consulta. No utilices emojis ni caracteres especiales.

Respuesta:


Warhammer 40,000 está lleno de términos y nombres que podrían aparecer en otras culturas populares no relacionadas, por lo que es importante establecer el contexto del RAG en la primera consulta. Este contexto debería estar disponible para seleccionar o modificar si su aplicación cubre múltiples contextos, como si necesita cubrir múltiples ediciones de las reglas del juego Warhammer o combinarlas con los libros de historia oficiales.


Tenga en cuenta que la consulta del usuario siempre está encapsulada entre comillas para este experimento. Esto ayuda al LLM a distinguir entre la consulta que intenta responder directamente y las instrucciones de ingeniería rápidas separadas, que no debe responder directamente. La parte de pregunta/respuesta del mensaje se puede ajustar para adaptarse a un contexto particular, pero principalmente, todo lo que necesita poder hacer es informar al LLM a qué debe y no debe responder directamente y cómo responder.


En este caso, es seguro asumir que el LLM tiene un conocimiento general del universo del juego, ya que la serie es razonablemente popular y la información general está disponible de forma gratuita. El resultado de esta primera consulta ayuda a generar algunas palabras clave para usar en la búsqueda léxica sin que tengamos que crear una hoja de referencia en nuestra aplicación.


Las comparaciones léxicas y vectoriales se pueden realizar en segundo plano y se compila una lista de resultados para que el LLM la revise. Debido a que la pregunta original del usuario nunca se responde directamente con inferencia en el primer paso, el LLM solo transforma lo que se encuentra en una búsqueda y se puede impedir fácilmente que responda consultas fuera de sus barreras de seguridad o base de conocimientos.

Si hay resultados relevantes de la búsqueda:


Consulta: “<consulta de usuario>”

Revise estos resultados de búsqueda y utilícelos para responder la consulta.

Resultado 1

Resultado 2

etc.

Respuesta:


Si no hay resultados relevantes de la búsqueda:


Consulta: “<consulta de usuario>”
Cortésmente dígame que buscó pero no pudo encontrar una respuesta para la consulta. En su lugar, responda lo mejor que sepa.

Respuesta:


Para mayor seguridad, puede rechazar o redirigir completamente la solicitud cuando no se pueda atender.


Consulta: “<consulta de usuario>”

Cortésmente dígame que buscó pero no pudo encontrar una respuesta a la consulta. Indíqueme que me comunique con el equipo de atención al cliente para obtener ayuda.

Respuesta:


Incluso puedes alargar los resultados solicitando más detalles. Siempre que pueda incluir su material fuente dentro de la ventana contextual, el LLM puede transformarlo por usted.


Consulta: “<consulta de usuario>”

Revise estos resultados de búsqueda y utilícelos para responder la consulta. Sea lo más detallado posible y cite las fuentes.

Resultado 1

Resultado 2

etc.

Respuesta:

Limitaciones

El LLM tiene una ventana de contexto limitada y no podrá procesar páginas de texto excepcionalmente grandes. Considere imponer límites al tamaño de las filas para que sus datos sean más manejables y más fáciles de procesar para el LLM. Por ejemplo, cortar páginas en trozos de aproximadamente 1000 caracteres parece funcionar bien y tratar de evitar incluir más de cuatro o cinco respuestas detalladas en el mensaje.


El LLM no recuerda ninguna conversación aparte de lo que puede caber en la ventana de contexto. Es posible crear un almacén permanente de datos de conversaciones, pero no es posible que un LLM incluya conversaciones excesivamente grandes o un contexto detallado en un mensaje; hay un límite superior a lo que puede transformar. Esto significa que pase lo que pase, en cierto momento, notará que el LLM parece "olvidar" ciertos detalles incluso cuando se proporcionan como contexto; esto es sólo una limitación inherente de la herramienta. Es mejor confiar en él sólo para conversaciones breves y centrarse en transformar pequeñas cantidades de texto a la vez para minimizar las alucinaciones.


La aleatoriedad en el LLM puede ser un problema. Será necesario realizar pruebas y ajustes para determinar qué indicaciones funcionan mejor para su conjunto de datos y para encontrar qué modelo funciona mejor para su caso de uso. En mis pruebas con un modelo de parámetros 13B, había mucha imprevisibilidad con respecto a qué palabras clave de búsqueda se generaban desde el primer mensaje, especialmente a medida que aumentaba la longitud del mensaje. Para obtener mejores resultados, siga indicaciones más breves.

Conclusión

En resumen, aprovechar RAG mediante la combinación de modelos de búsqueda léxica y vectorial permite encontrar y clasificar resultados relevantes de manera más efectiva y generar resultados de agentes que son mucho menos propensos a alucinaciones. Cuanto más pequeño sea el contexto de búsqueda, más precisas y exactas serán las respuestas. La creación de su propio canal personalizado de llamadas de LLM ofrece mucha más flexibilidad para ajustar las respuestas hacia el nivel deseado de precisión y barreras de seguridad.


Si bien no puede procesar cantidades excesivamente grandes de datos dentro de una ventana de contexto limitada, sí ofrece la capacidad de crear asistentes efectivos en bases de conocimiento limitadas, así como ejecutar más agentes simultáneos en el mismo o menor hardware que antes. Esto podría abrir más posibilidades para asistentes virtuales para aplicaciones como juegos de mesa o incluso cubrir temas más complejos para uso por parte del gobierno, firmas legales y contables, investigación científica, energía y más.


Si está listo para comenzar a construir, puede probar Astra DB gratis . Cree su base de datos y comience a cargar sus fuentes RAG hoy, sin necesidad de experiencia en operaciones de base de datos o nube.


Por Mario Charnell-Delgado, DataStax


También publicado aquí .