Encadenamiento de instrucciones con LangChain: una descripción general completa

Autor

Vrunda Gadesha

AI Advocate | Technical Content Author

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:

  1. Exploraremos diferentes tipos de encadenamiento de instrucciones (secuencial, ramificado, iterativo y otros).
  2. Implementaremos un ejemplo de encadenamiento genérico que combine tipos de encadenamiento secuencial, ramificado e iterativo.
  3. Aprovecharemos las clases integradas de LangChain, como PromptTemplate, LLMChain y SequentialChain, para definir y gestionar el flujo de trabajo.

Cómo gestiona LangChain el encadenamiento de instrucciones

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.

Tipos de encadenamiento de instrucciones

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.

Caso de uso: procesamiento de texto de varios pasos

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)

  • El texto de entrada o la entrada del usuario en lenguaje natural se procesa a través de una plantilla de instrucciones para identificar palabras clave significativas.
  • Este paso utiliza el encadenamiento secuencial para garantizar que las palabras clave extraídas se introduzcan directamente en las tareas posteriores.

Generación de un resumen de sentimiento (encadenamiento de ramificaciones)

  • Las palabras clave extraídas se pasan a un modelo de chat para generar un resumen de sentimiento.
  • El encadenamiento de ramificación permite rutas paralelas para el resumen para adaptar los resultados en función del contexto.

Refinar el resumen de sentimiento (encadenamiento iterativo)

  • Si el resumen de sentimiento no cumple con los criterios de calidad predefinidos, se pasa a través de una instrucción de refinamiento.
  • El encadenamiento iterativo permite el reprocesamiento hasta que el resultado alcanza el nivel de precisión esperado.

Resultado final

  • El resumen de sentimiento refinado se entrega como resultado final, proporcionando insights pulidos al usuario.
  • Esto muestra la integración de ingeniería rápida, IA generativa y técnicas avanzadas de encadenamiento.

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.

Requisitos previos

Necesita una cuenta de IBM® Cloud para crear un proyecto en watsonx.ai .

Pasos

Paso 1: Configuración del entorno

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.

  1. Inicie sesión en watsonx.ai con su cuenta de IBM Cloud.
  2. Cree un proyecto watsonx.ai. Puede obtener su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Manage . Luego, copie el ID del proyecto de la sección Details de la página General. Necesita este ID para este tutorial.
  3. Cree 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.

Paso 2. Configuración del servicio watsonx.ai Runtime y la clave de API

  1. Cree una instancia de servicio watsonx.ai Runtime (elija el plan Lite, que es una instancia gratuita).
  2. Genere una clave de API.
  3. Asocie el servicio watsonx.ai Runtime con el proyecto que creó en watsonx.ai.

Paso 3. Instalación de los paquetes

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.

!pip install --upgrade pip
%pip install langchain
!pip install langchain-ibm

Paso 3: Importación de las bibliotecas necesarias

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.

import os
from langchain_ibm import WatsonxLLM
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain
import getpass

Paso 5. Configuración de las credenciales

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.

  • Las credenciales de un diccionario se crean con la URL del servicio WML y la clave de API. La clave de API se recopila de forma segura mediante gatepass.gatepass para evitar exponer información confidencial.
  • El código intenta obtener el PROJECT_ID de las variables de entorno mediante la función os.environ. Si no se encuentra PROJECT_ID, se le da la instrucción al usuario para que lo ingrese manualmente a través de la entrada.
# Set up credentials
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com", # Replace with the correct region if needed
    "apikey": getpass.getpass("Please enter your WML API key (hit enter): ")
}

# Set up project_id
try:
    project_id = os.environ["PROJECT_ID"]
except KeyError:
    project_id = input("Please enter your project_id (hit enter): ")

Paso 6. Inicialización de un modelo de lenguaje grande

Este código inicializa IBM Watson LLM para su uso en la aplicación:

  1. Este código crea una instancia de watsonxLLM utilizando el modelo ibm/granite-3-8b-instruct, diseñado para tareas de IA generativa basadas en instrucciones.
  2. Los valores url, apikey y project_id de las credenciales configuradas previamente se pasan para autenticar y conectarse al servicio IBM Watson LLM.
  3. Configura el parámetro max_new_tokens para limitar el número de tokens generados por el modelo en cada respuesta (150 tokens en este caso).

Este paso prepara a Watson LLM para generar respuestas en el flujo de trabajo.

# Initialize the IBM LLM
llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials["url"],
    apikey=credentials["apikey"],
    project_id=project_id,
    params={
    "max_new_tokens": 150
    }
)   

Paso 7. Definición de plantillas de instrucciones

