jazz21 · MCI
Usar una taxonomía como contexto
Un vocabulario SKOS nombra las clases y el modelo con el que se calculan sus perfiles. Los vectores no viajan dentro. El ejemplo de esta página es una taxonomía de armonía jazz, el lenguaje de jazz21.
El ejemplo
jazz21 es la librería pública de Radio Micelio para cifrado americano, lead sheets y guitarra, apoyada en music21. El ejemplo de esta página usa solo ese lenguaje.
Una clase de ejemplo, en Turtle. Los identificadores son de muestra:
@prefix skos: <http://www.w3.org/2004/02/skos/core#> . @prefix rm: <https://www.radiomicelio.es/vocab/> . <https://www.radiomicelio.es/id/armonia/ii-v-i> a skos:Concept ; skos:prefLabel "ii–V–I"@es ; skos:definition "Cadencia en la que un acorde de segunda precede a la dominante y esta resuelve en la tónica."@es ; skos:example "Dm7 G7 Cmaj7" ; skos:broader <https://www.radiomicelio.es/id/armonia/cadencia> ; rm:embeddingModel "modelo-local" .
SKOS no tiene un hueco estándar para un vector. El vector además cambia si cambia el modelo o la definición. El fichero declara el nombre exacto del modelo y deja el cálculo fuera. Lo mismo vale en JSON-LD.
Dos archivos distintos
Los pesos son el modelo que descargas para poder incrustar texto. Sin ellos no hay vectores.
Los vectores son el resultado de pasar cada perfil por ese modelo. El conjunto de una taxonomía de clases cabe en un fichero pequeño. Una caché de muchos pasajes de un corpus es otra cosa, y no hace falta para usar el vocabulario. Descargar los pesos no reconstruye los vectores: hay que calcularlos.
Pasos
-
Lee el vocabulario en Turtle o JSON-LD. De cada
skos:Conceptguarda la URI, la etiqueta, la definición, los ejemplos y el concepto más amplio. -
Escribe el texto del perfil, uno por concepto: etiqueta,
camino de categorías, definición y ejemplos.
ii–V–I. Categoría: armonía jazz › cadencia. Cadencia en la que un acorde de segunda precede a la dominante y esta resuelve en la tónica. Ejemplos: Dm7, G7, Cmaj7.
Si falta la definición, el perfil se queda en la etiqueta y el camino. No inventes el texto: el vector saldría de otra clase. - Respeta el prefijo del modelo. Muchos modelos de embedding piden una fórmula distinta para el documento y para la consulta. Esa fórmula forma parte del texto. Sin ella, el vector del pasaje no se puede comparar con el del concepto.
-
Calcula el vector en local con el modelo declarado y
anota su digest. La misma frase con otro digest es otro vector. Guarda
la URI del concepto junto al vector.
En jazz21 el mismo símbolo ya es un objeto, no solo una frase:
import jazz21 jazz21.describe_chord("Cmaj7")El texto del perfil y ese objeto deben nombrar el mismo acorde. - Compara el vector del pasaje con el de cada concepto por similitud del coseno. Los conceptos más cercanos son el contexto de ese pasaje: una cadencia, un modo, un cifrado con bajo distinto.
- Al modelo de lenguaje le pasas texto, no números. El embedding solo elige qué clases entran. En la conversación van la etiqueta, la definición y el cifrado. Un modelo de lenguaje no lee un vector como si fuera una frase.
Hay que repetir el cálculo de un concepto si cambia su definición, sus ejemplos o el digest del modelo. No mezcles vectores de dos digest.
De la taxonomía a una conversación sobre componer
La idea siguiente no es un generador de audio. Es un modelo de lenguaje entrenado con el lenguaje simbólico de jazz21: cifrados, progresiones, bajos en slash chord, formas de lead sheet. Se le habla de cómo componer y responde en ese mismo lenguaje.
El agente que ejecuta la respuesta sería una versión nueva de MCI, el Music Controller Interpreter. MCI hoy registra por MIDI lo que se toca y lo devuelve como cifrado, función y forma. La versión nueva se sentaría entre la conversación y jazz21. Una frase como «cambia el segundo acorde por un tritono sustituto» se convierte en una llamada a la librería, y la respuesta vuelve como cifrado y como objeto simbólico. Si luego suena, es porque algo reproduce ese objeto. El modelo no sintetiza la onda.