Formato abierto · Borrador
ISOLDA
Indexed Subject-Ordered Linked Data for AI
Una forma de escribir grafos de conocimiento para que los modelos de lenguaje —incluso los pequeños, que funcionan en un portátil— puedan leerlos. Menos tokens que Turtle o JSON-LD, nombres legibles en lugar de códigos opacos y sin perder ni un solo dato por el camino.
Trabajo en curso, contado con honestidad. La versión 0.1 cumplió dos de sus tres objetivos en un estudio prerregistrado: no pierde información y es más barata, pero todavía no era tan precisa como el mejor formato estándar. La versión 0.2 corrige las causas y se está validando ahora. Publicamos los resultados buenos y los malos.
01 · El problema
Los grafos de conocimiento se escriben para máquinas, no para modelos de lenguaje
Cada vez más conocimiento se publica como grafo de conocimiento: el JSON-LD (se abre en una ventana nueva) escondido en casi cualquier página web, los catálogos de datos abiertos, Wikidata. La forma habitual de dárselo a un modelo de lenguaje es pegarlo en el prompt como texto, normalmente en Turtle (se abre en una ventana nueva) o JSON-LD.
Esos formatos se diseñaron para analizadores sintácticos, que nunca se cansan y nunca adivinan. Un modelo de lenguaje lee de otra manera, y se nota:
- Son caros. Cada clave, prefijo y corchete repetido es un token que pagas y un trozo de ventana de contexto que pierdes.
- Hablan en códigos. Las entidades se nombran con identificadores como
ex:o7o@p3. Pregunta a un modelo pequeño para quién trabaja alguien y a menudo te contestará el código en lugar del nombre. - Esconden los recuentos. «¿Cuántos conjuntos de datos tiene este catálogo?» significa contar cientos de afirmaciones dispersas, y los modelos cuentan mal.
El formato importa más de lo que parece. Investigadores de Google comprobaron que cambiar solo la forma de escribir un grafo hacía variar el rendimiento de los modelos entre un 4,8 % y un 61,8 %, según la tarea (Fatemi et al., ICLR 2024 (se abre en una ventana nueva)). En el banco de pruebas KG-LLM-Bench (se abre en una ventana nueva), los dos estándares web quedaron a la cola:
Precisión media por formato en KG-LLM-Bench (resultados publicados)
- JSON estructurado : 0,42
- Lista de aristas : 0,41
- YAML : 0,41
- Turtle : 0,35
- JSON-LD : 0,34
Hay, por tanto, un hueco: los formatos que conservan todo lo que RDF puede expresar (enlaces, tipos de datos, idiomas) son los que peor leen los modelos, y los que mejor leen pierden una parte.
02 · La idea
Escribir el grafo como un modelo lee una tabla
ISOLDA conserva todo lo que hace que RDF sea RDF y solo cambia la disposición. El nombre explica el diseño: cada entidad está indexada (Indexed) con un identificador legible, las afirmaciones están ordenadas por sujeto (Subject-Ordered: todas juntas, una fila por entidad), son datos enlazados (Linked Data: decodificarlas devuelve exactamente el mismo grafo) y está escrito para la IA (for AI).
Nombres, no códigos
Cada entidad se identifica con su propia etiqueta: «Opendata.cat», no ex:o7. Cuando una pregunta quiere saber dónde trabaja Anna, la respuesta ya está escrita junto a su nombre.
Una fila por cosa
Todo lo que se sabe de una entidad está en una sola línea, y las entidades del mismo tipo comparten una tabla con una sola cabecera. Sin claves repetidas ni afirmaciones dispersas.
Los recuentos, escritos
Cada tabla y cada lista dice cuántos elementos tiene (Person[2], [5] a | b | …). Los modelos cuentan mal las listas largas; ISOLDA cuenta por ellos.
Un glosario a medida
Cada documento empieza con unas pocas líneas que explican solo la notación que usa, para que incluso un modelo pequeño sepa cómo leerlo.
Los mismos cuatro hechos, de dos maneras
Dos personas y las organizaciones de las que son miembros. Es una ilustración simplificada, no la salida exacta del codificador:
@prefix schema: <http://schema.org/> .
@prefix ex: <https://example.org/> .
ex:p1 a schema:Person ;
schema:name "Anna Puig" ;
schema:memberOf ex:o7 .
ex:p2 a schema:Person ;
schema:name "Pau Serra" ;
schema:memberOf ex:o9 .
ex:o7 a schema:Organization ;
schema:name "Opendata.cat" .
ex:o9 a schema:Organization ;
schema:name "Sorensen.ai" . # Entities are grouped by type.
# `Type[N]{a, b}:` is a table of N entities, one per row;
# the first cell is the entity id.
# A property ending in `>` links to another entity by its id.
@vocab http://schema.org/
@types Person 2, Organization 2
Person[2]{name, memberOf>}:
Anna Puig, Opendata.cat
Pau Serra, Sorensen.ai
Organization[2]{name}:
Opendata.cat
Sorensen.ai El glosario de ISOLDA está siempre en inglés, la lengua que los modelos entienden mejor para instrucciones técnicas.
En Turtle, el modelo tiene que saltar de ex:p1 a ex:o7 y luego buscar cómo se llama ex:o7. En ISOLDA, Anna Puig y Opendata.cat están en la misma línea.
Y no pierde nada: la implementación de referencia comprueba que RDF → ISOLDA → RDF devuelve un grafo idéntico, con IRI, tipos de datos, etiquetas de idioma y nodos en blanco incluidos. La salida es determinista, byte a byte.
03 · Qué hemos medido
Menos tokens, mejores recuentos, nombres que no se pierden
Hemos probado ISOLDA con cuatro modelos de pesos abiertos que cualquiera puede ejecutar —dos pequeños (Qwen3 4B y Gemma 4 E4B) y dos medianos (Qwen3.8 27B y Gemma 4 31B)— con el razonamiento desactivado, para medir cómo lee el formato cada modelo.
Tokens necesarios para el mismo grafo (cuantos menos, mejor)
- TOON / JSON-LD : 12.075
- JSON-LD : 11.127
- Turtle : 11.058
- ISOLDA : 8.702 · −21 %
Ahorro de tokens frente a Turtle con etiquetas, en un grafo que no se vio durante el diseño
- Qwen3 4B : −20,3 %
- Qwen3.8 27B : −25,9 %
- Gemma 4 E4B : −28,6 %
- Gemma 4 31B : −28,6 %
Los modelos pequeños dejan de responder con códigos
El hallazgo más claro hasta ahora: los modelos pequeños responden con el identificador que ven. Si les das códigos, responden códigos; incluso los identificadores legibles como sorensen-ai vuelven como respuesta. Usar el nombre de la entidad como identificador lo resuelve casi todo.
Preguntas de varios saltos acertadas, de 14, según cómo se identifican las entidades
Qwen3 4B
- JSON-LD : 11/14
- Códigos opacos : 3/14
- Códigos legibles : 5/14
- ISOLDA (nombres) : 12/14
Gemma 4 E4B
- JSON-LD : 12/14
- Códigos opacos : 8/14
- Códigos legibles : 3/14
- ISOLDA (nombres) : 13/14
Contar deja de ser adivinar
Preguntas de recuento acertadas, los cuatro modelos juntos (de 24)
- Turtle : 12/24
- JSON-LD : 13/24
- ISOLDA : 22/24
04 · Dónde falló
La primera prueba de verdad: bien en un grafo, mal en el otro
Ahorrar tokens no es un éxito por sí solo, así que ISOLDA tenía que cumplir tres criterios fijados de antemano: no perder información, ser más barato y entenderse al menos tan bien como el mejor formato estándar. Después probamos la versión 0.1 con dos grafos que nadie había mirado durante el diseño: el catálogo de datos abiertos de la Generalitat y los municipios de Cataluña en Wikidata.
No perdió nada y fue más barato. Pero en conjunto fue significativamente menos preciso que Turtle con etiquetas, con los cuatro modelos. El desglose por grafo muestra dónde:
Precisión global en la prueba confirmatoria prerregistrada (cuanto más, mejor)
Gemma 4 31B · DCAT
- JSON-LD : 91 %
- Turtle + etiquetas : 91 %
- ISOLDA 0.1 : 92 %
Gemma 4 31B · Municipios
- JSON-LD : 75 %
- Turtle + etiquetas : 79 %
- ISOLDA 0.1 : 36 %
Qwen3.8 27B · DCAT
- JSON-LD : 91 %
- Turtle + etiquetas : 90 %
- ISOLDA 0.1 : 100 %
Qwen3.8 27B · Municipios
- JSON-LD : 72 %
- Turtle + etiquetas : 77 %
- ISOLDA 0.1 : 52 %
Gemma 4 E4B · DCAT
- JSON-LD : 72 %
- Turtle + etiquetas : 78 %
- ISOLDA 0.1 : 94 %
Gemma 4 E4B · Municipios
- JSON-LD : 37 %
- Turtle + etiquetas : 65 %
- ISOLDA 0.1 : 36 %
Qwen3 4B · DCAT
- JSON-LD : 61 %
- Turtle + etiquetas : 64 %
- ISOLDA 0.1 : 63 %
Qwen3 4B · Municipios
- JSON-LD : 26 %
- Turtle + etiquetas : 27 %
- ISOLDA 0.1 : 14 %
Con el catálogo de datos, ISOLDA igualó o superó la mejor referencia con todos los modelos: hasta un 94 % frente a un 78 % con el Gemma pequeño. Con los municipios se hundió, sobre todo en las preguntas de varios saltos (un 2 % frente a un 98 % con Gemma 4 31B).
Por qué. Cada municipio de Wikidata tiene el nombre en catalán, castellano e inglés. La versión 0.1 solo usaba el nombre como identificador cuando había exactamente uno, así que recurrió a códigos como manresa o bages, y los modelos respondieron con el código: justo el error que ISOLDA quería evitar. El grafo de desarrollo, con un solo nombre por entidad, no lo había hecho aflorar.
05 · Qué viene ahora
ISOLDA 0.2, y datos nuevos para probarla
La versión 0.2 cambia cuatro cosas, cada una pensada para un límite que destaparon las pruebas:
- Un idioma preferido para los nombres. Si hay nombres en varios idiomas, elige uno (inglés, luego sin etiqueta de idioma, luego el resto) como identificador; los demás pasan a ser columnas normales.
- Nombres fila a fila. Un nombre repetido ya no convierte toda una tabla en códigos; solo esa fila.
- Nombres de propiedades legibles. Cuando el grafo sabe qué significa
wdt:P1082, ISOLDA escribepopulation. - Enlaces más cortos. Los IRI de las entidades se escriben con un prefijo en lugar de enteros en cada fila.
Con los datos que se usaron para diseñarla, la 0.2 ya reduce los contextos de KG-LLM-Bench de 8.076 a 5.925 tokens de media. Eso no es una validación, así que hay en marcha dos estudios prerregistrados nuevos: uno con un grafo de escritores en catalán de Wikidata y otro con el propio KG-LLM-Bench, con sus tareas, prompts y puntuación. Un tercer estudio comprobará si los resultados se mantienen cuando el modelo trabaja por completo en catalán, una lengua no hegemónica.
Iremos actualizando esta página a medida que lleguen los resultados, salgan como salgan.