No sé vosotros, pero yo sigo dándole vueltas a la creación de nuestro “inspector” de modelos semánticos que creamos en los post pasados que nos ayudaba a documentar y revisar nuestro modelo, proponiéndonos puntos de mejora y añadiendo valor añadido a nuestro informe. Si no lo has leído, te dejo aquí los enlaces.

Y en una de esas muchas vueltas que le he dado (casi hasta me mareo 😊) he pensado que una de las tareas a las que nos enfrentamos y nos lleva mucho tiempo es la generación de documentación del proyecto para entregar a cliente. ¿Cómo podríamos apoyarnos en la IA para que nos adelante el trabajo y seamos nosotros quien lo revisemos? ¿Quieres saberlo? Pues no te vayas que te lo cuento a continuación 😉

Partimos del modelo de datos del post anterior y del flujo de Power Automate:

  

El cual lanzábamos una consulta DAX a la tabla con la información de las funciones INFO.VIEW y con esa respuesta, se la enviábamos a ChatGPT vía API para que nos hiciese el trabajo de documentar el modelo. ¿Correcto? Bien, y ahora os pregunto, ¿por qué no aprovechar esto para generar parte de la documentación a entregar a cliente? Bien, lo primero que vamos a realizar es la creación de una plantilla tipo en Word, de manera que sea una estándar para todos nuestros informes. ¿Cómo lo hacemos? De la siguiente manera:

Abrimos Microsoft Word y nos vamos a la opción de “Programador” en la cinta de opciones:

 

 

Si no la tienes visible, ve a Archivo – Opciones y en “Personalizar cinta de opciones” marca la casilla de “Programador”:

  

Una vez ya le tenemos visible, lo primero que hacemos es insertar nuestro logo corporativo (también se podría insertar el logo del cliente pero no es el alcance de este post). Una vez tenemos nuestro logo ya insertado, lo siguiente que vamos a insertar son dos “control de contenido de texto enriquecido”, que se encuentra dentro del grupo “Controles”, uno para la fecha de generación y otro para el contenido. Esto lo que nos va a permitir es que se rellene de manera dinámica con lo que nos devuelve ChatGPT:

 


 
Y nos queda un Word de la siguiente manera:


 


Ahora lo que tenemos que hacer es asignarle un nombre a cada uno de los controles de manera que Power Automate sepa dónde introducir cada bloque de información de ChatGPT. Para ello seleccionamos el primer control y vemos que se nos ha habilitado la opción de Propiedades:
 
 
 
Hacemos clic sobre él, y en la ventana que se no ha abierto escribimos el nombre que le asignamos, y marcamos el check de que tenga en cuenta los retornos de carro, es decir, los saltos de línea no vayáis a pensar en carros de verdad… 😊
 
 

Una vez hecho esto, ya sólo nos queda poner bonita la plantilla y listo:
 
 
 
 
Una vez hecho esto, guardamos el documento y volvemos a nuestro Power BI para abrir el flujo de trabajo y empezar a modificarlo. Para ello, lo que vamos ha realizar es un nuevo hilo en el flujo, es decir, una rama en paralelo en el que hacemos otra llamada POST a ChatGPT:
 
 
 

En esta nueva acción HTTP, modificamos el modelo al cual hacemos la consulta, en este caso, es al modelo GPT-4o, modificamos también el content, que es el prompt que le pasamos y el número de tokens, así la respuesta que nos devuelva es más amplia que en el ejemplo anterior.

Una vez lanzamos la pregunta a ChatGPT, como buena y educada IA, nos devuelve una respuesta a nuestra pregunta, pero esta respuesta tiene un formato JSON que debemos “traducir” para el mundo real, para ello usamos la misma configuración que utilizamos la vez pasada y no es otra que:

 
 

Donde el esquema completo es:

