En este caso, estoy usando el modelo GPT-4 mini. El “content” es el mensaje que le estamos enviando a ChatGPT, que como podéis ver le estamos dando las instrucciones que queremos y le estamos enviando el resultado de la consulta de la tabla.
El “max_tokens” lo definimos en 1000, si queremos más, basta con ampliarlo. Esto es el número de palabras que nos va a devolver (no es una equivalencia de un token = una palabra)
La “temperature” es lo exacto que queremos que sea en su respuesta, cuanto más bajo, más exacto.
¿Cómo sé todo esto y de dónde lo he sacado? Porque no me lo he inventado yo, no soy tan listo. Esta todo en la documentación oficial de OpenAI, os dejo aquí el link:
https://platform.openai.com/docs/api-reference/completions
Bien, una vez enviada la pregunta a ChatGPT, como es muy cordial, nos va a devolver la respuesta en formato JSON, por que debemos leer ese JSON y extraer la información que queremos. ¿Cómo lo hacemos? Para ello añadimos un nuevo paso que es “Análisis del archivo JSON”
{
"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"
}
}
}
}
}
Este esquema, representa la estructura de la respuesta generada por ChatGPT. Incluye información como el identificador del objeto, el modelo utilizado, los mensajes generados y las estadísticas de uso.
Ahora ya tenemos la respuesta que nos ha dado ChatGPT, pero tenemos que seleccionar de todo lo que nos ha enviado lo que realmente necesitamos. Para este caso, quiero la fecha y hora de la respuesta y el cuerpo de esta, es decir, la respuesta en sí. El resto no me interesa por lo que lo descarto. Una vez decidido esto, lo primero que debemos hacer es tratar la fecha para darle el formato correcto, para ello generamos un nuevo paso “Redactar” y escribimos la siguiente expresión:
formatDateTime(
addSeconds('1970-01-01T00:00:00Z', int(body('Análisis_del_archivo_JSON')?['created'])),
'yyyy-MM-dd HH:mm:ss'
)
El desde le indicamos que es “choices” del paso del JSON y contiene los siguientes encabezados:
FechaInserccion: es la salida del paso anterior, es decir, la fecha tratada.
Contenido: es la respuesta de ChatGPT, pero sólo la respuesta, no todo lo demás. Para ello escribimos la siguiente expresión:
body('Análisis_del_archivo_JSON')?['choices'][0]['message']['content']
El siguiente paso, es guardar esa información, ¿dónde? Pues en este ejemplo he decidido guardarlo en OneDrive, para ello:
Seleccionamos la ruta y el contenido del archivo, que es la salida del paso anterior.
Y con esto, ya tendríamos el flujo creado. Ahora sólo falta asignarle un nombre, guardarlo, aplicarlo y ejecutarlo.
Y vemos que tenemos dos columnas (bien, era lo que queríamos y esperado). Una de ellas con la fecha de inserción de la respuesta y separada por coma la respuesta a la pregunta que le hemos enviado a ChatGPT.
Ahora os lanzo yo la siguiente pregunta, ¿qué nos falta? Llevarlo al informe de Power BI. Para ello realizamos la conexión al csv y como dicen en Francia “et voila”:
Y en el lienzo, colocamos una tabla y arrastramos la columna de contenido de la tabla:
Y ahora sí, tenemos todo de manera automática. ¿Qué os parece? A mi creerme que una pasada, casi a la par que las vistas TMDL.
Ahora ya tenemos el informe bien documentación y hasta con opciones de mejora incluidas, eso sí, como con todo lo que viene de un sistema de IA, hay que revisarlo y ver que sea lo que realmente queremos y que sea correcto. ¿Qué os parece si le damos una vuelta de tuerca más e introducimos los parámetros de campo para hacer dinámica la vista de la información?
Acordaros de como se crean los parámetros dinámicos, os dejo aquí un post de hace un tiempo que escribí (allá por el 2022), pero sigue vigente. Y obtenemos la siguiente estructura del informe:
El código DAX del parámetro de campo es:
Filtro = {
("Estructura", NAMEOF('ChatGPT'[Estructura]), 0),
("Columnas", NAMEOF('ChatGPT'[Columnas]), 1),
("Relaciones", NAMEOF('ChatGPT'[Relaciones]), 2),
("Medidas", NAMEOF('ChatGPT'[Medidas]), 3),
("DescripcionesUsabilidad", NAMEOF('ChatGPT'[DescripcionesUsabilidad]), 4),
("Recomendaciones", NAMEOF('ChatGPT'[Recomendaciones]), 5),
("Conclusión", NAMEOF('ChatGPT'[Conclusión]), 6),
("Contenido", NAMEOF('ChatGPT'[Contenido]), 7)
}
Y hasta aquí, los posts en los que he estado varias noches trasteando.
¿Qué os parecen? ¿Les veis utilidad? Para mí este
flujo puede ser integrable en otro muchos procesos para que el modelo se
documente de manera automática, ahorrándonos tiempo para poder dedicarlo entre otras cosas a modelar correctamente ;).
Gracias Brian Julius por el aporte vital para este post.
¡Nos vemos en los datos!