Back to Blog
2 min read

Semantic Layer for AI: Building Business-Ready Data Interfaces

A semantic layer bridges the gap between raw data and AI applications by providing business context.

AI-Ready Semantic Layer

from dataclasses import dataclass
from typing import Optional
import yaml

@dataclass
class Metric:
    name: str
    description: str
    calculation: str
    dimensions: list[str]
    filters: Optional[dict] = None

@dataclass
class Dimension:
    name: str
    description: str
    source_column: str
    hierarchy: Optional[list[str]] = None

class SemanticLayer:
    def __init__(self, config_path: str):
        self.metrics = {}
        self.dimensions = {}
        self.load_config(config_path)

    def load_config(self, path: str):
        """Load semantic layer definitions."""
        with open(path) as f:
            config = yaml.safe_load(f)

        for metric in config['metrics']:
            self.metrics[metric['name']] = Metric(**metric)

        for dim in config['dimensions']:
            self.dimensions[dim['name']] = Dimension(**dim)

    def get_metric_sql(self, metric_name: str, dimensions: list[str]) -> str:
        """Generate SQL for a metric with dimensions."""
        metric = self.metrics[metric_name]
        dim_columns = [self.dimensions[d].source_column for d in dimensions]

        return f"""
        SELECT
            {', '.join(dim_columns)},
            {metric.calculation} as {metric.name}
        FROM {metric.source_table}
        GROUP BY {', '.join(dim_columns)}
        """

    def get_context_for_ai(self, question: str) -> str:
        """Generate context about available metrics for AI."""
        relevant_metrics = self.find_relevant_metrics(question)
        context = "Available metrics:\n"
        for metric in relevant_metrics:
            context += f"- {metric.name}: {metric.description}\n"
            context += f"  Dimensions: {', '.join(metric.dimensions)}\n"
        return context

    def natural_language_query(self, question: str) -> str:
        """Convert natural language to semantic layer query."""
        context = self.get_context_for_ai(question)
        # Use LLM to map question to metrics and dimensions
        return self.llm_translate(question, context)

A semantic layer enables AI to understand business terminology and generate accurate queries.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.