Гірнича справа — галузь, де відмова обладнання або неточна геологічна модель коштують мільйонів доларів. Позаплановий простій кар'єрного екскаватора — мільйони гривень на добу, а помилка в оцінці вмісту металу позбавляє прибутку на весь термін експлуатації родовища. Ми проєктуємо AI-системи, які інтегруються з SCADA та MES, аналізують телеметрію в реальному часі та автоматично коригують плани видобутку. Наш стек: PyTorch для CV-моделей, LangChain для RAG-звітів, vLLM для інференсу LLM. Використовуємо LoRA fine-tuning для адаптації моделей під конкретне родовище. Всі рішення деплояться в Kubernetes з Triton Inference Server для низької затримки. Ми реалізували понад 30 проєктів у гірничій галузі, включаючи предиктивну діагностику для 5 кар'єрів. Середня економія склала 40 млн грн на проєкт.
Як AI знижує простої гірничого обладнання?
Предиктивне обслуговування екскаваторів, бурових установок і конвеєрів. Гірниче обладнання працює в умовах абразивного зносу, ударних навантажень і пилу. Середнє напрацювання на відмову (MTBF) кар'єрного екскаватора — сотні годин. Наші моделі машинного навчання аналізують телеметрію та передбачають відмови за 6-72 години до їх настання.
import pandas as pd import numpy as np from sklearn.ensemble import IsolationForest, GradientBoostingClassifier from sklearn.preprocessing import StandardScaler class MiningEquipmentPredictor: """Предиктивна діагностика гірничого обладнання за телеметрією""" def __init__(self, equipment_id: str, equipment_type: str): self.equipment_id = equipment_id self.equipment_type = equipment_type self.anomaly_detector = IsolationForest(contamination=0.03, n_estimators=200) self.failure_classifier = GradientBoostingClassifier(n_estimators=300) def extract_features(self, telemetry_df: pd.DataFrame) -> pd.DataFrame: """ Ознаки з телеметрії: вібрація, температура, струм, тиск. Зсуви: 1год, 4год, 8год (зміна), 24год. """ features = telemetry_df.copy() sensor_cols = ['vibration_x', 'vibration_y', 'vibration_z', 'motor_temp', 'bearing_temp', 'hydraulic_pressure', 'motor_current', 'oil_pressure', 'rpm'] for col in sensor_cols: if col in features.columns: for window in [60, 240, 480]: # хвилини features[f'{col}_mean_{window}'] = features[col].rolling(window).mean() features[f'{col}_std_{window}'] = features[col].rolling(window).std() features[f'{col}_max_{window}'] = features[col].rolling(window).max() # Тренд: похідна features[f'{col}_trend'] = features[col].diff(60) # Вібраційні ознаки (FFT-статистики якщо є raw) if 'vibration_x' in features.columns: features['vibration_rms'] = np.sqrt( features[['vibration_x', 'vibration_y', 'vibration_z']].pow(2).mean(axis=1) ) features['vibration_crest_factor'] = ( features[['vibration_x', 'vibration_y', 'vibration_z']].abs().max(axis=1) / (features['vibration_rms'] + 1e-6) ) return features.dropna() def detect_anomalies(self, features_df: pd.DataFrame) -> pd.Series: """Виявлення аномальної поведінки обладнання""" feature_cols = [c for c in features_df.columns if any( x in c for x in ['_mean_', '_std_', '_max_', '_trend', 'rms', 'crest'] )] X = features_df[feature_cols].fillna(0) scores = self.anomaly_detector.decision_function(X) return pd.Series(-scores, index=features_df.index, name='anomaly_score') def predict_failure_probability(self, features_df, horizon_hours=24): """P(відмова протягом horizon_hours) → поріг 0.7 = попередження""" feature_cols = [c for c in features_df.columns if c not in ['timestamp', 'equipment_id', 'failure_label']] X = features_df[feature_cols].fillna(0) proba = self.failure_classifier.predict_proba(X)[:, 1] return proba Специфіка за типом обладнання:
| Обладнання | Ключові датчики | Типові відмови | Попередження |
|---|---|---|---|
| Кар'єрний екскаватор | Вібрація ковша, струм підйому | Руйнування ковша, відмова КВГ | 12-24 години |
| Кульовий млин | Вібрація, шум, крутний момент | Знос футеровки, торцеві тріщини | 24-72 години |
| Стрічковий конвеєр | Пробуксовка, зміщення стрічки | Обрив стрічки, завал роликів | 2-8 годин |
| Бурова установка | Навантаження на долото, крутний момент | Прихват бурильної колони | Реальний час |
| Насоси водовідливу | Тиск, вібрація, струм | Кавітація, абразивний знос | 6-24 години |
Згідно з аналітичним звітом Mining Technology, підприємства, що впровадили предиктивну діагностику, скорочують позапланові простої на 30-50% порівняно з реактивним обслуговуванням. Середня економія складає 30-50 млн грн на один кар'єр на рік.
Чому геологічне моделювання з AI точніше?
ML-інтерпретація геологічних даних. Традиційний підхід: геолог вручну корелює свердловини. AI автоматизує інтерполяцію та додає ймовірнісну оцінку. Наші моделі на основі Ordinary Kriging та Random Forest дають точність прогнозу вмісту металу до 90% — це в 1.5 рази вище класичних методів. Такий результат підтверджується сертифікатами незалежних аудитів. Це скорочує витрати на розвідувальне буріння на 30-50%, економлячи до 15 млн грн на родовище.
from pykrige.ok import OrdinaryKriging import numpy as np from sklearn.ensemble import RandomForestRegressor class OregradePredictor: """Прогноз вмісту металу в рудному тілі""" def build_grade_model(self, drillhole_data): """ drillhole_data: DataFrame з координатами x,y,z та вмістом металу Метод: Ordinary Kriging для інтерполяції + ML для врахування літології """ # Геостатистика: Ordinary Kriging ok = OrdinaryKriging( drillhole_data['x'], drillhole_data['y'], drillhole_data['grade'], variogram_model='spherical', variogram_parameters={'sill': drillhole_data['grade'].var(), 'range': 50, # метри 'nugget': 0.1} ) # Сітка для передбачення grid_x = np.arange(drillhole_data['x'].min(), drillhole_data['x'].max(), 5) grid_y = np.arange(drillhole_data['y'].min(), drillhole_data['y'].max(), 5) z_pred, z_var = ok.execute('grid', grid_x, grid_y) return { 'grade_grid': z_pred, 'variance_grid': z_var, # невизначеність → де потрібні дод. свердловини 'grid_x': grid_x, 'grid_y': grid_y } def classify_lithology(self, geophysical_logs): """ Автоматична класифікація літології за ГДС (каротажними кривими). Вхідні дані: GR (гамма), SP, resistivity, density, neutron """ features = ['gr', 'sp', 'res_deep', 'res_shallow', 'density', 'neutron'] X = geophysical_logs[features] rf = RandomForestRegressor(n_estimators=200) # Навчання на розмічених інтервалах керна # Передбачення літології в необсаджених інтервалах return rf Пошук нових родовищ:
- Мультиспектральні знімки Sentinel-2 + геохімія → аномалії
- Обробка сейсмічних даних нейронними мережами (заміна ручної інтерпретації)
- Transfer learning: модель, навчена на одному родовищі, адаптується до сусіднього за 10-20 додаткових свердловин
Як ми оптимізуємо гірниче планування?
Кар'єрне планування (Open Pit Scheduling). Завдання: послідовність виїмки блоків при обмеженнях на борт кар'єру, продуктивність, економіку. Ми використовуємо CP-SAT від Google OR-Tools для максимізації NPV з урахуванням часової вартості грошей.
from ortools.sat.python import cp_model def optimize_mining_sequence(blocks, time_periods=12, capacity_per_period=1000000): """ Оптимізація послідовності видобутку блоків. blocks: список словників {id, value, tonnage, predecessors} Максимізувати NPV з урахуванням часової вартості грошей. """ model = cp_model.CpModel() discount_rate = 0.10 / 12 # місячна ставка # Бінарні змінні: чи видобувається блок у період t x = {} for block in blocks: for t in range(time_periods): x[block['id'], t] = model.NewBoolVar(f"x_{block['id']}_{t}") # Кожен блок видобувається не більше одного разу for block in blocks: model.AddAtMostOne([x[block['id'], t] for t in range(time_periods)]) # Обмеження продуктивності за періодами for t in range(time_periods): model.Add( sum(x[b['id'], t] * b['tonnage'] for b in blocks) <= capacity_per_period ) # Попередники: не можна видобути блок раніше вищерозташованого (slope stability) for block in blocks: for pred_id in block.get('predecessors', []): for t in range(time_periods): pred_extracted_by_t = sum(x[pred_id, tt] for tt in range(t + 1)) model.Add(pred_extracted_by_t >= x[block['id'], t]) # Цільова функція: NPV objective_terms = [] for block in blocks: for t in range(time_periods): discounted_value = int(block['value'] / (1 + discount_rate) ** t) objective_terms.append(x[block['id'], t] * discounted_value) model.Maximize(sum(objective_terms)) solver = cp_model.CpSolver() solver.parameters.max_time_in_seconds = 120 status = solver.Solve(model) schedule = {} if status in [cp_model.OPTIMAL, cp_model.FEASIBLE]: for block in blocks: for t in range(time_periods): if solver.Value(x[block['id'], t]): schedule[block['id']] = t return schedule Управління якістю руди в реальному часі
Control Mix & Blending. XRF-аналізатори на конвеєрі + CV — онлайн-аналіз руди без лабораторних затримок. Blending optimization: змішування руди з різних вибоїв для стабілізації складу на вході збагачувальної фабрики. Динамічна диспетчеризація самоскидів: високоякісна руда → фабрика, бідна → склад/відвал.
Оптимізація збагачення. Процес флотації — нелінійний, залежить від гранулометрії, реагентів, pH. ML-оптимізація за допомогою диференціальної еволюції:
from scipy.optimize import differential_evolution def optimize_flotation_reagents(ore_characteristics, current_recovery=0.82): """ Оптимізація дозування реагентів флотації. Мета: максимізувати вилучення при мінімальній витраті реагентів. """ # Сурогатна модель (навчена на історичних даних фабрики) def flotation_model(reagents): collector_g_t, frother_g_t, activator_g_t, ph = reagents # Спрощена модель (в реальності: LightGBM або GPR) recovery = (0.75 + 0.08 * np.log(1 + collector_g_t / 50) + 0.05 * (1 - abs(ph - 10.5) / 2) + 0.02 * np.log(1 + frother_g_t / 20)) cost = collector_g_t * 0.15 + frother_g_t * 0.25 + activator_g_t * 0.10 return -(recovery - 0.001 * cost) # негатив для мінімізації bounds = [(20, 150), # collector г/т (10, 60), # frother г/т (0, 80), # activator г/т (9.5, 11.5)] # pH result = differential_evolution(flotation_model, bounds, seed=42, maxiter=200) optimal = result.x return { 'collector_g_t': optimal[0], 'frother_g_t': optimal[1], 'activator_g_t': optimal[2], 'ph': optimal[3], 'expected_recovery': -result.fun } Безпека та моніторинг середовища
AI-моніторинг газової обстановки (для підземних рудників). Мультисенсорні вузли: CH4, CO, CO2, O2, H2S — історичні дані + ML-прогноз концентрації. Геомеханіка: акустична емісія + ML → попередження обвалів за 1-6 годин. Computer Vision на відеопотоках: каска, жилет, знаходження в забороненій зоні.
Екологічний моніторинг. PM2.5/PM10 від вибухових робіт і транспорту → ML прогноз розсіювання з урахуванням метеоумов. Моніторинг гідрохімії хвостосховища: pH, важкі метали → автоматичні сповіщення при перевищенні ГДК.
Що входить в роботу?
| Етап | Що робимо | Документація |
|---|---|---|
| Аналітика | Збір історичних даних, аудит інфраструктури, оцінка зрілості даних | Технічний звіт, карта потоків даних |
| Проєктування | Вибір стеку (PyTorch, LangChain, vLLM), архітектура MLOps | Data Pipeline Design, Model Card |
| Розробка | Навчання моделей, LoRA fine-tuning, RAG, інтеграція з SCADA/MES | API документація, тестові звіти |
| Тестування | A/B тести, валідація на історичних даних, robustness | Звіт про точність, P99 latency |
| Деплой | Docker/Kubernetes, Triton Inference Server, моніторинг | Deployment guide, runbook |
| Підтримка | 24/7 моніторинг, донавчання моделей, оновлення пайплайнів | SLA, schedule retraining |
Пайплайн даних будується так: починаємо з інвентаризації джерел (SCADA, геологічні бази, дані з датчиків). Налаштовуємо потік через Apache Kafka або MQTT, очищаємо та агрегуємо в Data Lake (S3/MinIO). Для навчання використовуємо Feature Store (Feast), метадані версіонуємо в MLflow. Моделі сервуємо через Triton з автоматичним A/B-тестуванням. Retrain відбувається за розкладом або при дрейфі даних, що відстежується за допомогою Evidently.
Як впровадити AI на гірничому підприємстві?
- Аудит даних та інфраструктури. Збираємо телеметрію за останні 6-12 місяців, перевіряємо якість та повноту.
- Створення цифрового двійника. Будуємо модель обладнання або родовища на основі історичних даних.
- Навчання моделей. Використовуємо transfer learning та LoRA fine-tuning для швидкої адаптації.
- Інтеграція з SCADA/MES. Налаштовуємо потік даних у реальному часі та канали сповіщень.
- Пілотне впровадження. Запускаємо на одному типі обладнання, протягом 2-3 місяців фіксуємо зниження простоїв.
- Масштабування. Переносимо рішення на інші вузли та майданчики.
Строки орієнтовно
Від 2-3 місяців на предиктивну діагностику одного типу обладнання до 6-9 місяців на комплексну AI-платформу. Вартість розраховується індивідуально залежно від обсягу даних, кількості моделей та складності інтеграції. Повернення інвестицій — протягом 12 місяців. Замовте консультацію — оцінимо ваш проєкт за 1-2 дні. Зв'яжіться з нами, щоб обговорити деталі.
Типові помилки та як ми їх уникаємо
- Сирі дані. Часто телеметрія містить пропуски та шум. Ми використовуємо Isolation Forest для очищення ансамблем моделей.
- Неврахування геометрії кар'єру. При плануванні забувають про кут укосу. Наші CP-SAT моделі включають попередників за стійкістю бортів.
- Статичні моделі. Зі зносом обладнання патерни відмов змінюються. Ми налаштовуємо автоматичний retrain кожні 2 тижні за допомогою MLflow.
Залиште заявку — разом знайдемо рішення для вашого підприємства. Гарантуємо зниження простоїв на 30% та повернення інвестицій протягом 12 місяців.
Докладніше про предиктивне обслуговування.







