Modelfile ile Özelleştirilmiş Ollama Modeli Oluşturma

Ollama’yı yükleyip birkaç model indirdikten sonra insanların takıldığı yer genellikle şu oluyor: “Bu modeli her seferinde aynı system prompt ile başlatmak zorunda mıyım?” ya da “Şirket içi kullanım için bu modeli biraz daha özelleştiremez miyim?” İşte tam bu noktada Modelfile devreye giriyor. Modelfile, Docker’daki Dockerfile mantığıyla çalışan, kendi özel Ollama modelini sıfırdan ya da mevcut bir modelin üzerine inşa etmeni sağlayan bir yapılandırma dosyası. Bu yazıda Modelfile’ı her açıdan ele alacağız ve gerçek dünya senaryolarıyla nasıl kullanacağını göstereceğiz.

Modelfile Nedir ve Neden Kullanmalısın?

Ollama’nın sunduğu hazır modeller çoğu iş için yeterli. Ama production ortamında ya da ekip içi kullanımda bazı ihtiyaçlar doğuyor:

  • Belirli bir kişilikle ya da rol tanımıyla çalışan bir asistan oluşturmak
  • Şirket içi teknik terminolojiye hakim, tutarlı cevaplar veren bir model istemek
  • Model parametrelerini (sıcaklık, context window, repeat penalty) kalıcı olarak ayarlamak
  • Mevcut bir modeli temel alıp üzerine özel davranış katmanı eklemek
  • Ekip arkadaşlarının aynı modeli aynı davranışlarla kullanmasını sağlamak

Modelfile olmadan her sohbet başında uzun system prompt’lar yapıştırmak ya da parametreleri tek tek girmek zorundasın. Modelfile ile bunu bir kere tanımlıyorsun, ollama build komutuyla paketliyorsun ve sonra herkes ollama run sirket-asistani diyerek kullanmaya başlıyor.

Temel Modelfile Yapısı

Modelfile aslında oldukça sade bir sözdizimi kullanıyor. Bir metin editörüyle oluşturabileceğin, özel direktiflerden oluşan bir dosya.

# Basit bir Modelfile örneği
cat > Modelfile << 'EOF'
FROM llama3.2

PARAMETER temperature 0.7
PARAMETER top_p 0.9

SYSTEM """
Sen yardımsever bir asistansın. Türkçe sorulara Türkçe cevap verirsin.
"""
EOF

Bu kadar basit bir dosyayla bile işe yarar bir model oluşturabilirsin. Şimdi direktifleri tek tek inceleyelim.

FROM Direktifi

Her Modelfile’ın olmazsa olmazı. Hangi modeli temel aldığını belirtiyor.

# Ollama Hub'dan bir model
FROM llama3.2

# Belirli bir tag ile
FROM mistral:7b-instruct

# Lokal bir GGUF dosyasından
FROM /opt/models/custom-model.gguf

# SHA256 hash ile kesin sürüm belirleme
FROM llama3.2:latest@sha256:a1b2c3d4...

Lokal GGUF dosyasından model oluşturma özellikle Hugging Face’den indirdiğin modelleri Ollama’ya entegre etmek için çok işe yarıyor. Şirket içinde fine-tune edilmiş bir model varsa bu yöntemle Ollama ekosistemine dahil edebilirsin.

PARAMETER Direktifi

Model davranışını belirleyen parametreleri burada ayarlıyorsun.

temperature: Modelin yaratıcılık seviyesi. 0’a yakın değerler daha deterministik, 1’e yakın değerler daha çeşitli cevaplar üretiyor. Kod yazan bir asistan için 0.1-0.3 arası, yaratıcı yazarlık için 0.7-0.9 arası mantıklı.

top_p: Nucleus sampling parametresi. 0.9 değeri token seçimini en olası %90’lık dilimle sınırlıyor. Temperature ile birlikte çalışıyor.

top_k: Her adımda değerlendirilen token sayısını sınırlıyor. Düşük değerler daha odaklı, yüksek değerler daha çeşitli çıktı veriyor.

num_ctx: Context window boyutu. Token cinsinden belirtiliyor. Uzun dökümanlarda çalışıyorsan artırman gerekebilir.

repeat_penalty: Aynı kelimelerin tekrarlanmasını engelliyor. 1.0 ceza yok demek, 1.3 gibi değerler tekrarları bastırıyor.

num_predict: Maksimum üretilecek token sayısı. -1 sınırsız demek.

stop: Modelin duracağı token dizileri. Özellikle belirli formatta çıktı istediğinde yararlı.

