Správa dat a kvalita dat pro spolehlivou AI
Il 72 % podnikových projektů umělé inteligence selže před dosažením produkce. Ne pro nedostatek sofistikovaných algoritmů, ne pro neadekvátní architektury, ne pro chybějící talenty v týmu. Selhají pro data nedostatečné kvality, pro nedostatek správy, pro potrubí, která produkují tiše nesprávné výsledky, aniž by si toho někdo všiml.
V kontextu, ve kterémAI zákon EU poprvé ukládá zákonné požadavky na kvalitu školicích dat pro vysoce rizikové systémy a do kterých italské malé a střední podniky investují stále více v projektech založených na datech díky PNRR přechod 5.0, postavit jeden pevný základ správy dat a kvalita dat již není volbou: je to nezbytný předpoklad soutěžit a zůstat v souladu.
Tento článek vás provede operačními rámci, open source nástroji a implementacemi postupy, které vám umožní budovat spolehlivé systémy umělé inteligence: od definice dimenzí kvality dat, k implementaci automatických testů s Velká očekávání e dbt, až po správu datové řady s OpenMetadata a dodržování zákona o AI.
Co se dozvíte v tomto článku
- 6 dimenzí DAMA kvality dat a jak je měřit automatizovaným způsobem
- Implementace kontrol kvality dat s Great Expectations a dbt-expectations
- Katalog dat a řádky dat s OpenMetadata a Apache Atlas
- Rámec správy dat: role, procesy a organizační struktura
- AI Act Požadavky EU (článek 10) na údaje o školení: co dělat do srpna 2026
- Pozorovatelnost dat pomocí Soda Core a Monte Carlo pro produkční potrubí
- Detekce zkreslení v souborech dat ML a strategie zmírňování
- Případová studie: rámec správy dat pro italský výrobní MSP
Série Data Warehouse, AI a Digital Transformation
| # | Položka | Soustředit |
|---|---|---|
| 1 | Vývoj datového skladu | Od SQL Serveru po Data Lakehouse |
| 2 | Data Mesh a decentralizovaná architektura | Doménové vlastnictví dat |
| 3 | ETL vs moderní ELT | dbt, Airbyte a Fivetran |
| 4 | Pipeline Orchestrace | Airflow, Dagster a Prefect |
| 5 | AI ve výrobě | Prediktivní údržba a digitální dvojče |
| 6 | AI ve financích | Detekce podvodů a kreditní hodnocení |
| 7 | AI v maloobchodě | Prognóza a doporučení poptávky |
| 8 | AI ve zdravotnictví | Diagnostika a objevování léků |
| 9 | AI v logistice | Optimalizace trasy a automatizace skladu |
| 10 | LLM v podnikání | RAG Enterprise a Guardrails |
| 11 | Vektorové databáze Enterprise | pgvector, Pinecone a Weaviate |
| 12 | MLOps for Business | Modely AI ve výrobě s MLflow |
| 13 | Jste zde – Data Governance | Kvalita dat pro spolehlivou AI |
| 14 | Plán založený na datech pro malé a střední podniky | Jak adoptovat AI a DWH |
Problém kvality dat v éře AI
„Garbage in, garbage out“ je princip, který datoví inženýři znají po desetiletí, ale s generativní AI a modely strojového učení ve výrobě, důsledky špatných dat se staly exponenciálně závažnější. Model detekce podvodů trénovaný na nevyvážených datech generuje padělky pozitiva, která blokují legitimní transakce. Systém doporučení vyškolený na datech demografická zaujatost zesiluje diskriminaci. Model prognózování poptávky trénovaný na nekonzistentní data generují nesprávné objednávky s přímým dopadem na cash flow.
Náklady na údaje nízké kvality – údaje za rok 2025
| Indikátor | Hodnota | Zdroj |
|---|---|---|
| Průměrné náklady na společnost (nekvalitní data) | 12,9 milionů dolarů ročně | Gartner 2024 |
| Projekty AI, které selžou kvůli kvalitě dat | 72 % | McKinsey 2025 |
| Čas datového vědce na čištění dat | 45–60 % | Více průzkumů |
| Italské malé a střední podniky s formálním programem kvality dat | 18 % | Observatoř AI Polimi 2025 |
| Omezte chyby ML pomocí správy dat | až 35 % | IBM Institute 2025 |
Klíčovým rozdílem, který mnoha organizacím chybí, je rozdíl mezi kvalita dat pro analytiku e kvalita dat pro AI. V hlášení tradiční, anomální data vytvářejí špatné číslo na palubní desce - někdo si všimne, opraví ho, jedeme dál. Při strojovém učení se anomální data v trénovací sadě kontaminují potichu model, který se pak několik měsíců předtím chová ve výrobě špatně že je problém identifikován. Latence mezi problémem a jeho projevem e nekonečně vyšší.
6 dimenzí DAMA kvality dat
Rámec DAMA-DMBOK (Data Management Body of Knowledge) definuje 6 dimenzí základy kvality dat, které v roce 2025 zůstanou standardní referencí pro všechny Program kvality podnikových dat:
Dimenze DAMA pro AI - Extended Framework
| Velikost | Definice | Metrika specifická pro AI | Kritický práh |
|---|---|---|---|
| Přesnost | Data správně reprezentují realitu | % správných štítků v tréninkové sadě | >99 % pro kritickou klasifikaci |
| Úplnost | Všechny potřebné údaje jsou k dispozici | % nenulových hodnot pro kritické funkce | > 95 % pro vstupní funkce |
| Konzistence | Data jsou konzistentní napříč různými systémy | % shodných záznamů mezi zdroji | > 98 % pro sdílené funkce |
| Včasnost | Data jsou aktualizována a dostupná v případě potřeby | Průměrné zpoždění výrobních dat vs | <24h pro modely v reálném čase |
| Platnost | Data respektují definované formáty a omezení | % porušení vzoru a rozsahu | <0,1 % porušení |
| Jedinečnost | Žádné neúmyslné duplikáty | % duplicitních záznamů v tréninkové sadě | <0,5 % duplikátů |
Praktická implementace: Kvalita dat s velkými očekáváními
Velká očekávání a nejpopulárnější open source Python framework pro testování kvalita dat. Tento přístup je podobný jednotkovým testům pro kód: nazývají se „očekávání“ (očekávání) na datech, jsou automaticky prováděny v potrubí a je generována dokumentace automatické. Integrace s Airflow, Prefect a dbt z něj dělá přirozenou součást jakýkoli moderní datový zásobník.
# data_quality_pipeline.py
# Framework completo di data quality con Great Expectations
import great_expectations as gx
from great_expectations.core.batch import RuntimeBatchRequest
import pandas as pd
import numpy as np
from datetime import datetime
import logging
logger = logging.getLogger(__name__)
class DataQualityFramework:
"""
Framework di data quality per pipeline ML enterprise.
Implementa le 6 dimensioni DAMA con Great Expectations.
"""
def __init__(self, datasource_name: str = "ml_training_data"):
self.context = gx.get_context()
self.datasource_name = datasource_name
self.validation_results = {}
def build_expectation_suite_for_ml(
self,
suite_name: str,
target_column: str,
feature_columns: list[str]
):
"""
Crea una suite di expectations per dataset ML.
Copre tutte le 6 dimensioni DAMA.
"""
suite = self.context.add_expectation_suite(
expectation_suite_name=suite_name
)
# === DIMENSIONE: COMPLETENESS ===
# Feature critiche devono avere meno del 5% di valori nulli
for col in feature_columns:
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_values_to_not_be_null",
kwargs={
"column": col,
"mostly": 0.95 # 95% non-null
}
)
)
# Target column deve essere 100% non-null
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_values_to_not_be_null",
kwargs={"column": target_column}
)
)
# === DIMENSIONE: VALIDITY ===
# Valori numerici in range atteso (es. eta 0-120)
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_values_to_be_between",
kwargs={
"column": "customer_age",
"min_value": 18,
"max_value": 120,
"mostly": 0.999
}
)
)
# === DIMENSIONE: UNIQUENESS ===
# Chiavi primarie devono essere uniche
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_values_to_be_unique",
kwargs={"column": "transaction_id"}
)
)
# === DIMENSIONE: CONSISTENCY ===
# Il target deve avere solo valori attesi (no label noise)
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_values_to_be_in_set",
kwargs={
"column": target_column,
"value_set": [0, 1], # Classificazione binaria
}
)
)
# === DIMENSIONE: ACCURACY - Distribuzione statistica ===
# La distribuzione non deve essere degenere
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_proportion_of_unique_values_to_be_between",
kwargs={
"column": "customer_id",
"min_value": 0.3, # Almeno 30% utenti unici
"max_value": 1.0
}
)
)
# Bilanciamento classi per training set (max 10:1 ratio)
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_most_common_value_to_be_in_set",
kwargs={
"column": target_column,
"value_set": [0, 1],
"ties_okay": True
}
)
)
# === DIMENSIONE: TIMELINESS ===
# Dati non più vecchi di 90 giorni
suite.add_expectation(
gx.core.ExpectationConfiguration(
expectation_type="expect_column_values_to_be_between",
kwargs={
"column": "event_timestamp",
"min_value": "2024-11-01", # Rolling window
"max_value": datetime.now().strftime("%Y-%m-%d"),
"parse_strings_as_datetimes": True,
"mostly": 0.99
}
)
)
self.context.save_expectation_suite(suite)
logger.info(f"Suite {suite_name} creata con {len(suite.expectations)} expectations")
return suite
def validate_dataset(
self,
df: pd.DataFrame,
suite_name: str,
run_name: str = None
) -> dict:
"""
Valida un DataFrame contro la suite definita.
Restituisce risultati strutturati per monitoring.
"""
run_name = run_name or f"run_{datetime.now().isoformat()}"
batch_request = RuntimeBatchRequest(
datasource_name=self.datasource_name,
data_connector_name="runtime_connector",
data_asset_name="training_data",
runtime_parameters={"batch_data": df},
batch_identifiers={"run_id": run_name}
)
checkpoint = self.context.add_or_update_checkpoint(
name="ml_data_checkpoint",
validations=[
{
"batch_request": batch_request,
"expectation_suite_name": suite_name
}
]
)
results = checkpoint.run(run_name=run_name)
# Estrai metriche aggregate
validation_result = results.list_validation_results()[0]
stats = validation_result.statistics
quality_report = {
"run_name": run_name,
"timestamp": datetime.now().isoformat(),
"success": results.success,
"evaluated_expectations": stats["evaluated_expectations"],
"successful_expectations": stats["successful_expectations"],
"unsuccessful_expectations": stats["unsuccessful_expectations"],
"success_rate": stats["success_percent"] / 100,
"failed_checks": [
{
"expectation": r.expectation_config.expectation_type,
"column": r.expectation_config.kwargs.get("column"),
"details": r.result
}
for r in validation_result.results
if not r.success
]
}
self.validation_results[run_name] = quality_report
return quality_report
# Utilizzo nella pipeline
def run_data_quality_checks(raw_data_path: str):
framework = DataQualityFramework()
# Definisci le expectations per il dataset
framework.build_expectation_suite_for_ml(
suite_name="ml_training_v1",
target_column="churn_label",
feature_columns=["customer_age", "tenure_months", "monthly_charges",
"total_charges", "contract_type", "payment_method"]
)
# Carica e valida i dati
df = pd.read_parquet(raw_data_path)
report = framework.validate_dataset(df, "ml_training_v1")
if not report["success"]:
failed = report["unsuccessful_expectations"]
logger.error(f"Data quality FALLITA: {failed} check falliti su {report['evaluated_expectations']}")
for check in report["failed_checks"]:
logger.error(f" - {check['expectation']} su colonna '{check['column']}'")
raise DataQualityError(f"Dataset non conforme agli standard di qualità")
logger.info(f"Data quality OK: {report['success_rate']:.1%} success rate")
return report
Kvalita dat s dbt: Deklarativní testování v transformačním kanálu
Pro týmy používající dbt jako transformační vrstva, balík dbt-očekávání přináší stejné schopnosti jako Great Expectations přímo v modelech dbt, definující testy v YAML blízko kódu SQL. Toto Přístup „kvalita jako kód“ zajišťuje, že každá transformace je automaticky ověřena.
# models/schema.yml
# Test di data quality con dbt-expectations
version: 2
models:
- name: ml_features_customer
description: "Feature store per modello churn prediction"
columns:
- name: customer_id
description: "Identificativo univoco cliente"
tests:
- unique
- not_null
- dbt_expectations.expect_column_values_to_be_of_type:
column_type: VARCHAR
- name: customer_age
description: "Eta del cliente in anni"
tests:
- not_null
- dbt_expectations.expect_column_values_to_be_between:
min_value: 18
max_value: 120
mostly: 0.999
- name: monthly_charges
description: "Addebiti mensili in EUR"
tests:
- not_null
- dbt_expectations.expect_column_values_to_be_between:
min_value: 0
max_value: 10000
- dbt_expectations.expect_column_mean_to_be_between:
min_value: 50
max_value: 200
- name: churn_label
description: "Label target: 1=churned, 0=retained"
tests:
- not_null
- accepted_values:
values: [0, 1]
# Verifica che il dataset non sia troppo sbilanciato
- dbt_expectations.expect_column_proportion_of_unique_values_to_be_between:
min_value: 0.01 # Almeno 1% di churn (altrimenti dataset anomalo)
max_value: 0.5 # Max 50% di churn (dataset equilibrato)
- name: event_date
description: "Data dell'evento"
tests:
- not_null
- dbt_expectations.expect_column_values_to_be_between:
min_value: "2023-01-01"
max_value: "{{ var('max_date', modules.datetime.date.today().isoformat()) }}"
parse_strings_as_datetimes: true
- name: ml_features_customer
tests:
# Test a livello di tabella: volumetria attesa
- dbt_expectations.expect_table_row_count_to_be_between:
min_value: 10000
max_value: 10000000
# Nessuna riga duplicata su chiave composta
- dbt_expectations.expect_compound_columns_to_be_unique:
column_list: ["customer_id", "snapshot_date"]
Data Catalog a Data Lineage s OpenMetadata
La daný rodokmen - schopnost sledovat cestu dat ze zdroje až po finální model umělé inteligence – se stal základním požadavkem ze dvou splývajících důvodů: soulad s AI Act EU (který vyžaduje dokumentaci původu tréninkových dat) a praktická potřeba ladění, když model produkuje neočekávané výsledky.
OpenMetadata a nejpokročilejší open source datový katalog a platforma linie v roce 2025, postavený bývalými inženýry Uberu a zakladateli Apache Hadoop. Podporuje rodokmen na úrovni sloupců nativní integrace s dbt, Airflow, Spark a hlavními datovými sklady.
# openmetadata_lineage.py
# Registrazione automatica della data lineage per pipeline ML
from metadata.ingestion.api.workflow import Workflow
from metadata.generated.schema.entity.data.pipeline import Pipeline
from metadata.generated.schema.entity.data.table import Table
from metadata.generated.schema.type.entityLineage import (
ColumnLineage,
EntitiesEdge,
LineageDetails
)
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.generated.schema.security.client.openMetadataJWTClientConfig import (
OpenMetadataJWTClientConfig
)
import json
from typing import Optional
class MLPipelineLineageTracker:
"""
Tracker automatico di data lineage per pipeline ML.
Registra ogni trasformazione in OpenMetadata.
"""
def __init__(self, server_url: str, jwt_token: str):
from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import (
OpenMetadataConnection
)
server_config = OpenMetadataConnection(
hostPort=server_url,
authProvider="openmetadata",
securityConfig=OpenMetadataJWTClientConfig(jwtToken=jwt_token)
)
self.metadata = OpenMetadata(server_config)
def register_training_data_lineage(
self,
source_tables: list[str],
feature_store_table: str,
ml_model_name: str,
transformation_description: str
):
"""
Registra il percorso: raw_data -> feature_store -> ml_model
Essenziale per compliance AI Act (Art. 10 - Data Governance)
"""
# 1. Recupera entità sorgente
source_entities = []
for table_fqn in source_tables:
table = self.metadata.get_by_name(
entity=Table,
fqn=table_fqn
)
if table:
source_entities.append(table)
# 2. Recupera/crea feature store table
feature_table = self.metadata.get_by_name(
entity=Table,
fqn=feature_store_table
)
# 3. Costruisci lineage con dettagli di trasformazione
for source in source_entities:
lineage_request = AddLineageRequest(
edge=EntitiesEdge(
fromEntity={
"id": str(source.id.__root__),
"type": "table"
},
toEntity={
"id": str(feature_table.id.__root__),
"type": "table"
},
lineageDetails=LineageDetails(
description=transformation_description,
columnsLineage=[
ColumnLineage(
fromColumns=[f"{source.fullyQualifiedName.__root__}.customer_id"],
toColumn=f"{feature_store_table}.customer_id"
),
ColumnLineage(
fromColumns=[f"{source.fullyQualifiedName.__root__}.event_date"],
toColumn=f"{feature_store_table}.snapshot_date"
)
]
)
)
)
self.metadata.add_lineage(lineage_request)
# 4. Aggiungi tag di compliance (AI Act)
self._tag_for_ai_act_compliance(feature_store_table, ml_model_name)
def _tag_for_ai_act_compliance(
self,
table_fqn: str,
model_name: str
):
"""
Aggiunge tag AI Act per tracciabilita compliance.
Essenziale per sistemi high-risk (AI Act Art. 10).
"""
table = self.metadata.get_by_name(entity=Table, fqn=table_fqn)
# Tag strutturati per AI Act
compliance_tags = {
"ai_act_article_10": "training_data",
"ai_system": model_name,
"data_governance_reviewed": "true",
"bias_assessment_date": "2025-01-15",
"data_quality_score": "98.5"
}
# Aggiorna custom properties
self.metadata.patch_entity(
entity=Table,
source=table,
destination=table.copy(
update={"customMetrics": compliance_tags}
)
)
print(f"Compliance tags aggiunti per {table_fqn} -> modello {model_name}")
# Utilizzo pratico
def setup_ml_lineage():
tracker = MLPipelineLineageTracker(
server_url="http://openmetadata.internal:8585/api",
jwt_token="your-jwt-token"
)
tracker.register_training_data_lineage(
source_tables=[
"default.raw_crm.customers",
"default.raw_billing.transactions",
"default.raw_support.tickets"
],
feature_store_table="default.feature_store.ml_churn_features_v3",
ml_model_name="churn_prediction_xgboost_v2",
transformation_description="Feature engineering per churn prediction: "
"aggregazioni mensili, calcolo tenure, "
"encoding categoriche. Approvato data steward 2025-01-15."
)
Data Governance Framework: Organizační struktura a procesy
Data governance není softwarový nástroj: je to systém lidé, procesy a technologií což zajišťuje, že data jsou spravována jako strategické aktivum. Pro malé a střední podniky Italské společnosti, které se blíží AI, budují tuto strukturu pragmatickým a zásadním způsobem.
Klíčové role správy dat
Struktura řízení pro malé a střední podniky (50–500 zaměstnanců)
| Role | Odpovědnost | Odhadovaný FTE | Profil |
|---|---|---|---|
| Chief Data Officer (CDO) | Datová strategie, výkonný sponzor, rozpočet, dodržování zákona o AI | 0,25 FTE (částečné) | C-level nebo vyšší manažer |
| Datoví správci | Vlastnictví datové domény, standardní definice, schvalování změn | 1 na datovou doménu | Obchodní + technické |
| datový inženýr | Potrubí, technická kvalita, monitorovací nástroje | 1-2 FTE | Technický profil |
| Analytik kvality dat | Definice KPI kvality, audity, reporting | 0,5 FTE | Analytické/hybridní |
| DPO (Data Protection Officer) | GDPR, AI Act, zabezpečení dat, soukromí již od návrhu | 0,25-0,5 FTE | Právní/technické |
Zásady správy dat: 5 základních procesů
Program správy provozních dat je založen na 5 opakujících se procesech, které musí být dokumentováno, přiděleno a monitorováno:
- Klasifikace dat: Každý soubor dat klasifikovaný podle citlivosti (veřejné, interní, důvěrné, tajné) a podle typu (PII, finanční údaje, provozní údaje, údaje o školení ML). Tato klasifikace určuje řízení přístupu, zásady uchovávání a požadavky použitelné kvality.
- Kvalita dat SLA: Pro každou kritickou datovou sadu formální definice SLA kvalita: úplnost > 98 %, latence < 2 h, přesnost ověřena čtvrtletně. SLA musí být měřitelné a automaticky monitorované.
- Řízení změn: Formální proces pro změny datového schématu kritiků. Žádné změny bez posouzení dopadu, regresního testování a schválení správce dat domény.
- Správa přístupu k datům: Princip nejmenšího privilegia aplikovaný na data. Přístup k datům školení ML je omezen na tým ML s úplným protokolem auditu. Recenze čtvrtletních přístupů.
- Reakce na incident: Postup eskalace pro incidenty kvality dat: automatická detekce (upozornění), třídění (<4h), náprava, pitva aktualizace automatických kontrol.
AI zákon EU a požadavky na údaje o školení
L'AI zákon EU poprvé v historii zavádí zákonné požadavky omezení kvality trénovacích dat pro vysoce rizikové systémy umělé inteligence. THE'článek 10 nařízení a konkrétně věnovaný „Údajům a datům Governance“ a od té doby začala fungovat pro modely GPAI 2. srpna 2025. U vysoce rizikových systémů je vyžadována plná shoda 2. srpna 2026.
Časová osa AI Act EU – co dělat do srpna 2026
| Datum | Milníky | Je vyžadována akce |
|---|---|---|
| únor 2025 | Provozní zakázané praktiky umělé inteligence | Auditujte systémy umělé inteligence pro zakázané praktiky |
| Srpen 2025 | Operační modely a správa GPAI | Řízení pro LLM a základní modely |
| Srpen 2026 | Plná shoda systémů AI s vysokým rizikem | Správa údajů Čl. 10 plně implementováno |
| Srpen 2027 | Soulad se staršími systémy | Odpovídající stávající systémy umělé inteligence |
Článek 10 zákona AI: Technické požadavky na data
Článek 10 zákona o umělé inteligenci ukládá zvláštní požadavky na datové soubory používané při školení, ověřování a testování vysoce rizikových systémů umělé inteligence. Zde je to, co je třeba zdokumentovat a konkrétně implementováno:
# ai_act_compliance_checker.py
# Verifica compliance AI Act Art. 10 per dataset di training
from dataclasses import dataclass, field
from typing import Optional
import pandas as pd
import numpy as np
from scipy import stats
import json
from datetime import datetime
@dataclass
class DatasetComplianceReport:
"""Report di compliance AI Act Articolo 10."""
dataset_name: str
assessment_date: str
assessor: str
compliant: bool = False
checks: dict = field(default_factory=dict)
recommendations: list = field(default_factory=list)
class AIActArticle10Checker:
"""
Verifica conformità AI Act Art. 10 per dataset di training high-risk.
Art. 10 richiede che i dataset siano:
1. Rilevanti e sufficientemente rappresentativi
2. Liberi da errori per quanto possibile
3. Completi rispetto allo scopo
4. Con proprietà statistiche appropriate
5. Privi di bias che potrebbero discriminare gruppi protetti
"""
def __init__(self, dataset_name: str, assessor: str):
self.report = DatasetComplianceReport(
dataset_name=dataset_name,
assessment_date=datetime.now().isoformat(),
assessor=assessor
)
def check_representativeness(
self,
df: pd.DataFrame,
demographic_columns: list[str],
reference_distributions: dict
) -> bool:
"""
Art. 10(3): Verifica rappresentativita demografica.
Confronta distribuzione del dataset con popolazione di riferimento.
"""
is_representative = True
self.report.checks["representativeness"] = {}
for col in demographic_columns:
if col not in df.columns:
continue
# Distribuzione nel dataset
observed = df[col].value_counts(normalize=True).to_dict()
# Distribuzione attesa (es. ISTAT per demografia italiana)
expected = reference_distributions.get(col, {})
if not expected:
continue
# Test chi-quadro per significativita statistica
categories = list(set(observed.keys()) | set(expected.keys()))
obs_counts = [df[col].value_counts().get(c, 0) for c in categories]
exp_props = [expected.get(c, 0.001) for c in categories]
# Normalizza expected
total_exp = sum(exp_props)
exp_normalized = [p / total_exp * len(df) for p in exp_props]
chi2, p_value = stats.chisquare(obs_counts, exp_normalized)
deviation = {
"chi2_statistic": chi2,
"p_value": p_value,
"is_representative": p_value > 0.05, # p > 0.05 = no significant deviation
"observed_distribution": observed,
"expected_distribution": expected
}
self.report.checks["representativeness"][col] = deviation
if p_value <= 0.05:
is_representative = False
self.report.recommendations.append(
f"CRITICO: Colonna '{col}' non e rappresentativa della popolazione target "
f"(chi2={chi2:.2f}, p={p_value:.4f}). "
f"Richiesta oversampling o raccolta dati aggiuntiva."
)
return is_representative
def check_bias_protected_attributes(
self,
df: pd.DataFrame,
target_column: str,
protected_attributes: list[str]
) -> bool:
"""
Art. 10(5): Verifica assenza bias su attributi protetti.
Usa disparate impact ratio (soglia 0.8 = 80% rule).
"""
is_unbiased = True
self.report.checks["bias_assessment"] = {}
for attr in protected_attributes:
if attr not in df.columns:
continue
groups = df[attr].unique()
positive_rates = {}
for group in groups:
mask = df[attr] == group
group_df = df[mask]
if len(group_df) == 0:
continue
positive_rate = (group_df[target_column] == 1).mean()
positive_rates[str(group)] = positive_rate
if len(positive_rates) < 2:
continue
max_rate = max(positive_rates.values())
min_rate = min(positive_rates.values())
# Disparate Impact = min_rate / max_rate
# AI Act richiede > 0.8 (80% rule)
disparate_impact = min_rate / max_rate if max_rate > 0 else 1.0
bias_result = {
"disparate_impact": disparate_impact,
"compliant": disparate_impact >= 0.8,
"group_rates": positive_rates,
"max_group": max(positive_rates, key=positive_rates.get),
"min_group": min(positive_rates, key=positive_rates.get)
}
self.report.checks["bias_assessment"][attr] = bias_result
if disparate_impact < 0.8:
is_unbiased = False
self.report.recommendations.append(
f"CRITICO: Bias rilevato su attributo protetto '{attr}'. "
f"Disparate impact = {disparate_impact:.3f} (soglia AI Act: 0.80). "
f"Applicare re-weighting, resampling o fairness constraints."
)
return is_unbiased
def check_completeness_and_errors(
self,
df: pd.DataFrame,
critical_features: list[str]
) -> bool:
"""
Art. 10(2): Verifica completezza e assenza di errori.
"""
is_complete = True
self.report.checks["completeness"] = {}
for col in critical_features:
null_rate = df[col].isna().mean()
is_col_complete = null_rate < 0.05 # Soglia 5%
self.report.checks["completeness"][col] = {
"null_rate": null_rate,
"compliant": is_col_complete
}
if not is_col_complete:
is_complete = False
self.report.recommendations.append(
f"AVVISO: Feature '{col}' ha {null_rate:.1%} valori mancanti. "
f"Applicare imputation strategy o raccogliere dati aggiuntivi."
)
return is_complete
def generate_compliance_report(self) -> str:
"""Genera report JSON per audit AI Act."""
self.report.compliant = all([
check.get("is_representative", True)
for check in self.report.checks.get("representativeness", {}).values()
] + [
check.get("compliant", True)
for check in self.report.checks.get("bias_assessment", {}).values()
] + [
check.get("compliant", True)
for check in self.report.checks.get("completeness", {}).values()
])
return json.dumps({
"dataset": self.report.dataset_name,
"assessment_date": self.report.assessment_date,
"assessor": self.report.assessor,
"ai_act_article_10_compliant": self.report.compliant,
"checks": self.report.checks,
"recommendations": self.report.recommendations,
"next_review_date": "2025-04-15"
}, indent=2, default=str)
# Esempio di utilizzo per un sistema HR high-risk
def assess_hr_model_dataset(df: pd.DataFrame):
checker = AIActArticle10Checker(
dataset_name="hr_promotion_training_v3",
assessor="Maria Rossi, Data Steward HR"
)
# Distribuzione di riferimento: composizione forza lavoro italiana
reference_distributions = {
"gender": {"M": 0.54, "F": 0.46},
"age_group": {"18-30": 0.20, "31-45": 0.40, "46-60": 0.35, "60+": 0.05}
}
# Esegui tutti i check
checker.check_representativeness(df, ["gender", "age_group"], reference_distributions)
checker.check_bias_protected_attributes(df, "promoted", ["gender", "age_group", "nationality"])
checker.check_completeness_and_errors(df, ["performance_score", "tenure", "education_level"])
report = checker.generate_compliance_report()
print(report)
return report
Pozorovatelnost dat: Nepřetržité sledování výrobních potrubí
Kvalita dat není zaručena pouze v době příjmu: data časem degradují čas. The phenomenon of datový drift - kde je distribuce dat produkce se postupně odchyluje od tréninkové množiny – a jedna z hlavních příčin tiché degradace modelů AI. Pozorovatelnost dat řeší tento problém s nepřetržitým sledováním a proaktivním varováním.
Porovnání nástrojů pro sledování dat 2025
| Nástroj | Typ | Silné stránky | Ideální případ použití |
|---|---|---|---|
| Sodové jádro | Open source | Na bázi YAML, CLI, vložit do CI/CD | SME s omezeným rozpočtem, dbt pipeline |
| Monte Carlo | SaaS (podnik) | Detekce anomálií s nulovou konfigurací poháněná ML | Podnikání, velký objem, malý tým |
| Velká očekávání | Open source | Python-nativní, flexibilní, automatická dokumentace | Datový inženýrský tým, Python pipeline |
| testy dbt | Open source | Kvalita jako kód, integrovaná do pracovního postupu dbt | Týmy používající dbt jako hlavní vrstvu |
| Metarovina | SaaS (střední trh) | Lineage + pozorovatelnost, intuitivní uživatelské rozhraní | Škálování s více zdroji dat |
Detekce posunu dat pomocí Soda Core
Sodové jádro umožňuje definovat kontroly kvality v YAML a provádět je plánovaně nebo na vyžádání. Pro sledování driftu dat je možné porovnávat distribuce kritických rysů mezi různými obdobími, automaticky detekce významné změny, které by mohly degradovat modely AI.
# soda_checks_ml_pipeline.yml
# Check Soda Core per data observability pipeline ML
checks for ml_features_customer:
# === FRESHNESS: timeliness dei dati ===
- freshness(event_date) < 24h:
name: "Dati non più vecchi di 24 ore"
fail:
when freshness(event_date) > 24h
warn:
when freshness(event_date) > 12h
# === VOLUME: anomalie di volumetria ===
- row_count > 50000:
name: "Minimo 50K record per inference affidabile"
- row_count between 50000 and 5000000:
name: "Volume nel range atteso (no spike anomali)"
# === COMPLETENESS ===
- missing_count(customer_age) = 0:
name: "Customer age: zero null tollerati"
- missing_percent(monthly_charges) < 2%:
name: "Monthly charges: max 2% null"
# === VALIDITY ===
- invalid_percent(customer_age) < 0.1%:
name: "Customer age nel range 18-120"
valid min: 18
valid max: 120
- duplicate_count(customer_id) = 0:
name: "Nessun customer_id duplicato"
# === DISTRIBUTION DRIFT ===
# Confronto con baseline storica (riferimento: settimana precedente)
- distribution_difference_index(monthly_charges) < 0.1:
name: "Monthly charges: drift < 10% vs baseline"
method: psi # Population Stability Index
baseline: soda://ml_features_customer/monthly_charges_baseline
- distribution_difference_index(customer_age) < 0.1:
name: "Customer age: drift < 10% vs baseline"
method: ks # Kolmogorov-Smirnov test
# === BUSINESS RULES ===
- failed_rows(monthly_charges_anomaly):
name: "Nessun addebito negativo"
fail condition: monthly_charges < 0
- failed_rows(contract_consistency):
name: "Contratti annuali: addebito >= 100 EUR"
fail condition: contract_type = 'annual' AND monthly_charges < 100
# Configurazione alerting
alert config:
slack:
webhook: "https://hooks.slack.com/services/..."
channel: "#data-quality-alerts"
email:
to:
- "data-team@azienda.it"
- "ml-team@azienda.it"
severity:
fail: immediate
warn: daily_digest
Detekce zkreslení v ML datových sadách: Systematický přístup
Il zkreslení v datech a jeden z nejzáludnějších problémů v podnikovém strojovém učení: tiché, obtížně zjistitelné bez vhodných metodologií a potenciálně diskriminační vůči chráněným skupinám. Zákon o umělé inteligenci klasifikuje systémy umělé inteligence používané jako „vysoce rizikové“. rozhodování o přístupu k práci, úvěru, veřejným službám a vzdělání, odhalování zkreslení a stal se požadavkem dodržování předpisů i profesionální etiky.
Zkreslení v trénovacích datech vzniká ze tří hlavních zdrojů: historická zaujatost (údaje odrážející minulou diskriminaci, např. historicky nevyvážená míra propagace), zaujatost reprezentace (skupiny nedostatečně zastoupené v tréninkové sadě), e zkreslení měření (funkce, které slouží jako proxy pro chráněné atributy, např. PSČ jako proxy pro příjem a etnickou příslušnost).
Metriky spravedlnosti – standardy IBM AIF360 a AI Act
| Metrický | Vzorec | Práh zákona AI | Typické použití |
|---|---|---|---|
| Nesourodý dopad | P(Y=1|A=0) / P(Y=1|A=1) | >= 0,80 | Pronájem, úvěr |
| Rovné příležitosti | TPR(A=0) – TPR(A=1) | |rozdíl| < 0,05 | Zdravotnictví, spravedlnost |
| Demografická parita | P(Y=1|A=0) – P(Y=1|A=1) | |rozdíl| < 0,05 | Doporučení |
| Kalibrace | P(Y=1|skóre=s, A=a) jednotné | RMSE < 0,02 | Bodování rizika |
Případová studie: Správa dat pro italský výrobní MSP
Lombardský výrobní MSP se 180 zaměstnanci zahájil datový program v roce 2024 řízení na podporu tří iniciativ AI: model prediktivní údržby pro strojní zařízení CNC, vizuální systém kontroly kvality založený na počítačovém vidění a předpovídání poptávky pro plánování výroby.
Výzva: Data byla všude a nikdo za ně nebyl zodpovědný
Počáteční situace byla typická pro italské malé a střední podniky: IoT senzory, které zapisovaly data proprietární formáty, produkční data v SAP Business One ERP, data o kvalitě v Excelové listy sdílené e-mailem, prodejní data v neintegrovaném CRM. IT tým měl technická vize infrastruktury, ale žádná formální správa.
Výsledky programu Data Governance (12 měsíců)
| Indikátor | Před | Po 12 měsících | Dopad |
|---|---|---|---|
| Průměrné skóre kvality dat | 61 % | 94 % | +33 bodů |
| Doba přípravy dat ML | 3-4 týdny | 2-3 dny | -90 % |
| Datový soubor s dokumentovanou linií | 0% | 87 % | +87 bodů |
| AI modely ve výrobě | 0 | 3 | +3 systémy |
| Soulad se zákonem o AI Čl. 10 | Nehodnoceno | Vyhovující | Připraveno na audity |
Plán implementace ve 4 fázích
Program byl strukturován do 4 čtvrtletních fází s celkovou investicí přibližně 85 000 EUR (částečně pokryto přechodem PNRR 5.0):
- Fáze 1 – Inventář a hodnocení (1. čtvrtletí 2024): Mapování všech systémů data, klasifikace datových sad podle kritičnosti AI, počáteční hodnocení kvality. Pomůcky: inventární list + sebehodnotící dotazník pro doménové manažery. Výstup: kompletní mapa kritických dat s analýzou mezer.
- Fáze 2 – Nadace (2. čtvrtletí 2024): Nasazení OpenMetadata on-premise, konfigurace prvních datových katalogů, definice správců dat pro každou doménu (výroba, kvalita, prodej). Implementace prvních automatických kontrol s dbt testy.
- Fáze 3 – Automatizace kvality (3. čtvrtletí 2024): Nasaďte velká očekávání pro automatickou validaci datových sad ML, integraci s Airflow pro upozornění, definice kvalitních SLA pro 3 projekty AI. První hodnocení AI Act Art. 10.
- Fáze 4 – Optimalizace a vyspělá správa (4. čtvrtletí 2024): Rada pro data aktivní měsíční, kvalitní KPI na Metabase dashboard, proces řízení změn formální, školení personálu. 3 modely AI byly nasazeny ve výrobě s kompletní správou dat.
Poučení: 5 chyb, kterým je třeba se vyhnout
- Počínaje nástroji místo procesů: Technologie přijde později lidé a procesy. Před instalací jakéhokoli softwaru jmenujte správce dat.
- Chtít udělat vše hned: Program evoluční správy a další udržitelný než velký třesk. Začněte s kritickými datovými sadami pro AI a postupně rozšiřujte.
- Podcenění tréninku: Bylo investováno 40 % rozpočtu školení a řízení změn. Bez toho jsou nástroje ignorovány.
- Nezapojujte firmu: Správci dat musí být hybridní postavy obchodně-technické, nejen IT. Business ví, jaká data jsou kritická, IT ví jak měřit je.
- Ignorování souladu od začátku: Požadavky zákona AI nejsou omezení: jsou strukturou, která v očích ospravedlňuje investice do správy věcí veřejných řízení.
Osvědčené postupy a anti-vzorce
Základní doporučené postupy
- Kvalita jako kód: Definujte požadavky na kvalitu v kódu (YAML, Python) verze v Git, ne v dokumentech Wordu. Díky tomu jsou kontroly automatické, reprodukovatelné a součástí procesu CI/CD.
- Selhat rychle, selhat hlasitě: Kontrola kvality dat musí zablokovat potrubí (nejen vygenerovat varování), když jsou data mimo rozsah. Modelka cvičená na špatná data způsobují horší škody než zastavené potrubí.
- Oddělené ověření od transformace: Ověřte data před jejich transformací (ověření schématu a rozsahu při příjmu), při transformaci (test dbt v modelech), a před použitím v ML (Great Expectations on the feature store). Dochází ke kvalitě na více místech, nejen na konci.
- Monitorujte drift, nejen statickou kvalitu: Údaje se v průběhu času mění. PSI (Population Stability Index) a KS (Kolmogorov-Smirnov) testy jsou standardními nástroji k detekci distribučních posunů, které tiše degradují modely.
- Rozhodnutí o správě dokumentů: Každá volba (práh kvality, strategie atribuce, vyloučení datové sady) musí být zdokumentovány s datem, autor a racionální. Tato dokumentace je vyžadována zákonem o AI pro vysoce rizikové systémy.
Anti-vzory, kterým je třeba se vyhnout
Kritické anti-vzorce ve správě dat pro AI
- Kvalita dat "nejlepší úsilí": Definujte vágní SLA („data co nejvíce úplné") namísto přesných a měřitelných numerických prahů. Bez metrik neexistuje žádná skutečné vládnutí.
- Ztišení upozornění: Nakonfigurujte kontroly kvality a poté ztište výstrahy, protože „ruší“. Každé ignorované upozornění je budoucí modelový problém ve výrobě.
- Správa pouze pro nové projekty: Starší datové sady používané pro modelové rekvalifikace mají stejné požadavky na kvalitu. Jsou často nejvíce problematické.
- Jednorázová kontrola zkreslení: Zkreslení kontrolujte pouze před tréninkem počáteční. Zkreslení se může objevit s novými daty výroby v průběhu času (posun konceptu).
- Matoucí kvalita dat pro analýzu a ML: Přijatelné prahové hodnoty pro řídicí panel (5 % null ve sloupci) může být pro funkci katastrofální ML vstupů. Tyto dva kontexty vyžadují různé standardy.
Závěry a další kroky
Správa dat a kvalita dat pro umělou inteligenci nejsou byrokracie: je to infrastruktura neviditelný, který určuje, zda vaše modely fungují ve výrobě nebo tiše selžou. Díky AI Act EU, který přináší právně závazné požadavky na tréninková data, Investice do správy není jen dobrá praxe – je to nezbytný předpoklad fungování na evropském trhu s vysoce rizikovými systémy umělé inteligence.
Il praktickým výchozím bodem pro jakoukoli organizaci – SME nebo podnik – and the same: identify the 3-5 most critical datasets for your AI initiatives, name a správce dat pro každou z nich, implementujte automatické kontroly pomocí nástrojů s otevřeným zdrojovým kódem popsané v tomto článku (Velká očekávání, dbt-očekávání, Soda Core) a postupně budovat strukturu řízení kolem těchto datových sad.
Dokonalost není prvotním požadavkem: 94% skóre kvality dat bylo dosaženo Výroba PMI v naší případové studii po 12 měsících začala na 61 %. Cesta Záleží stejně jako místo určení a každé procento zlepšení kvality dat se přímo promítá do spolehlivějších modelů umělé inteligence, méně nehod výroba a silnější obchodní rozhodnutí.
Kontrolní seznam pro spouštění programu AI pro správu dat
- Inventář kritických datových sad pro AI dokončen
- Jmenovaní správci dat pro každou klíčovou datovou doménu
- Kvalitní SLA definovaná a schválená (úplnost, čerstvost, platnost)
- Automatické kontroly implementované v potrubí (GE, dbt-expectations nebo Soda)
- Katalog dat s nakonfigurovanou linií (OpenMetadata nebo Apache Atlas)
- Posouzení zkreslení provedeno pro všechny soubory dat používané ve vysoce rizikových systémech
- Zákon o AI, čl. 10 documentation for high-risk systems initiated
- Nakonfigurovaná upozornění a definované kanály eskalace
- Plánován první měsíční Data Council
- Týmový trénink dokončen
Související statistiky
- MLOps pro firmy: Jak sledovat drift modelů ve výrobě s MLflow - Článek #12 této série
- LLM ve společnosti: Správa dat pro podnik RAG a zabezpečení dat ve velkých jazykových modelech - Článek #10 této série
- AI inženýrství: Ukládání funkcí a správa vkládání pro systémy podnik RAG - AI inženýrská řada
- PostgreSQL AI: pgvector a kvalita dat pro vektorové databáze - Řada PostgreSQL AI







