Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Embeddings : Symfony AI en pratique

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Embeddings : Symfony AI en pratique

On parle beaucoup d’IA, mais rarement de ce qu’on peut *vraiment* en faire dans un projet PHP.
Avec Symfony AI, il devient enfin possible de manipuler des modèles d’embeddings, de génération ou de classification sans quitter son écosystème habituel.

Dans ce talk, on explore concrètement l’usage des **embeddings** avec Symfony AI, à travers un exemple simple : rapprocher automatiquement des pages web par similarité.

Au programme :

* comprendre ce qu’est un embedding et comment il permet de mesurer la similarité entre textes ;
* découvrir les **plateformes et modèles** disponibles, et apprendre à choisir le bon selon vos besoins ;
* vectoriser du contenu depuis Symfony et communiquer efficacement avec votre modèle ;
* stocker et requêter les vecteurs dans différents **stores** (Redis, ClickHouse, Postgres, etc.) ;
* héberger et scaler votre “vectoriseur” (Ollama, multi-GPU, RabbitMQ…).

L’objectif : comprendre les bases réelles de l’IA sémantique appliquée au PHP, et repartir avec une méthode claire pour expérimenter, comparer et mettre en production vos propres embeddings.

Avatar for Grégoire Pineau

Grégoire Pineau

March 27, 2026
Tweet

More Decks by Grégoire Pineau

Other Decks in Technology

