Contenido del curso

Introducción a LangChain

Chats y memoria con LangChain

Cómo encadenar TransformChain y LLMChain

Resumen

Cuando trabajas con LangChain, las cadenas fundacionales son los bloques mínimos que puedes combinar para construir flujos más complejos. Aquí aprenderás a unir una TransformChain con una LLMChain dentro de una SequentialChain, ideal si necesitas limpiar texto antes de pasarlo a un modelo de lenguaje.

Qué son las cadenas fundacionales y por qué encadenarlas

Una cadena fundacional es un eslabón individual que procesa texto de una forma muy concreta. La gracia está en que puedes unir varios eslabones para que el output de uno alimente al siguiente, como piezas de Lego. De hecho, la lógica recuerda mucho a cómo armas un modelo en PyTorch.

En el ejemplo que vamos a recorrer hay dos cadenas:

  • Una TransformChain que limpia el texto de emojis y URLs.
  • Una LLMChain que parafrasea el texto limpio con un estilo regional.

¿Qué es una TransformChain? Es una cadena que aplica una función de Python pura sobre el texto de entrada. No usa modelos de IA, solo transforma datos según la lógica que tú definas.

Cómo construir una TransformChain para limpiar texto

El primer paso es crear una función de Python que reciba un diccionario y devuelva otro diccionario. Esa es toda la magia: nada de inteligencia artificial todavía, solo regex aplicado con la librería re.

Función limpiar_texto paso a paso

La función toma la llave texto del diccionario de entrada y aplica dos transformaciones [01:20]:

  1. Sustituye emojis y símbolos fuera de un rango amplio de unicode por un espacio en blanco.
  2. Elimina cualquier patrón que parezca URL, como https o www.

Al final, retorna un diccionario con la llave texto_limpio que contiene el resultado procesado. Esto es clave porque la TransformChain se conecta con el resto del flujo justamente por esos nombres de llaves.

Instanciar la TransformChain

Importas TransformChain desde la librería chains de LangChain y creas el objeto cadena_que_limpia indicando tres argumentos:

  • input_variables: lista con texto.
  • output_variables: lista con texto_limpio.
  • transform: la función limpiar_texto.

Cuando la corres con un prompt como "Chequeen esta página" más un URL y un emoji, la respuesta llega casi instantánea porque no hay modelo de por medio, solo Python ejecutando regex [03:45].

Cómo unir TransformChain y LLMChain en una SequentialChain

La cadena que limpia por sí sola no aporta tanto. Lo interesante aparece cuando la conectas con una LLMChain que use un modelo de OpenAI para parafrasear.

Plantilla con dos variables de entrada

Creas un PromptTemplate con dos input_variables: texto_limpio y estilo. La instrucción dentro del prompt es "parafrasea esto", y el estilo puede ser, por ejemplo, una persona informal de Perú, México o Chile.

Luego instancias LLMChain pasando:

  • El modelo llm, en este caso un GPT-3.5 turbo de OpenAI.
  • El prompt recién creado.
  • El output_key igual a texto_final.

¿Por qué los nombres de las llaves importan tanto? Porque la SequentialChain conecta cadenas usando esos nombres. Si una cadena retorna texto_limpio, la siguiente debe esperar exactamente esa variable como entrada.

Ensamblar la SequentialChain

Importas SequentialChain desde chains y la instancias con [07:30]:

  • chains: lista con cadena_que_limpia y cadena_que_cambia_estilo.
  • input_variables: texto y estilo.
  • output_variables: texto_final.

Fíjate en el flujo: el usuario ingresa texto y estilo. La primera cadena consume texto y produce texto_limpio. La segunda recibe texto_limpio (de la cadena anterior) más estilo (del usuario) y produce texto_final.

Qué resultado entrega el flujo completo

Al correr la SequentialChain con un texto sobre la ciudad de Monterrey, México, lleno de emojis, banderitas y URLs como visitamonterrey.com, junto con el estilo "una persona de Perú", el resultado final llega sin emojis ni links.

Un fragmento del output: "Oye, Monterrey es una ciudad superchévere, tiene unas montañas impresionantes". Quien sea de Perú reconocerá ese tono, bacán.

¿Qué diferencia hay entre cadenas fundacionales y cadenas de utilidad? Las fundacionales son los bloques básicos como TransformChain o LLMChain. Las de utilidad son combinaciones con un propósito concreto, como limpiar y reformular texto.

Reto: agrega una tercera cadena al flujo

Amplía la SequentialChain con un tercer eslabón. El orden propuesto:

  1. Limpia el texto de entrada.
  2. Genera un texto nuevo a partir del limpio.
  3. Crea un resumen del texto generado.

Ingresa un texto largo para que el resumen tenga sentido y comparte tu resultado en los comentarios. ¿Qué estilo regional probarás primero?