Blog

      Cómo nos puede ayudar la ingeniería de prompting en nuestro día a día

      14 de octubre de 2025

      Cómo nos puede ayudar la ingeniería de prompting en nuestro día a día

      Tabla de contenido

      Un prompt (instrucción / indicación) es un texto en lenguaje natural que solicita a un modelo de IA generativa que realice una tarea específica

      La ingeniería de prompting es el proceso por el que se guían las soluciones de inteligencia artificial generativa (IA generativa) para generar los resultados deseados, siendo la guía principal cómo diseñar estos prompts.

      La ingeniería de prompting se ha popularizado y ha demostrado ser una herramienta clave a la hora de extraer todo el potencial de los grandes modelos de lenguaje (LLMs). Más allá de generar texto, imágenes, video, etc., estos modelos son muy útiles para crear, depurar y mejorar código en diferentes lenguajes de programación.

      Sin embargo, aunque los resultados obtenidos suelen ser funcionales, pueden resultar poco eficientes o difícilmente mantenibles, afectando a la calidad del software (Jialun Cao, 2025).

      En este artículo proponemos un conjunto de técnicas y patrones eficaces para el diseño de prompts orientados a la generación de código de calidad. Para facilitar su comprensión, se incluyen ejemplos simulando un sistema de gestión de pedidos en una plataforma web. El contenido se divide en cuatro apartados: consejos para escribir prompts efectivos; patrones extraídos de la literatura consultada; un caso de uso real; lecciones aprendidas y ¿cómo se aplica en TECNALIA: GureGPT?

      Consejos para escribir prompts efectivos

      En la generación de código existe un conjunto de prácticas que han demostrado ser útiles:

      • Nombre de función: especificar el nombre de la función que se quiere generar. Evita efectos laterales en caso de volver a generar la función.

      "Genera una función que calcule el total de un pedido con impuestos y descuentos".

      Buenas prácticas:

      "Genera una función llamada ‘calcular_total_pedido’ que reciba un pedido y devuelva el total con impuestos y descuentos".

      • Parámetros de E/S: ser lo más específico posible con respecto a los parámetros de entrada y salida. Si son clases conocidas, se deben definir en un apartado.

      "La función debe recibir un pedido y devolver el total".

      Buenas prácticas:

      "[Definición de clase Pedido]

      - productos: lista de objetos Producto

      - impuestos: número decimal

      - descuento: número decimal

      [Definición de clase Producto]

      - nombre: string

      - precio: número decimal

      - cantidad: entero

      Genera una función llamada calcular_total_pedido(pedido: Pedido) -> float".

      • Remarcar el contexto: ser específico en las referencias a dichos parámetros, no dejar que el LLM infiera que parámetro usar.

      "La función debe usar los productos del pedido".

      Buenas prácticas:

      "En la función calcular_total_pedido, recorre específicamente pedido y productos para obtener precio y cantidad.

      No uses ninguna otra variable fuera de la clase Pedido".

      • Indicar funciones exactas: al utilizar una función existente, indicar el nombre exacto de la función a utilizar junto a su formato de entrada y salida, indicándole que ya existe.

      "Puedes usar la función de validación de email".

      Buenas prácticas:

      "Ya existe la función validar_email(email: str) -> bool.

      En la función registrar_usuario(nombre: str, email: str, password: str) debes reutilizar validar_email.

      No implementes de nuevo la validación".

      • Cuidado con expresiones lógicas: la utilización de expresiones lógicas (por ejemplo "mayor" y "menor") son propensas a sufrir alucinaciones. Es conveniente reescribirlas en forma de operaciones aritméticas.

      "La función debe devolver True si el total del pedido es mayor que 100, False en caso contrario".

      Buenas prácticas:

      "Devuelve True si (total_pedido - 100) > 0, en caso contrario devuelve False".

      • No repetir funcionalidades complejas: en caso de tener funcionalidades complejas que se van a repetir más de una vez dentro del prompt, se puede agrupar la descripción de esa funcionalidad en un apartado y hacer referencia desde diferentes secciones del propio prompt.

      (En tres funciones diferentes) La validación del pedido consiste en verificar que todos los productos tengan precio > 0 y cantidad > 0, y que el total del pedido sea mayor que 0".

      Buenas prácticas:

      "[Validación de pedido]:

      - Todos los productos deben tener precio > 0

      - Todos los productos deben tener cantidad > 0

      - El total del pedido debe ser mayor que 0

      [Funciones a generar]:

      1. confirmar_pedido(pedido: Pedido) -> bool: usa [Validación de pedido].
      2. procesar_pago(pedido: Pedido) -> bool: antes de iniciar el pago, usa [Validación de pedido].
      3. generar_factura(pedido: Pedido) -> Factura: solo generar si se cumple [Validación de pedido].”
      • Patrón persona: o “Persona Pattern”, uno de las técnicas más comunes y útiles es indicar que adopte el punto de vista de un desarrollador de software.

      "Genera una función que calcule el total de un pedido con impuestos y descuentos".

      Buenas prácticas:

      "Adopta el rol de un desarrollador de software senior especializado en aplicaciones de e-commerce. Tu objetivo es implementar funciones de backend con código limpio, reutilizable y documentado".

       

      Patrones extraídos de la literatura consultada

      La realización de múltiples interacciones con el LLM hasta conseguir el resultado deseado se conoce como “Prompting interactivo”, pensado para que el usuario que genera el código y el LLM depuren la salida de forma conjunta.

      La literatura contiene diversas publicaciones de patrones para la mejora de calidad, refactorización, diseño, etc.

      En este apartado únicamente se incluyen algunos de estos patrones aplicados en los prompts de manera satisfactoria.

      1. Agrupamiento de código. Este patrón tiene como objetivo organizar el código en funciones, clases o diferentes estructuras según una característica dada. Por ejemplo, separar la lógica de negocio de la base de datos o de las peticiones a una API externa.

      "Siempre que te pida que escribas código, quiero que lo organices separando:

      - La lógica de negocio (cálculo del total del pedido, validación de productos).

      - El acceso a base de datos (guardar y recuperar pedidos).

      - La integración con la API externa de pagos".

      1. Abstracción intermedia. La abstracción y la modularidad son piezas clave para un código limpio, reutilizable y fácil de mantener.

      Ejemplo:

      "Siempre que les pida que escriban código, quiero que separen la lógica de negocio lo máximo posible de las bibliotecas de terceros subyacentes. Si la lógica de negocio utiliza una biblioteca de terceros, por favor, escriban una abstracción intermedia que la lógica de negocio utilice en su lugar para que la biblioteca de terceros pueda reemplazarse por una alternativa si es necesario".

      1. Basado en principios. Mediante el uso de nombres de patrones de diseño conocidos en el desarrollo de software se busca obtener un código reestructurado sin explicar cada regla en detalle.

      Ejemplo:

      "De ahora en adelante, siempre que escriba, refactorice o revise código, asegúrese de que se adhiera a los principios de diseño SOLID".

      Un caso de uso real

      Uno de los objetivos del proyecto Paravasis (Misiones) donde Tecnalia participa junto a los socios Ghenova Digital, DGH, Integrasys, Cotesa, Capgemini, Optiva Media, Kolokium y Komorebi, es la generación de componentes software de manera automática para distintos casos de uso. Para alcanzar dicho objetivo, se ha utilizado IA generativa, requiriendo una experimentación de prompting.

      La mayoría de los componentes software utilizados en este contexto han sido generados mediante prompting, empleando el modelo Qwen2.

      Para la validación de este experimento, se ha seleccionado un componente especifico del caso de uso. Este componente software se utiliza para seleccionar la puerta de salida de un taller en un astillero por el que debe salir una máquina junto a una pieza. Se ha elegido este componente debido a que no es una funcionalidad simple pero tampoco demasiado compleja. Además, da lugar a posibles necesidades de reutilización de código.

      Los patrones utilizados en la experimentación han sido:

      1. Agrupamiento de código.
      2. Abstracción intermedia.
      3. Basado en principios.
      4. Adjuntar ejemplos de funciones (few shot).

      La metodología definida para llevar a cabo la experimentación por cada prompt y código generado consiste en:

      1. Determinar cómo influyen los cambios a la funcionalidad.
      2. Calcular la complejidad ciclomática (CC) (Ebert, Cain, Antoniol, Counsell, & Laplante, 2016). Esta métrica es utilizada para evaluar la calidad del código, su mantenibilidad y capacidad de prueba siendo "A" el valor que determina que el código es muy simple y "F" extremadamente complejo, pasando por B, C, D y E de menor a mayor complejidad.
      3. La funcionalidad del componente se verifica mediante un conjunto de test unitarios; el caso base, sin patrones, se depuró cíclicamente hasta superar los test.

      La siguiente tabla muestra los resultados obtenidos para la generación de código:

      Tabla 2

      Lecciones aprendidas

      Tras concluir la experimentación en Paravasis se extraen varias conclusiones:

      • Los patrones de prompting a la hora de generar código influyen de manera muy positiva en la calidad del código que el LLM genera. Con la utilización de patrones de prompting se mejora en la calidad del código, pero la funcionalidad se ve afectada. Los LLMs son muy sensibles a las variaciones en el prompt. El hecho de que los tests fallen y dado que los cambios en el prompt no versan sobre la funcionalidad, indica que hay que añadirlos en una primera fase del proceso. Es decir, los patrones van a generar mejor código, pero hay que hacerlo desde el principio.
      • El uso de ejemplos (técnica de few shot) mejora los resultados obtenidos. Dotando al LLM de ejemplos, se mejora de rendimiento y fomenta el razonamiento del modelo. Por ello, generalmente ofrecen respuestas más completas, observando que para la generación de código puede ser eficiente.
      • La portabilidad de prompts entre diferentes modelos es muy limitada. Los prompts cuanto más se personalizan, se obtienen mejores resultados y funcionan mejor para el modelo con el que están utilizando. Debido a esta personalización, si se cambia de modelo, los resultados difieren. Dos prompts pueden generar resultados válidos pero incorrectos en diferentes modelos.

      Tanto los consejos de prompting como los patrones descritos en el documento procuran funcionar de manera “universal” para diferentes modelos actuales.

      ¿Cómo se aplica en TECNALIA: GureGPT?

      TECNALIA cuenta con un servicio de LLMs que se ejecutan sobre los servidores de la organización y son mantenidos por BASE. Gracias a ello, se puede utilizar este servicio de forma privada y la información queda y pertenece a TECNALIA. Es conveniente consultar la política de uso profesional de IA Generativa antes de su uso.

      La capacidad de los modelos avanza muy rápido; actualmente se dispone en GureGPT de modelos razonadores como Qwen3.

      Agradecimientos

      • Esta investigación ha sido posible por un lado, gracias al proyecto PARAVASIS, financiado por el CDTI y apoyado por el Ministerio de Ciencia e Innovación de España.
      • Iker Lasa y Juan Bartolomé han sido también piezas claves por su contribuciones y revisiones.

      **Este artículo ha sido redactado en colaboración con Alejandro Rodríguez Ortega

      Fernando Jorge

      SOBRE EL AUTOR

      Fernando Jorge

      Se graduó en Informática en 2010. En 2016 obtuvo su doctorado en Informática y Telecomunicaciones con la tesis "Teoría de grafos en la caracterización de patologías cerebrales en imágenes de resonancia magnética".
      Autor:Fernando Jorge
      Banner transformación digital