Ollama ile Yerel AI Çözümleri: Fabrika İçinde Veri Güvenliğini Koruyarak AI Kullanımı

Amazeng Teknik Ekip
11 dakika okuma
OllamaYerel AIOn-Premise AIVeri GüvenliğiEdge AILLMEndüstriyel AI

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ş)

ModelBoyutRAM GereksinimiUse Case
Llama 3.18B8GBGenel amaçlı, anomali tespiti
Mistral7B6GBHızlı inference, log analizi
CodeLlama7B-34B6-40GBKod generation, PLC kod analizi
Phi-33.8B4GBKüçü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ı

ModelCPU (16 core)GPU (RTX 3060)
Phi-3 (3.8B)~2s / prompt~0.3s / prompt
Llama 3.1 (8B)~8s / prompt~0.8s / prompt
Llama 70BN/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.

İlgili Kaynaklar