cat > Modelfile << 'EOF'
FROM llama3.2

PARAMETER temperature 0.2
PARAMETER top_p 0.85
PARAMETER top_k 40
PARAMETER num_ctx 8192
PARAMETER repeat_penalty 1.1
PARAMETER num_predict 2048
PARAMETER stop "<|eot_id|>"
PARAMETER stop "Human:"
PARAMETER stop "Assistant:"
EOF

SYSTEM Direktifi

Modelin genel davranışını, rolünü ve kısıtlamalarını tanımladığın yer. İyi yazılmış bir system prompt modelin tutarlılığını dramatik biçimde artırıyor.

cat > Modelfile << 'EOF'
FROM llama3.2

SYSTEM """
Sen şirketimizin DevOps asistanısın. Adın DEVA.

Görevlerin:
- Linux sistem yönetimi sorularını cevaplamak
- Shell script yazımında yardımcı olmak
- Docker ve Kubernetes konularında rehberlik etmek
- CI/CD pipeline sorunlarını gidermek

Kuralların:
- Her zaman Türkçe cevap ver
- Kod örneklerini her zaman code block içinde göster
- Güvenlik açığı oluşturabilecek komutlarda uyarı ver
- Emin olmadığın konularda bunu açıkça belirt
- Cevapların kısa ve öz olsun, gereksiz açıklamadan kaçın
"""
EOF

TEMPLATE Direktifi

Modelin mesaj formatını belirliyor. Çoğu durumda baz modelin template’ini kullanmak yeterli, ama bazı GGUF modellerinde bu direktife ihtiyaç duyabilirsin.

cat > Modelfile << 'EOF'
FROM /opt/models/custom.gguf

TEMPLATE """{{ if .System }}<|system|>
{{ .System }}<|end|>
{{ end }}{{ if .Prompt }}<|user|>
{{ .Prompt }}<|end|>
<|assistant|>
{{ end }}{{ .Response }}<|end|>
"""
EOF

MESSAGE Direktifi

Modele örnek konuşmalar eklemene yarıyor. Few-shot prompting’in Modelfile versiyonu diyebiliriz.

cat > Modelfile << 'EOF'
FROM llama3.2

SYSTEM "Sen bir SQL uzmanısın."

MESSAGE user "Bir tablodaki duplicate kayıtları nasıl bulurum?"
MESSAGE assistant """
Duplicate kayıtları bulmak için GROUP BY ve HAVING kullanabilirsin:

SELECT kolon1, kolon2, COUNT() as tekrar_sayisi FROM tablo_adi GROUP BY kolon1, kolon2 HAVING COUNT() > 1;


Eğer sadece duplicate'in bir kopyasını silmek istiyorsan:

DELETE FROM tablo_adi WHERE id NOT IN ( SELECT MIN(id) FROM tablo_adi GROUP BY kolon1, kolon2 );

"""

MESSAGE user "NULL değerleri olan sütunları nasıl filtrelerim?"
MESSAGE assistant "NULL kontrolü için IS NULL veya IS NOT NULL kullanman gerekiyor, çünkü NULL değerler normal eşitlik operatörleriyle karşılaştırılamaz."
EOF

Gerçek Dünya Senaryosu 1: Yazılım Geliştirme Ekibi Asistanı

Diyelim ki bir yazılım ekibinde çalışıyorsun ve herkesin aynı teknik standardlara uygun cevaplar almasını istiyorsun. İşte bu senaryo için kapsamlı bir Modelfile:

cat > /opt/ollama-models/dev-assistant/Modelfile << 'EOF'
FROM codellama:13b-instruct

PARAMETER temperature 0.1
PARAMETER top_p 0.9
PARAMETER num_ctx 16384
PARAMETER repeat_penalty 1.05
PARAMETER num_predict 4096

SYSTEM """
Sen şirketimizin kıdemli yazılım geliştirme asistanısın. Kod incelemeleri, mimari kararlar ve teknik sorunlarda yardımcı oluyorsun.

Teknoloji stack'imiz:
- Backend: Python (FastAPI, SQLAlchemy), Go
- Frontend: React, TypeScript
- Veritabanı: PostgreSQL, Redis
- Altyapı: Docker, Kubernetes, Terraform
- CI/CD: GitLab CI

Kod yazarken dikkat ettiğimiz standartlar:
- Python için PEP 8 ve type hint kullan
- Fonksiyonlar tek bir sorumluluğa sahip olmalı
- Error handling her zaman explicit olmalı
- Testler yazılabilir kod üret
- Security best practice'leri göz ardı etme

Her kod örneğinde:
1. Dili belirt (```python, ```go vb.)
2. Gerekirse kısa açıklama ekle
3. Potansiyel sorunları veya alternatifleri belirt
"""

