Encadenamiento de instrucciones con LangChain: una visió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 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:

  1. Explorar diferentes tipos de encadenamiento de instrucciones (secuencial, ramificado, iterativo y otros).
  2. Implementar un ejemplo de encadenamiento genérico que combine tipos de encadenamiento secuencial, ramificado e iterativo.
  3. Aproveche 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 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.

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

Caso de uso: procesamiento de texto en varios pasos

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)

  • 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 sentimientos (encadenamiento ramificado)

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

Refinamiento del resumen de sentimientos (encadenamiento iterativo)

  • Si el resumen de sentimientos no cumple 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 refinado de sentimientos se entrega como resultado final, proporcionando conocimientos pulidos al usuario.
  • Esto muestra la integración del prompt engineering, la IA generativa y las técnicas avanzadas de encadenamiento.

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.

Requisitos previos

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

Pasos

Paso 1. Configure su entorno

Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.

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

Paso 2. Configure el 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 API.
  3. Asocie la instancia del servicio watsonx.ai Runtime al proyecto que ha creado en watsonx.ai.

Paso 3. Instalación de los paquetes

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.

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

Paso 4. Importe 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 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.

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

Paso 5. Configure credenciales

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.

  • Las credenciales de un diccionario se crean con la URL del servicio WML y la clave 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 el PROJECT_ID, se le pedirá al usuario que lo introduzca 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. Inicialice un modelo de lenguaje de gran tamaño

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

  1. Este código crea una instancia de WatsonxLLM mediante 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 el LLM de Watson 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. Defina plantillas de instrucción

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 de forma dinámica la entrada.
  2. Generación de resumen de sentimientos: sentiment_prompt toma las {keywords} extraídas como entrada y genera un resumen de sentimientos del feedback. La plantilla garantiza que la generación de sentimientos se centre en las palabras clave proporcionadas.
  3. Refinamiento del resumen: refine_prompt mejora el resumen de sentimientos utilizando {sentiment_summary} como entrada. Se centra en hacer que el resultado sea conciso y preciso.

Estas instancias de PromptTemplate permiten un prompt engineering reutilizable y estructurado 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. Cree cadenas

Este código define cadenas LLM que conectan las instrucciones con el IBM Watson LLM inicializado, asignando resultados únicos 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 "palabras clave" para su uso en pasos posteriores.
  2. Cadena de sentimiento: sentiment_chain toma las palabras clave extraídas y genera un resumen de sentimiento utilizando el archivo sentiment_prompt. El resultado se etiqueta como "sentiment_summary".
  3. Cadena de refinamiento: refine_chain procesa el resumen de sentimientos generado mediante refine_prompt. El resultado refinado final se almacena con la clave "refined_summary".

Estas instancias de LLMChain permiten la ejecución modular de tareas, lo que facilita 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. Combine cadenas

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.

# 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. Ejecute el 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 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.

# 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

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.

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

Resumen

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.

Soluciones relacionadas
IBM watsonx.ai

Entrene, valide, ajuste e implemente IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de nueva generación para desarrolladores de IA. Cree aplicaciones de IA en menos tiempo y con menos datos.

Explore watsonx.ai
Soluciones de inteligencia artificial

Ponga la IA al servicio de su negocio con la experiencia líder del sector y el portfolio de soluciones de IA de IBM.

Explore las soluciones de IA
Servicios y consultoría de inteligencia artificial (IA)

Los servicios de IA de IBM Consulting ayudan a reinventar la forma de trabajar de las empresas usando IA para la transformación.

Explore los servicios de IA
Dé el siguiente paso

Gracias a la IA, IBM Concert descubre información crucial sobre sus operaciones y ofrece recomendaciones de mejora personalizadas para cada aplicación. Descubra cómo Concert puede hacer avanzar su negocio.

Explorar el concierto Explore las soluciones de automatización de procesos empresariales
Notas a 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.