Lección 23: La distancia y el camino armónicos
Secciones
Ajustes de lectura
Ninguna voz para este idioma en este navegador.
Más voces
Código y términos técnicos en inglés
Desactivado: la voz de la página lo lee todo, sin pausa entre dos voces.
Ninguna voz para este idioma en este navegador.
Más voces
Más voces: Microsoft Edge ofrece voces naturales en línea, y Windows (Configuración › Hora e idioma › Voz), macOS y Android instalan otras.
La lección 22 le pidió a IcvNeighborsSkill los conjuntos cercanos a un acorde. Dos skills registradas junto a ella reciben una pareja de acordes (GaPlugin.cs líneas 100-102): GrothendieckDeltaSkill da la diferencia de sus vectores interválicos, sus normas L1 y L2 y un coste (GrothendieckDeltaSkill.cs líneas 97-131), e IcvShortestPathSkill, una cadena de conjuntos de clases de altura de uno a otro (IcvShortestPathSkill.cs líneas 9-53). Las dos llaman a GrothendieckService, y las dos tienen un CanHandle que siempre dice que no: el enrutador compara una pregunta con la descripción y los prompts de ejemplo de cada skill, le suma los refuerzos de las pistas y la envía a la de mayor puntuación si esa puntuación alcanza un umbral de confianza (SemanticIntentRouter.cs líneas 129-257).
Todos los enlaces a GA apuntan al commit a826864, el commit fijado del curso, salvo los que nombran otro. En el main de GA en f4f5b4a (2026-10-01), las dos skills solo marcan su rechazo con Declined, GrothendieckDelta y DefaultRoutingHintProvider no han cambiado, y FindNearby compara el conjunto de origen con cada conjunto por valor; los propios conjuntos de clases de altura sí cambiaron, así que GaMain vuelve a preguntar. Su salida imprime las mismas tablas que la del commit fijado, bajo títulos que dicen “on main”. La salida procede de:
dotnet run --project code/ga-ai/GaAi -c Release -- l23dotnet run --project code/ga-ai/GaMain -c Release -- l23Cómo leen las skills una pregunta
Sección titulada «Cómo leen las skills una pregunta»La skill delta busca dos acordes unidos por “to”, “and” o una flecha:
// Two-chord pattern shared with VoiceLeadingSkill — anchored on // "<chord A> to/and <chord B>" with a permissive chord token. Pre-anchored // by routing hint, so substring overlap with unrelated phrases is unlikely. private static readonly Regex TwoChordPattern = new(@"\b(?<a>[A-Ga-g][b#♭♯]?(?:maj|min|m|dim|aug|sus|add|dom)?\d*(?:[b#♭♯]\d+)*°?)\s+(?:to|and|→|->|>)\s+(?<b>[A-Ga-g][b#♭♯]?(?:maj|min|m|dim|aug|sus|add|dom)?\d*(?:[b#♭♯]\d+)*°?)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled);La skill de camino pide “shortest path”, “shortest route”, “harmonic path”, “step by step” o algunas palabras más, y después dos acordes unidos por “to”, o bien “how do I get from” seguido de dos acordes y luego “harmonic”:
// "shortest path / harmonic path / route from A to B" private static readonly Regex PathPattern = new(@"\b(?:shortest(?:[\s-]*harmonic)?[\s-]*(?:path|route)|harmonic[\s-]*(?:path|route)|BFS\s+path|step[\s-]*by[\s-]*step|PC[\s-]*set\s+path|ICV\s+path|harmonic\s+route)\b[^.?!]*?\b(?:from\s+)?(?<a>[A-Ga-g][b#♭♯]?(?:maj|min|m|dim|aug|sus|add|dom)?\d*(?:[b#♭♯]\d+)*°?)\s+(?:to|→|->)\s+(?<b>[A-Ga-g][b#♭♯]?(?:maj|min|m|dim|aug|sus|add|dom)?\d*(?:[b#♭♯]\d+)*°?)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled);
// Fallback — "how do I get from X to Y harmonically" private static readonly Regex HowDoIGetPattern = new(@"\bhow\s+do\s+i\s+get\s+from\s+(?<a>[A-Ga-g][b#♭♯]?(?:maj|min|m|dim|aug|sus|add|dom)?\d*(?:[b#♭♯]\d+)*°?)\s+to\s+(?<b>[A-Ga-g][b#♭♯]?(?:maj|min|m|dim|aug|sus|add|dom)?\d*(?:[b#♭♯]\d+)*°?)\b[^.?!]*?\bharmonic", RegexOptions.IgnoreCase | RegexOptions.Compiled);Los prompts de ejemplo de las dos skills se reformularon el 2026-06-16 para mantenerlas separadas. La skill de camino conserva dos comentarios al respecto, el segundo escrito encima del primero sin quitarlo (líneas 55-66).
Las formulaciones de GA
Sección titulada «Las formulaciones de GA»El programa le hace a cada skill sus diez prompts de ejemplo, las formulaciones de su comentario de documentación y las dos que sugiere su rechazo, le hace las mismas preguntas a la otra skill, y le pregunta a DefaultRoutingHintProvider qué intenciones reforzaría cada una:
== GrothendieckDeltaSkill's and IcvShortestPathSkill's example prompts and GA's other phrasings for them, at the pinprompt skill from its answer the other's routing hints, +0.06 eachhow harmonically far is Am from D7 delta anchor declined declined skill.grothendieckdeltaharmonic distance from Cmaj7 to G7 delta anchor Cmaj7 → G7 declined skill.grothendieckdeltahow far apart are Cmaj7 and Dm7 harmonically delta anchor Cmaj7 → Dm7 declined noneharmonic cost to move from C to G delta anchor C → G declined skill.transposehow different are C major and F major harmonically delta anchor declined declined noneharmonic distance between Am and Em delta anchor Am → Em declined skill.grothendieckdeltahow close are Cmaj7 and Fmaj7 harmonically delta anchor Cmaj7 → Fmaj7 declined noneL1 distance from Gmaj7 to Bm7b5 delta anchor Gmaj7 → Bm7b5 declined noneGrothendieck delta from C to F delta anchor C → F declined skill.grothendieckdeltameasure the harmonic gap between Dm7 and G7 delta anchor Dm7 → G7 declined noneshortest harmonic path from Cmaj7 to G7 path anchor Cmaj7 → G7 Cmaj7 → G7 skill.icvshortestpathshortest path from C major to F major path anchor declined declined skill.icvshortestpathshortest harmonic route from Am to D7 path anchor Am → D7 Am → D7 skill.icvshortestpathshortest path from Cmaj7 to Bm7b5 path anchor Cmaj7 → Bm7b5 Cmaj7 → Bm7b5 skill.icvshortestpathstep-by-step harmonic route from C to G path anchor C → G C → G skill.icvshortestpathshortest chord path from Dm7 to Gmaj7 path anchor declined Dm7 → Gmaj7 noneshortest route from C to A minor path anchor C → A C → A skill.icvshortestpathharmonic stepping stones from Cmaj7 to Fmaj7 path anchor declined Cmaj7 → Fmaj7 noneshortest path from Gmaj7 to Em path anchor Gmaj7 → Em Gmaj7 → Em skill.icvshortestpathshortest harmonic path of chords from C to F path anchor C → F C → F skill.icvshortestpathHarmonic distance from Cmaj7 to G7 delta doc comment Cmaj7 → G7 declined skill.grothendieckdeltaGrothendieck delta C to F delta doc comment C → F declined skill.grothendieckdeltaHow harmonically far is Am from D7 delta doc comment declined declined skill.grothendieckdeltaCompare the ICVs of Cmaj7 and Dm7 delta doc comment Cmaj7 → Dm7 declined noneharmonic distance from Cmaj7 to G7 delta refusal Cmaj7 → G7 declined skill.grothendieckdeltadelta C to F delta refusal C → F declined noneShortest harmonic path from Cmaj7 to G7 path doc comment Cmaj7 → G7 Cmaj7 → G7 skill.icvshortestpathPath from C major to F major path doc comment declined declined noneHow do I get from Am to D7 harmonically path doc comment Am → D7 Am → D7 noneshortest path from Cmaj7 to G7 path refusal Cmaj7 → G7 Cmaj7 → G7 skill.icvshortestpathhow do I get from C to F harmonically path refusal C → F C → F noneGrothendieckDeltaSkill: anchors 10, answered 8, hinted toward skill.grothendieckdelta 4; the other skill answers 0 of them; CanHandle accepts 0IcvShortestPathSkill: anchors 10, answered 7, hinted toward skill.icvshortestpath 8; the other skill answers 9 of them; CanHandle accepts 0- La skill delta responde a 8 de sus 10 prompts de ejemplo. “how harmonically far is Am from D7”, que también es la primera formulación de su comentario de documentación, pone “from” entre los acordes, y “how different are C major and F major harmonically” pone “major” entre el primer acorde y “and”.
- La skill de camino responde a 7 de sus 10. “shortest path from C major to F major”, que también figura en su comentario de documentación como “Path from C major to F major”, tiene “major” detrás de cada acorde; “shortest chord path from Dm7 to Gmaj7” pone “chord” entre “shortest” y “path”; “harmonic stepping stones from Cmaj7 to Fmaj7” no tiene ni “path” ni “route”. De los siete a los que responde, dos no obtienen ningún camino y uno se lee como A mayor, como muestran las secciones siguientes.
- La skill delta responde a 9 de los 10 prompts de la skill de camino, ya que le basta con dos acordes cualesquiera unidos por “to”; la skill de camino no responde a ninguno de los de la delta. Una pregunta de camino formulada como estos prompts que el enrutador envíe a la skill delta recibe una distancia, no un rechazo.
- Las reglas de las pistas refuerzan 4 de los prompts de la skill delta y 8 de los de la skill de camino (
DefaultRoutingHintProvider.cslíneas 128-144). “harmonic cost to move from C to G” refuerza en cambio askill.transpose, cuya regla lee “move … to” y una letra mayúscula (líneas 257-259).
Los acordes que leen
Sección titulada «Los acordes que leen»Las dos skills construyen sus conjuntos con una copia de la tabla que leyó la lección 22 (GrothendieckDeltaSkill.cs líneas 133-173, IcvShortestPathSkill.cs líneas 165-201). El programa construye los acordes de la lección 22 y las 16 cualidades con las tablas de las tres skills, y después les pregunta por parejas de acordes:
== The chords the two skills read, at the pinchord tokens 36: built alike by IcvNeighborsSkill, GrothendieckDeltaSkill and IcvShortestPathSkill 36prompt skill read as first built second built rightharmonic distance from C major to F major delta declined - - noharmonic distance from C to A minor delta C → A C E G C# E A noharmonic distance from Cmaj7 to a G7 delta Cmaj7 → a C E G B C# E A noharmonic distance between CM7 and G7 delta CM7 → G7 C D# G A# D F G B noharmonic distance from C° to C+ delta C° → C C D# F# C E G noshortest path from C major to F major path declined - - noshortest route from C to A minor path C → A C E G C# E A noshortest path from C to a G path C → a C E G C# E A noshortest path from CM7 to G7 path CM7 → G7 C D# G A# D F G B no- Las tres tablas construyen los mismos conjuntos, así que los errores de lectura de la lección 22 se repiten: CM7 se construye como C menor séptima, y una palabra detrás de la fundamental termina el acorde, así que “C to A minor”, uno de los prompts de ejemplo de la skill de camino, pide A mayor.
- “a” también es un acorde aquí: “from Cmaj7 to a G7” pide la distancia hasta A mayor, y “from C to a G”, un camino hasta A mayor.
- ° se conserva en el primer acorde, no en el segundo. Al primer acorde solo le hace falta un espacio detrás, y al segundo un límite de palabra, así que “C° to C+” se lee como de C disminuido a C mayor.
Los deltas
Sección titulada «Los deltas»La skill delta da lo que devuelve ComputeDelta, a través de GrothendieckDelta.FromIcVs:
public static GrothendieckDelta FromIcVs(IntervalClassVector source, IntervalClassVector target) { var delta = new GrothendieckDelta { Ic1 = target[IntervalClass.Hemitone] - source[IntervalClass.Hemitone], Ic2 = target[IntervalClass.Tone] - source[IntervalClass.Tone], Ic3 = target[IntervalClass.FromValue(3)] - source[IntervalClass.FromValue(3)], Ic4 = target[IntervalClass.FromValue(4)] - source[IntervalClass.FromValue(4)], Ic5 = target[IntervalClass.FromValue(5)] - source[IntervalClass.FromValue(5)], Ic6 = target[IntervalClass.Tritone] - source[IntervalClass.Tritone] };
// Heuristic: When two distinct sets share the same ICV (e.g., diatonic modes/keys), // L1 difference is zero. To preserve musical differentiation expected by callers/tests, // emit a minimal non-zero delta focused on ic1. This keeps related keys close but not identical. if (delta.L1Norm == 0) { delta = delta with { Ic1 = 1 }; }
return delta; }El programa le pregunta a la skill delta por cada pareja de sus prompts de ejemplo en los dos sentidos y por dos acordes frente a sí mismos, y después por cada pareja ordenada de los 192 acordes de 12 fundamentales y 16 cualidades:
== The deltas GrothendieckDeltaSkill gives, at the pinpair first vector second vector L1 the skill's delta L1 L2 cost its interpretationCmaj7 → G7 <1 0 1 2 2 0> <0 1 2 1 1 1> 6 [-1, +1, +1, -1, -1, +1] 6 2.449 3.60 -1 ic1 (semitone), +1 ic2 (whole tone), +1 ic3 (minor 3rd), -1 ic4 (major 3rd), -1 ic5 (perfect 4th), +1 ic6 (tritone) → more chromatic colorG7 → Cmaj7 <0 1 2 1 1 1> <1 0 1 2 2 0> 6 [+1, -1, -1, +1, +1, -1] 6 2.449 3.60 +1 ic1 (semitone), -1 ic2 (whole tone), -1 ic3 (minor 3rd), +1 ic4 (major 3rd), +1 ic5 (perfect 4th), -1 ic6 (tritone) → more chromatic colorCmaj7 → Dm7 <1 0 1 2 2 0> <0 1 2 1 2 0> 4 [-1, +1, +1, -1, 0, 0] 4 2.000 2.40 -1 ic1 (semitone), +1 ic2 (whole tone), +1 ic3 (minor 3rd), -1 ic4 (major 3rd) → more chromatic colorDm7 → Cmaj7 <0 1 2 1 2 0> <1 0 1 2 2 0> 4 [+1, -1, -1, +1, 0, 0] 4 2.000 2.40 +1 ic1 (semitone), -1 ic2 (whole tone), -1 ic3 (minor 3rd), +1 ic4 (major 3rd) → more chromatic colorC → G <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorG → C <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorAm → Em <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorEm → Am <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorCmaj7 → Fmaj7 <1 0 1 2 2 0> <1 0 1 2 2 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorFmaj7 → Cmaj7 <1 0 1 2 2 0> <1 0 1 2 2 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorGmaj7 → Bm7b5 <1 0 1 2 2 0> <0 1 2 1 1 1> 6 [-1, +1, +1, -1, -1, +1] 6 2.449 3.60 -1 ic1 (semitone), +1 ic2 (whole tone), +1 ic3 (minor 3rd), -1 ic4 (major 3rd), -1 ic5 (perfect 4th), +1 ic6 (tritone) → more chromatic colorBm7b5 → Gmaj7 <0 1 2 1 1 1> <1 0 1 2 2 0> 6 [+1, -1, -1, +1, +1, -1] 6 2.449 3.60 +1 ic1 (semitone), -1 ic2 (whole tone), -1 ic3 (minor 3rd), +1 ic4 (major 3rd), +1 ic5 (perfect 4th), -1 ic6 (tritone) → more chromatic colorC → F <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorF → C <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorDm7 → G7 <0 1 2 1 2 0> <0 1 2 1 1 1> 2 [0, 0, 0, 0, -1, +1] 2 1.414 1.20 -1 ic5 (perfect 4th), +1 ic6 (tritone) → increased tensionG7 → Dm7 <0 1 2 1 1 1> <0 1 2 1 2 0> 2 [0, 0, 0, 0, +1, -1] 2 1.414 1.20 +1 ic5 (perfect 4th), -1 ic6 (tritone) → more consonantC → C <0 0 1 1 1 0> <0 0 1 1 1 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorCmaj7 → Cmaj7 <1 0 1 2 2 0> <1 0 1 2 2 0> 0 [+1, 0, 0, 0, 0, 0] 1 1.000 0.60 +1 ic1 (semitone) → more chromatic colorordered pairs 36864: with the same vector 4320, answered L1 1 4320, delta [+1, 0, 0, 0, 0, 0] 4320; with different vectors 32544, L1 right 32544pairs with different vectors 16272: "more chromatic color" both ways 1440- Dos acordes con el mismo vector están a 1 de distancia, con un semitono más. Las parejas de C a G, de Am a Em, de Cmaj7 a Fmaj7 y de C al propio C reciben el delta
[+1, 0, 0, 0, 0, 0], un L1 de 1, un coste de 0.60 y “more chromatic color”. Lo mismo ocurre con las 4320 parejas ordenadas de los 192 acordes que comparten un vector; las otras 32544 reciben su L1 correcto. La propia glosa de la respuesta dice que cada componente es “how many more occurrences of that interval-class the target has than the source” (cuántas apariciones más de esa clase de intervalo tiene el destino que el origen) (líneas 122-128): G mayor no tiene más semitonos que C mayor. La skill de la lección 22 vuelve a calcular el delta para evitarlo (IcvNeighborsSkill.cslíneas 122-129); esta no. La heurística está comunicada en la issue de GA #776. - La interpretación es la primera regla que coincide, y la primera es “more semitones or whole tones” (más semitonos o tonos enteros) (
GrothendieckDelta.cslíneas 226-258). De Cmaj7 a G7 se gana un tono entero y de G7 a Cmaj7 un semitono, así que los dos sentidos reciben “more chromatic color”, como les ocurre a 1440 de las 16272 parejas con vectores distintos. - La flecha que precede a la interpretación se imprime como
→. La línea 217 contiene los bytes de→leídos como Windows-1252 y guardados de nuevo como UTF-8 (GrothendieckDelta.cslínea 217);maintiene la misma línea.
Los caminos
Sección titulada «Los caminos»FindShortestPath es una búsqueda en anchura: desde cada conjunto, pasa a los conjuntos del mismo tamaño a un L1 de 2 como máximo que aún no ha visto, y se detiene tras cinco movimientos (GrothendieckService.cs líneas 117-163):
// Check if we've exceeded max steps if (path.Count >= maxSteps + 1) { continue; }
// Find nearby sets (within small distance) to keep the graph sparse and paths musically local. // Using radius=2 connects closely related diatonic collections (e.g., C major → G major) // that typically differ by one accidental yet may exceed radius=1 under the ICV L1 metric. var nearby = FindNearby(current, 2) .Select(r => r.Set) // Restrict traversal to sets with the same cardinality to avoid unrealistic one-step jumps .Where(s => s.Cardinality == current.Cardinality) .Where(s => !visited.Contains(s));
foreach (var next in nearby) { visited.Add(next); var newPath = new List<PitchClassSet>(path) { next }; queue.Enqueue((next, newPath)); }El programa le hace a la skill de camino los prompts de ejemplo a los que responde y cuatro parejas más, y cuenta, para cada camino, los movimientos, el L1 y las notas que se conservan en cada movimiento, y los movimientos entre dos conjuntos de un mismo vector:
== The paths IcvShortestPathSkill finds, at the pinpair notes the answer says moves L1 per move common notes same vectorCmaj7 → G7 4, 4 4 steps total (3 intermediate moves) 3 2,2,2 2,1,0 0Am → D7 3, 4 No path found within 5 steps 0 - - 0Cmaj7 → Bm7b5 4, 4 4 steps total (3 intermediate moves) 3 2,2,2 2,1,0 0C → G 3, 3 2 steps total (1 intermediate move) 1 0 1 1C → A 3, 3 2 steps total (1 intermediate move) 1 0 1 1Gmaj7 → Em 4, 3 No path found within 5 steps 0 - - 0C → F 3, 3 2 steps total (1 intermediate move) 1 0 1 1C → C 3, 3 1 step total (0 intermediate moves) 0 - - 0C → Cm 3, 3 2 steps total (1 intermediate move) 1 0 2 1Cdim7 → Cmaj7 4, 4 No path found within 5 steps 0 - - 0Caug → C 3, 3 No path found within 5 steps 0 - - 0before "No path" for Am → D7: sets expanded 168 of the 220 of 3 notes, each a scan of the 4096 setsbefore "No path" for Gmaj7 → Em: sets expanded 462 of the 495 of 4 notes, each a scan of the 4096 setsbefore "No path" for Cdim7 → Cmaj7: sets expanded 3 of the 495 of 4 notes, each a scan of the 4096 setsbefore "No path" for Caug → C: sets expanded 4 of the 220 of 3 notes, each a scan of the 4096 setsthe path for "shortest harmonic path from Cmaj7 to G7": {0,4,7,11} C E G B 4-20 <1 0 1 2 2 0> {0,2,3,7} C D D# G 4-14 <1 1 1 1 2 0> L1 2, common notes 2 {0,1,4,6} C C# E F# 4-Z15 <1 1 1 1 1 1> L1 2, common notes 1 {2,5,7,11} D F G B 4-27 <0 1 2 1 1 1> L1 2, common notes 0- Los acordes de tamaños distintos nunca se unen. De Am a D7 y de Gmaj7 a Em, dos de los prompts de ejemplo de la skill, y “How do I get from Am to D7 harmonically”, de su comentario de documentación, reciben “No path found within 5 steps”, y la respuesta culpa a la distancia o a “the cardinality constraint” (línea 137). Antes de decirlo, la búsqueda expande 168 de los 220 conjuntos de tres notas, o 462 de los 495 conjuntos de cuatro, y cada expansión recorre los 4096 conjuntos, cuyos vectores se recalculan en cada lectura (
PitchClassSet.cslínea 104), salvo siFindNearbyguardó su respuesta para ese conjunto: guarda 256 y descarta primero las más antiguas (GrothendieckService.cslínea 21, líneas 93-113). - La respuesta cuenta los conjuntos como pasos (línea 141). De Cmaj7 a G7 son “4 steps total (3 intermediate moves)”: tres movimientos, a través de dos conjuntos. De C a G son “2 steps total (1 intermediate move)”: un movimiento, a través de ninguno. De C a C es “1 step total”.
- Un movimiento entre dos conjuntos de un mismo vector cuenta como un paso. Los caminos de C a G, de C a F, de C a Cm y de C a A requieren un movimiento cada uno: su L1 real es 0, que
FromIcVsconvierte en 1. - La respuesta no nombra ninguno de los conjuntos intermedios, y las notas se pierden. El camino de Cmaj7 a G7 pasa por C D D# G y C C# E F#, 4-14 y 4-Z15, y conserva 2 notas, después 1 y después ninguna, cuando la respuesta promete “common-tone bridges” (líneas 156-160). El de Cmaj7 a Bm7b5 da los mismos recuentos.
- Cdim7 y Caug solo alcanzan sus propias transposiciones, 3 y 4 conjuntos: la lección 22 no encontró ningún conjunto a un L1 de 1 o 2 de Cdim7 y solo conjuntos de dos notas de Caug, y la búsqueda conserva el tamaño, así que solo quedan los conjuntos con su vector.
Hasta dónde llega el curso
Sección titulada «Hasta dónde llega el curso»- No se ejecuta el enrutador: necesita los embeddings. La lección les hace a las skills sus propios prompts de ejemplo: una pregunta formulada exactamente como uno de ellos es la que más probabilidades tiene de que se les envíe.
- El recuento de conjuntos expandidos es el del curso, procede de una búsqueda que sigue la regla de
FindShortestPath; la skill no lo imprime. El programa no cronometra las skills. - El programa llama directamente a los métodos de las skills, no a través del chatbot.
Comunicado upstream
Sección titulada «Comunicado upstream»- Se comunicaron después de escribir esta lección, en la issue de GA #802: los prompts de ejemplo que las expresiones no leen, los deltas de L1 1 entre acordes del mismo vector y la flecha en mojibake, la búsqueda de camino que conserva el tamaño del acorde, y el recuento de pasos y los conjuntos sin nombre de la respuesta.
Ejercicios
Sección titulada «Ejercicios»- ¿Por qué rechaza la skill delta “how harmonically far is Am from D7”?
- C mayor y G mayor tienen los dos el vector
<0 0 1 1 1 0>. ¿Qué L1 los separa, y qué imprime la skill delta? ¿Qué línea marca la diferencia? - ¿Por qué no encuentra la skill de camino ningún camino de Am a D7?
- El camino de Cmaj7 a G7 contiene cuatro conjuntos. ¿Cuántos movimientos hace, y a través de cuántos conjuntos intermedios? ¿Qué dice la respuesta?
Soluciones
- Su expresión necesita “to”, “and” o una flecha entre los dos acordes (líneas 65-67); el prompt tiene “from”.
-
- La skill imprime un L1 de 1 y el delta
[+1, 0, 0, 0, 0, 0], porqueFromIcVsconvierte un delta nulo enIc1 = 1(líneas 128-131 del extracto anterior).
- La skill imprime un L1 de 1 y el delta
- Am tiene tres notas y D7 cuatro, y la búsqueda solo pasa a conjuntos del mismo tamaño (línea 150 de
GrothendieckService.cs), así que nunca llega a D7. - Tres movimientos, a través de dos conjuntos: C D D# G y C C# E F#. La respuesta dice “4 steps total (3 intermediate moves)”.
Puntos clave
Sección titulada «Puntos clave»- Una heurística colocada en un tipo compartido llega a todos los que lo usan: una skill la corrige, su hermana la imprime.
- Una distancia que nunca devuelve 0 no puede decir que dos acordes son semejantes.
- Una búsqueda que conserva el tamaño no puede unir acordes de tamaños distintos, y debería decirlo antes de buscar.
- Un recuento de pasos es un recuento de movimientos, no de las cosas que los movimientos unen.
- El mojibake de un archivo de código fuente acaba en las respuestas del chatbot.
Fuentes
Sección titulada «Fuentes»- GuitarAlchemist/ga en
a826864:Common/GA.Business.ML/Agents/Skills/GrothendieckDeltaSkill.cs,Common/GA.Business.ML/Agents/Skills/IcvShortestPathSkill.cs,Common/GA.Business.ML/Agents/Skills/IcvNeighborsSkill.cs,Common/GA.Domain.Services/Atonal/Grothendieck/GrothendieckDelta.cs,Common/GA.Domain.Services/Atonal/Grothendieck/GrothendieckService.cs,Common/GA.Domain.Core/Theory/Atonal/PitchClassSet.cs,Common/GA.Business.ML/Agents/Intents/DefaultRoutingHintProvider.cs,Common/GA.Business.Core.Orchestration/Plugins/GaPlugin.cs. - GuitarAlchemist/ga en
f4f5b4a: las mismas skills, con sus rechazos marcados conDeclined, yGrothendieckDelta.cs. - Los programas del curso:
code/ga-ai/GaAi/Lesson23.cs,code/ga-ai/GaMain/Program.cs,code/ga-ai/Shared/IcvDeltaPathProbe.cs.