MESSAGE user "FastAPI'de authentication nasıl implement ederim?"
MESSAGE assistant """
FastAPI'de JWT tabanlı authentication için şu yapıyı kullanabilirsin:

from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import JWTError, jwt from passlib.context import CryptContext from datetime import datetime, timedelta from typing import Optional

SECRET_KEY = “env-den-oku-asla-hardcode-etme” ALGORITHM = “HS256” ACCESS_TOKEN_EXPIRE_MINUTES = 30

pwd_context = CryptContext(schemes=[“bcrypt”], deprecated=”auto”) oauth2_scheme = OAuth2PasswordBearer(tokenUrl=”token”)

def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): to_encode = data.copy() expire = datetime.utcnow() + (expires_delta or timedelta(minutes=15)) to_encode.update({“exp”: expire}) return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)


**Önemli uyarı:** SECRET_KEY'i her zaman environment variable'dan oku. Production'da en az 32 karakter rastgele string kullan.
"""
EOF

# Modeli build et
ollama create dev-assistant -f /opt/ollama-models/dev-assistant/Modelfile

Gerçek Dünya Senaryosu 2: IT Destek Hattı Modeli

Bir IT destek ekibi için kullanıcılara sabırlı ve adım adım rehberlik eden bir model:

cat > /opt/ollama-models/it-support/Modelfile << 'EOF'
FROM llama3.2:3b

PARAMETER temperature 0.3
PARAMETER top_p 0.85
PARAMETER num_ctx 4096
PARAMETER repeat_penalty 1.15

SYSTEM """
Sen şirketin IT destek hattı asistanısın. Teknik bilgisi sınırlı son kullanıcılara yardım ediyorsun.

İletişim tarzın:
- Teknik jargondan kaçın, basit dil kullan
- Her adımı numaralandırarak açıkla
- Sabırlı ve anlayışlı bir ton kullan
- Türkçe ve nazik cevaplar ver

Kapsadığın konular:
- Windows 10/11 sorunları
- Microsoft 365 uygulamaları
- VPN bağlantı sorunları
- Yazıcı ve çevre birimi sorunları
- Parola sıfırlama yönlendirmesi

Yapmamanız gerekenler:
- Kullanıcının bilgisayarına uzaktan bağlantı talimatı verme (BT ekibine yönlendir)
- Domain parolasını sıfırlama ([email protected] adresine yönlendir)
- Lisans anahtarı veya aktivasyon konuları (yazılım ekibine yönlendir)

Çözemediğin konularda: 'Bu konuda sizi IT ekibimize yönlendirmem gerekiyor. [email protected] adresine mail atabilir veya dahili 1234 numaralı hattı arayabilirsiniz.'
"""
EOF

ollama create it-support -f /opt/ollama-models/it-support/Modelfile

Model Build ve Yönetim Komutları

Model oluşturduktan sonra yönetim için kullanacağın temel komutlar:

# Modelfile'dan yeni model oluştur
ollama create model-adi -f /path/to/Modelfile

# Mevcut modeli güncelle (aynı komut, yeni build alır)
ollama create dev-assistant -f /opt/ollama-models/dev-assistant/Modelfile

# Oluşturulan modeli test et
ollama run dev-assistant "Python'da context manager nasıl yazılır?"

# Tüm modelleri listele
ollama list

# Modelin detaylarını gör (kullandığı Modelfile direktiflerini gösterir)
ollama show dev-assistant
ollama show --modelfile dev-assistant

# Modeli sil
ollama rm dev-assistant

# Modeli başka bir isimle kopyala
ollama cp dev-assistant dev-assistant-backup

Modeli Servis Olarak Çalıştırma

Ekip içinde kullanım için modeli bir HTTP API olarak sunmak isteyebilirsin:

# Ollama'yı belirli bir adreste başlat
OLLAMA_HOST=0.0.0.0:11434 ollama serve

# Systemd service dosyası oluştur
cat > /etc/systemd/system/ollama-dev.service << 'EOF'
[Unit]
Description=Ollama Dev Assistant Service
After=network.target

[Service]
Type=simple
User=ollama
Environment=OLLAMA_HOST=0.0.0.0:11434
Environment=OLLAMA_MODELS=/opt/ollama-models
ExecStart=/usr/bin/ollama serve
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now ollama-dev

