Adaptando proyectos existentes de LLM para usar LangChain

'Adapting existing LLM projects to use LangChain'

Refactorizando las llamadas de OpenAI en algo más poderoso con LangChain

Foto de JJ Ying en Unsplash

¡Felicitaciones! Tienes un concepto de prueba de concepto (LLM) funcional del que te sientes orgulloso y listo para mostrar al mundo. Tal vez hayas utilizado la biblioteca de OpenAI directamente o tal vez estés utilizando un modelo de fundamento diferente y los transformadores de HuggingFace. De cualquier manera, has trabajado duro y estás buscando el siguiente paso. Esto podría significar refactorizar el código, agregar soporte para múltiples modelos de fundamento o agregar funcionalidades más avanzadas como agentes o base de datos vectoriales. Aquí es donde entra en juego LangChain.

LangChain es un marco de código abierto para trabajar con LLMs y desarrollar aplicaciones sobre ellos. Tiene versiones tanto en Python como en JavaScript y admite múltiples modelos de fundamento y proveedores de LLM. También tiene varias funciones de utilidad para manejar tareas comunes como dividir documentos o interactuar con bases de datos vectoriales. ¿Convencido de que vale la pena echarle un vistazo? Echa un vistazo a este excelente artículo, que es un gran punto de partida para comprender qué es posible:

Comenzando con LangChain: Guía para principiantes sobre cómo crear aplicaciones impulsadas por LLM

Un tutorial de LangChain para crear cualquier cosa con grandes modelos de lenguaje en Python

towardsdatascience.com

Este artículo no se centrará en el desarrollo desde cero, sino más bien en refactorizar una aplicación existente. También asumirá cierto conocimiento básico de LangChain, pero habrá enlaces a documentación relevante. Específicamente, voy a analizar la refactorización de un proyecto que escribí llamado AdventureGPT, un agente autónomo para jugar el juego de aventuras basado en texto Colossal Cave Adventure de 1977. Si estás interesado en aprender más sobre ese proyecto, echa un vistazo a mi artículo anterior al respecto:

AdventureGPT: Uso de agentes respaldados por LLM para jugar juegos de aventuras basados en texto

betterprogramming.pub

Había varias áreas en las que estaba especialmente interesado en refactorizar:

  1. Utilizar cadenas en lugar de llamadas directas a OpenAI
  2. Reemplazar utilidades de documentos personalizadas por el manejo de documentos/datos de LangChain

Cada una de estas se abordará a su debido tiempo.

Comencemos con qué es una cadena. Una cadena es un método para combinar varias técnicas de manipulación de indicaciones en una sola unidad que resulta en una única llamada al modelo de fundamento. Una vez que tienes una cadena funcional, las cadenas se pueden combinar y utilizar juntas para lograr tareas más complejas.

LangChain ofrece varios tipos de cadenas, este artículo se centra en LLMChain y ConversationChain. LLMChain es el tipo más simple de cadena, combina plantillas de indicaciones con los objetos LLM que LangChain admite. ConversationChain ofrece flujos de trabajo conversacionales personalizados, como chatbots. Una de las características principales de ConversationChain es su capacidad para incluir memoria y almacenar partes anteriores de la conversación sin esfuerzo en la indicación.

Las plantillas de indicaciones son una de las características más poderosas de LangChain, te permiten incluir variables dentro de las indicaciones. Cuando completas esta tarea manualmente, puedes usar f-strings combinados con concatenación de cadenas y un uso cuidadoso de los métodos __repr__ personalizados para tomar tus datos e insertarlos en una indicación para un modelo de fundamento. Con la plantilla de indicación, puedes formatear una cadena escapando las variables con corchetes. Eso es todo lo que tienes que hacer.

Dependiendo del tipo de cadena que estés creando, algunas variables se establecen automáticamente por defecto, como el historial de conversación o la entrada del usuario. Esto puede agregar cierta complejidad. En una indicación conversacional tradicional, hay mensajes del sistema, del asistente de IA y del usuario o humano. Al escribir indicaciones a mano, utilizas etiquetas como “Sistema”, “Humano” y “IA” para etiquetar cada uno de estos mensajes en la indicación. LangChain puede encargarse de esto por ti, permitiéndote usar el método ChatPromptTemplate from_messages para especificar cada mensaje como una lista de objetos, lo que permite un nivel más alto de abstracción e inclusión automática e formato del historial.

Todo este poder tiene un costo de complejidad. En lugar de simplemente adaptar las indicaciones con texto, uno debe leer la extensa documentación y posiblemente extender el código existente para adaptarlo a un caso de uso específico. Por ejemplo, las indicaciones conversacionales tienden a incluir únicamente la entrada del usuario y el historial de conversación como variables. Sin embargo, yo quería incluir contexto adicional del juego en mi indicación para mi PlayerAgent, que era responsable de interactuar con el mundo del juego. Después de agregar las variables adicionales a mi indicación, me encontré con el siguiente error:

Tengo variables de entrada inesperadas en el prompt. El prompt espera ['completed_tasks', 'input', 'history', 'objective'], pero se recibieron ['history'] como entradas desde la memoria, y "input" como la clave de entrada normal. (type=value_error)

