Todo el mundo está obsesionado con ChatGPT. Pero los que programamos sabemos que una caja de chat en una web no nos sirve para automatizar los procesos. Queremos usar la API de estos modelos. Y ahí surge un problema grave: los Modelos de Lenguaje (LLMs) como GPT-4 son apátridas (stateless). No tienen memoria. Si haces una llamada HTTP a su API, no saben lo que le dijiste en la llamada anterior.
De repente, una nueva disciplina se ha puesto de moda: la "Ingeniería de Prompts". Algunos la venden como un arte esotérico para susurrarle a la IA, pero no es más que inyectar el contexto correcto. Y para gestionar ese contexto, ha nacido un framework en Python que está arrasando: LangChain.
Encadenando la incertidumbre
LangChain es un orquestador. Te permite conectar un LLM con otras fuentes de datos y crear "Cadenas" (Chains). En lugar de escribir un código lineal y determinista con sentencias if/else, diseñas una plantilla (PromptTemplate) y dejas que el modelo lingüístico razone el siguiente paso.
Por ejemplo, puedes crear un "Agente" y darle acceso a herramientas (una calculadora, una búsqueda en Wikipedia, y acceso a tu base de datos).
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# Instanciamos el modelo
llm = OpenAI(temperature=0.7)
# Creamos una plantilla donde inyectaremos variables dinámicamente
plantilla = """
Eres un asistente experto en bases de datos.
Dada la siguiente estructura de tabla: {esquema_bd}
El usuario pregunta: {pregunta_usuario}
Escribe la consulta SQL exacta y nada más.
"""
prompt = PromptTemplate(
input_variables=["esquema_bd", "pregunta_usuario"],
template=plantilla,
)
# Creamos la cadena que une el Prompt y el LLM
cadena_sql = LLMChain(llm=llm, prompt=prompt)
# Ejecutamos inyectando el contexto
resultado = cadena_sql.run(
esquema_bd="Ventas (id, importe, fecha, cliente_id)",
pregunta_usuario="¿Quién gastó más ayer?"
)
print(resultado)
Reflexión: El caos del código probabilístico
Programar con LangChain es alucinante, pero es una pesadilla de depurar (debuggear). Toda nuestra vida como ingenieros hemos escrito funciones matemáticas donde un input A siempre devuelve un output B.
Hacer pair-programming con Copilot era el primer paso, pero construir aplicaciones donde la lógica central es manejada por un motor probabilístico que a veces "alucina" es un salto mortal. Si el modelo decide que hoy su probabilidad le dicta escribir un SQL ligeramente distinto que rompe la aplicación, estás vendido. La flexibilidad para resolver problemas ambiguos es enorme, pero la fragilidad estructural de estas nuevas aplicaciones nos va a dar muchos dolores de cabeza en producción.