Ollama : Exécuter des LLMs localement

tl;dr: Ollama simplifie l'exécution de LLMs en local : installation en une commande, bibliothèque de 100+ modèles (Llama, Mistral, Gemma), API REST compatible OpenAI, quantization automatique. Parfait pour confidentialité, développement et IA offline.

Vous utilisez ChatGPT, Claude ou Gemini via leurs APIs cloud. Mais que se passe-t-il quand :

  • Vous travaillez sur des données confidentielles (santé, finance, legal)
  • Vous êtes hors ligne (avion, zone sans réseau)
  • Vous voulez contrôler les coûts (pas de frais par token)
  • Vous avez besoin de latence minimale (pas de requête réseau)
  • Vous développez et testez en continu (des milliers de requêtes)

La réponse : exécuter des LLMs en local avec Ollama.

💡 Ollama est un outil open source qui simplifie l’exécution de LLMs sur votre machine. Il gère le téléchargement, la quantization, l’optimisation et expose une API REST compatible OpenAI.

Pourquoi Ollama ?

Avantages vs alternatives (llama.cpp, vLLM, etc.) :

  • Simplicité extrême : Installation et utilisation en 2 commandes
  • Multi-plateformes : Mac (Apple Silicon natif), Linux, Windows
  • Bibliothèque riche : 100+ modèles pré-configurés (Llama, Mistral, Gemma, Qwen, etc.)
  • Quantization automatique : Télécharge la version adaptée à votre hardware
  • API REST : Compatible OpenAI SDK (drop-in replacement)
  • GPU auto-détection : CUDA, ROCm, Metal (Apple) supportés
  • Modelfile : Personnalisation facile (system prompts, température, etc.)

Cas d’usage typiques :

  • Développement d’applications : Tester sans coûts API
  • Prototypage : Itérer rapidement sur prompts
  • Confidentialité : Données sensibles restent locales
  • Production on-premise : Serveurs internes d’entreprise
  • Éducation : Apprendre sans limites de quota
  • Offline : Assistants fonctionnels sans internet

Popularité :

  • 50K+ étoiles GitHub
  • 10M+ téléchargements
  • Supporté par Hugging Face, LangChain, LlamaIndex

Guide pratique sur Ollama pour exécuter des LLMs localement pour déployer l’IA localement

Installation

macOS

# Installation via brew (recommandé)
brew install ollama

# Ou via script officiel
curl -fsSL https://ollama.com/install.sh | sh

# Démarrer le service
ollama serve
# Le serveur démarre sur http://localhost:11434

Apple Silicon (M1/M2/M3) : Ollama utilise Metal pour accélération GPU native. Performances excellentes !

Linux

# Installation automatique
curl -fsSL https://ollama.com/install.sh | sh

# Démarrer comme service systemd
sudo systemctl start ollama
sudo systemctl enable ollama  # Démarrage automatique au boot

# Vérifier status
sudo systemctl status ollama

GPU NVIDIA : Ollama détecte automatiquement CUDA (version 11.8+ requise).

# Vérifier détection GPU
nvidia-smi

# Ollama utilisera automatiquement le GPU

GPU AMD : Support via ROCm (expérimental).

Windows

Option 1 : Binaire officiel (recommandé)

  1. Télécharger OllamaSetup.exe
  2. Exécuter l’installateur
  3. Ollama démarre automatiquement comme service Windows

Option 2 : WSL2 (pour développeurs Linux habitués)

# Dans WSL2 Ubuntu
curl -fsSL https://ollama.com/install.sh | sh
ollama serve

GPU Windows : Support CUDA si drivers NVIDIA installés.

Vérification installation

# Tester que Ollama fonctionne
ollama --version
# Sortie : ollama version 0.1.x

# Lister modèles installés (vide pour l'instant)
ollama list

# Tester avec un petit modèle
ollama run phi
# Télécharge phi (~2.7B paramètres) et lance un chat
💡 Installation réussie ! Vous pouvez maintenant télécharger et exécuter des modèles.

