Un'azienda leader canadese di trasporti e logistica ha usato Genie Code, Unity Catalog e Agent Skills personalizzate per automatizzare la modernizzazione controllata delle pipeline legacy, riducendo l'ingestione di nuove tabelle da giorni a minuti.
di Dinesh Chandrasekaran, Subhadip Chanda, Julia Brouillette e Gal Oshri
Una delle più grandi reti ferroviarie del Canada si estende per circa 20.000 miglia di tratte attraverso il Canada e negli Stati Uniti, supportando il movimento di oltre 250 miliardi di dollari canadesi in merci all'anno. Per un'organizzazione che opera su tale scala, modernizzare un patrimonio di dati vecchio di decenni non sarebbe mai potuto essere un esercizio da fare una tabella alla volta.
Con centinaia di pipeline in corso, una crescente domanda di analytics in tempo reale e AI, e una profonda conoscenza istituzionale radicata nei sistemi legacy, l'azienda aveva bisogno di un modo per scalare la modernizzazione senza aumentare lo sforzo di sviluppo manuale.
Utilizzando Databricks Genie Code, Unity Catalog, custom Agent Skills e un'app Streamlit basata su Databricks Apps, il team ha trasformato lo sviluppo stesso delle pipeline in una fabbrica ripetibile. Un breve prompt YAML può ora generare codice di ingestion pronto per la produzione, basato sui metadati del catalogo live e allineato per impostazione predefinita alle convenzioni aziendali, incluse definizioni di tabelle, logica di caricamento storico, logica di ingestion in streaming, logica di merge incrementale e test automatizzati.
Il risultato è un'automazione superiore al 90% per l'ingestion di nuove tabelle, il rilascio delle pipeline ridotto da giorni a minuti e un programma di modernizzazione in grado di scalare con il business anziché essere limitato dalla larghezza di banda degli sviluppatori.
Come molte grandi aziende, l'impresa ha costruito il proprio patrimonio analitico nel corso di decenni attraverso sistemi mainframe, data warehouse legacy, piattaforme ETL aziendali e appliance dedicate. Man mano che l'azienda si muoveva verso una moderna architettura lakehouse, la sfida era più grande della sola migrazione: il team doveva semplificare e standardizzare il modo in cui venivano create le pipeline, preservando al contempo la logica di business critica in un'ampia impronta legacy.
Prima dell'automazione, la creazione di una pipeline per una singola tabella richiedeva uno sforzo di diversi giorni. I team dovevano ispezionare gli schemi di origine, definire la logica di business in un foglio di calcolo di mappatura Source-to-Target, creare la logica di ingestion storica e in streaming, scrivere pipeline di merge incrementale, implementare trasformazioni downstream e creare una copertura di test per casi come l'evoluzione dello schema, la ridenominazione delle colonne, i type cast e le soft delete.
Quel lavoro era gestibile per una sola tabella; non lo era per centinaia. Il vero vincolo era lo sforzo manuale richiesto per tradurre la logica legacy in pipeline lakehouse in modo ripetitivo e coerente.
L'azienda doveva modernizzare non solo le sue pipeline, ma il processo stesso di creazione di centinaia di pipeline.
La soluzione si è concentrata su due funzionalità che lavorano insieme: Genie Code con Agent Skills personalizzate per generare artefatti di ingestion pronti per la produzione, e una Databricks App per mappare i campi di origine alle tabelle lakehouse di destinazione e generare la logica di trasformazione.
Insieme, hanno creato un workflow end-to-end dalla discovery dei metadati al codice generato, tutto all'interno di Databricks. Genie Code funge da partner AI autonomo, mentre una Agent Skill personalizzata codifica i pattern di ingestion e la logica di merge dell'azienda. Unity Catalog fornisce l'introspezione dello schema tra i livelli raw, historical e prep, mentre Databricks Apps supporta l'esperienza di mappatura source-to-target. Le pipeline risultanti utilizzano PySpark, Spark SQL e Delta Lake e sono progettate per essere eseguite tramite Lakeflow Jobs.
Questo approccio ha consentito al team di estendere Genie Code con i propri standard di ingestion e convenzioni per le pipeline. Convenzioni di audit, logica di deduplicazione, protezioni di merge basate sulla sequenza di modifiche (change-sequence), riconciliazione delle soft-delete e pattern di test sono integrati direttamente nel processo di generazione, anziché affidarsi all'applicazione manuale da parte di ogni sviluppatore.
Aggiungere determinismo a un workflow probabilistico è la chiave. Abbiamo scelto di automatizzare ciò che sappiamo essere corretto e lasciamo opzionale il livello di interpretazione. L'LLM ti aiuta mentre pensi. Il framework garantisce che la spiegabilità sia integrata.—Dinesh Chandrasekaran, Data & AI Leader presso un'azienda leader canadese nel settore dei trasporti e della logistica
Questa filosofia è diventata centrale per l'intero approccio: utilizzare l'AI dove il ragionamento e la discovery sono importanti, e utilizzare pattern rigorosi dove la coerenza e la riproducibilità contano di più.
Uno sviluppatore inizia con un prompt YAML compatto. Nel caso più semplice, quel prompt può essere di sole due righe per la sola ingestion raw. Per una pipeline di tabella completa, include input principali come i nomi delle tabelle di origine e di destinazione, le chiavi primarie, la logica di deduplicazione e il comportamento di refresh.
Da lì, Genie Code segue un workflow strutturato. Analizza e convalida il prompt, individua gli schemi dei livelli historical e trusted tramite i metadati di Unity Catalog, abbina automaticamente le colonne con l'origine, identifica i requisiti di type-cast e ridenominazione, risolve i pattern di trasformazione, genera gli artefatti richiesti utilizzando i pattern standard dell'azienda e convalida ogni output rispetto agli invarianti aziendali richiesti. Tali invarianti includono la copertura delle chiavi primarie, il posizionamento delle colonne di audit, i merge protetti da change-sequence, la deduplicazione sensibile al REFRESH e la copertura della suite di test.
A seconda della modalità, il workflow supporta una singola tabella, più tabelle in un'unica richiesta o un'esecuzione in blocco guidata da un file CSV o Excel memorizzato in un volume di Unity Catalog. All'atto pratico, il workflow può generare sei output pronti per la produzione: DDL, caricamento storico, ingestion in streaming raw, primo merge incrementale, merge incrementale continuo e una suite di test automatizzata.
Ogni notebook generato segue le stesse convenzioni aziendali per le colonne di audit, la deduplicazione, i merge sensibili alla change-sequence e la riconciliazione delle soft-delete.
Una parte fondamentale dell'architettura è stata la Agent Skill personalizzata, che offre a Genie Code un modo riutilizzabile per applicare gli standard di ingestion, le convenzioni di denominazione e i pattern delle pipeline dell'azienda.
La skill è sottoposta a controllo di versione come qualsiasi altra codebase. Include un punto di ingresso SKILL.md e file di pattern di supporto per la discovery del catalogo, le convenzioni, l'ingestion raw, i caricamenti storici, i merge incrementali e la generazione di test. Questa struttura consente all'azienda di mantenere la propria logica di generazione a livello centrale, rendendola al contempo disponibile agli sviluppatori tramite Genie Code.
La skill è una singola cartella caricata su workspace/.assistant/skills/lakehouse-ingestion/. 
Contiene un punto di ingresso SKILL.md più sette file di pattern, uno per tipo di artefatto:
Il frontmatter SKILL.md è ciò che Genie Code utilizza per decidere quando caricare la skill:
Invece di documentare gli standard in un unico posto e chiedere a ogni sviluppatore di interpretarli manualmente, il team ha codificato tali standard nel workflow stesso. L'agente gestisce la raccolta del contesto e l'orchestrazione. La skill garantisce che gli artefatti generati seguano ogni volta gli stessi pattern.
Uno sviluppatore avvia la generazione del codice con un breve prompt YAML all'interno di una sessione di Genie Code. Il minimo è di due righe per la sola ingestion raw. Una pipeline completa ne richiede sei.
Esempio minimo, genera solo il notebook di ingestion raw:
Esempio completo, genera la pipeline completa a sei artefatti per una tabella:
I sei artefatti vengono eseguiti in questo ordine in fase di runtime:
Un altro principio di progettazione chiave è stato quello di basare la generazione del codice su metadati in tempo reale anziché su ipotesi statiche.
Genie Code utilizza Unity Catalog per esaminare gli schemi di tabelle raw, storiche e di preparazione in tempo reale. Questo approccio basato sui metadati elimina la necessità di un livello di discovery separato e fornisce all'agente il contesto necessario per generare mappature, dedurre trasformazioni e convalidare i campi richiesti prima che il codice venga emesso.
Altrettanto importante, tutti gli artefatti generati rimangono all'interno dell'area di lavoro Databricks e operano all'interno dello stesso modello di governance del resto della piattaforma dati. I controlli di accesso, i criteri dei metadati e la cronologia delle revisioni rimangono nativi di Databricks. Questa combinazione di radicamento dei metadati ed esecuzione governata ha aiutato il team a colmare un divario comune nell'adozione dell'AI aziendale: muoversi più velocemente senza introdurre incongruenze o indebolire i controlli.
L'azienda non ha affrontato questo problema come una generazione completamente automatizzata e senza intervento. Prima che il codice venga generato, i data designer utilizzano un'app Databricks per esaminare come i campi dei sistemi sorgente legacy dovrebbero essere mappati sulle tabelle lakehouse di destinazione.
Questo passaggio, chiamato Source-to-Target Mapping, acquisisce la logica aziendale che non dovrebbe essere indovinata o automatizzata alla cieca. Sviluppata con Databricks Apps basate su Streamlit, l'applicazione analizza le tabelle del sistema sorgente, precompila le mappature delle colonne e consente ai data designer di rivedere e perfezionare la logica di trasformazione nel browser.
Ogni modifica viene tracciata in un registro delle modifiche (change log) e la mappatura finale può essere esportata e utilizzata come input per il flusso di lavoro di generazione. Ciò ha reso il processo più rapido senza eliminare la revisione degli esperti dalle parti del flusso di lavoro in cui l'interpretazione aziendale è ancora fondamentale. I data designer hanno potuto concentrarsi sull'intento di trasformazione e sulla logica aziendale, mentre Genie Code e il framework di generazione gestivano pattern di implementazione ripetibili.
Una delle decisioni più importanti nell'architettura è stata quella di mantenere il livello di ragionamento intelligente e adattivo, rendendo al contempo deterministico il codice della pipeline emesso.
Genie Code gestisce le parti del flusso di lavoro che beneficiano del ragionamento basato su agenti: interpretazione dei prompt, individuazione degli schemi, selezione del percorso di generazione corretto e unione della sequenza corretta di azioni. Ma il codice PySpark generato è guidato da regole e riproducibile. Le istruzioni di merge, le finestre di deduplicazione, il posizionamento delle colonne di controllo (audit-column), i cast di tipo e i pattern di test sono tutti definiti attraverso modelli espliciti e invarianti.
Per l'azienda, questo era essenziale. Nella generazione di pipeline di produzione, piccole variazioni nella logica di merge, nelle finestre di deduplicazione o nel posizionamento delle colonne di controllo possono creare rischi per la qualità dei dati a valle. L'emissione deterministica ha reso il sistema sufficientemente affidabile da poter essere utilizzato su scala aziendale e abbastanza coerente da preservare gli standard ingegneristici faticosamente conquistati.
L'impatto è stato immediato e pratico:
A cambiare non è stata solo la produttività degli sviluppatori. L'azienda ha aumentato l'efficienza del programma di modernizzazione stesso.
Invece di trattare ogni migrazione di tabella come un progetto ingegneristico su misura, il team ha creato un sistema ripetibile per tradurre gli asset legacy in pipeline lakehouse governate su scala.
L'azienda vede questo come la base per una più ampia automazione della modernizzazione. Il team sta ora esplorando un'architettura di competenze più modulare per l'orchestrazione, la trasformazione, la logica aziendale e l'osservabilità; estendendo la discovery oltre Unity Catalog nel catalogo dati aziendale più ampio; valutando la conversione assistita dall'AI di logiche legacy DataStage, COBOL e stored-procedure in PySpark; e utilizzando le emergenti funzionalità degli agenti in background per supportare il triage di routine delle pipeline, gli aggiornamenti DBR e la riparazione della mancata corrispondenza degli schemi.
L'obiettivo a lungo termine va oltre una generazione di codice più rapida. Consiste nel creare un modello di modernizzazione che si adatti continuamente, anche con la crescita della complessità legacy, della domanda aziendale e della portata della piattaforma.
(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale
Iscriviti al nostro blog e ricevi gli ultimi articoli direttamente nella tua casella di posta.