Hice algunas investigaciones y encontré un problema existente en GitHub que describe exactamente el problema que estaba teniendo, pero sin una solución clara. Sin desanimarme, examiné el código fuente de la clase ConversationChain y vi que había un método específico utilizado para validar que solo se pasaran las variables esperadas como entrada. Creé una nueva clase que hereda de la clase original y anulé el método. Con mi clase CustomConversationChain en mano, luego necesitaba especificar qué variable debería ser utilizada por el ConversationalMemoryBuffer para la entrada del usuario (o en mi caso, del juego) ya que había varias variables de entrada. Esto fue lo suficientemente simple a través de la variable de instancia input_key y listo, todo funcionó.

Una vez que terminé de convertir mis llamadas a OpenAI en cadenas, era hora de abordar la forma en que estaba manejando la ingestión de documentos. Como parte de mi ciclo de juego, aceptaba una ruta hacia un texto de guía que luego se convertiría en tareas de juego que debían completarse por el PlayerAgent. Cuando agregué esta funcionalidad por primera vez, simplemente pasé toda la guía al prompt y esperé lo mejor. A medida que encontré guías más sofisticadas, eso ya no era posible, ya que la longitud de las guías excedía la ventana de contexto que OpenAI permitía para ChatGPT. Por lo tanto, corté el texto en fragmentos de 500 tokens y ejecuté el prompt para convertir las guías en tareas de juego varias veces.

Cuando dije que dividí el texto en alrededor de 500 tokens, lo hice de manera muy rudimentaria, confiando en el método split de Python para tokenizar el texto (una aproximación muy aproximada que no coincide con la forma en que la mayoría de los LLM tokenizan el texto) y luego convertí la matriz de tokens nuevamente en una cadena a través del método join, también de la clase String. Si bien esto funciona, LangChain ofrece soluciones mejores.

LangChain es capaz de dividir el texto de varias formas diferentes. La más relevante para la mayoría de las personas es por token, ya que conserva el flujo del documento. Hay una página completa de documentación aquí dedicada a los diferentes métodos de división de textos por token. Se admiten varias bibliotecas de procesamiento del lenguaje natural (NLP) para la tokenización, pero elegí la solución nativa de LLM llamada tiktoken, que es el primer método descrito. Solo fueron unas pocas líneas de código para dividir el texto de manera más efectiva mientras se conserva el espacio en blanco.

Esto solo raspa la superficie de la preparación de documentos que LangChain es capaz de hacer. También es capaz de convertir los fragmentos de texto en una incrustación de texto adecuada para almacenarla en una base de datos vectorial y posteriormente recuperarla e incluirla en el prompt. Planeo hacer esto en el futuro de mi proyecto, incluyendo un fragmento relevante de una guía suministrada para el PlayerAgent.

LangChain es un poderoso framework de código abierto que ofrece una variedad de características y funciones de utilidad para trabajar con LLMs y desarrollar aplicaciones sobre ellos. Ya sea que estés utilizando la biblioteca de OpenAI o un modelo base diferente, LangChain brinda soporte para múltiples modelos base y proveedores de LLM, lo que lo convierte en una elección versátil para tus proyectos.

Aunque LangChain puede introducir cierta complejidad en comparación con la gestión de prompt en bruto, ofrece numerosos beneficios y simplifica la interacción con LLMs. Estandariza el proceso y proporciona herramientas útiles para mejorar tus prompts y maximizar el potencial de tu LLM elegido.

Si estás interesado en ver cómo se puede implementar LangChain en un proyecto real, puedes consultar el código actualizado de AdventureGPT, que utiliza LangChain para refactorizar y mejorar la aplicación existente.

GitHub – oaguy1/AdventureGPT en langchain

Contribuye al desarrollo de oaguy1/AdventureGPT creando una cuenta en GitHub.

github.com

En general, LangChain es un recurso valioso para los desarrolladores que trabajan con LLMs, proporcionando un marco integral y una amplia gama de funcionalidades para mejorar las aplicaciones impulsadas por LLM. ¡Explora LangChain y desbloquea todo el potencial de tus proyectos de LLM!

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Un nuevo conjunto de datos de imágenes del Ártico impulsará la investigación en inteligencia artificial

El conjunto de datos, recopilado como parte de una misión científica de la Guardia Costera de Estados Unidos, se publ...

Inteligencia Artificial

Cómo la IA está ayudando a los clientes a comprar mejor en Amazon

Las reseñas de los clientes se han convertido en la piedra angular de las compras en línea, empoderando a los comprad...

Inteligencia Artificial

Predicciones en tiempo real de aglomeraciones para los viajeros en tren

Los viajeros en los Ferrocarriles Holandeses pueden utilizar la aplicación de la agencia ferroviaria holandesa para p...

Inteligencia Artificial

Investigadores de Stanford presentan BLASTNet el primer conjunto de datos de aprendizaje automático grande para la dinámica fundamental de fluidos

Investigadores de Stanford presentaron un avance revolucionario llamado BLASTNet, anunciando una nueva era en la diná...