Télécharger et exécuter des modèles

Bibliothèque de modèles

Ollama héberge 100+ modèles optimisés sur ollama.com/library.

Modèles populaires :

ModèleParamètresVRAM requiseUse caseCommande
Llama 3.18B6 GBGénéral, codeollama run llama3.1
Llama 3.170B48 GBQualité maximaleollama run llama3.1:70b
Mistral7B5 GBFrançais excellentollama run mistral
Gemma 29B7 GBGoogle, multilingueollama run gemma2
Qwen 2.57B5 GBChinois, codeollama run qwen2.5
Phi-33.8B3 GBCompact, rapideollama run phi3
CodeLlama7B5 GBSpécialisé codeollama run codellama
Llama 3.2 Vision11B8 GBMultimodal (texte+image)ollama run llama3.2-vision

Commande ollama run

Syntaxe :

ollama run <model_name>:<tag>

Tags : Variantes de quantization (taille vs qualité).

# Télécharger et lancer Llama 3.1 8B (quantization par défaut : Q4)
ollama run llama3.1

# Spécifier variante de quantization
ollama run llama3.1:70b-instruct-q4_K_M  # 70B paramètres, Q4_K_M
ollama run llama3.1:8b-instruct-q8_0     # 8B paramètres, Q8 (meilleure qualité, plus lourd)

# Mistral en français
ollama run mistral

# Gemma 2
ollama run gemma2:27b

Première exécution : Télécharge le modèle (peut prendre quelques minutes selon taille et connexion).

$ ollama run llama3.1
pulling manifest
pulling 8eeb52dfb3bb... 100% ▕████████████████▏ 4.7 GB
pulling 948af2743fc7... 100% ▕████████████████▏  1.5 KB
pulling 0ba8f0e314b4... 100% ▕████████████████▏  12 KB
pulling 56bb8bd477a5... 100% ▕████████████████▏   96 B
pulling 1a4c3c319823... 100% ▕████████████████▏  485 B
verifying sha256 digest
writing manifest
removing any unused layers
success

>>> Send a message (/? for help)

Chat interactif

Une fois le modèle lancé, vous êtes en mode chat interactif.

>>> Explique-moi ce qu'est un LLM en termes simples

Un LLM (Large Language Model) est un modèle d'intelligence artificielle
entraîné sur d'énormes quantités de texte pour comprendre et générer du
langage naturel. Imagine un assistant qui a "lu" l'équivalent de millions
de livres et peut répondre à des questions, écrire des textes, traduire,
coder, etc. Les LLMs comme GPT, Claude ou Llama fonctionnent en prédisant
le mot suivant le plus probable dans une séquence, token par token.

>>> Donne-moi un exemple de code Python pour lire un fichier CSV

Voici un exemple simple avec la bibliothèque pandas :

```python
import pandas as pd

# Lire le fichier CSV
df = pd.read_csv('data.csv')

# Afficher les premières lignes
print(df.head())

# Afficher informations sur les colonnes
print(df.info())

Si tu n’as pas pandas, installe-le avec pip install pandas.


**Commandes spéciales en mode chat** :
- `/bye` : Quitter
- `/clear` : Effacer l'historique de conversation
- `/show` : Afficher paramètres du modèle
- `/load <model>` : Charger un autre modèle
- `/?` : Aide

```bash
>>> /show info
Model
  architecture        llama
  parameters          8.0B
  context length      8192
  embedding length    4096
  quantization        Q4_K_M

Gestion des modèles

# Lister modèles installés
ollama list

# Sortie exemple :
# NAME                ID              SIZE    MODIFIED
# llama3.1:latest     42182419e950    4.7 GB  2 hours ago
# mistral:latest      61e88e884507    4.1 GB  1 day ago
# codellama:latest    8fdf8f752f6e    3.8 GB  3 days ago

# Supprimer un modèle
ollama rm llama3.1

# Mettre à jour un modèle
ollama pull llama3.1

