El encadenamiento de instrucciones es un concepto fundamental en la creación de flujos de trabajo avanzados mediante modelos de lenguaje grandes (LLM). Implica vincular varias instrucciones en una secuencia lógica, donde la salida de una instrucción sirve como entrada para la siguiente. Este enfoque modular es poderoso para resolver tareas complejas como el procesamiento de textos de varios pasos, el resumen, la respuesta a preguntas y 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) de OpenAI, definir instrucciones personalizadas y conectarlas en cadenas reutilizables. Al abstraer la complejidad de gestionar las instrucciones, LangChain permite a los desarrolladores centrarse en resolver problemas en lugar de orquestar interacciones con LLM.
En este tutorial, haremos lo siguiente:
LangChain proporciona una infraestructura potente 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 maneja el encadenamiento de instrucciones de manera efectiva:
Abstracción de instrucción: LangChain aprovecha from_template para diseñar flujos de trabajo estructurados de entrada/salida para cada paso, lo que facilita el manejo de operaciones complejas de chatbot.
Integración de LLM: la infraestructura se integra perfectamente con varios LLM, como IBM® Granite, OpenAI y Hugging Face, lo que permite realizar ajustes 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: mediante herramientas como ConditionalChain y plantillas de mensajes del sistema, 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 final de este tutorial, tendrá una sólida comprensión de cómo usar 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 avanzan al siguiente. Los diferentes tipos de encadenamiento admiten diversos flujos de trabajo, que van desde tareas secuenciales simples hasta procesos más complejos y dinámicos. Aquí hay un breve vistazo a los tipos de encadenamiento de instrucción:
Encadenamiento secuencial: el tipo de encadenamiento más sencillo, en el que la salida de una instrucción se pasa directamente como entrada a la siguiente. Esta opción es ideal para tareas con una progresión lineal.[1]
Encadenamiento de ramificación: en el encadenamiento de ramificación, una sola salida se divide en múltiples flujos de trabajo paralelos. Cada rama procesa la salida de forma independiente. [2]
Encadenamiento iterativo: el encadenamiento iterativo implica ejecutar repetidamente una instrucción o cadena hasta que se cumpla una condición específica. Esta opción es útil para refinar los resultados.[3]
Encadenamiento jerárquico: este tipo desglosa 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 dinámicamente el siguiente paso 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 las condiciones cambiantes. Agrega flexibilidad al encadenamiento de instrucciones. [5]
Encadenamiento recursivo: en el encadenamiento recursivo, las entradas grandes se dividen en fragmentos más pequeños para el procesamiento individual, y luego se combinan los resultados. Es útil para manejar documentos o conjuntos de datos largos. [6]
Encadenamiento inverso: el encadenamiento inverso comienza con una salida esperada y funciona hacia atrás para determinar las entradas o pasos necesarios para lograrlo. Es ideal para la resolución de problemas y la depuración. [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 e ingeniería rápida para construir un pipeline de procesamiento de texto escalable. Las siguientes etapas del tutorial demuestran 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 sentimiento (encadenamiento de ramificaciones)
Refinar el resumen de sentimiento (encadenamiento iterativo)
Resultado final
Este enfoque combina el encadenamiento secuencial, de ramificación e iterativo en Python con modelos de chat e ingeniería rápida. 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 en watsonx.ai .
Si bien puede elegir entre varias herramientas, este tutorial lo guiará a través de cómo configurar una cuenta de IBM para usar un Jupyter Notebook.
Este paso abre un entorno de notebook donde puede copiar el código de este tutorial. También puede descargar este Notebook en su sistema local y cargarlo en 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 la infraestructura langchain y watsonxLLM. Primero, instalemos los paquetes necesarios.
Nota: Si está utilizando una versión anterior de `pip`, puede usar 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 actualizó 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 de 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 la ingeniería rápida.
LLMChain construye cadenas de tareas individuales mientras
SequencialChain vincula varios pasos en un solo flujo de trabajo y `getpass` recupera de forma segura información confidencial (por ejemplo, claves de 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 PROJECT_ID esté configurado correctamente.
Este código inicializa IBM Watson LLM para su uso en la aplicación:
Este paso prepara a Watson LLM 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 una ingeniería rápida reutilizable y estructurada para la aplicación LLM.
Este código define cadenas de LLM que conectan las instrucciones con el IBM Watson LLM inicializado, asignando claves de salida únicas para cada etapa:
Estas instancias de LLMChain permiten la ejecución modular de tareas, facilitando un flujo de trabajo de aplicaciones LLM paso a paso.
Este código combina las cadenas definidas previamente en un flujo de trabajo secuencial, lo que permite un proceso paso a paso para la entrada de texto. SequentialChain vincula keyword_chain, sentiment_chain y refine_chain en un orden definido, lo que garantiza que la salida de una cadena sirva como entrada para la siguiente. El flujo de trabajo está configurado para aceptar texto como entrada inicial, con la salida final, un resumen de sentimiento refinado, almacenado bajo la clave "refined_summary". Esta configuración permite una ejecución optimizada y eficiente de la aplicación de 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 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.
RESULTADOS
Resumen de sentimiento refinado:
El sentimiento del usuario es predominantemente negativo debido a los bloqueos recurrentes de la aplicación y a los lentos tiempos de respuesta del servicio de 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 de sentimiento refinado es una evaluación concisa y clara del feedback. Destaca el aprecio del usuario por las características de la aplicación, pero expresa frustración por los frecuentes bloqueos y la lentitud de la atención al cliente, lo que refleja la capacidad del flujo de trabajo para destilar insights 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 few-shot o chatprompttemplate pueden ayudar a estructurar tareas complejas que requieren diferentes instrucciones.
Dependencia: si las salidas de un paso son marcadores de posición para la siguiente instrucción, utilice el encadenamiento secuencial. Los analizadores de salida garantizan una transición fluida de las salidas a entradas estructuradas.
Adaptabilidad: para flujos de trabajo dinámicos, como los que involucran agentes 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 incorporación para texto y datos vectoriales o LangChain Expression Language para operaciones flexibles.
Al considerar estos factores, puede crear una aplicación LLM sólida y adaptable con flujos de trabajo de encadenamiento coherentes.
El encadenamiento de instrucciones es una técnica versátil para crear flujos de trabajo sofisticados de procesamiento de 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.