Transcript

  1. Embeddings : Symfony AI en pratique Rapprocher automatiquement des contenus

    par similarité, sans quitter son écosystème Grégoire Pineau @jolicode / @redirectionio Core Team @symfony 1
  2. Cas concret : Rapprocher automatiquement les pages de deux sites

    web différents. • Le point de départ ◦ Nous avons deux sites web ▪ Site A (l'ancien) ▪ Site B (le nouveau) • L'objectif ◦ Pour chaque URL du Site A ▪ Trouver la page du Site B qui lui ressemble le plus sémantiquement • Cas d'usage réels ◦ Plan de redirection SEO lors d'une refonte ◦ Fusion de plusieurs sites ◦ Détection de duplication de contenu 3
  3. Les Embeddings • Traduire une page web (texte flou) en

    un vecteur • Un vecteur est un ensemble de nombres flottants. ◦ 🤯 C’est pourquoi les GPU > CPU C'est l'empreinte digitale sémantique de la page 5
  4. Le Matching • Imaginez une carte géante en 2D. •

    On place les pages sur cette carte selon leur sujet : ◦ Les pages parlant de recettes de cuisine sont regroupées au Nord ◦ Les pages parlant de mécanique vélo sont au Sud • La proximité sur la carte == La similarité du sens. 6
  5. Notre mission technique • Prendre le Site A ◦ Transformer

    toutes ses pages en points dans l’espace vectoriel (embedding) ◦ Sauvegarder ces coordonnées • Faire de même avec B • Prendre chaques pages du Site A ◦ Demander : quel est le point du Site B le plus proche de mon point A (matching) 7
  6. La pipeline Crawl HTML <html> <body> <nav>...</nav> <article>La soupe</article> <body>

    </html> Vectorization Vector [0.2, 0.5, 0.1, 0.1, …., 0.9] Sauvegarde Store INSERT INTO …. Matching Query SELECT * FROM … 9
  7. Premier défi : préparer les donnés Les IA ont une

    limite en entrée assez basse lors de la vectorisation (500 - 2000 mots) • On ne peut pas juste jeter du HTML brut dans un modèle d'IA ◦ C'est trop bruyant / volumineux • Nous devons appliquer une préparation rigoureuse ◦ Nous devons simplifier le HTML ◦ C’est une étape crucial 11
  8. La pipeline Crawl HTML <html> <body> <nav>...</nav> <article>La soupe</article> <body>

    </html> Nettoyage Text La soupe Vectorization Vector [0.2, 0.5, 0.1, 0.1, …., 0.9] Sauvegarde Store INSERT INTO …. 12 Matching Query SELECT * FROM … 12
  9. Étape 1 : Le nettoyage agressif • Le piège du

    "Boilerplate" ◦ Si on garde les headers, footers et menus, une page "Contact" du site A va matcher la page "Mentions légales" du site B juste à cause du pied de page identique • L'objectif : Isoler le Cœur Sémantique ◦ Il faut extraire uniquement le contenu unique de la page (le corps de l'article, la description du produit) ◦ Tout le reste doit être impitoyablement supprimé avant l'IA • Outils ◦ symfony/dom-crawler ◦ symfony/css-filter 13
  10. Étape 2 : Le Chunking • Le problème : Le

    contenu peut être très long ◦ Les modèles d'embedding ont une mémoire limitée (ex: ~500-2000 mots d'un coup) • La solution : le Chunking ◦ Découper le contenu en petits segments cohérents (paragraphes) ◦ Vectoriser chaque segment ◦ Faire la moyenne mathématique de tous ces vecteurs ◦ Symfony le fait pour vous via le TextSplitTransformer 14
  11. Étape 2 : Métadonnées des chunks • C'est crucial :

    quand on découpe une page du site en N chunks, chaque chunk doit se souvenir d'où il vient ! • Pour chaque chunk, on garde ◦ Le texte du chunk ◦ L’identifiant de la page 15
  12. Étape 2 : Ou pas ! • Notre but :

    1 URL = 1 Vecteur. ◦ Nous voulons une "empreinte globale" de la page pour faire du matching 1 pour 1 ◦ On ne peut (veut) pas faire de chunk • La stratégie pragmatique : ◦ Après le nettoyage agressif, la plupart des pages sont sous la limite ▪ Demander un résumé à une IA ▪ Truncate du text ◦ On envoie donc le contenu propre entier en une seule fois ◦ On obtient un vecteur unique qui représente parfaitement la page 16
  13. Etape 3 : les boosts Il faut booster certains élément

    du HTML (title, URL, H1, H2, etc) Pour ce faire, on répète ces éléments 17
  14. La Pipeline Crawl HTML <html> <body> <nav>...</nav> <article>La soupe</article> <body>

    </html> Nettoyage Text La soupe Vectorization Vector [0.2, 0.5, 0.1, 0.1, …., 0.9] Sauvegarde Store INSERT INTO …. 18 Matching Query SELECT * FROM …
  15. symfony/ai-platform AiMlApi Albert Anthropic Azure Bedrock Cartesia Cerebras Decart DeepSeek

    DockerModelRunner ElevenLabs Failover Gemini Generic HuggingFace LmStudio Meta Mistral Ollama OpenAi OpenRouter Ovh Perplexity Replicate Scaleway TransformersPhp VertexAi Voyage 21
  16. Platform VS Model La Plateforme (Le fournisseur / Le constructeur)

    • C'est “l'entreprise” qui entraîne, héberge l'infrastructure et fournit l'API d'accès. • C'est elle que vous payez (ou qui fournit le logiciel à installer en local). • Exemples : OpenAI, Mistral AI, Google Cloud Vertex AI, Anthropic Le Modèle (Le moteur spécifique) • C'est le réseau de neurones spécifique, entraîné à une date précise, avec une capacité précise. • Une plateforme propose des dizaines de modèles différents selon le besoin (vitesse, intelligence, prix). • Exemples de modèles "Embeddings" (ceux qui nous intéressent) : text-embedding-3-small (OpenAI), mistral-embed (Mistral) 22
  17. Comment choisir sa platform ? • Commencez avec des platform

    en SaaS ◦ Free Tier quasi systématique ◦ Plus simple à mettre en place ◦ Très bon résultats ◦ Attention au coût (bien que beaucoup plus bas que pour un chat) • Il faut en bencher plusieurs pour son workload • Si les coûts sont trop élevé ou que la souveraineté est importante ◦ On héberge les modèles soit même 23
  18. Auto-héberger son API de vectorisation • Sur son laptop ◦

    Ollama : Le “docker” des LLM ◦ LM Studio : Propose une interface graphique • Pour la production ◦ Ollama ◦ llama.cpp : Outil plus bas niveau, mais plus performant • Attention, il faut un serveur/laptop avec une grosse carte graphique 24
  19. Ou trouver des models Open Source ? • Hub ollama

    : https://ollama.com/library ◦ Mais il y a peu de modèles • Hugging Face : https://huggingface.co ◦ La plateforme centrale mondiale où toute la communauté IA partage ses modèles ◦ Attention: Ollama ne peut pas faire tourner n'importe quel modèle sur Hugging Face. Il lui faut un format très précis : le GGUF (c'est un format optimisé pour tourner sur des CPU et GPU grand public). 25
  20. Comment choisir un modèle : la taille Le nombre de

    paramètres • Se mesure en milliards (ex : Mistral-7B, Llama-3.1-70B). • Corrélation directe : Plus c'est gros = Plus c'est intelligent et capable de raisonnements complexes. • Le coût : Explosion de la RAM/VRAM nécessaire pour le charger. 26 Float
  21. Comment choisir un modèle : la "précision" La qualité intrinsèque

    • Tous les modèles de même taille ne se valent pas. • Capacité à suivre des instructions, à coder, ou à éviter les hallucinations. • Conseil : Regardez les benchmarks (ou testez sur vos données !). 27
  22. Comment choisir un modèle : la quantisation • C'est la

    "compression" du modèle. • Réduire la précision mathématique des poids (ex: de 16 bits à 4 bits) pour gagner énormément de place. • La règle empirique : Mieux vaut un gros modèle quantisé (ex: 70B en Q4) qu'un petit modèle non compressé (ex: 7B en FP16). • Mots-clés à chercher : GGUF, Q4_K_M, Q5_K_S. 28
  23. Comment choisir son modèle : la solution • Il n’y

    a pas de bonne réponse • Il faut trouver le compromis entre performance et précision • A vous de bencher plein de modèles pour votre workload 29
  24. Comment choisir son modèle : la solution Ce que nous

    avons pu observer : • Gemini est très bien • Open AI est bien • Mistral est nul • En OSS, hf.co/Qwen/Qwen3-Embedding-*B-GGUF est très bien 30
  25. Compatibilité des modèles • Un modèle génère des vecteurs d’une

    taille fixe ◦ On ne choisit pas la taille ◦ Généralement entre 500 et 3000 • Deux modèles, même avec une taille de vecteur similaire, ne sont pas compatibles 31
  26. A propos de la performance • Calculer un embed est

    LENT ! • Il vaut mieux utiliser des workers et mettre tout en async (cf symfony/messenger) • Il ne faut pas hésiter à augmenter le nombre de worker, jusqu'à trouver le sweet spot Protip : En dev, il peut être utile de faire un “FakeVectorizer” 32
  27. Comment bien choisir son serveur ? • Il faut absolument

    une carte graphique (pour le moment) • Chez OVH, un serveur avec 4 GPU coûte la même chose que 4 serveur avec 1 GPU (avec GPU égale) 🙃 • Il faut bencher pour son workload 33
  28. La Pipeline Crawl HTML <html> <body> <nav>...</nav> <article>La soupe</article> <body>

    </html> Nettoyage Text La soupe Vectorization Vector [0.2, 0.5, 0.1, 0.1, …., 0.9] Sauvegarde Store INSERT INTO …. 35 Matching Query SELECT * FROM …
  29. Le Store Symfony AI à la rescousse Le composant Store

    abstrait la complexité des Store 37
  30. symfony/ai-store AzureSearch ChromaDb ClickHouse Cloudflare Elasticsearch ManticoreSearch MariaDb Meilisearch Milvus

    MongoDb Neo4j OpenSearch Pinecone Postgres Qdrant Redis Supabase SurrealDb Typesense Weaviate 38
  31. Comment choisir son store ? • Il peut y avoir

    des différences énormes de performance (×10) • Certains stores sont payants et/ou en SaaS. • Certains stores sont peut être déjà dans votre infrastructure 39
  32. Comment choisir son store : la solution Ce que nous

    avons pu observer : • Clickhouse est lent ! • MariaDb aussi • PostgreSQL avec pgvector est vraiment bien • Redis devient indispensable sur de très grosse volumétrie 40
  33. La Pipeline Crawl HTML <html> <body> <nav>...</nav> <article>La soupe</article> <body>

    </html> Nettoyage Text La soupe Vectorization Vector [0.2, 0.5, 0.1, 0.1, …., 0.9] Sauvegarde Store INSERT INTO …. 41 Matching Query SELECT * FROM …
  34. Le Store, encore lui ! Symfony AI à la rescousse

    Le composant Store abstrait la complexité des Store 43
  35. Le Score de Similarité • Une fois le vecteur généré,

    l'IA n'intervient plu. On manipule des coordonnées dans un espace à N dimensions. • Distance = Désaccord : Plus la distance entre deux points est faible, plus les pages sont proches sémantiquement. ◦ Le "Score" que renvoie le Store (Postgres, Redis, etc.) est simplement une mesure d'écart. • Le calcul de distance est déterministe. Si le matching est mauvais, c'est la qualité de l'embedding ou du nettoyage qui est en cause, pas le calcul. 45
  36. Fonctions de calcul de distance 47 Critère Euclidienne (L2) Cosinus

    (Cosine) Produit Scalaire (Inner Product) Ce qu'elle mesure La distance directe entre deux points. L'angle entre les vecteurs. La projection d'un vecteur sur l'autre. Intervalle [0, +∞[ [0, 2] (où 0 = identique) ou [-1, 1] ]-∞, +∞[ Usage courant Vision par ordinateur / Données tabulaires. Le standard NLP / Recherche sémantique. Systèmes de recommandation haute performance. Avantage Très intuitif, "mathématique pure". Ignore la longueur du texte (focus sur le sens). La plus rapide à calculer (simple somme). Inconvénient Sensible au volume de texte (vecteurs longs). Plus lourd en calcul (racines carrées). Nécessite des vecteurs normalisés en amont.
  37. La Pipeline Crawl HTML <html> <body> <nav>...</nav> <article>La soupe</article> <body>

    </html> Nettoyage Text La soupe Vectorization Vector [0.2, 0.5, 0.1, 0.1, …., 0.9] Sauvegarde Store INSERT INTO …. 49 Matching Query SELECT * FROM …
  38. 50

  39. The Godfather — director: Francis Ford Coppola. Description: "The aging

    patriarch of an organized crime dynasty transfers control of his empire to his reluctant son." 56
  40. Conclusion 1. En entrée se trouve un texte brut 2.

    Il faut le nettoyer pour simplifier son analyse 3. Puis le vectoriser, via l’option embed d’un LLM 4. On stocke ce vecteur dans un store 5. Enfin, on peut comparer les vecteurs entre eux 58
  41. Conclusion • Rien n’est compliqué • Il faut tester différentes

    platform / différents modèles • Il faut tester différents store • symfony/ai simplifie énormément le travail grâce à ses abstractions : ◦ Store ◦ Platform ◦ Il existe d’autres composants ▪ Agent ▪ Chat ▪ Mate ▪ Mcp 59