# Pull sans lancer
ollama pull gemma2

# Voir détails d'un modèle
ollama show llama3.1

# Copier un modèle avec nouveau nom
ollama cp llama3.1 my-custom-llama

Mode non-interactif

Exécuter une commande unique :

# Réponse directe (non-interactif)
ollama run llama3.1 "Quelle est la capitale de la France ?"

# Sortie :
# La capitale de la France est Paris.

# Rediriger sortie
ollama run codellama "Écris une fonction Python pour calculer la factorielle" > factorial.py

Utilisation en scripts bash :

#!/bin/bash

MODEL="llama3.1"
PROMPT="Analyse ce log d'erreur : $(cat error.log)"

RESPONSE=$(ollama run $MODEL "$PROMPT")

echo "Diagnostic IA :"
echo "$RESPONSE"

# Envoyer par email, logger, etc.

API REST

Ollama expose une API REST sur http://localhost:11434 compatible avec le format OpenAI.

Endpoints principaux

1. Générer une completion :

# POST /api/generate
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.1",
  "prompt": "Why is the sky blue?",
  "stream": false
}'

Réponse :

{
  "model": "llama3.1",
  "created_at": "2025-01-15T10:30:00Z",
  "response": "The sky appears blue due to Rayleigh scattering...",
  "done": true,
  "context": [128, 564, ...],
  "total_duration": 3247892000,
  "load_duration": 48203000,
  "prompt_eval_duration": 527841000,
  "eval_duration": 2671848000
}

2. Chat completion (format OpenAI) :

# POST /api/chat
curl http://localhost:11434/api/chat -d '{
  "model": "llama3.1",
  "messages": [
    {"role": "system", "content": "Tu es un assistant serviable."},
    {"role": "user", "content": "Quelle est la capitale du Japon ?"}
  ],
  "stream": false
}'

3. Streaming :

# Streaming de tokens (Server-Sent Events)
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.1",
  "prompt": "Écris une courte histoire",
  "stream": true
}'

# Sortie progressive :
# {"response": "Il", "done": false}
# {"response": " était", "done": false}
# {"response": " une", "done": false}
# {"response": " fois", "done": false}
# ...
# {"done": true}

Python SDK

import requests
import json

class OllamaClient:
    def __init__(self, base_url="http://localhost:11434"):
        self.base_url = base_url

    def generate(self, model, prompt, stream=False, **kwargs):
        """Générer texte depuis prompt"""
        url = f"{self.base_url}/api/generate"
        data = {
            "model": model,
            "prompt": prompt,
            "stream": stream,
            **kwargs
        }

        response = requests.post(url, json=data, stream=stream)

        if stream:
            # Streaming mode
            for line in response.iter_lines():
                if line:
                    yield json.loads(line)
        else:
            return response.json()

    def chat(self, model, messages, stream=False, **kwargs):
        """Chat avec historique"""
        url = f"{self.base_url}/api/chat"
        data = {
            "model": model,
            "messages": messages,
            "stream": stream,
            **kwargs
        }

        response = requests.post(url, json=data, stream=stream)

        if stream:
            for line in response.iter_lines():
                if line:
                    yield json.loads(line)
        else:
            return response.json()

# Utilisation
client = OllamaClient()

# Génération simple
result = client.generate(
    model="llama3.1",
    prompt="Explique la relativité en une phrase",
    temperature=0.7
)
print(result["response"])

# Chat avec mémoire
messages = [
    {"role": "system", "content": "Tu es un expert Python."},
    {"role": "user", "content": "Comment lire un fichier JSON ?"}
]

response = client.chat(model="codellama", messages=messages)
print(response["message"]["content"])

# Streaming
print("Génération progressive :")
for chunk in client.generate(model="mistral", prompt="Écris un poème", stream=True):
    if not chunk.get("done"):
        print(chunk["response"], end="", flush=True)

Compatible OpenAI SDK

Ollama est compatible avec OpenAI Python SDK !

from openai import OpenAI

# Pointer vers Ollama au lieu d'OpenAI
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # Requis mais non utilisé
)

# Utiliser exactement comme OpenAI
response = client.chat.completions.create(
    model="llama3.1",
    messages=[
        {"role": "system", "content": "Tu es un assistant serviable."},
        {"role": "user", "content": "Quelle est la hauteur de l'Everest ?"}
    ],
    temperature=0.7,
    max_tokens=150
)

print(response.choices[0].message.content)

# Streaming
stream = client.chat.completions.create(
    model="mistral",
    messages=[{"role": "user", "content": "Conte une blague"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Avantage majeur : Basculer entre OpenAI (cloud) et Ollama (local) en changeant juste base_url !

import os

# Configuration dynamique
USE_LOCAL = os.getenv("USE_LOCAL_LLM", "false").lower() == "true"

if USE_LOCAL:
    client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
    model = "llama3.1"
else:
    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    model = "gpt-4o"

# Le reste du code est identique !
response = client.chat.completions.create(
    model=model,
    messages=[...]
)

Modelfile : Personnalisation

Un Modelfile permet de personnaliser un modèle : system prompt, température, top_p, etc.

Syntaxe Modelfile

# Modelfile
FROM llama3.1

# System prompt personnalisé
SYSTEM """
Tu es un expert en cybersécurité, spécialisé dans l'analyse de vulnérabilités.
Tu réponds de manière concise et technique.
Tu fournis toujours des exemples de code quand pertinent.
"""

# Paramètres de génération
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 4096  # Taille du contexte

# Message d'accueil
TEMPLATE """{{ if .System }}System: {{ .System }}{{ end }}
User: {{ .Prompt }}
Assistant: """

Créer un modèle custom

# Créer Modelfile
cat > Modelfile <<EOF
FROM mistral

SYSTEM "Tu es un poète romantique du 19e siècle. Tu t'exprimes avec élégance et lyrisme."

PARAMETER temperature 0.9
PARAMETER top_p 0.95
EOF

# Créer le modèle custom
ollama create romantic-poet -f Modelfile

# Utiliser le modèle
ollama run romantic-poet

>>> Décris la lune
Ô douce clarté lunaire, astre argenté qui règne sur la voûte céleste nocturne !
Telle une perle suspendue dans l'éther, tu verses ta lumière d'albâtre...

Exemples de Modelfiles

1. Assistant de code strict :

FROM codellama:13b

SYSTEM """
Tu es un senior software engineer expert en clean code.

Règles strictes :
- Code commenté et documenté
- Gestion d'erreurs explicite
- Respect PEP 8 (Python) ou conventions du langage
- Tests unitaires si demandé
- Pas de solutions "quick and dirty"

Format de réponse :
1. Explication de l'approche
2. Code complet
3. Exemples d'utilisation
4. Tests (si applicable)
"""

PARAMETER temperature 0.3  # Bas = plus déterministe pour code
PARAMETER top_p 0.9
ollama create clean-coder -f Modelfile
ollama run clean-coder "Écris une fonction pour valider une adresse email"

2. Tuteur pédagogue :

FROM llama3.1:8b

SYSTEM """
Tu es un tuteur patient et pédagogue pour étudiants débutants.

Méthode d'enseignement :
1. Commence par expliquer le concept simplement (analogie si possible)
2. Donne un exemple concret
3. Pose une question pour vérifier la compréhension
4. Encourage et félicite les efforts

Ton : Amical, encourageant, jamais condescendant
Ne donne jamais directement la réponse complète, guide plutôt
"""

PARAMETER temperature 0.8

3. Extracteur JSON strict :

FROM llama3.1:8b

SYSTEM """
Tu es un extracteur de données. Tu réponds UNIQUEMENT en JSON valide, rien d'autre.
Format JSON strict sans commentaires ni texte additionnel.
"""

PARAMETER temperature 0.1  # Très bas pour consistance
PARAMETER top_k 10
ollama create json-extractor -f Modelfile

echo "Extrais les infos : Jean Dupont, né le 15/03/1985 à Paris, ingénieur" | \
  ollama run json-extractor
# {
#   "nom": "Dupont",
#   "prenom": "Jean",
#   "date_naissance": "1985-03-15",
#   "lieu_naissance": "Paris",
#   "profession": "ingénieur"
# }

Importer modèles Hugging Face

Vous pouvez convertir n’importe quel modèle GGUF depuis Hugging Face.

# Modelfile
FROM https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF/resolve/main/llama-2-13b-chat.Q4_K_M.gguf

SYSTEM "Tu es un assistant serviable."

PARAMETER temperature 0.7
ollama create llama2-13b-custom -f Modelfile

Modèles GGUF populaires : TheBloke sur Hugging Face propose des centaines de modèles quantizés.


Intégration avec applications

LangChain

from langchain_community.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# Initialiser Ollama
llm = Ollama(
    model="llama3.1",
    base_url="http://localhost:11434",
    temperature=0.7
)

# Utiliser avec LangChain
prompt = PromptTemplate(
    input_variables=["product"],
    template="Rédige une description marketing pour {product}"
)

chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(product="un smartphone pliable")
print(result)

# RAG avec Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# [Embeddings](/ia/embedding/) locaux
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# Charger documents
from langchain_community.document_loaders import TextLoader
loader = TextLoader("documentation.txt")
documents = loader.load()

# Chunking
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# Base vectorielle locale
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# RAG Chain
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)

# Question
response = qa_chain.run("Comment installer Python ?")
print(response)

LlamaIndex

from llama_index.llms.ollama import Ollama
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.ollama import OllamaEmbedding

# LLM local
llm = Ollama(model="llama3.1", request_timeout=120.0)

# Embeddings locaux
embed_model = OllamaEmbedding(model_name="nomic-embed-text")

# Charger documents
documents = SimpleDirectoryReader("./data").load_data()

# Créer index
index = VectorStoreIndex.from_documents(
    documents,
    llm=llm,
    embed_model=embed_model
)

# Query engine
query_engine = index.as_query_engine()

response = query_engine.query("Résume les points clés du document")
print(response)

Gradio UI

Créer une interface web pour discuter avec Ollama :

import gradio as gr
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

def chat_with_ollama(message, history, model):
    """Chat function pour Gradio"""
    # Convertir historique Gradio en format OpenAI
    messages = []
    for human, ai in history:
        messages.append({"role": "user", "content": human})
        messages.append({"role": "assistant", "content": ai})
    messages.append({"role": "user", "content": message})

    # Appeler Ollama
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        stream=False
    )

    return response.choices[0].message.content

# Interface Gradio
with gr.Blocks() as demo:
    gr.Markdown("# Chat avec Ollama")

    model_dropdown = gr.Dropdown(
        choices=["llama3.1", "mistral", "codellama", "gemma2"],
        value="llama3.1",
        label="Choisir modèle"
    )

    chatbot = gr.Chatbot()
    msg = gr.Textbox(placeholder="Votre message...")

    msg.submit(
        chat_with_ollama,
        inputs=[msg, chatbot, model_dropdown],
        outputs=chatbot
    )

demo.launch()

API REST depuis JavaScript

// Frontend web app
async function askOllama(prompt, model = "llama3.1") {
  const response = await fetch("http://localhost:11434/api/generate", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      model: model,
      prompt: prompt,
      stream: false,
    }),
  });

  const data = await response.json();
  return data.response;
}

// Utilisation
const answer = await askOllama("Quelle est la capitale de l'Italie ?");
console.log(answer); // Rome

// Streaming
async function streamOllama(prompt, onToken) {
  const response = await fetch("http://localhost:11434/api/generate", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      model: "llama3.1",
      prompt: prompt,
      stream: true,
    }),
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    const chunk = decoder.decode(value);
    const lines = chunk.split("\n").filter((line) => line.trim());

    for (const line of lines) {
      const data = JSON.parse(line);
      if (!data.done) {
        onToken(data.response);
      }
    }
  }
}

// Usage
streamOllama("Écris une histoire courte", (token) => {
  process.stdout.write(token); // Affichage progressif
});

Quantization automatique

Ollama gère la quantization automatiquement pour optimiser taille/qualité selon votre hardware.

Niveaux de quantization

Les modèles Ollama utilisent le format GGUF avec différents niveaux :

QuantizationBits/weightTaille relativeQualitéUse case
Q2_K~2.6 bits0.3x⭐⭐RAM/VRAM très limité
Q3_K_M~3.5 bits0.4x⭐⭐⭐Bon compromis léger
Q4_K_M~4.5 bits0.5x⭐⭐⭐⭐Recommandé général
Q5_K_M~5.5 bits0.65x⭐⭐⭐⭐Qualité élevée
Q6_K~6.5 bits0.75x⭐⭐⭐⭐⭐Presque FP16
Q8_08 bits0.85x⭐⭐⭐⭐⭐Qualité maximale
FP1616 bits1.0x⭐⭐⭐⭐⭐Reference (lourd)

Sélection automatique par Ollama :

# Par défaut : Q4_K_M (optimal)
ollama run llama3.1

# Spécifier explicitement
ollama run llama3.1:8b-instruct-q8_0  # Qualité max
ollama run llama3.1:8b-instruct-q4_K_M  # Défaut
ollama run llama3.1:8b-instruct-q2_K  # Ultra-compact

Impact sur les performances

Llama 3.1 8B :

QuantTailleVRAMVitesseQualité
Q2_K3.0 GB4 GB100%85%
Q4_K_M4.7 GB6 GB95%95%
Q8_08.5 GB10 GB85%99%
FP1616 GB18 GB70%100%

Recommandation : Q4_K_M offre le meilleur compromis (95% qualité, 50% taille).


GPU vs CPU

Performances GPU

NVIDIA (CUDA) :

  • RTX 3060 12GB : Llama 8B @ ~25 tokens/sec
  • RTX 4090 24GB : Llama 70B Q4 @ ~15 tokens/sec
  • A100 80GB : Llama 70B FP16 @ ~50 tokens/sec

Apple Silicon (Metal) :

  • M1 Max 64GB : Llama 13B @ ~20 tokens/sec
  • M2 Ultra 192GB : Llama 70B Q4 @ ~25 tokens/sec
  • M3 Max 128GB : Llama 34B @ ~30 tokens/sec

AMD (ROCm) :

  • RX 7900 XTX 24GB : Llama 13B @ ~18 tokens/sec
🔎 Tip
Apple Silicon : Unified memory architecture = excellent pour LLMs ! Un M3 Max 128GB peut charger des modèles impossibles sur GPU NVIDIA de même prix.

Mode CPU uniquement

Si pas de GPU compatible, Ollama fonctionne sur CPU (plus lent mais viable).

# Forcer CPU
OLLAMA_NUM_GPU=0 ollama run llama3.1

# Performance CPU typique (Intel i9-13900K, 32GB RAM)
# Llama 8B Q4 : ~5-8 tokens/sec (utilisable)
# Llama 70B Q4 : ~1-2 tokens/sec (lent mais fonctionne)

Optimisations CPU :

# Threads CPU (par défaut : auto)
OLLAMA_NUM_THREAD=16 ollama run llama3.1

# Contexte réduit pour économiser RAM
ollama run llama3.1 --num-ctx 2048  # Défaut : 4096

Monitoring ressources

# Voir utilisation GPU en temps réel (NVIDIA)
watch -n 1 nvidia-smi

# Mac : Activity Monitor > GPU History

# Linux : htop pour CPU/RAM
htop

Cas d’usage pratiques

1. Chatbot customer support local

import ollama
from flask import Flask, request, jsonify

app = Flask(__name__)

KNOWLEDGE_BASE = """
Politique de retour : 30 jours
Frais de livraison : Gratuit au-dessus de 50€
Support : [email protected]
Horaires : Lundi-Vendredi 9h-18h
"""

@app.route("/chat", methods=["POST"])
def chat():
    user_message = request.json.get("message")

    # Prompt avec knowledge base
    prompt = f"""Contexte : Tu es un assistant customer support.

Base de connaissance :
{KNOWLEDGE_BASE}

Règles :
- Réponds uniquement basé sur la base de connaissance
- Si tu ne sais pas, redirige vers [email protected]
- Sois poli et professionnel

Client : {user_message}
Assistant :"""

    response = ollama.generate(
        model="mistral",
        prompt=prompt
    )

    return jsonify({"response": response["response"]})

if __name__ == "__main__":
    app.run(port=5000)

2. Génération de tests unitaires

def generate_tests(source_code_path):
    """Générer tests unitaires avec Ollama"""
    with open(source_code_path) as f:
        code = f.read()

    prompt = f"""Génère des tests unitaires pytest pour ce code Python :

```python
{code}

Requirements :

  • Tests complets (cas normaux + edge cases)
  • Docstrings claires
  • Fixtures si nécessaire
  • Code pytest standard

Réponds uniquement avec le code des tests, rien d’autre."""

response = ollama.generate(
    model="codellama:13b",
    prompt=prompt,
    options={"temperature": 0.2}  # Bas pour code consistant
)

# Sauvegarder tests
test_file = source_code_path.replace(".py", "_test.py")
with open(test_file, "w") as f:
    f.write(response["response"])

print(f"Tests générés : {test_file}")

Usage

generate_tests(“src/calculator.py”)

Crée src/calculator_test.py


### 3. Résumé automatique de documents

```python
import ollama
from pathlib import Path

def summarize_document(file_path, max_length="medium"):
    """Résumer un document texte"""
    content = Path(file_path).read_text()

    length_prompts = {
        "short": "en 3 phrases",
        "medium": "en un paragraphe",
        "long": "en plusieurs paragraphes"
    }

    prompt = f"""Résume ce document {length_prompts[max_length]} :

{content}

Résumé :"""

    response = ollama.generate(
        model="llama3.1",
        prompt=prompt
    )

    return response["response"]

# Usage
summary = summarize_document("rapport_annuel.txt", max_length="medium")
print(summary)

Conclusion

Ollama démocratise l’accès aux LLMs locaux avec une simplicité remarquable. En quelques commandes, vous exécutez des modèles state-of-the-art sur votre machine.

Points clés :

  1. Installation facile : Une commande sur Mac/Linux/Windows
  2. 100+ modèles : Llama, Mistral, Gemma, Qwen, et plus
  3. API REST : Compatible OpenAI SDK (drop-in replacement)
  4. Modelfile : Personnalisation system prompts et paramètres
  5. Quantization auto : Optimisation taille/qualité transparente
  6. Performance : Excellent sur GPU NVIDIA, Apple Silicon
  7. Intégrations : LangChain, LlamaIndex, Gradio

Quand utiliser Ollama :

  • ✅ Développement et prototypage (coût zéro)
  • ✅ Données confidentielles (santé, finance, légal)
  • ✅ Applications offline
  • ✅ Contrôle total sur l’infrastructure
  • ✅ Tests et expérimentation illimités

Quand préférer APIs cloud :

  • ❌ Modèles très larges inaccessibles localement (GPT-4, Claude Opus)
  • ❌ Infrastructure limitée (pas de GPU, RAM faible)
  • ❌ Maintenance et mises à jour automatiques critiques
  • ❌ Scaling horizontal massif

L’avenir de l’IA est hybride : APIs cloud pour qualité maximale, modèles locaux pour confidentialité et coûts. Ollama rend cette approche accessible à tous !


Ressources

Articles liés :

Liens officiels :

Communautés :

Modèles GGUF :