Este código define plantillas de instrucciones para tres etapas del flujo de trabajo de procesamiento de texto:

  1. Extracción de palabras clave: keyword_prompt está diseñado para extraer las palabras clave más significativas del texto proporcionado. Utiliza el marcador de posición {text} para insertar dinámicamente la entrada.
  2. Generación de resumen de sentimiento: sentiment_prompt toma las {keywords} extraídas como entrada y genera un resumen de sentimiento del feedback. La plantilla garantiza que la generación de sentimiento se centre en las palabras clave proporcionadas.
  3. Refinamiento del resumen: refine_prompt mejora el resumen de sentimiento utilizando {sentiment_summary} como entrada. Se enfoca en hacer que el resultado sea conciso y preciso.

Estas instancias de PromptTemplate permiten una ingeniería rápida reutilizable y estructurada para la aplicación LLM.

# Define Prompt Templates

# Prompt for extracting keywords
keyword_prompt = PromptTemplate(
    input_variables=["text"],
    template="Extract the most important keywords from the following text:\n{text}\n\nKeywords:"
)

# Prompt for generating sentiment summary
sentiment_prompt = PromptTemplate(
    input_variables=["keywords"],
    template="Using the following keywords, summarize the sentiment of the feedback:\nKeywords: {keywords}\n\nSentiment Summary:"
)

# Prompt for refining the summary
refine_prompt = PromptTemplate(
    input_variables=["sentiment_summary"],
    template="Refine the following sentiment summary to make it more concise and precise:\n{sentiment_summary}\n\nRefined Summary:"
)

Paso 8. Creación de cadenas

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:

  1. Cadena de palabras clave: keyword_chain utiliza keyword_prompt para extraer palabras clave del texto de entrada. El resultado se almacena bajo la clave única "keywords" para su uso en pasos posteriores.
  2. Cadena de sentimiento: sentiment_chain toma las palabras clave extraídas y genera un resumen de sentimiento mediante sentiment_prompt. La salida está etiquetada como "sentiment_summary".
  3. Cadena de refinamiento: refine_chain procesa el resumen de sentimiento generado mediante refine_prompt. La salida refinada final se almacena con la clave "refined_summary".

Estas instancias de LLMChain permiten la ejecución modular de tareas, facilitando un flujo de trabajo de aplicaciones LLM paso a paso.

# Define Chains with Unique Keys

# Chain to extract keywords
keyword_chain = LLMChain(
    llm=llm,
    prompt=keyword_prompt,
    output_key="keywords" # Unique key for extracted keywords
)

# Chain to generate sentiment summary
sentiment_chain = LLMChain(
    llm=llm,
    prompt=sentiment_prompt,
    output_key="sentiment_summary" # Unique key for sentiment summary
)

# Chain to refine the sentiment summary
refine_chain = LLMChain(
    llm=llm,
    prompt=refine_prompt,
    output_key="refined_summary" # Final refined output
)

Paso 9. Combinación de cadenas

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.

# Combine Chains into a Sequential Workflow

workflow = SequentialChain(
    chains=[keyword_chain, sentiment_chain, refine_chain],
    input_variables=["text"], # Initial input for the workflow
    output_variables=["refined_summary"] # Final output of the workflow
)

Paso 10. Ejecución del flujo de trabajo

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.

# Example Input Text

feedback_text = """
    I really enjoy the features of this app, but it crashes frequently, making it hard to use.
    The customer support is helpful, but response times are slow.

    I tried to reachout to the support team, but they never responded

    For me, the customer support was very much helpful. Ihis is very helpful app. Thank you for grate services.

"""

# Run the Workflow

result = workflow.run({"text": feedback_text})

# Display the Output

print("Refined Sentiment Summary:")
print(result) # Directly print the result since it is a string

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.

Cómo elegir el tipo de encadenamiento correcto

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.

Resumen

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.

Soluciones relacionadas
IBM® watsonx.ai

Entrene, valide, ajuste y despliegue IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de próxima generación para creadores de IA. Diseñe aplicaciones de IA en menos tiempo y con menos datos.

Explore watsonx.ai
Soluciones de inteligencia artificial

Ponga a trabajar la IA en su negocio con la experiencia en IA líder del sector y la cartera de soluciones de IBM a su lado.

Explore las soluciones de IA
Consultoría y servicios de inteligencia artificial (IA)

Los servicios de IA de IBM Consulting ayudan a reinventar la forma en que las empresas trabajan con IA para la transformación.

Explore los servicios de IA
Dé el siguiente paso

Con la IA, IBM Concert muestra insights cruciales sobre operaciones y proporciona recomendaciones de mejora específicas de las aplicaciones. Descubra cómo Concert puede hacer avanzar su negocio.

Explore Concert Explore las soluciones de automatización de procesos de negocio
Notas de pie de página

[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.