Ollama ile Yerel AI Çözümleri: Fabrika İçinde Veri Güvenliğini Koruyarak AI Kullanımı
Giriş
AWS Bedrock ve ChatGPT gibi bulut tabanlı AI servisleri güçlü olsa da, birçok endüstriyel tesis için veri gizliliği kritik bir endişedir. Özellikle:
- Savunma sanayi tesisleri
- İlaç üretim fabrikaları
- Patentli proseslere sahip kimya tesisleri
- KVKV ve GDPR gereksinimleri olan şirketler
Bu senaryolarda, Ollama gibi yerel AI çözümleri devreye girer. Cloud & IoT Veri Toplama Çözümlerimiz kapsamında, hem bulut hem de on-premise AI seçenekleri sunuyoruz.
Ollama Nedir?
Ollama, LLaMA, Mistral, CodeLlama gibi açık kaynak LLM'leri (Large Language Models) kendi sunucunuzda çalıştırmanızı sağlayan bir araçtır.
Temel Özellikler
- Yerel Çalıştırma: Tüm inference sunucunuzda, internet gerekmez
- Ücretsiz: Hiçbir API maliyeti yok
- Hızlı: GPU varsa saniyeler içinde yanıt
- Modüler: 7B'dan 70B'a kadar model boyutları
- Kolay API: REST API ile entegrasyon
Desteklenen Modeller (Seçilmiş)
| Model | Boyut | RAM Gereksinimi | Use Case |
|---|---|---|---|
| Llama 3.1 | 8B | 8GB | Genel amaçlı, anomali tespiti |
| Mistral | 7B | 6GB | Hızlı inference, log analizi |
| CodeLlama | 7B-34B | 6-40GB | Kod generation, PLC kod analizi |
| Phi-3 | 3.8B | 4GB | Küçük cihazlar (Jetson, RPi) |
Endüstriyel AI Use Case'leri
1. Anomali Tespiti
ZMA Data Acquisition cihazından gelen sensör verilerinde anormal pattern tespiti.
Senaryo: Motor titreşim sensörü
import ollama
import json
# ZMA'dan son 1 saatin vibrasyonverisi
vibration_data = [
{"time": "10:00", "value": 0.05},
{"time": "10:05", "value": 0.06},
{"time": "10:10", "value": 0.15}, # Ani artış!
{"time": "10:15", "value": 0.14},
{"time": "10:20", "value": 0.13},
]
prompt = f"""
Aşağıdaki motor titreşim verilerini analiz et:
{json.dumps(vibration_data, indent=2)}
Normal değer aralığı: 0.02-0.08 mm/s
Soru: Bu verilerde anomali var mı? Varsa ne tür bir arıza belirtisi olabilir?
"""
response = ollama.chat(model='llama3.1:8b', messages=[
{'role': 'user', 'content': prompt}
])
print(response['message']['content'])
Ollama Çıktısı:
Evet, 10:10'da anormal bir artış görülüyor (0.15 mm/s).
Bu, şunlardan biri olabilir:
1. Rulman aşınması başlangıcı
2. Dengesizlik (balans problemi)
3. Gevşek bağlantı/montaj hatası
Öneri: Motor bakımını planla, titreşim artışı devam ederse acil müdahale gerekebilir.
2. Kestirimci Bakım (Predictive Maintenance)
import ollama
from datetime import datetime, timedelta
# [GDT Loadcell](/urunler/gdt-dijital-transmitter) drift analizi
weight_history = {
"2025-01-01": 1000.0,
"2025-01-15": 999.8,
"2025-02-01": 999.5,
"2025-02-15": 999.1,
"2025-03-01": 998.6, # Sürekli azalma
}
prompt = f"""
Bir loadcell sensörünün son 3 aydaki kalibrasyon kayması:
{json.dumps(weight_history, indent=2)}
Her ölçümde aynı 1000kg referans ağırlık kullanıldı.
Soru: Bu trend ne söylüyor? Ne zaman yeniden kalibrasyon gerekir?
"""
response = ollama.chat(model='llama3.1:8b', messages=[
{'role': 'user', 'content': prompt}
])
print(response['message']['content'])
Ollama Çıktısı:
Loadcell'de sistematik bir negatif drift var (ayda ~0.3kg).
Muhtemel sebep: Strain gauge'lerde mekanik yorulma veya sıcaklık etkisi.
Kalibrasyon önerisi:
- Hemen: Değil, drift henüz %0.15 seviyesinde (tolere edilebilir)
- 1 ay içinde: Evet, %0.2'yi geçmeden önce
- Uzun dönem: Yılda 2 kez düzenli kalibrasyon planla
3. PLC Kod Analizi ve Optimizasyon
plc_code = """
IF Sensor1 > 100 THEN
Valve1 := TRUE;
Pump1 := TRUE;
Timer1 := 60;
END_IF;
IF Timer1 <= 0 AND Sensor2 < 50 THEN
Valve1 := FALSE;
Pump1 := FALSE;
END_IF;
"""
prompt = f"""
Aşağıdaki PLC kodunu analiz et:
{plc_code}
Sorunları ve optimizasyon önerilerini listele.
"""
response = ollama.chat(model='codellama:13b', messages=[
{'role': 'user', 'content': prompt}
])
Ollama Kurulumu ve Konfigürasyonu
Sunucu Gereksinimleri
Minimum (Phi-3 3.8B için):
- CPU: 4 core
- RAM: 8GB
- Disk: 10GB
Önerilen (Llama 3.1 8B için):
- CPU: 8 core
- RAM: 16GB
- GPU: NVIDIA RTX 3060 (12GB VRAM) veya üzeri
- Disk: 50GB SSD
Enterprise (Llama 70B için):
- GPU: NVIDIA A100 (80GB) veya H100
- RAM: 128GB
- Disk: 500GB NVMe SSD
Linux Kurulumu
# Ollama yükle
curl -fsSL https://ollama.ai/install.sh | sh
# Servisi başlat
sudo systemctl start ollama
# Model indir (Llama 3.1 8B)
ollama pull llama3.1:8b
# Test et
ollama run llama3.1:8b "Merhaba, motor titreşimi analizi yapabilir misin?"
Docker ile Kurulum
# docker-compose.yml
version: '3'
services:
ollama:
image: ollama/ollama:latest
ports:
- '11434:11434'
volumes:
- ollama-models:/root/.ollama
environment:
- OLLAMA_HOST=0.0.0.0
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
volumes:
ollama-models:
docker-compose up -d
docker exec -it ollama-container ollama pull llama3.1:8b
IoT Gateway Entegrasyonu
ZMA/GDT cihazlarından Modbus ile toplanan verileri Ollama'ya gönderen gateway:
Python Gateway + Ollama
ai_gateway.py
import ollama
import json
from pymodbus.client.sync import ModbusTcpClient
import time
class IntelligentGateway:
def __init__(self):
# Modbus client (ZMA cihazı)
self.zma_client = ModbusTcpClient('192.168.1.100', port=502)
self.zma_client.connect()
# Ollama modeli
self.model = 'llama3.1:8b'
# Geçmiş veriler (anomali tespiti için)
self.history = []
def read_sensor_data(self):
"""ZMA'dan 4 kanal veri oku"""
result = self.zma_client.read_holding_registers(0, 8, unit=1)
# Float'a dönüştür (IEEE 754)
channels = []
for i in range(0, 8, 2):
raw = (result.registers[i] << 16) | result.registers[i+1]
value = struct.unpack('f', struct.pack('I', raw))[0]
channels.append(value)
return {
'timestamp': time.time(),
'ch1': channels[0],
'ch2': channels[1],
'ch3': channels[2],
'ch4': channels[3]
}
def analyze_with_ai(self, data):
"""Ollama ile veri analizi"""
# Son 10 ölçümü ekle
self.history.append(data)
if len(self.history) > 10:
self.history.pop(0)
# Prompt oluştur
prompt = f"""
Endüstriyel sensör verileri (son 10 ölçüm):
{json.dumps(self.history, indent=2)}
Her kanal bir sıcaklık sensörü. Normal aralık: 20-80°C.
Soru:
1. Anormal bir durum var mı?
2. Varsa hangi kanal ve ne tür bir sorun?
3. Acil müdahale gerekiyor mu?
Kısa ve net cevap ver (max 100 kelime).
"""
response = ollama.chat(model=self.model, messages=[
{'role': 'system', 'content': 'Sen endüstriyel otomasyon uzmanısın.'},
{'role': 'user', 'content': prompt}
])
return response['message']['content']
def run(self):
"""Ana döngü"""
print("AI Gateway başlatıldı. Ollama modeli:", self.model)
while True:
# Sensör verisi oku
data = self.read_sensor_data()
print(f"\n[{time.strftime('%H:%M:%S')}] Veri: {data}")
# AI analizi (her 10 ölçümde bir)
if len(self.history) >= 10:
analysis = self.analyze_with_ai(data)
print(f"\n🤖 AI Analizi:\n{analysis}\n")
# Alarm varsa email gönder
if "acil" in analysis.lower() or "alarm" in analysis.lower():
self.send_alarm_email(analysis)
time.sleep(5) # 5 saniyede bir
def send_alarm_email(self, message):
"""Alarm email gönder"""
import smtplib
from email.mime.text import MIMEText
msg = MIMEText(message)
msg['Subject'] = 'AI Anomali Alarmı - Fabrika'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
with smtplib.SMTP('localhost') as server:
server.send_message(msg)
print("✉️ Alarm emaili gönderildi!")
if __name__ == "__main__":
gateway = IntelligentGateway()
gateway.run()
Grafana + Ollama Entegrasyonu
Grafana dashboard'unda AI insights gösterimi:
Grafana Infinity Plugin + API
Ollama REST API Çağrısı:
// Grafana transformation script
const sensorData = data.series[0].fields[1].values
const avgValue = sensorData.reduce((a, b) => a + b) / sensorData.length
// Ollama'ya HTTP POST
const response = await fetch('http://localhost:11434/api/generate', {
method: 'POST',
body: JSON.stringify({
model: 'llama3.1:8b',
prompt: `Sensör ortalaması ${avgValue.toFixed(2)}°C. Bu normal mi? Kısa yanıt.`,
stream: false,
}),
})
const result = await response.json()
return result.response // Grafana text panel'de göster
Performans ve Maliyet
Inference Hızı
| Model | CPU (16 core) | GPU (RTX 3060) |
|---|---|---|
| Phi-3 (3.8B) | ~2s / prompt | ~0.3s / prompt |
| Llama 3.1 (8B) | ~8s / prompt | ~0.8s / prompt |
| Llama 70B | N/A (çok yavaş) | ~3s / prompt |
Maliyet Karşılaştırması
Bulut (AWS Bedrock - Claude 3 Haiku):
- $0.00025 / 1K input token
- $0.00125 / 1K output token
- Aylık
1M token kullanım = **$400/ay**
On-Premise (Ollama + Sunucu):
- Sunucu (Dell R750 + RTX 3060): ~$3,000 (one-time)
- Elektrik (~500W, 7/24): ~$50/ay
- ROI: 8 ay sonra başabaş
Veri Güvenliği Avantajları
1. Zero-Knowledge
Sensör verileri hiçbir zaman fabrikanın dışına çıkmaz:
Sensör → ZMA/GDT → Gateway (Modbus) → Ollama (Lokal) → Dashboard (Lokal)
↓
Hiçbir internet bağlantısı yok!
2. KVKV / GDPR Uyumu
- Kişisel veri işlenmiyorsa KVKV gereksiz
- Ancak üretim verileri de hassassa, Ollama ideal
3. IP Koruması
Patentli proseslerinizin verileri (sıcaklık profilleri, reçeteler) OpenAI/AWS'ye gitmez.
Hibrit Yaklaşım: Ollama + AWS Bedrock
Hassas veriler için Ollama, genel sorgular için Bedrock:
def smart_route(query, data_sensitivity):
if data_sensitivity == "high":
# Yerel Ollama
return ollama.chat(model='llama3.1:8b', messages=[...])
else:
# AWS Bedrock (daha güçlü model)
return bedrock_client.invoke_model(model='claude-3-opus', ...)
Raspberry Pi 5 ile Edge AI
Düşük maliyetli yerel AI:
# Raspberry Pi 5 (8GB) üzerine Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# Küçük model kullan
ollama pull phi3:mini
# Python ile entegrasyon
import ollama
response = ollama.chat(model='phi3:mini', messages=[
{'role': 'user', 'content': 'Motor titreşimi 0.2 mm/s, normal mi?'}
])
Performans: Phi-3 mini, RPi 5'te ~5 saniye/prompt (CPU only)
Sonuç
Ollama, endüstriyel tesislerde veri gizliliğini koruyarak AI kullanımı için mükemmel bir çözümdür. Cloud & IoT Veri Toplama Çözümlerimiz kapsamında:
✅ Yerel Inference: Hiçbir veri buluta gitmez
✅ Maliyet Avantajı: Uzun dönemde buluttan ucuz
✅ Esneklik: İstediğiniz modeli kullanın
✅ Performans: GPU ile saniyeler içinde yanıt
Hem Ollama hem AWS Bedrock entegrasyonu için iletişime geçin.