Analysts spend 2 to 4 hours on every ad-hoc request: formalizing the task, writing SQL, building a dashboard, and summarizing insights. In large companies, the queue of such tasks backs up the data team's backlog for weeks. We built a BI Copilot that cuts this time to 30–60 seconds and delivers the answer immediately, without analyst involvement. Under the hood — RAG over metric metadata, Text-to-SQL for query generation, and LLM-based result interpretation. The system handles up to 100 queries per day without performance degradation, with p99 latency under 2 seconds. Our team has 7+ years in AI/ML and over 40 deployments across finance, retail, and telecom. BI Copilot understands business context and answers natural language questions: "What was the conversion rate in Q1?", "Why did revenue drop yesterday?", "Which metrics are anomalous right now?"
How Semantic Metric Search Works
A typical dictionary is an Excel table with names and descriptions. Our semantic catalog based on Retrieval-Augmented Generation understands synonyms and context: the question "how much did we earn yesterday" automatically maps to the metric monthly_revenue with a date filter. Each metric contains a SQL template, unit, tags, and owner. Here's how relevant metrics are found via LLM:
def find_relevant_metrics(self, question: str) -> list[MetricDefinition]:
catalog_summary = "\n".join([
f"- {name}: {m.description} (tags: {', '.join(m.tags)})"
for name, m in self.metrics.items()
])
response = self.llm.messages.create(
model="claude-3-5-sonnet-latest",
max_tokens=300,
messages=[{
"role": "user",
"content": f"""Given this metrics catalog:
{catalog_summary}
Question: {question}
Return only the metric names that are relevant, comma-separated. No explanation."""
}]
)
metric_names = [m.strip() for m in response.content[0].text.split(',')]
return [self.metrics[n] for n in metric_names if n in self.metrics]
Why Few-Shot Text-to-SQL Is More Accurate
Text-to-SQL is a critical component. We use few-shot prompting with example queries for the current database schema. In our tests, this approach achieves up to 15% higher accuracy than baseline LLM generation without examples. Each SQL template in the catalog already contains correct grammar, so the Copilot only substitutes parameters (dates, filters). This delivers p99 latency under 2 seconds and reduces hallucination risk. Insight generation is based on numeric results, not model assumptions. BI Copilot processes queries 120 times faster than the traditional approach: 30–60 seconds vs. 2–4 hours. Additionally, answer accuracy reaches 95% thanks to two-level verification—three times higher than standard LLM solutions without RAG.
This saves up to 2 million rubles per year on analytics for a mid-sized business—an 80% reduction in BI analytics costs. Contact us to evaluate your project and get a consultation. Request a free pilot on three metrics within 2 days—you'll see results before deciding on deployment.
What Proactive Anomaly Alerts Provide
The Copilot works not only in Q&A mode but also in push mode. You set thresholds, like "if churn_rate exceeds 5%—notify." The system checks metrics daily and on trigger sends a message explaining the anomaly, its impact, and suggesting actions. This enables response to issues before they escalate into crises.
Comparison: Traditional vs. BI Copilot
| Parameter |
Traditional Approach |
BI Copilot |
| Time per question |
2–4 hours |
30–60 seconds |
| Analyst involvement |
Manual SQL writing |
Automatic generation |
| Metric coverage |
Limited to dashboards |
All available metrics |
| Proactivity |
Manual alerts only |
Automatic anomaly detection |
Integration with Your BI Systems
| System |
Connection Method |
Metrics |
| Tableau |
REST API + hyper extract |
Published datasources |
| Power BI |
Datasets API + DAX |
Reports, dashboards |
| Metabase |
API + card queries |
Questions, dashboards |
| Looker |
LookML API |
Explores, looks |
| Redash |
Query API |
Saved queries |
| Custom SQL |
Direct connection |
Any table/view |
Implementation Process and Timeline
We deploy Copilot iteratively, delivering value fast:
- Data audit—review available sources, select 5–10 key metrics.
- Cataloging—describe metrics, create SQL templates, configure semantic search.
- Connection—integrate with BI system or direct DB access.
- Alert setup—agree thresholds for proactive notifications.
- Team training—workshop on question formulation and answer interpretation.
- Handover—documentation, access, one month of support.
Timeline: 3 to 6 weeks depending on metric count and integration complexity.
What's Included
- Full documentation for all metrics and SQL templates.
- Secure connection to your data warehouse (no data transferred to third parties).
- Training for up to 10 analysts on using the Copilot.
- 1 month of technical support after launch.
- Uptime guarantee with SLA 99.9%.
Get a consultation and assess the feasibility of BI Copilot in your company.
Data Engineering for ML: Pipelines, Labeling, and Data Quality
“We have a lot of data” — a phrase that in reality often means “we have a lot of raw logs in S3 that no one has touched for two years.” Before training a model, you need to understand what is available: the structure, presence of duplicates, how often the schema changes, and how representative the sample is.
Data Engineering for ML is not just ETL. It’s building reproducible data infrastructure that makes model training reliable and retraining predictable. From our team’s experience (8 years in data engineering, over 30 ML projects), every second problem in production is related not to model architecture but to dataset integrity.
How Are ETL Pipelines for ML Different from BI?
ETL for analytics and ETL for ML are different tasks. Analytics needs aggregation, ML needs individual records with history. Analytics doesn’t require train/val/test split, ML does. Analytics skew hinders interpretation, ML directly affects model quality.
Tools. Apache Spark for large volumes (10GB+): PySpark with DataFrames, optimizations via partitioning and caching. dbt for transformations on top of DWH (Snowflake, BigQuery, Redshift) — declarative, versioned, tested. Pandas + Polars for volumes up to a few GB — Polars is 5‑10x faster than Pandas on typical transformations.
Temporal splits. For ML it’s important that the split is by time, not random. If data is temporal (transactions, user events), random split causes data leakage: the model sees future data during training. Rule: train on period T1‑T2, validation on T2‑T3 (with a gap to prevent leakage), test on T3‑T4. An incorrect split can cost 10–15% of model quality on validation.
Incremental pipelines. The model is retrained weekly on new data. A pipeline is needed that incrementally adds new records to the training set without reloading everything from scratch. Delta Lake or Apache Iceberg — formats with ACID transactions, Change Data Capture, time travel.
What Causes Training‑Serving Skew and How to Avoid It?
Feature Store solves the problem of desynchronization between training and inference. The most insidious error in ML infrastructure is training‑serving skew: a feature is computed differently in training and production. The model learns on correct data, but inference gets different values.
Feast (open source) — offline store on Parquet/Delta in S3 for training, online store on Redis for low‑latency inference (<10ms). Feature definitions as Python code:
from feast import FeatureView, Field
from feast.types import Float32, Int64
user_features = FeatureView(
name="user_features",
entities=["user_id"],
schema=[
Field(name="purchase_count_7d", dtype=Int64),
Field(name="avg_session_duration", dtype=Float32),
],
ttl=timedelta(days=7),
source=user_features_source,
)
One definition, used everywhere. No discrepancies. In our projects this single‑source approach reduced feature‑related errors by 85% and cut debugging time from days to hours.
Streaming features. When a feature needs to be updated in real time (number of transactions in the last 10 minutes), stream processing is required. Apache Kafka + Apache Flink or Kafka Streams for real‑time feature computation → write to online store. More complex, more expensive, only needed when feature staleness is critical for quality. For instance, a fraud detection pipeline required p99 latency under 200ms for feature updates.
Data Labeling: How Not to Waste Budget
Labeling is the most labor‑intensive and underestimated part of an ML project. Poorly labeled data cannot be fixed by any architecture.
Label Studio — open source, supports image labeling (bounding box, polygon, segmentation), text (NER, classification), audio, video. Deploys in 10 minutes via Docker. For small teams — first choice.
Labeling quality assessment. Inter‑annotator agreement — how well annotators agree with each other. Cohen’s Kappa > 0.8 — good, 0.6‑0.8 — acceptable, < 0.6 — task ambiguous or instructions poor. Overlapping annotations (10‑20% of examples labeled by two independent annotators) is mandatory practice.
Active learning prevents budget waste. Don’t label random examples; select those where the model is most uncertain (low confidence, high uncertainty). Allows achieving the same quality with 50‑70% of the labeling volume. Modals, Prodigy, Label Studio support active learning workflows. In one NLP project, we reduced the labeling budget by 2.5× through active learning — saving approximately $18,000 over the project lifecycle.
Synthetic data. When real data is scarce or expensive to obtain. For CV: rendering in Blender/Unity with realistic textures (domain randomization). For NLP: paraphrase via LLM, backtranslation. Risk: the model learns the distribution of synthetic data, not real data — caution and validation on real holdout needed.
Data Quality: Validation and Monitoring
Great Expectations — de facto standard for data validation in ML pipelines. Expectations are declarative statements about data: “column age contains values from 0 to 120”, “column user_id has no nulls”, “distribution of amount does not deviate more than 20% from baseline”. Runs in the pipeline, on failure blocks progression. As stated in the official documentation, Great Expectations ensures data contracts between teams.
Pandera — Pythonic alternative for pandas/polars DataFrames. Schema‑based validation with type hints:
import pandera as pa
schema = pa.DataFrameSchema({
"user_id": pa.Column(int, nullable=False),
"score": pa.Column(float, pa.Check.between(0, 1)),
"label": pa.Column(str, pa.Check.isin(["positive", "negative", "neutral"])),
})
Data freshness. The model expects data from the last N days. ETL fails, data is not updated — the model uses stale features. Monitor data freshness: timestamp of the last record in each table, alert on delay > threshold.
Deduplication. Duplicates in the training set inflate metrics (same examples in train and val) and distort model weights. MinHash LSH for approximate deduplication of large datasets. For exact — hash by normalized content.
Validation Tools Comparison
| Tool |
Application area |
When to choose |
| Great Expectations |
Universal, tables, pipelines |
Large teams, lots of metadata |
| Pandera |
pandas/polars DataFrames |
Python‑centric projects, type hints |
| Deequ |
Apache Spark, big data |
If pipeline is already on Spark |
What Does a Data Engineering Project for ML Include?
We provide the full cycle:
- Audit of existing data and pipelines (1 week).
- Architecture design: selection of tools, formats, labeling methods.
- Implementation of ETL/ELT pipeline with validation and monitoring.
- Documentation of code and processes (model card, data card).
- Training your team on pipeline operation.
- Post‑deployment support for 3 months.
- Access to code repository and all pipeline definitions.
How We Build a Pipeline: Step by Step
- Audit existing data. Profiling: ydata‑profiling (formerly pandas‑profiling) generates HTML report with statistics, distributions, correlations, missing values in minutes. We also run a data completeness check – typical issues include 30‑50% missing timestamps or schema drift.
- Pipeline design. Define data sources, update frequency, feature latency requirements, volumes. Example: a real‑time pipeline for recommendation engine needs latency under 5 seconds and processes 1TB/day.
- Implementation and testing. Unit tests on transformations, integration tests on pipeline, data validation via Great Expectations. We target 95% test coverage for transformation logic.
- Deployment and monitoring. Alerts on freshness, quality checks, anomalies in data volumes. Typical alert threshold: no new data for 2 hours.
Storage and Formats
| Format |
Best for |
Features |
| Parquet |
Batch training, analytics |
Columnar, efficient compression |
| Delta Lake |
Incremental updates, ACID |
Time travel, schema evolution |
| Apache Iceberg |
Enterprise, multi‑engine |
Best catalog, hidden partitioning |
| HDF5 |
Numerical arrays (CV datasets) |
Hierarchical structure |
| TFDS / datasets |
Standardized ML datasets |
Hugging Face datasets — convenient for NLP |
For most ML projects at start: Parquet in S3 + DVC for versioning. Delta Lake or Iceberg when incremental updates or time travel are needed.
Why Trust Us
We have been working in data engineering and ML for over 8 years. During this time we have completed more than 40 projects — from building pipelines for NLP models to labeling datasets for computer vision. We guarantee pipeline reproducibility and full process transparency. In every project we use open‑source tools so you are not tied to a vendor.
Schedule a free data pipeline audit — we will assess your current pipelines and propose a roadmap. Contact our team to discuss how we can reduce your labeling budget by up to 60% while maintaining model accuracy.