Гірнича справа — галузь, де відмова обладнання або неточна геологічна модель коштують мільйонів доларів. Позаплановий простій кар'єрного екскаватора — мільйони гривень на добу, а помилка в оцінці вмісту металу позбавляє прибутку на весь термін експлуатації родовища. Ми проєктуємо 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 місяців.
Докладніше про предиктивне обслуговування.







