El encadenamiento de instrucciones es un concepto fundamental en la creación de flujos de trabajo avanzados mediante modelos de lenguaje de gran tamaño (LLM). Implica vincular varias instrucciones en una secuencia lógica, donde el resultado de una instrucción sirve como entrada para la siguiente. Este enfoque modular es potente para resolver tareas complejas como el procesamiento de textos en varios pasos, la síntesis, la respuesta a preguntas y mucho más.
LangChain es un marco versátil diseñado para simplificar la creación de dichos flujos de trabajo. Proporciona herramientas para gestionar LLM, como los modelos IBM® Granite o los modelos GPT (transformador generativo preentrenado por sus siglas en inglés) de OpenAI, definir instrucciones personalizadas y conectarlas en cadenas reutilizables. Al abstraer la complejidad de la gestión de instrucciones, LangChain permite a los desarrolladores centrarse en resolver problemas en lugar de orquestar interacciones con LLM.
En este tutorial, vamos a:
LangChain proporciona un potente marco para crear flujos de trabajo modulares en aplicaciones de chatbot. Al combinar instrucciones estructuradas, encadenamiento dinámico e integración avanzada de LLM, permite a los desarrolladores crear pipelines escalables y adaptables que aprovechan las técnicas RAG y ofrecen resultados estructurados como JSON. Así es como LangChain gestiona de manera eficaz el encadenamiento de instrucciones:
Abstracción de instrucciones: LangChain aprovecha from_template para diseñar flujos de trabajo estructurados de entrada/salida para cada paso, lo que facilita la gestión de operaciones complejas de chatbot.
Integración de LLM: el marco se integra de manera fluida con varios LLM, como IBM Granite, OpenAI y Hugging Face, lo que permite el ajuste para tareas personalizadas.
Gestión de cadenas: SequentialChain y SimpleSequentialChain de LangChain permiten flujos de trabajo modulares para pipelines de chatbot, mientras que stroutputparser garantiza resultados estructurados como JSON.
Flujos de trabajo dinámicos: al utilizar herramientas como ConditionalChain y plantillas de systemmessage, LangChain admite flujos de trabajo adaptativos, alineándose con los principios de RAG (generación aumentada por recuperación) para la generación dinámica de contenido.
Al finalizar este tutorial, tendrá un conocimiento sólido sobre cómo utilizar LangChain para crear flujos de trabajo modulares y extensibles para una amplia gama de aplicaciones.
El encadenamiento de instrucciones le permite diseñar flujos de trabajo en los que los resultados de un paso se transfieren al siguiente. Los diferentes tipos de encadenamiento admiten diversos flujos de trabajo, que van desde simples tareas secuenciales hasta procesos más complejos y dinámicos. A continuación, se ofrece una breve descripción de los tipos de encadenamiento de instrucciones:
Encadenamiento secuencial: el tipo de encadenamiento más sencillo, en el que el resultado de una instrucción se pasa directamente como entrada al siguiente. Esta opción es ideal para tareas con una progresión lineal[1].
Encadenamiento ramificado: en el encadenamiento ramificado, un único resultado se divide en varios flujos de trabajo paralelos. Cada rama procesa el resultado de forma independiente [2].
Encadenamiento iterativo: el encadenamiento iterativo implica ejecutar de manera repetida una instrucción o cadena hasta que se cumpla una condición especificada. Esta opción es útil para refinar los resultados[3].
Encadenamiento jerárquico: este tipo divide una tarea grande en subtareas más pequeñas, que se ejecutan jerárquicamente. Los resultados de nivel inferior alimentan las tareas de nivel superior [4].
Encadenamiento condicional: el encadenamiento condicional elige de forma dinámica los próximos pasos en función del resultado de una instrucción anterior. Permite la toma de decisiones dentro de los flujos de trabajo.
Encadenamiento multimodal: el encadenamiento multimodal integra instrucciones que manejan diferentes tipos de datos (por ejemplo, texto, imágenes o audio). Es adecuado para aplicaciones que combinan múltiples modalidades [2].
Encadenamiento dinámico: el encadenamiento dinámico adapta el flujo de trabajo en función de los resultados en tiempo real o de las condiciones cambiantes. Añade flexibilidad al encadenamiento de instrucciones [5].
Encadenamiento recursivo: en el encadenamiento recursivo, las entradas grandes se dividen en fragmentos más pequeños para su procesamiento individual y, a continuación, se combinan los resultados. Es útil para gestionar documentos o conjuntos de datos largos [6].
Encadenamiento inverso: el encadenamiento inverso comienza con un resultado y trabaja hacia atrás para determinar las entradas necesarias para lograrlo. Es ideal para resolver problemas y depurar [5].
Cada tipo de encadenamiento se adapta a casos de uso únicos, por lo que es esencial elegir el adecuado en función de la complejidad y los requisitos de la tarea.
En este flujo de trabajo, procesamos el feedback de los clientes con modelos de chat y prompt engineering para crear un pipeline de procesamiento de texto escalable. Las siguientes etapas del tutorial muestran técnicas de encadenamiento secuencial, ramificado e iterativo impulsadas por IA generativa.
Extracción de palabras clave (encadenamiento secuencial)
Generación de un resumen de sentimientos (encadenamiento ramificado)
Refinamiento del resumen de sentimientos (encadenamiento iterativo)
Resultado final
Este enfoque combina el encadenamiento secuencial, ramificado e iterativo en Python con modelos de chat y prompt engineering. Garantiza un procesamiento sólido del feedback de los clientes, aprovechando la IA generativa para la extracción de palabras clave, el análisis de sentimientos y el refinamiento.
Necesita una cuenta de IBM® Cloud para crear un proyecto watsonx.ai .
Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.
Este paso abre un entorno de notebook en el que puede copiar el código de este tutorial. También puede descargar este notebook en su sistema local y subirlo a su proyecto watsonx.ai como activo. Para ver más tutoriales de Granite, consulte la comunidad de IBM® Granite. Este tutorial también está disponible en GitHub.
Necesitamos bibliotecas para trabajar con el marco LangChain y WatsonxLLM. Primero, instalemos los paquetes necesarios.
Nota: si está utilizando una versión antigua de "pip", puede utilizar el comando"pip install --upgrade pip" para actualizarla. Este paso le ayuda a instalar fácilmente los paquetes más recientes, que pueden no ser compatibles con una versión anterior. Pero si ya está utilizando la última versión o ha actualizado recientemente sus paquetes, puede omitir este comando.
Este bloque de código importa bibliotecas y herramientas esenciales de Python para crear y gestionar una aplicación LLM mediante LangChain e IBM® Watson LLM.
El módulo os se utiliza para acceder a variables de entorno, como credenciales de proyecto o claves API.
WatsonxLLM es un módulo de langchain_ibm que integra IBM Watson LLM para generar resultados a partir de modelos de IA generativa.
PromptTemplate ayuda a crear plantillas reutilizables para instrucciones, lo que garantiza la estructura de entrada y la flexibilidad en el prompt engineering.
LLMChain crea cadenas de tareas individuales mientras
SequencialChain vincula varios pasos en un único flujo de trabajo y "getpass" recupera de forma segura información confidencial (por ejemplo, claves API) sin exponerla en la pantalla.
Este código configura las credenciales para acceder a la API de IBM® Watson Machine Learning (WML) y garantiza que el PROJECT_ID esté correctamente configurado.
Este código inicializa IBM Watson LLM para su uso en la aplicación:
Este paso prepara el LLM de Watson para generar respuestas en el flujo de trabajo.
Este código define plantillas de instrucciones para tres etapas del flujo de trabajo de procesamiento de texto:
Estas instancias de PromptTemplate permiten un prompt engineering reutilizable y estructurado para la aplicación LLM.
Este código define cadenas LLM que conectan las instrucciones con el IBM Watson LLM inicializado, asignando resultados únicos para cada etapa:
Estas instancias de LLMChain permiten la ejecución modular de tareas, lo que facilita un flujo de trabajo de aplicaciones LLM paso a paso.
Este código combina las cadenas definidas anteriormente en un flujo de trabajo secuencial, lo que permite un proceso paso a paso para la entrada de texto. SequentialChain vincula keyword_chain, la sentiment_chain y refine_chain en un orden definido, lo que garantiza que el resultado de una cadena sirva como la entrada para la siguiente. El flujo de trabajo está configurado para aceptar texto como entrada inicial, y el resultado final, un resumen refinado del sentimiento, se almacena bajo la clave "refined_summary". Esta configuración permite una ejecución optimizada y eficiente de la aplicación LLM, lo que garantiza un pipeline de procesamiento coherente y modular.
En este bloque de código, ejecutaremos todo el flujo de trabajo. En primer lugar, tenemos una cadena de feedback multilínea definida como feedback_text, que contiene comentarios de usuario tanto positivos como negativos sobre una aplicación. El método workflow.run procesa el feedback a través de las cadenas secuenciales (extracción de palabras clave, análisis de sentimiento y refinamiento) utilizando la entrada proporcionada. Y el resumen de sentimiento refinado se imprime directamente como resultado final.
RESULTADO
Resumen refinado de sentimientos:
El sentimiento del usuario es predominantemente negativo debido a los bloqueos recurrentes de la aplicación y a los lentos tiempos de respuesta de la atención al cliente, a pesar de que aprecian las características de la aplicación y la atención al cliente útil ocasional. Para mejorar la satisfacción del usuario, el equipo de desarrollo debe centrarse en resolver los bloqueos de la aplicación y agilizar las respuestas de atención al cliente.
El resumen refinado de sentimientos es una evaluación concisa y clara del feedback. Destaca la apreciación del usuario por las características de la aplicación, pero expresa frustración por los bloqueos frecuentes y la lentitud de la atención al cliente, lo que refleja la capacidad del flujo de trabajo para destilar conocimientos críticos de manera efectiva.
Seleccionar el tipo de encadenamiento adecuado para la aplicación LLM implica evaluar factores clave para garantizar la eficiencia y la coherencia:
Complejidad de las tareas: utilice flujos de trabajo ejecutables para tareas con varios pasos. Los ejemplos de pocas tomas o la plantilla de instrucciones de chat pueden ayudar a estructurar tareas complejas que requieren diferentes instrucciones.
Dependencia: si los resultados de un paso son marcadores de posición para la siguiente instrucción, utilice el encadenamiento secuencial. Los analizadores de resultados garantizan una transición fluida de los resultados a entradas estructuradas.
Adaptabilidad: para flujos de trabajo dinámicos, como los que implican agentes de LangChain, el encadenamiento iterativo permite ajustes en tiempo real de los parámetros y las siguientes instrucciones.
Modalidad de datos: elija flujos de trabajo compatibles con diversos tipos de datos. Utilice métodos de embedding para datos de texto y vectoriales o LangChain Expression Language para operaciones flexibles.
Al tener en cuenta estos factores, puede crear una aplicación LLM robusta y adaptable con flujos de trabajo de encadenamiento coherentes.
El encadenamiento de instrucciones es una técnica versátil para crear sofisticados flujos de trabajo de procesamiento del lenguaje natural (PLN). En este tutorial, exploramos varios tipos de encadenamiento y demostramos un ejemplo genérico que integra múltiples enfoques de encadenamiento. Al experimentar con estos métodos, puede desbloquear todo el potencial de los modelos de lenguaje para aplicaciones del mundo real.
[1] Roegiest, A., & Chitta, R. (2024). Answering Questions in Stages: Prompt Chaining for Contract QA.
[2] Ge, J., Luo, H., Qian, S., Gan, Y., Fu, J., & Zhang, S. (2023). Chain of Thought Prompt Tuning in Vision Language Models.
[3] Sun, S., Yuan, R., Cao, Z., Li, W., & Liu, P. (2024). Prompt Chaining or Stepwise Prompt? Refinement in Text Summarization. , 7551-7558. https://arxiv.org/abs/2406.00507.
[4] Huang, Q., Zhu, J., Li, Z., Xing, Z., Wang, C., & Xu, X. (2023). PCR-Chain: Partial Code Reuse Assisted by Hierarchical Chaining of Prompts on Frozen Copilot. 2023 IEEE/ACM 45th International Conference on Software Engineering: Companion Proceedings (ICSE-Companion), 1-5. https://ieeexplore.ieee.org/document/10172550.
[5] Wu, T., Jiang, E., Donsbach, A., Gray, J., Molina, A., Terry, M., & Cai, C. (2022). PromptChainer: Chaining Large Language Model Prompts through Visual Programming. CHI Conference on Human Factors in Computing Systems Extended Abstracts. https://dl.acm.org/doi/10.1145/3491101.3519729.
[6] Trautmann, D. (2023). Large Language Model Prompt Chaining for Long Legal Document Classification. ArXiv, abs/2308.04138. https://arxiv.org/abs/2308.04138.