{

    "type": "object",

    "properties": {

        "id": {

            "type": "string"

        },

        "object": {

            "type": "string"

        },

        "created": {

            "type": "integer"

        },

        "model": {

            "type": "string"

        },

        "system_fingerprint": {

            "type": "string"

        },

        "choices": {

            "type": "array",

            "items": {

                "type": "object",

                "properties": {

                    "index": {

                        "type": "integer"

                    },

                    "message": {

                        "type": "object",

                        "properties": {

                            "role": {

                                "type": "string"

                            },

                            "content": {

                                "type": "string"

                            }

                        }

                    },

                    "finish_reason": {

                        "type": "string"

                    }

                },

                "required": [

                    "index",

                    "message",

                    "finish_reason"

                ]

            }

        },

        "usage": {

            "type": "object",

            "properties": {

                "prompt_tokens": {

                    "type": "integer"

                },

                "completion_tokens": {

                    "type": "integer"

                },

                "total_tokens": {

                    "type": "integer"

                }

            }

        }

    }

}

 


El primer campo a rellenar que tenemos en nuestra plantilla es la Fecha, por lo que vamos a crear una acción de Redactar para que nos ponga la fecha y hora de manera correcta. Para ello, en la acción, hacemos clic sobre insertar expresión y escribimos:

formatDateTime(

    addSeconds('1970-01-01T00:00:00Z', int(body('ArchivoJSON2')?['created'])),

    'yyyy-MM-dd HH:mm:ss'

)

 

Una vez tenemos ya la fecha y hora correcta, debemos de darle forma al texto que nos ha devuelvo ChatGPT, para ello añadimos otra acción de Redactar e insertamos la siguiente expresión:

replace(

  replace(

    replace(

      replace(

        replace(

          body('ArchivoJSON2')?['choices'][0]['message']['content'],

          '### ', '<h1>'

        ),

        '#### ', '<h2>'

      ),

      '**', ''

    ),

    '* ', '• '

  ),

  '\n', '<br>'

)

 

¿¿Qué diablos es esto que acabo de escribir?? ¿Estoy poseído? No, tranquilos. Lo que acabo de escribir es una expresión ya que ChatGPT devuelve el contenido en formato Markdown, pero Power Automate lo interpreta como texto plano.

 Explicación de cada replace():

  • replace('### ', '<h1>') → Convierte ### en un título principal (h1).
  • replace('#### ', '<h2>') → Convierte #### en subtítulos (h2).
  • replace('**', '') → Elimina los ** que intentan hacer negritas en Markdown.
  • replace('* ', '• ') → Convierte listas Markdown (* texto) en listas con puntos (• texto).
  • replace('\n', '<br>') → Reemplaza saltos de línea de texto plano con saltos de HTML.

Una vez ya hemos dado el formato deseado a la respuesta de ChatGPT (comentar que este es un ejemplo, habrá un millón de posibilidades más y mejores que esta, pero no me las sé, ya que no soy experto en Power Automate) llamamos a la plantilla que hemos creado al inicio de este post mediante la acción Rellenar una plantilla de Microsoft Word y rellenamos los siguientes campos:

 

 

 

 

En el recuadro rojo, le indicamos:

  • La ubicación de la plantilla
  • Dónde buscarla
  • El nombre del archivo

Y luego, en la parte inferior, vemos que nos ha “leído” los contenidos que hemos añadido en el Word y rellenamos los campos con:

  • El mensaje devuelto por ChatGPT
  • La hora del mensaje

Ahora ya tenemos: 

  • El mensaje enviado
  • El mensaje recibido
  • El mensaje formateado
  • El archivo Word rellenado

Nos queda, guardar el archivo en el formato deseado. Para este ejemplo, voy a guardarlo en docx. Para ello, añadimos la acción Crear Archivo y le añadimos los siguientes campos:


 


Donde le especificamos la ruta donde guardarlo, el nombre dinámico que lo obtenemos de la fecha extraída y el contenido es el documento generado en el paso anterior. Con todo esto, se nos queda un flujo tal que así:
 
 
 
 
 
Ahora guardamos y aplicamos los cambios. Y volvemos a nuestro informe de Power BI y ejecutamos el flujo:

 


Y vemos que la ejecución del flujo se ha ejecutado correctamente:
 
 
 

 

Si vamos ahora a la carpeta de OneDrive, vemos:

 
 


Y si abrimos el archivo vemos… ¡Magia!

Y ya tendríamos el informe del proyecto realizado, sólo nos quedaría revisarlo para verificar que es correcto y no hay nada erróneo.


¿Qué os parece? A mi me está maravillando…

 

¡Nos vemos en los datos!