Ollama, Llama 3, Phi-3, Gemma 2 ve Mistral gibi büyük dil modellerini yerel makinenizde veya kendi sunucunuzda çalıştırmanızı sağlar. API key gerekmez, veri dışarı çıkmaz ve internet bağlantısı olmadan kullanılabilir.

Kurulum ve Model İndirme

# Windows/Mac/Linux: ollama.com/download
# Temel komutlar
ollama pull llama3.1        # Meta Llama 3.1 8B
ollama pull phi3            # Microsoft Phi-3 Mini (3.8B — hafif, hızlı)
ollama pull gemma2          # Google Gemma 2 9B
ollama pull nomic-embed-text # Embedding modeli

ollama list                 # indirilen modeller
ollama run llama3.1         # interaktif test
ollama serve                # API sunucusunu başlat (varsayılan: localhost:11434)

.NET Entegrasyonu

// dotnet add package Microsoft.Extensions.AI.Ollama
using Microsoft.Extensions.AI;

// IChatClient — Microsoft.Extensions.AI soyutlaması
IChatClient chatClient = new OllamaChatClient(
    new Uri("http://localhost:11434"),
    "llama3.1");

var yanit = await chatClient.CompleteAsync("C# async/await nasıl çalışır?");
Console.WriteLine(yanit.Message.Text);

// Streaming
await foreach (var chunk in chatClient.CompleteStreamingAsync("Bana bir haiku yaz"))
    Console.Write(chunk.Text);

// Embedding
IEmbeddingGenerator<string, Embedding<float>> embedder =
    new OllamaEmbeddingGenerator(
        new Uri("http://localhost:11434"),
        "nomic-embed-text");

var vektor = await embedder.GenerateEmbeddingVectorAsync("Test metni");
Console.WriteLine($"Boyut: {vektor.Length}");

DI Kaydı

// Program.cs — geliştirme: Ollama, production: OpenAI/Azure
if (builder.Environment.IsDevelopment())
{
    builder.Services.AddSingleton<IChatClient>(
        new OllamaChatClient(new Uri("http://localhost:11434"), "llama3.1"));
}
else
{
    builder.Services
        .AddOpenAIClient(opts => opts.ApiKey = config["OpenAI:ApiKey"]!)
        .AddChatClient("gpt-4o");
}

// Servislerde aynı arayüz
public class IcerikServisi(IChatClient chatClient)
{
    public async Task<string> OzetleAsync(string metin) =>
        (await chatClient.CompleteAsync($"Özetle: {metin}")).Message.Text ?? "";

Docker Compose ile Kurulum

# docker-compose.yml
services:
  ollama:
    image: ollama/ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]  # GPU varsa

  webapi:
    build: .
    ports:
      - "8080:8080"
    environment:
      - Ollama__BaseUrl=http://ollama:11434
      - Ollama__Model=llama3.1
    depends_on:
      - ollama

volumes:
  ollama_data:

Model Seçim Rehberi

// Model seçimi — VRAM ve kullanım senaryosuna göre
// phi3           (3.8B): 4GB RAM — basit görevler, hızlı yanıt
// llama3.1:8b    (8B):  8GB RAM — genel amaç, Türkçe destek
// llama3.1:70b   (70B): 48GB RAM — GPT-4 kalitesine yakın
// gemma2         (9B):  8GB RAM — kod görevleri
// nomic-embed-text: yalnızca embedding, 768 boyut

// ChatOptions ile parametreler
var secenekler = new ChatOptions
{
    Temperature = 0.7f,   // yaratıcılık (0=deterministik, 1=yaratıcı)
    MaxOutputTokens = 2048
};

var yaraticiYanit = await chatClient.CompleteAsync(
    "Kısa bir hikaye yaz", secenekler);

Performans İpuçları

// 1. Modeli önceden yükle — ilk istek gecikmesini önle
var isitmaSorusu = await chatClient.CompleteAsync("Merhaba");

// 2. Bağlam penceresini yönet — büyük bağlam = yavaş
var kısaGecmis = konusmaGecmisi.TakeLast(10).ToList();

// 3. Streaming kullan — kullanıcı hemen içerik görür
await foreach (var token in chatClient.CompleteStreamingAsync(soru))
    Console.Write(token.Text);

Ollama, yapay zeka uygulamalarını veri gizliliği ve maliyet kontrolüyle geliştirmenin pratik yoludur. Microsoft.Extensions.AI soyutlaması sayesinde geliştirmede Ollama, production'da OpenAI veya Azure kullanmak tek satır DI değişikliği ile mümkündür.