# API üzerinden modeli test et
curl http://localhost:11434/api/generate 
  -d '{
    "model": "dev-assistant",
    "prompt": "Docker multi-stage build nedir?",
    "stream": false
  }'

Performans Optimizasyonu için İpuçları

Modelfile ile oluşturduğun modellerin performansını artırmak için dikkat etmen gereken birkaç nokta var.

num_ctx parametresini gerçekçi tut: 8192 veya 16384 gibi büyük context window değerleri bellek tüketimini ciddi artırıyor. Kullanım senaryona göre minimum yeterli değeri seç. Basit Q&A için 2048-4096 çoğunlukla yeterli.

Model boyutunu iş yüküyle eşleştir: IT destek asistanı için 3B ya da 7B model yeterken, kod yazma asistanı için 13B ya da 34B model daha iyi sonuç veriyor. Küçük modellere yapay zeka yeteneği kazandırmaya çalışmak yerine doğru modeli seç.

Temperature’ı amaca göre ayarla: Faktüel bilgi gerektiren asistanlarda 0.1-0.3, genel sohbet için 0.5-0.7, yaratıcı görevler için 0.7-0.9 arasında tut.

# GPU kullanımını kontrol et
ollama ps

# Belirli GPU'yu kullan
CUDA_VISIBLE_DEVICES=0 ollama serve

# Modelin ne kadar GPU belleği kullandığını izle
watch -n 2 nvidia-smi

Modelfile’ı Versiyon Kontrolüne Alma

Modelfile’ları Git’te tutmak son derece mantıklı. Ekip içinde değişiklikleri takip edebilir, rollback yapabilirsin.

# Proje yapısı
mkdir -p /opt/ai-models/{dev-assistant,it-support,sql-expert}

# Git repo başlat
cd /opt/ai-models
git init
git remote add origin [email protected]:infra/ai-models.git

# Her modelin dizininde Modelfile ve README tut
ls /opt/ai-models/dev-assistant/
# Modelfile
# README.md
# CHANGELOG.md

# Değişiklik yaptıktan sonra
git add .
git commit -m "dev-assistant: context window 8192'den 16384'e çıkarıldı"
git push origin main

# CI/CD ile otomatik deploy
cat > .gitlab-ci.yml << 'EOF'
deploy-models:
  stage: deploy
  script:
    - ollama create dev-assistant -f dev-assistant/Modelfile
    - ollama create it-support -f it-support/Modelfile
  only:
    - main
EOF

Sık Karşılaşılan Sorunlar

“Model not found” hatası: FROM direktifinde belirttiğin model lokal olarak bulunmuyordur. ollama pull llama3.2 ile önce modeli indir.

Çok yavaş build süresi: Büyük GGUF dosyalarından model oluştururken Ollama dosyayı kendi formatına dönüştürür, bu zaman alır. Disk I/O’yu izle.

System prompt’un etkisiz kalması: Bazı modeller system prompt’u farklı işliyor. TEMPLATE direktifiyle modelin beklediği formatı manuel olarak tanımlamayı dene.

Context sınırı aşımı: num_ctx değerini modelin desteklediği maksimumun altında tutman gerekiyor. Modelin maksimum context boyutunu ollama show model-adi ile kontrol et.

# Hata ayıklama için verbose mod
OLLAMA_DEBUG=1 ollama run dev-assistant "test"

# Ollama loglarını izle
journalctl -u ollama -f

# Model bilgilerini detaylı gör
ollama show --parameters dev-assistant
ollama show --system dev-assistant

Sonuç

Modelfile, Ollama’yı sadece “model çalıştırma aracı” olmaktan çıkarıp gerçek anlamda özelleştirilebilir bir LLM platformuna dönüştürüyor. Docker imajlarını nasıl kuruluşa özgü Dockerfile’larla yönetiyorsak, LLM modellerini de Modelfile’larla yönetmek artık standart bir pratik haline geliyor.

Özellikle ekip içi araçlar, özelleştirilmiş destek asistanları ya da belirli bir teknik alana odaklanmış modeller oluşturmak için Modelfile vazgeçilmez. System prompt yönetimini merkezi hale getiriyor, parametreleri standartlaştırıyor ve modelleri versiyon kontrolünde tutmanı sağlıyor.

Başlangıç için küçük bir kullanım senaryosu seç, bir Modelfile oluştur, test et, ekiple paylaş. Zamanla nelerin işe yarayıp nelerin yaramadığını göreceksin. Ollama geliştikçe Modelfile direktifleri de genişliyor, bu yüzden resmi Ollama dökümanını ara ara takip etmek faydalı.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir