IA en local

Presenter Notes

Presenter Notes

Plan

Presenter Notes

But

  • Contrôle de l'architecture
  • Prix
  • Confidentialité

Presenter Notes

Matériel

  • GPU vs CPU
  • Delphine et Natacha
  • Spéc matériel

Presenter Notes

Choisir le modèle

  • Spécification
  • Limite matérielle
  • Devstral Small 2
  • Qwen 3.5

Presenter Notes

Déploiement

  • Ollama
  • Configuration
  • Exécution
  • Pas assez de VRAM
  • API

Presenter Notes

Tests

  • AI assistant Jetbrains

Presenter Notes

RAG

  • Introduction
  • Fonctionnement

Presenter Notes

Cas Pratique

  • Besoin
  • Limites Actuelles
  • Solutions possibles

Presenter Notes

Vectorisation

  • Présentation rapide TF-IDF
  • Embedding
  • Similarité Cosinus

Presenter Notes

Base de données vectorielles

  • Présentation Qdrant
  • Collections
  • Requête

Presenter Notes

Test embedding

  • Introduction
  • Exemples

Presenter Notes

Cas pratique (suite)

  • Extraction des données
  • Vectorisation
  • Stockage en base
  • Le programme final
  • Exemple

Presenter Notes

Erreurs IA

  • Idempotence
  • Erreurs

Presenter Notes

Conclusion

  • Validité
  • Difficulté
  • Rentabilité

Presenter Notes

Presenter Notes

But

Presenter Notes

But

  • Contrôle de l'architecture
  • Prix
  • Confidentialité

Presenter Notes

Contrôle de l'architecture

Les plus

  • Administration complète
  • Gestion du nombre de requêtes
  • Customisation complète

Les moins

  • Gestion du matériel
  • Connaissances bas niveau requises
  • Plus de travail

Presenter Notes

Prix

Les plus

  • Pas de tarification exhorbitante
  • Pas de limites de requêtes

Les moins

  • Matériel coûteux

Presenter Notes

Confidentialité

  • Les informations sont confidentielles
  • Aucun accès au cloud
  • Pas de sortie hors de France
  • Compatible RGPD à 100%

Presenter Notes

Presenter Notes

Matériel

Presenter Notes

Matériel

  • GPU vs CPU
  • Delphine et Natcha
  • Spéc matériel

Presenter Notes

GPU vs CPU

gpu vs cpu

Presenter Notes

Delphine et Natacha

Delphine

  • i7-6700K (4 cœurs, 8 threads) ± 4.20GHz
  • 16Go DDR4
  • Nvidia Geforce RTX 4060 OC (8G) Ada Lovelace

Natacha

  • i9-12900K (16 cœurs, 24 threads) ± 5GHz, ± 3.20GHz
  • 64Go DDR5
  • Pas de carte graphique

Presenter Notes

Spéc matériel

Vérification

  • Port PCI Express pour la carte graphique
  • Vérifier la compatibilité
  • Vérifier la configuration du port dans le BIOS
  • Plus récente -> plus de débit

Exemple

  • Mauvaise config (mode gen 2), passage à gen3 -> bande passante doublée
  • Résultats ? le llm se charge plus rapidement

Presenter Notes

Monitoring GPU

Utilisation de nvtop

gpu

En cours d'utilisation

Presenter Notes

Monitoring CPU

Utilisation de htop

cpu

En cours d'utilisation

Presenter Notes

Presenter Notes

Choisir le modèle

Presenter Notes

Choisir le modèle

  • Spécification
  • Limite matérielle
  • Devstral Small 2
  • Qwen 3.5

Presenter Notes

Spécification

  • Savoir ce que le modèle prend en entrée (image, texte, …)
  • Est-il multilingue ?
  • Quelle est sa spécialité ?
  • Sa taille
  • La taille du contexte

Presenter Notes

Limite matérielle

Taille

  • La taille du modèle est la principale limite
  • Si taille > VRAM -> passage en mode CPU uniquement

Pour calculer à peu près

  • Taille modèle + 1Go + 1Go (var) < VRAM

Solution

  • Carte avec plus de VRAM
  • Plusieurs cartes en parallèle (pas encore testé)

Presenter Notes

Devstral Small 2

Spec

  • Taille : 15GB
  • Nombre de paramètres : 24B
  • Entrée : texte, image

Presenter Notes

Test Devstral Small 2

Explication du code suivant (réponse ici) :

import serial
arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600)

Delphine

  • Impossible, pas assez de VRAM

Natacha

  • Solution correcte
  • Temps : 5m20s -> trop long
  • Tous les cœurs à 100%, ± 98°C

Presenter Notes

Qwen 3.5 (4B)

Spec

  • Taille: 3.4GB
  • Nombre de paramètres: 4.66B
  • Entrée : texte, image

Presenter Notes

Test Qwen 3.5

Explication du code suivant (réponse ici) :

import serial
arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600)

Delphine

  • Solution correcte
  • Temps : 30s
  • GPU à 75%,
  • VRAM à 80%

Natacha

  • Solution correcte
  • Temps: 5m35s -> Trop long
  • Tous les cœurs à 100%, ± 98°C

Presenter Notes

Test description image

image

Presenter Notes

Résultat

image

Sur l'image, la fille dessine sur sa tablette graphique une scène avec un lapin blanc mignon.

Plus précisément, le dessin à l'écran montre un lapin blanc ressemblant (en style "chibi") qui tient un crayon dans ses petites mains, semblant être en train de dessiner aussi. Le fond du dessin est doré et chaleureux.

Presenter Notes

Choisir le modèle (conclusion)

Comparaison

DevstrallQwen
+
  • Texte, image
  • Multilingue (français)
  • A l'air fiable
  • Texte, image
  • Multilingue (français)
  • A l'air fiable
-
  • Trop lourd
  • 18Go VRAM min
  • Moins de paramètres
  • Moins de connaissances de base

Retenu

  • Qwen 3.5

Presenter Notes

Presenter Notes

Déploiement

Presenter Notes

Déploiement

  • Ollama
  • Configuration
  • Exécution
  • Pas assez de VRAM
  • API

Presenter Notes

Ollama

  • Plateforme qui exécute des LLM
  • Open source
  • Écrit en Go
  • API Rest
  • Compatible CUDA
  • Interfaçage avec Copilot, OpenClaw,…
  • Utilise llama.cpp

Presenter Notes

Configuration (Archlinux)

Installation

  • CUDA (Nvidia)
  • ollama et ollama-cuda
  • Derniers pilotes nvidia-open

Vars d'env

NomValeurDescription
OLLAMA_NO_CLOUD true Pas de cloud, que local
CUDA_VISIBLE_DEVICES 0 Seléction CG, si plusieurs dispo
OLLAMA_VERBOSE 1 Plus de logs

Presenter Notes

Éxecution

Démarrage

Lancer ollama avec la commande

ollama serve

Pull auto LLM

Il est possible de tirer automatiquement le LLM avec la commande suivante

ollama pull qwen3.5:4b

Démarrage interactif

Avec la commande

ollama run qwen3.5:4b

interactif

Presenter Notes

Pas assez de VRAM

Cause

  • LLM trop lourd
  • VRAM déjà utilisée

Conséquences

  • Chargement en RAM
  • Utilisation du CPU
  • GPU inutilisé

Presenter Notes

Api Question

Requête

import requests
d = {
    "model": "qwen3.5:4b",
    "options": { "num_ctx": 8192 },
    "messages": [
        {"role": "user", "content": "Es tu un poisson ?"}
    ],
    "think": False, "stream": False,
}
r = requests.post("http://localhost:11434/api/chat", json=d)
rep = r.json()
print(rep["message"]["content"])

Réponse

Non, je ne suis pas un poisson. Je suis une intelligence artificielle (un modèle de langage), pas un animal marin. 🐟❌

Je n'ai pas de branchies, ne respire pas de l'eau et je ne nage pas dans l'océan ! J'existe sous forme de code et d'algorithmes pour vous répondre aux questions.

Presenter Notes

Api Embedding

Requête

import resquests
r = requests.post("http://localhost:11434/api/embed", json={
    "model": "qwen3-embedding:4b",
    "input": ["roi", "amour", "reine"]
})
j = r.json()

print(len(j["embeddings"]))
# nombre de vecteurs -> 3


print(len(j["embeddings"][0]))
# dimension d'un vecteur -> 2560 pour qwuen3-embedding

Presenter Notes

Presenter Notes

Tests

Presenter Notes

Tests

  • AI assistant Jetbrains

Presenter Notes

AI assistant jetbrains

Introduction

  • Comparable à copilot
  • Facilité d'utilisation de ollama et choix du modèle

Test

  • Explication du code
import serial
arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600)

Résultat

  • Surcharge du CPU et de la RAM pour la création du contexte
  • Durée totale de 15 min de calcul
  • Abandon

Presenter Notes

Presenter Notes

Rag

Presenter Notes

RAG

  • Introduction
  • Fonctionnement

Presenter Notes

Introduction

Problème

  • Connaissances du LLM figés
  • Connaissances non mises à jour
  • Interrogation données privées impossible de base

Solution

  • Utilisation d'un RAG
  • Le LLM aura accès à une base de connaissance
  • Le contexte est plus complet pour la génération de la réponse

Contraintes

  • Les documents doivent être fiables
  • Les documents doivent être transformés
  • Comment les stocker, sous quelles formes ?

Presenter Notes

Fonctionnement

  • Vectorisation de la question
  • Recherche des documents pertinents dans la BDD vectorielle
  • Enrichissement du contexte
  • Envoi de la question au LLM
  • Récupération de la réponse

Presenter Notes

Presenter Notes

Cas Pratique

Presenter Notes

Cas Pratique

  • Besoin
  • Limites Actuelles
  • Solutions possibles

Presenter Notes

Besoin: Application cible

doc/cas-pratique/images/image.png

Presenter Notes

Besoin: Recherche

  • Avoir des propositions de film à regarder
  • Avec le genre, les thèmes
  • Les acteurs, réalisateurs

Presenter Notes

Limites actuelles

Intro

  • Il faut connaitre le film par avance
  • Recherche par genre, thèmes
  • Recherche par mots-clefs

Requêtage actuel

select f.id, f.titre, f.date_ajout
from films f
where 1=1
and (f.genres @> '[1,2]')
and (
    unaccent(f.titre) ilike unaccent('zombie')
    or unaccent(f.titre_original) ilike unaccent('zombie')
    or unaccent(f.acteurs) ilike unaccent('zombie')
    or unaccent(f.equipe) ilike unaccent('zombie')
)
order by f.titre asc limit 10 offset 0

Presenter Notes

Solutions possibles

Recherche par synonyme

  • Il faut avoir un dictionnaire des synonymes
  • La requête SQL sera plus grosse
  • Se baser sur un moteur Lucène (comme Elasticsearch)
  • Très grosse préparation des documents

Ajout d'une grammaire de recherche

$genre contient ["zombie","romance"]
et $plateforme == "crunchyroll"
et $mot-clefs contient ["gentil","amoureuse"]

Rag

  • Vectorisation des documents
  • Utilisation d'un LLM

Presenter Notes

Presenter Notes

Vectorisation

Presenter Notes

Vectorisation

  • Présentation rapide TF-IDF
  • Embedding
  • Similarité Cosinus

Presenter Notes

TF-IDF

Intro

  • Utilisation en fouille de données
  • Évaluer l'importance d'un terme contenu dans un document, relativement à une collection
  • Plus le mot est présent, plus le score est haut

Les plus

  • Peu coûteux
  • Facile à mettre en place

Les moins

  • Pas de sémantique
  • Chaque mot est considéré indépendant

Presenter Notes

Embedding

Intro

  • Représentation vectorielle
  • Ajout de la sémantique

Exemple

  • Roi et Reine sont proches
  • Ordinateur et Carottes sont différents

Support par le LLM

  • Soit le LLM suporte l'embedding
  • Soit on utilise un LLM sépcialisé pour comme qwen3-embedding

Presenter Notes

Similarité Cosinus

vecteur

Formule

vecteur

Exemple

Soit deux documents d1 et d2

Soit une question q

Résultat

α < θ , le document d1 est plus proche de la question q

Presenter Notes

Presenter Notes

Base de données vectorielles

Presenter Notes

Base de données vectorielles

  • Présentation Qdrant
  • Collection
  • Requête
  • Exemple de test

Presenter Notes

Présentation Qdrant

  • Base de données vectorielle
  • Developpé en Rust
  • Open source
  • Ajout d'infos supplémentaires en plus du vecteur

Presenter Notes

Collection

Intro

  • Ensemble de points

Configuration

  • Nom
  • Dimension des vecteurs
  • Type de comparaison

Type de comparaison

  • Produit scalaire
  • Similarité cosinus
  • Distance Euclidienne
  • Distance de Manhattan

Presenter Notes

Requête

Utilisation de qdrant-client (Python)

Création du client

from qdrant_client import QdrantClient, models

client = QdrantClient(host="localhost", port=6333)

Création d'une collection

client.create_collection(
    "films",
    vectors_config=models.VectorParams(
        size=2560, distance=models.Distance.COSINE)
)

Suppression d'une collection

client.delete_collection("films")

Presenter Notes

Requête (suite)

Ajout d'un point

point = PointStruct(
    id=id_uuid(f"{id_film}-titre"),
    vector=vecteurs[0],
    payload={
        "id": f"{id_film}-titre",
        "id-framboise": id_film,
        "titre": d["titre"],
        "texte": textes[0]
    }
)
client.upsert(collection_name="films", points=[point])

Presenter Notes

Requête (suite)

Requêtage

reponse = client.query_points(
    "films", query=vecteur_question, limit=20, with_payload=True
)
for point in reponse.points:
    print(point.score, point.payload["titre"])

Presenter Notes

Presenter Notes

Test embedding

Presenter Notes

Test embedding

  • Introduction
  • Exemples

Presenter Notes

Introduction

LLM

  • Utilisation de qwen3-embedding:4b
  • Vecteur de dimension 2560

Données de test

  • mort-vivant
  • roi
  • romance

Utilisation

  • Vectorisation des données et ajout dans Qdrant
  • Vectorisation du mot
  • Recherche des mots les plus proches
  • Affichage des résultats

Presenter Notes

Exemples

zombie

MotScore
mort-vivant0.73820543
roi0.56434727
romance0.5410757

amour

MotScore
romance0.7738683
mort-vivant0.62889326
roi0.5549742

Presenter Notes

Exemples (suite)

roi

MotScore
roi0.99999976
romance0.53677595
mort-vivant0.5326838

Presenter Notes

Presenter Notes

Cas pratique (suite)

Presenter Notes

Cas pratique (suite)

  • Extraction des données
  • Vectorisation
  • Stockage en base
  • Le programme final
  • Exemple

Presenter Notes

Extraction des données

  • 1370 films à extraire
  • Données textuelles uniquement
  • Via API Rest

Presenter Notes

Données d'un film

Identifiant

Utile pour récupérer le document

Titre

Le Château solitaire dans le miroir

Titre original

かがみの孤城

Genres

Fantastique, Drame

Thèmes

Mystère

Synopsis

Un beau jour, le miroir dans la chambre de Kokoro se met à scintiller…

Presenter Notes

Vectorisation

Que vectoriser ?

  • Titre
  • Genres
  • Thèmes
  • Synopsis

Comment ?

  • En minuscule
  • 1 vecteur par valeur
  • 50 films à la fois → 200 calculs en parallèle (si trop de requête → surcharge CG)
  • Avec aiohttp pour plus de rapidité (I/O bound)

Presenter Notes

Stockage en base

  • Tout dans la même collection
  • Ajout de l'ID du film en payload du vecteur dans Qdrant

Presenter Notes

Le programme final

  • L'utilisateur tape une phrase (question).
  • La question est vectorisée.
  • Interrogation des vecteurs proches de la question (limité à 20)
  • Récupération des films
  • Création d'une question avec contexte
  • Envoi au LLM
  • Affichage de la réponse

Presenter Notes

Quelle question est posée ?

Voici ton contexte:

[https://framboise.*******.fr/#/film/1057]
titre: @@@@
synopsis: @@@@@@
genres: ####, ####, ####
thèmes: @@@@@

{ ... autre films ... }

Voici ce que tu dois faire
pour chaque film:
- tu vas soit le garder si il a un rapport avec
    la phrase «{question utilisateur}», sinon tu vas l'oublier
- tu va extraire le titre, le lien, et le synopsis
- tu vas resumer un peu mieux le synopsis
tu dois seulement répondre en JSON

Presenter Notes

Exemple

Question posée

Histoire d'amour avec un zombie

Préselection de films pour le contexte

  • Warm Bodies
  • 28 Jours plus tard
  • Le village des damnés
  • Le Village des damnés
  • Dernier train pour Busan
  • Peninsula
  • Viral
  • Army of the Dead
  • Zom 100 : La liste de la mort
  • Bienvenue à Zombieland
  • Retour à Zombieland
  • World War Z
  • Resident Evil
  • Resident Evil : Retribution
  • Resident Evil : Chapitre Final
  • Resident Evil : Extinction
  • Resident Evil : Afterlife

Presenter Notes

Résultat en JSON

[
  {
    "titre": "Warm Bodies",
    "lien": "https://framboise.****.fr/#/film/1057",
    "synopsis": "Dans un futur où les zombies sont mortels,
                    un zombie nommé R …"
  },
  {
    "titre": "28 Jours plus tard",
    "lien": "https://framboise.****.fr/#/film/1188",
    "synopsis": "Un laboratoire découvre qu'un virus est responsable …"
  },
 //{... autres films ...}
]

Presenter Notes

Erreurs

  • 1 fois sur 4 le llm ne respecte pas le texte et renvoie du markdown
    • Recommencer la requête au LLM
    • Exécuter plusieurs requêtes et sélectionner la meilleure réponse
  • Certains résumés sont faux, farfelus, aucun rapport
    • L'IA n'est pas fiable
    • Tenter un résumé unitairement

Presenter Notes

Presenter Notes

Erreurs IA

Presenter Notes

Erreurs IA

  • Idempotence
  • Erreurs

Presenter Notes

Idempotence

Définition

Une opération a le même effet qu'on l'applique une ou plusieurs fois

Exemple

  • Les fonctions pures

Conclusion

  • L'IA est aléatoire et imprévisible
  • Partir du principe que le résultat sera toujours différent

Presenter Notes

Erreurs

  • Les hallucinations sont des erreurs
  • La fréquence d'erreur est très élevée
  • La confiance ne peut pas être totale
  • Partir du principe que la réponse est fausse

Presenter Notes

Presenter Notes

Conclusion

Presenter Notes

Conclusion

  • Validité
  • Difficulté
  • Rentabilité

Presenter Notes

Validité

Général

  • Dans le meilleur des cas 60% de bonnes réponses
  • L'embedding est efficace

Cas pratique

  • La recherche par similarité cosinus peut être suffisante
  • Peut-être intéressant pour une suggestion de film à voir

Autre

  • La vectorisation peut être faite uniquement par calcul CPU (RAM++).

Presenter Notes

Difficulté

  • Configuration du matériel
  • Installation
  • Monitoring (surveillance surchauffe)
  • Matériel insuffisant (manque de puissance)
  • Documentation quasi inexistante
  • Difficulté à trouver de l'expertise en livre ou sur internet

Presenter Notes

Rentabilité positive si

Général

  • Pour des requêtes simples
  • Description d'image
  • Avec une bonne gestion du nombre de requêtes
  • Utilisation d'un petit modèle

Cas pratique

  • Bonne gestion du nombre de requêtes

Presenter Notes

Rentabilité négative si

  • Utilisation d'un gros modèle
  • Contexte trop large
  • Assistance au codage

Presenter Notes

Presenter Notes

Questions ?

question

Presenter Notes