¡Jueves de post! Hoy seguimos trasteando un poco con la IA, eso que tanto nos gusta y nos ayuda (siempre y cuando lo hagamos con criterio y pensamiento analítico)

Dicho esto, lanzo una pregunta: ¿Cuántas veces nos ha tocado analizar encuestas de satisfacción de cliente? ¿Valoraciones de algún producto? Y luego, representarlas en Power BI… Bien, en Power Query, antes de la introducción Copilot, teníamos funciones de IA que nos permitían de una manera más o menos digna realizar este tipo de tareas (he puesto más o menos digna ya que no era del todo fiable sobre todo con la detección de idiomas, uso de preposiciones, faltas ortográficas…) ¿Y si no tenemos capacidad Fabric para usar Copilot cómo lo hacemos? ¿Cómo analizamos un caso como este que te muestro:

   

Vemos que tenemos una tabla con una columna que contiene títulos de películas y otra que recoge los comentarios de los espectadores. ¿Cómo podemos asignar por ejemplo una puntuación del 1 al 10 en función del comentario expresado por el espectador?

Lo vamos a hacer integrando un LLM con Power Query mediante AI Foundry. ¿Qué os parece? Bien, vamos a ello. Lo primero que hacemos es acceder a AI Foundry y vamos a crear un nuevo recurso haciendo clic en “Crear Recurso”

 

 

En la ventana que se nos abre, seleccionamos la opción recomendada, que es la de “Microsoft Foundry resource”:

 

A continuación, le asignamos un nombre al proyecto. También seleccionamos la suscripción de la cual vamos a consumir el saldo (como todo en esta vida, gratis no hay nada 😊 ). Elegimos la región donde lo queremos desplegar y el grupo de recursos, y ya por último le damos a “Crear”:

 

  

 

Y esperamos a que se cree el recurso, y una vez creado el recurso, tenemos que implementar el modelo de LLM que queramos, para ello en la parte inferior en “Mis recursos”, hacemos clic sobre “Modelos + Puntos de Conexión”:

  

 

Y a continuación hacemos clic en el botón “Implementar Modelo”:

 

  

 

Y nos da la opción de seleccionar una implementación del modelo base o de un modelo optimizado. Para este caso, nos basta con el modelo optimizado y seleccionamos el modelo que queramos para nuestro proyecto, en este caso, seleccionamos el Phi-4 y confirmamos:

 

  

  

Una vez, ya desplegado el modelo dentro del recurso, vemos las diferentes formas de conexión al mismo:

  

 

Bien, salimos por un momento de AI Foundry vamos a Power BI. Una vez ya en Power BI, nos conectamos a nuestro origen de datos, que en este caso es la tabla que hemos visto al principio, que puede venir de un Forms, de un SQL Database generado por los flujos translíticos… de un montón de fuentes.

Una vez conectado, aquí es donde viene la “magia”. ¿Cómo nos vamos a conectar a AI Foundry? Con {M}agia como diría mi buen amigo Rafael Gonzalez. Lo primero que vamos hacer es crear los parámetros de conexión relativos a la ApiKey, ApiURL y Modelo (que los encontramos en AI Foundry en el modelo desplegado):

  

 

Vamos a crear una función personalizada, para poder invocarla desde nuestro modelo para así poder enviarle tanto el prompt como los datos que queremos analizar. Para ello, lo primero que hacemos es crear una consulta en blanco y pegamos el siguiente código M:

 

let

    // ============================================================

    // =============== CONFIGURACIÓN GLOBAL ========================

    // ============================================================

 

    // Recogemos los parámetros del modelo

    ApiKey  = ApiKey,        // Parámetro: cadena con la API key

    ApiUrl  = ApiUrl,        // Parámetro: URL del endpoint Azure AI

    Modelo  = Modelo,        // Parámetro: nombre del modelo (p. ej. "Phi-4")

 

    // Cabeceras necesarias para Azure AI Services

    DefaultHeaders = [

        #"Content-Type" = "application/json",

        #"api-key"      = ApiKey

        // Si tu instancia requiere autenticación Bearer:

        // #"Authorization" = "Bearer " & ApiKey

    ],

 

    // ============================================================

    // =============== FUNCIÓN PRINCIPAL ===========================

    // ============================================================

 

    ChatCompletion =

    (promptQuestion as text, promptInput as text, optional maxTokens as nullable number)

        as text =>

    let

        // 1. Unificamos el texto proporcionado por el usuario

        UserContent = Text.Combine({promptQuestion, promptInput}, " "),

 

        // 2. max_tokens con valor por defecto si no se pasa parámetro

        MaxTokensValue = if maxTokens <> null then maxTokens else 100,

 

        // 3. Construimos el payload JSON que exige la API

        PayloadRecord = [

            model    = Modelo,

            messages = {

                [ role = "system", content = "You are a helpful assistant." ],

                [ role = "user",   content = UserContent ]

            },

            max_tokens = MaxTokensValue

        ],

 

        Payload = Json.FromValue(PayloadRecord),

 

        // 4. Llamada HTTP POST a Azure AI

        Response = Web.Contents(

            ApiUrl,

            [

                Headers = DefaultHeaders,

                Content = Payload

            ]

        ),

 

        // 5. Parseamos la respuesta JSON

        ResponseJson = Json.Document(Response),

 

        // 6. Extraemos el texto generado por el modelo

        Choices        = ResponseJson[choices],

        FirstChoice    = Choices{0},

        MessageRecord  = FirstChoice[message],

        CompletionText = MessageRecord[content]

    in

        CompletionText

 

in

    ChatCompletion

¿Qué es lo que realiza este “churro” de código? En palabras mundanas como suelo decir, este código define una función en M que permite enviar un mensaje a un modelo de IA alojado en Azure y recuperar su respuesta. Primero carga la configuración necesaria: la clave de acceso, la URL del servicio y el nombre del modelo. Estos valores suelen estar almacenados como parámetros en Power Query.

  

A continuación, se construye una función llamada ChatCompletion, que recibe dos textos —la pregunta y la entrada del usuario— y un parámetro opcional para el número máximo de tokens. La función combina ambos textos en uno solo y establece un valor por defecto de 100 tokens si no se ha indicado otro.

Después genera el cuerpo de la petición en formato JSON siguiendo la estructura requerida por el endpoint de Azure: incluye el modelo a utilizar, un mensaje de sistema y el mensaje del usuario. Este JSON se convierte en binario para poder enviarlo mediante una llamada HTTP POST.

 

  


 El código realiza la solicitud a la API utilizando Web.Contents, pasando los encabezados necesarios y el contenido JSON preparado. Una vez recibida la respuesta, la interpreta como JSON y accede a la estructura interna para extraer exclusivamente el texto generado por el modelo. 

  

 

Finalmente, la consulta devuelve la función ChatCompletion, que puede utilizarse desde otras consultas o transformaciones para obtener respuestas del modelo de IA de forma directa y automatizada.

 

  

 

Y obtenemos lo siguiente:

Bien, ahora volvemos a nuestra consulta con los datos a analizar e invocamos a la función personalizada que acabamos de crear:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

En primer lugar, asignamos un nombre a la columna que vamos a añadir con la valoración. En segundo lugar, seleccionamos la función personalizada a la que queremos llamar, que es la que acabamos de crear. En tercer lugar, el prompt, que lo podemos parametrizar o directamente escribirlo. Para este ejemplo, le he escrito el siguiente prompt:

“Lee el siguiente comentario sobre una película y asígnale una puntuación del 1 al 10, siendo 1 la peor valoración posible y 10 la mejor. Responde SÓLO con un número entero entre 1 y 10, sin texto adicional.”

Y en cuarto lugar, lo que queremos enviarle para que analice, en este caso, la columna llamada “Cometarios”. Aceptamos y…..

Interfaz de usuario gráfica, Tabla

El contenido generado por IA puede ser incorrecto. 

Nos devuelve una columna con el análisis de la valoración hecha. Ya sólo nos queda “Cerrar y aplicar” los cambios y pintar nuestro informe.

Gráfico, Gráfico de barras

El contenido generado por IA puede ser incorrecto.

 

Y hasta aquí el post de hoy. ¿Qué os ha parecido la forma en la ahora podemos analizar los datos? A mí, personalmente me parece una pasada.Os leo en comentarios!!

¡Nos vemos en los datos!