<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Chercher la source de l&#39;eau</title>
    <link>https://www.zair.top/fr/</link>
    <description>Bienvenue sur Chercher la source de l&#39;eau, un blog technologique personnel qui rassemble mes apprentissages et pratiques en informatique, science des données et intelligence artificielle. Des compétences en programmation à l&#39;analyse d&#39;algorithmes, de l&#39;analyse de données aux projets d&#39;apprentissage automatique, des connaissances techniques aux histoires de développement personnel, il y a une multitude de contenus qui vous attendent. Apprenons et grandissons ensemble, en déverrouillant les possibilités infinies du monde technologique !</description>
    <follow_challenge>
      <feedId>65268575454017536</feedId>
      <userId>72075959463733248</userId>
    </follow_challenge>
    <generator>Hugo 0.136.4 &amp; FixIt v0.3.17-036cbb41</generator>
    <language>fr</language>
    <managingEditor>blog@zair.top (Tim)</managingEditor>
    <webMaster>blog@zair.top (Tim)</webMaster>
    <copyright>本站内容采用 CC BY-NC-SA 4.0 国际许可协议。</copyright>
    <lastBuildDate>Fri, 28 Nov 2025 14:21:01 +0000</lastBuildDate>
    <atom:link href="https://www.zair.top/fr/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Mélange d&#39;Experts (MoE) : Détails des Architectures et Applications de Mixtral 8X7B, DBRX et Deepseek-v2</title>
      <link>https://www.zair.top/fr/post/mixture-of-experts/</link>
      <pubDate>Wed, 25 Dec 2024 15:44:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/mixture-of-experts/</guid>
      <category domain="https://www.zair.top/fr/categories/llm/">Llm</category>
      <description><![CDATA[<blockquote>
<p>Découvrez en profondeur l&rsquo;architecture et le fonctionnement des modèles à mélange d&rsquo;experts (MoE) et explorez les applications et avantages de modèles MoE populaires tels que Mixtral 8X7B, DBRX et Deepseek-v2. Implémentez un modèle MoE en Python et évaluez sa performance dans des tâches telles que le raisonnement logique, le résumé et l&rsquo;extraction d&rsquo;entités.</p>
</blockquote>
<p>Le concept de modèle à mélange d&rsquo;experts (MoE) fait sensation depuis un certain temps dans le domaine des grands modèles de langage (LLM). Non seulement il améliore considérablement l&rsquo;efficacité et l&rsquo;évolutivité des modèles, mais il offre aussi de nouvelles approches pour traiter des tâches complexes. En termes simples, un modèle MoE divise un large modèle en plusieurs petits modèles, chacun se concentrant sur une tâche ou un type de données spécifique. Ainsi, lors du traitement d&rsquo;une tâche, le modèle n&rsquo;active que les &ldquo;experts&rdquo; concernés, économisant ainsi considérablement les ressources informatiques.</p>
<p><strong>Dans cet article, vous allez :</strong></p>
<ul>
<li>Comprendre l&rsquo;architecture de base et le fonctionnement des modèles MoE</li>
<li>Découvrir quelques modèles MoE populaires comme Mixtral 8X7B, DBRX et Deepseek-v2</li>
<li>Implémenter un modèle MoE en Python sur Google Colab</li>
<li>Évaluer la performance d&rsquo;un modèle MoE typique dans des tâches de raisonnement logique, de résumé et d&rsquo;extraction d&rsquo;entités</li>
<li>Explorer les avantages et défis des modèles MoE dans des tâches complexes telles que le traitement du langage naturel et la génération de code</li>
</ul>
<h2 id="quest-ce-quun-modèle-à-mélange-dexperts-moe-" class="heading-element"><span>1 Qu&rsquo;est-ce qu&rsquo;un modèle à mélange d&rsquo;experts (MoE) ?</span>
  <a href="#quest-ce-quun-mod%c3%a8le-%c3%a0-m%c3%a9lange-dexperts-moe-" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les modèles d&rsquo;apprentissage profond actuels sont principalement basés sur les réseaux de neurones artificiels, composés de plusieurs couches, chacune contenant de nombreux &ldquo;neurones&rdquo;. Chaque neurone traite les données d&rsquo;entrée, effectue des calculs basiques (comme les fonctions d&rsquo;activation), puis transmet le résultat à la couche suivante. Des modèles plus avancés comme le Transformer introduisent un mécanisme d&rsquo;auto-attention capable de capturer des motifs complexes dans les données.</p>
<p>Cependant, dans les modèles denses traditionnels, l&rsquo;ensemble du réseau contribue au calcul de chaque entrée, ce qui engendre des coûts computationnels extrêmement élevés. Pour y remédier, les modèles Mixture of Experts (MoE) adoptent une <strong>architecture éparse</strong>, n&rsquo;activant que les parties du réseau pertinentes pour la tâche en cours, ou les &ldquo;experts&rdquo;. De cette manière, les modèles MoE consomment nettement moins de ressources informatiques pour traiter des tâches complexes comme le traitement du langage naturel.</p>
<p>Imaginez un projet d&rsquo;équipe où les membres sont divisés en groupes, chaque groupe se concentrant sur une tâche différente. Le fonctionnement d&rsquo;un modèle MoE est similaire. Il divise un problème complexe en plusieurs sous-tâches, chacune étant gérée par des &ldquo;experts&rdquo; dédiés.</p>
<p>Les principaux avantages des modèles MoE sont :</p>
<ul>
<li><strong>Vitesse de pré-entraînement accélérée</strong> : Par rapport aux modèles denses traditionnels, les modèles MoE sont plus efficaces lors du processus de pré-entraînement.</li>
<li><strong>Vitesse d&rsquo;inférence améliorée</strong> : Même avec un nombre de paramètres identique, un modèle MoE offre une vitesse d&rsquo;inférence plus rapide.</li>
<li><strong>Exigences élevées en VRAM</strong> : Tous les experts doivent être stockés simultanément en mémoire, d&rsquo;où une demande en VRAM relativement grande pour les modèles MoE.</li>
</ul>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif" alt="Diagramme MoE" srcset="https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif?size=small, https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif?size=medium 1.5x, https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif?size=large 2x" data-title="Diagramme MoE" class="suffix-invalid suffix-invalid__small suffix-invalid__large" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Un modèle MoE est constitué de deux composants clés : <strong>les experts</strong>, petits réseaux neuronaux se concentrant sur des tâches spécifiques, et un <strong>routeur</strong>, qui active sélectivement les experts pertinents à partir des données d&rsquo;entrée. Cette activation sélective améliore l&rsquo;efficacité en n&rsquo;utilisant que les experts nécessaires pour chaque tâche.</p>
<h2 id="quelques-modèles-moe-typiques" class="heading-element"><span>2 Quelques modèles MoE typiques</span>
  <a href="#quelques-mod%c3%a8les-moe-typiques" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Ces dernières années, les modèles MoE ont suscité un vif intérêt dans la recherche en IA en raison de leur capacité à conserver des performances élevées tout en étendant efficacement les grands modèles de langage. Parmi ceux-ci, Mixtral 8x7B est un exemple typique reposant sur l&rsquo;architecture à mélange d&rsquo;experts épars. Ce modèle active seulement un sous-ensemble de ses experts pour chaque entrée, améliorant ainsi l&rsquo;efficacité tout en réalisant des performances comparables à celles d&rsquo;un modèle dense massif.</p>
<p>Voyons quelques modèles MoE populaires et testons-les en Python sur Google Colab avec Ollama pour apprécier leur potentiel.</p>
<h3 id="mixtral-8x7b" class="heading-element"><span>2.1 Mixtral 8X7B</span>
  <a href="#mixtral-8x7b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>L&rsquo;<a href="https://huggingface.co/mistralai/Mixtral-8x7B-v0.1"target="_blank" rel="external nofollow noopener noreferrer">architecture de Mixtral 8X7B<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> repose sur un Transformer uniquement avec décodeur. Le modèle traite les entrées sous forme de séries de tokens, convertis en vecteurs puis traités via les couches de décodeur. Le résultat est une probabilité que chaque position soit remplie par un mot, permettant ainsi un remplissage et une prédiction de texte.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif" alt="Décodeur MoE" srcset="https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif?size=small, https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif?size=medium 1.5x, https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif?size=large 2x" data-title="Décodeur MoE" class="suffix-invalid suffix-invalid__small suffix-invalid__large" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Chaque couche de décodeur se compose principalement de deux parties clés : un mécanisme d&rsquo;attention pour capturer des informations contextuelles, et une section à mélange d&rsquo;experts épars (SMOE) pour traiter individuellement chaque vecteur de mot. La couche MLP constitue le principal poste de dépense en ressources informatiques. SMOE offre de nombreux &ldquo;experts&rdquo;, et pour chaque entrée, seul le résultat pondéré des experts les plus pertinents est retenu, permettant à la couche SMOE d&rsquo;apprendre des modèles complexes avec un coût de calcul réduit.</p>
<p><strong>Caractéristiques clés du modèle</strong> :</p>
<ul>
<li>Nombre total d&rsquo;experts : 8</li>
<li>Nombre d&rsquo;experts activés : 2</li>
<li>Nombre de couches de décodeur : 32</li>
<li>Taille du vocabulaire : 32000</li>
<li>Taille d&rsquo;embedding : 4096</li>
<li>Taille par expert : 5,6 milliards de paramètres, au lieu de 7 milliards. Les autres paramètres (7 milliards - 5,6 milliards) proviennent de composants partagés comme les couches d&rsquo;embedding, de normalisation et le mécanisme de porte.</li>
<li>Total des paramètres activés : 12,8 milliards</li>
<li>Longueur du contexte : 32k tokens</li>
</ul>
<p>Lors du chargement du modèle, tous les 44,8 milliards (8*5,6 milliards de paramètres) doivent être chargés (ainsi que tous les paramètres partagés), mais seuls 2×5,6 milliards (12,8 milliards) de paramètres sont nécessaires pour l&rsquo;inférence.</p>
<p>Mixtral 8x7B excelle dans de nombreux domaines tels que la génération de texte, la compréhension, la traduction, le résumé, l&rsquo;analyse de sentiment, l&rsquo;éducation, les services à la clientèle automatisés, et l&rsquo;assistance à la recherche. Son architecture efficace en fait un outil puissant pour divers champs d&rsquo;application.</p>
<h3 id="dbrx" class="heading-element"><span>2.2 DBRX</span>
  <a href="#dbrx" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Développé par Databricks, <a href="https://github.com/databricks/dbrx"target="_blank" rel="external nofollow noopener noreferrer">DBRX<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> est un modèle de langage de grande taille (LLM) basé sur un décodeur Transformer, entraîné pour prédire le prochain token. Il utilise une architecture de mélange d&rsquo;experts (MoE) à granularité fine avec un total de 132 milliards de paramètres, et 36 milliards de paramètres activés pour chaque entrée. Il a été pré-entraîné sur 12 000 milliards de données textuelles et de code. Comparé à d&rsquo;autres modèles MoE open source (comme Mixtral et Grok-1), DBRX se distingue par une granularité plus fine et l&rsquo;utilisation de plus petits experts. DBRX utilise 16 experts, en choisissant 4, contre 8 experts pour Mixtral et Grok-1, qui choisissent 2.</p>
<p><strong>Caractéristiques clés de l&rsquo;architecture</strong> :</p>
<ul>
<li><strong>Experts à granularité fine</strong> : Au lieu de simplement dupliquer les couches FFN pour créer plusieurs experts lors de la transition vers une couche MoE, l&rsquo;objectif avec des experts à granularité fine est de créer davantage d&rsquo;experts sans augmenter le nombre de paramètres. Pour ce faire, une seule couche FFN peut être divisée en multiples segments, chaque segment se comportant comme un expert distinct. DBRX adopte ce type d&rsquo;architecture MoE, avec 16 experts parmi lesquels 4 sont sélectionnés pour chaque entrée.</li>
<li>Le modèle applique aussi d&rsquo;autres innovations comme le codage de position rotatif (RoPE), les unités linéaires avec engorgement (GLU) et l&rsquo;attention de requête groupée (GQA).</li>
</ul>
<p><strong>Caractéristiques clés du modèle</strong> :</p>
<ul>
<li>Nombre total d&rsquo;experts : 16</li>
<li>Nombre d&rsquo;experts activés par couche : 4</li>
<li>Nombre de couches de décodeur : 24</li>
<li>Total des paramètres activés : 36 milliards</li>
<li>Nombre total de paramètres : 132 milliards</li>
<li>Longueur du contexte : 32k tokens</li>
</ul>
<p>Le modèle DBRX est particulièrement performant dans des cas d&rsquo;échelle tels que la génération de code, la compréhension fine du langage, le raisonnement mathématique et les tâches de programmation, notamment dans des scénarios exigeant efficacité et précision, comme la génération de snippets de code, la résolution de problèmes mathématiques, et la fourniture d&rsquo;explications détaillées pour des prompts complexes.</p>
<h3 id="deepseek-v2" class="heading-element"><span>2.3 Deepseek-v2</span>
  <a href="#deepseek-v2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Dans l&rsquo;architecture MoE de <a href="https://github.com/deepseek-ai/DeepSeek-V2"target="_blank" rel="external nofollow noopener noreferrer">Deepseek-v2<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, deux idées essentielles sont mises à profit :</p>
<ul>
<li><strong>Experts à granularité fine</strong> : Convient à une spécialisation plus avancée des experts et à un accès plus précis aux connaissances.</li>
<li><strong>Experts partagés</strong> : Cette méthode vise à désigner certains experts comme des experts partagés, garantissant leur activation continuelle. Cette stratégie aide à rassembler et à synthétiser des connaissances universelles pertinentes à travers divers contextes.</li>
</ul>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif" alt="DeepSeekMoE" srcset="https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif?size=small, https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif?size=medium 1.5x, https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif?size=large 2x" data-title="DeepSeekMoE" class="suffix-invalid suffix-invalid__small suffix-invalid__large" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p><strong>Caractéristiques clés du modèle</strong> :</p>
<ul>
<li>Nombre total de paramètres : 236 milliards</li>
<li>Total des paramètres activés : 21 milliards</li>
<li>Nombre d&rsquo;experts par couche routée : 160 (dont 2 sont choisis)</li>
<li>Nombre d&rsquo;experts partagés par couche : 2</li>
<li>Nombre d&rsquo;experts activés par couche : 8</li>
<li>Nombre de couches de décodeur : 60</li>
<li>Longueur du contexte : 128k tokens</li>
</ul>
<p>Le modèle a été pré-entraîné sur un large ensemble de données comptant 81 000 milliards de tokens.</p>
<p>DeepSeek-V2 est particulièrement adapté pour les conversations, ce qui en fait un bon choix pour les chatbots et les assistants virtuels. Le modèle peut générer du texte de haute qualité et est donc approprié pour la création de contenu, la traduction linguistique, et le résumé. Il est également bien adapté pour des cas d&rsquo;utilisation générant du code.</p>
<h2 id="implémenter-un-modèle-moe-avec-python" class="heading-element"><span>3 Implémenter un modèle MoE avec Python</span>
  <a href="#impl%c3%a9menter-un-mod%c3%a8le-moe-avec-python" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les modèles MoE représentent une avancée majeure en apprentissage machine, sélectionnant dynamiquement différents réseaux d&rsquo;experts pour traiter diverses tâches. Voici comment implémenter un modèle MoE en Python et explorer sa puissance.</p>
<h3 id="étape-1--installer-les-bibliothèques-python-nécessaires" class="heading-element"><span>3.1 Étape 1 : Installer les bibliothèques Python nécessaires</span>
  <a href="#%c3%a9tape-1--installer-les-biblioth%c3%a8ques-python-n%c3%a9cessaires" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>D&rsquo;abord, il est nécessaire d&rsquo;installer quelques bibliothèques Python essentielles :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="err">!</span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">update</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">install</span> <span class="o">-</span><span class="n">y</span> <span class="n">pciutils</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">langchain</span><span class="o">-</span><span class="n">ollama</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">curl</span> <span class="o">-</span><span class="n">fsSL</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">ollama</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">install</span><span class="o">.</span><span class="n">sh</span> <span class="o">|</span> <span class="n">sh</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">ollama</span><span class="o">==</span><span class="mf">0.4.2</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="étape-2--activer-les-threads" class="heading-element"><span>3.2 Étape 2 : Activer les threads</span>
  <a href="#%c3%a9tape-2--activer-les-threads" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Ensuite, utilisez threading pour faire fonctionner le service Ollama :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">threading</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">subprocess</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">run_ollama_serve</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">  <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s2">&#34;ollama&#34;</span><span class="p">,</span> <span class="s2">&#34;serve&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">run_ollama_serve</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="étape-3--récupérer-le-modèle-ollama" class="heading-element"><span>3.3 Étape 3 : Récupérer le modèle Ollama</span>
  <a href="#%c3%a9tape-3--r%c3%a9cup%c3%a9rer-le-mod%c3%a8le-ollama" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Récupérez un modèle Ollama, tel que DBRX :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="err">!</span><span class="n">ollama</span> <span class="n">pull</span> <span class="n">dbrx</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="étape-4--interroger-le-modèle" class="heading-element"><span>3.4 Étape 4 : Interroger le modèle</span>
  <a href="#%c3%a9tape-4--interroger-le-mod%c3%a8le" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Testez le modèle et voyez comment il se comporte :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">langchain_core.prompts</span> <span class="kn">import</span> <span class="n">ChatPromptTemplate</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">langchain_ollama.llms</span> <span class="kn">import</span> <span class="n">OllamaLLM</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="kn">import</span> <span class="n">Markdown</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">template</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34;Question: </span><span class="si">{question}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">Answer: Let&#39;s think step by step.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">prompt</span> <span class="o">=</span> <span class="n">ChatPromptTemplate</span><span class="o">.</span><span class="n">from_template</span><span class="p">(</span><span class="n">template</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">model</span> <span class="o">=</span> <span class="n">OllamaLLM</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="s2">&#34;dbrx&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">chain</span> <span class="o">=</span> <span class="n">prompt</span> <span class="o">|</span> <span class="n">model</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Préparer les données d&#39;entrée pour l&#39;appel</span>
</span></span><span class="line"><span class="cl"><span class="n">input_data</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;question&#34;</span><span class="p">:</span> <span class="s1">&#39;Résumez le contenu suivant en une seule phrase : &#34;Bob est un garçon. Bob a un chien. Bob et son chien vont se promener. Bob et son chien vont au parc. Au parc, Bob lance un bâton et son chien le rapporte. Le chien court après un écureuil et Bob le poursuit. Bob récupère son chien et ils rentrent chez eux ensemble.&#34;&#39;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Utiliser les données d&#39;entrée pour appeler la chaîne et afficher la réponse</span>
</span></span><span class="line"><span class="cl"><span class="n">response</span> <span class="o">=</span> <span class="n">chain</span><span class="o">.</span><span class="n">invoke</span><span class="p">(</span><span class="n">input_data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">display</span><span class="p">(</span><span class="n">Markdown</span><span class="p">(</span><span class="n">response</span><span class="p">))</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="performance-réelle-du-modèle-mixtral-8x7b" class="heading-element"><span>4 Performance Réelle du Modèle Mixtral 8x7B</span>
  <a href="#performance-r%c3%a9elle-du-mod%c3%a8le-mixtral-8x7b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Lors de la comparaison des sorties des différents modèles MoE, nous pouvons analyser leurs différences sur des tâches telles que le raisonnement logique, le résumé et l&rsquo;extraction d&rsquo;entités.</p>
<p><strong>Problème de Raisonnement Logique</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Donnez-moi une liste de 13 mots, chacun ayant 9 lettres.</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Sortie</strong> :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Bien sûr, voici treize mots, chacun ayant neuf lettres :
</span></span><span class="line"><span class="cl"><span class="k">1.</span> Agriculture
</span></span><span class="line"><span class="cl"><span class="k">2.</span> Beautiful
</span></span><span class="line"><span class="cl"><span class="k">3.</span> Chocolate
</span></span><span class="line"><span class="cl"><span class="k">4.</span> Dangerous
</span></span><span class="line"><span class="cl"><span class="k">5.</span> Encyclopedia
</span></span><span class="line"><span class="cl"><span class="k">6.</span> Fireplace
</span></span><span class="line"><span class="cl"><span class="k">7.</span> Grammarly
</span></span><span class="line"><span class="cl"><span class="k">8.</span> Hamburger
</span></span><span class="line"><span class="cl"><span class="k">9.</span> Important
</span></span><span class="line"><span class="cl"><span class="k">10.</span> Juxtapose
</span></span><span class="line"><span class="cl"><span class="k">11.</span> Kitchener
</span></span><span class="line"><span class="cl"><span class="k">12.</span> Landscape
</span></span><span class="line"><span class="cl"><span class="k">13.</span> Necessary
</span></span><span class="line"><span class="cl">J&#39;espère que cette liste vous aidera ! Si vous avez d&#39;autres questions ou besoin d&#39;assistance supplémentaire, n&#39;hésitez pas à demander.</span></span></code></pre></td></tr></table>
</div>
</div><p>Comme on peut le voir dans la sortie ci-dessus, tous les mots de la réponse n&rsquo;ont pas 9 lettres. Sur les 13 mots, seuls 8 ont 9 lettres. Ainsi, la réponse est partiellement correcte.</p>
<p><strong>Problème de Résumé</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Résumez le contenu suivant en une seule phrase : &#34;Bob est un garçon. Il a un chien. Bob et son chien se promènent. Bob et son chien vont au parc. Au parc, Bob jette un bâton que son chien rapporte. Le chien poursuit un écureuil, Bob le poursuit. Bob récupère son chien et ils rentrent ensemble à la maison.&#34;</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Sortie</strong> :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Le petit garçon Bob profite d&#39;une sortie animée avec son chien adoré. Ils vont ensemble au parc, jouent à rapporter la balle, poursuivent un écureuil puis rentrent ensemble à la maison.</span></span></code></pre></td></tr></table>
</div>
</div><p>La sortie ci-dessus montre que la réponse est bien résumée.</p>
<p><strong>Extraction d&rsquo;Entités</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Extrayez toutes les valeurs numériques et leurs unités correspondantes du texte : &#34;Le marathon mesure 42 kilomètres, plus de 30 000 personnes participent.&#34;</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Sortie</strong> :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">1.</span> Dans le texte donné, il y a deux valeurs numériques avec leurs unités correspondantes :
</span></span><span class="line"><span class="cl">   <span class="k">-</span> 42 (longueur du marathon, unité non mentionnée dans le texte mais plus loin, il est indiqué que c&#39;est en kilomètres)
</span></span><span class="line"><span class="cl">   <span class="k">-</span> 30,000 (nombre de participants)
</span></span><span class="line"><span class="cl"><span class="k">2.</span> Plus tard dans le texte, l&#39;unité de la longueur du marathon est fournie : kilomètres. Puisqu&#39;aucune autre unité n&#39;est spécifiée pour cette valeur, nous supposons qu&#39;elle est en kilomètres.
</span></span><span class="line"><span class="cl"><span class="k">3.</span> Ainsi, la réponse finale est :
</span></span><span class="line"><span class="cl">   <span class="k">-</span> 42 (kilomètres, longueur du marathon)
</span></span><span class="line"><span class="cl">   - 30,000 (nombre de participants)</span></span></code></pre></td></tr></table>
</div>
</div><p>La sortie ci-dessus montre que toutes les valeurs et unités ont été correctement extraites.</p>
<p><strong>Problème de Raisonnement Mathématique</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">J&#39;ai 2 pommes, puis j&#39;en achète 2 autres. J&#39;ai utilisé 2 pommes pour faire une tarte. Après avoir mangé la moitié de la tarte, combien de pommes me reste-t-il ?</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Sortie</strong> :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">1.</span> Vous commencez avec 2 pommes.
</span></span><span class="line"><span class="cl"><span class="k">2.</span> Vous en achetez 2 autres, vous avez donc 4 pommes (2 + 2 = 4).
</span></span><span class="line"><span class="cl"><span class="k">3.</span> Vous utilisez 2 pommes pour faire une tarte, vous avez donc 2 pommes restantes (4 - 2 = 2).
</span></span><span class="line"><span class="cl">4. Vous mangez la moitié de la tarte, mais comme nous ne savons pas combien de pommes il y avait dans la tarte, il est impossible de déterminer combien de pommes il reste.</span></span></code></pre></td></tr></table>
</div>
</div><p>La sortie du modèle est inexacte. La réponse correcte devrait être 2, car il reste 2 des 4 pommes après en avoir utilisé 2 pour la tarte.</p>
<h2 id="conclusion" class="heading-element"><span>5 Conclusion</span>
  <a href="#conclusion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les modèles MoE offrent une méthode d&rsquo;apprentissage profond efficace en n&rsquo;activant que les experts pertinents pour chaque tâche. Cette activation sélective permet aux modèles MoE de réaliser des opérations complexes avec moins de ressources informatiques comparé aux modèles denses traditionnels. Cependant, les modèles MoE nécessitent des compromis, car ils demandent une grande quantité de VRAM pour stocker tous les experts.</p>
<p>L&rsquo;architecture Mixtral 8X7B est un exemple typique. Elle utilise un mécanisme de mélange d&rsquo;experts épars (SMoE) qui active uniquement un sous-ensemble d&rsquo;experts pour réaliser un traitement de texte efficace, ce qui diminue considérablement le coût computationnel. Avec ses 12,8 milliards de paramètres activés et une longueur de contexte de 32k tokens, il performe bien dans diverses applications allant de la génération de texte à l&rsquo;automatisation du service client. Le modèle DBRX de Databricks se distingue également par son architecture MoE innovante à granulométrie fine, permettant d&rsquo;activer uniquement 36 milliards de paramètres lors de chaque entrée tout en utilisant un total de 1320 milliards de paramètres. De même, DeepSeek-v2 utilise des experts granulaires et partagés pour offrir une architecture puissante avec 2360 milliards de paramètres et une longueur de contexte de 128 000 tokens, ce qui le rend idéal pour des applications variées telles que les chatbots, la création de contenu et la génération de code.</p>
<h3 id="points-clés" class="heading-element"><span>5.1 Points Clés</span>
  <a href="#points-cl%c3%a9s" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Les modèles MoE améliorent l&rsquo;efficacité de l&rsquo;apprentissage profond en n&rsquo;activant que les experts pertinents pour des tâches spécifiques, réduisant l&rsquo;utilisation des ressources informatiques par rapport aux modèles denses traditionnels.</li>
<li>Bien que les modèles MoE offrent une efficacité computationnelle, ils requièrent une grande capacité de VRAM pour stocker tous les experts, soulignant un compromis clé entre la puissance de calcul et les besoins en mémoire.</li>
<li>Mixtral 8X7B adopte un mécanisme de mélange d&rsquo;experts épars (SMoE), activant un sous-ensemble des 12,8 milliards de paramètres pour un traitement de texte efficace et prise en charge d&rsquo;une longueur de contexte de 32 000 tokens, le rendant applicable à diverses applications, y compris la génération de texte et l&rsquo;automatisation du service client.</li>
<li>Le modèle DBRX de Databricks utilise une architecture de mélange d&rsquo;experts à grains fins, activant efficacement 36 milliards de paramètres à chaque entrée tout en exploitant 1320 milliards de paramètres au total, démontrant sa capacité à gérer des tâches complexes de traitement du langage.</li>
<li>DeepSeek-v2 combine une stratégie d&rsquo;experts granulaires et partagés, formant une architecture puissante avec 2360 milliards de paramètres et une longueur de contexte de 128 000 tokens, le faisant exceller dans des applications variées telles que les chatbots, la création de contenu et la génération de code.</li>
</ul>
<h2 id="questions-fréquemment-posées" class="heading-element"><span>6 Questions Fréquemment Posées</span>
  <a href="#questions-fr%c3%a9quemment-pos%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><strong>Q1. Qu&rsquo;est-ce qu&rsquo;un modèle à mélange d&rsquo;experts (MoE) ?</strong></p>
<p>A. Les modèles MoE utilisent une architecture éparse, n&rsquo;activant que les experts les plus pertinents pour chaque tâche, réduisant ainsi l&rsquo;utilisation des ressources informatiques comparé aux modèles denses traditionnels.</p>
<p><strong>Q2. Quels sont les avantages et inconvénients de l&rsquo;utilisation des modèles MoE ?</strong></p>
<p>A. Bien que les modèles MoE améliorent l&rsquo;efficacité computationnelle, ils requièrent une grande quantité de VRAM pour stocker tous les experts, nécessitant un compromis entre la puissance de calcul et les besoins en mémoire.</p>
<p><strong>Q3. Combien de paramètres activés compte le modèle Mixtral 8X7B ?</strong></p>
<p>A. Mixtral 8X7B compte 12,8 milliards (2×5,6 milliards) de paramètres activés, représentant une portion des 44,8 milliards au total (8×5,6 milliards de paramètres), le rendant capable de gérer efficacement des tâches complexes tout en offrant une inférence plus rapide.</p>
<p><strong>Q4. En quoi le modèle DBRX diffère-t-il des autres modèles MoE, tels que Mixtral et Grok-1 ?</strong></p>
<p>A. DBRX utilise une méthode de mélange d&rsquo;experts à granularité fine avec 16 experts par couche et 4 experts activés, contrairement aux autres modèles MoE avec 8 experts par couche et 2 experts activés.</p>
<p><strong>Q5. Comment DeepSeek-v2 se distingue-t-il parmi les autres modèles MoE ?</strong></p>
<p>A. DeepSeek-v2 combine des experts granulaires et partagés ainsi qu&rsquo;un ensemble de paramètres vastes et une longue longueur de contexte, en faisant un outil puissant pour une variété d&rsquo;applications.</p>
<h2 id="lectures-recommandées" class="heading-element"><span>7 Lectures Recommandées</span>
  <a href="#lectures-recommand%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://mistral.ai/news/mixtral-of-experts/"target="_blank" rel="external nofollow noopener noreferrer">Mixtral of experts | Mistral AI | Frontier AI in your hands<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://medium.com/@bnjmn_marie/deepseekmoe-moe-with-segmented-and-shared-experts-dedf22e4a98c"target="_blank" rel="external nofollow noopener noreferrer">DeepSeekMoE: MoE with Segmented and Shared Experts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://arxiv.org/abs/2401.04088"target="_blank" rel="external nofollow noopener noreferrer">Mixtral of Experts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://arxiv.org/abs/2401.04089"target="_blank" rel="external nofollow noopener noreferrer">DBRX: A Large-Scale Decoder-Only Language Model with Fine-Grained Mixture of Experts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>]]></description>
    </item>
    <item>
      <title>Une Perspective Mathématique sur les Machines à Vecteurs de Support (SVM) : Résolution de Problèmes d&#39;Optimisation</title>
      <link>https://www.zair.top/fr/post/svm/</link>
      <pubDate>Wed, 27 Nov 2024 16:53:06 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/svm/</guid>
      <category domain="https://www.zair.top/fr/categories/data-science-machine-learning/">Data-Science-Machine-Learning</category>
      <description><![CDATA[<blockquote>
<p>Les machines à vecteurs de support (SVM) sont des algorithmes classiques en apprentissage automatique. Cet article se concentre sur la déduction des formules dans les SVM, telles que le raisonnement détaillé de la formule de la distance de marge, ainsi que la formulation du problème primal et du problème dual. Il explore en profondeur les problèmes d&rsquo;optimisation, y compris la construction de la fonction lagrangienne pour traiter les problèmes d&rsquo;optimisation sous contrainte, et l&rsquo;utilisation des conditions KKT pour trouver la solution optimale. Il aborde également les caractéristiques des fonctions noyau polynomial et gaussien.</p>
</blockquote>
<h2 id="raisonnement-de-la-distance-de-marge" class="heading-element"><span>Raisonnement de la Distance de Marge</span>
  <a href="#raisonnement-de-la-distance-de-marge" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans les machines à vecteurs de support (SVM), les équations des hyperplans positif et négatif sont respectivement :
$$
\vec{w} \cdot \vec{x} + b = 1 \quad \text{(Hyperplan positif)}
$$
$$
\vec{w} \cdot \vec{x} + b = -1 \quad \text{(Hyperplan négatif)}
$$
où $\vec{w}=(w_1, w_2)$ est le vecteur de poids, $b$ est le biais, et $\vec{x}=(x_1, x_2)$ est le point de données.</p>
<p>Supposons que $\vec{x_m}$ est un point sur l&rsquo;hyperplan positif et $\vec{x_n}$ un point sur l&rsquo;hyperplan négatif, alors :
$$
w_1 x_{1m} + w_2 x_{2m} + b = 1 \quad \text{(1)}
$$
$$
w_1 x_{1n} + w_2 x_{2n} + b = -1 \quad \text{(2)}
$$</p>
<p>En soustrayant l&rsquo;équation (2) de l&rsquo;équation (1), on obtient :
$$
w_1 (x_{1m} - x_{1n}) + w_2 (x_{2m} - x_{2n}) = 2
$$
Sous forme vectorielle :
$$
\vec{w} \cdot (\vec{x_m} - \vec{x_n}) = 2 \quad \text{(3)}
$$
Considérons deux points $\vec{x_0}$ et $\vec{x_p}$ sur l&rsquo;hyperplan de décision, satisfaisant l&rsquo;équation de l&rsquo;hyperplan de décision $\vec{w} \cdot \vec{x} + b = 0$, c&rsquo;est-à-dire :
$$
w_1 x_{10} + w_2 x_{20} + b = 0
$$
$$
w_1 x_{1p} + w_2 x_{2p} + b = 0
$$
En soustrayant les deux équations, on obtient :
$$
w_1 (x_{10} - x_{1p}) + w_2 (x_{20} - x_{2p}) = 0
$$
Sous forme vectorielle :
$$
\vec{w} \cdot (\vec{x_0} - \vec{x_p}) = 0 \quad \text{(4)}
$$
L&rsquo;équation (4) montre que $\vec{w}$ est perpendiculaire à la différence vectorielle de deux points quelconques sur l&rsquo;hyperplan de décision.</p>
<p>D&rsquo;après les équations (3) et (4), on sait que le produit scalaire de $\vec{w}$ et $(\vec{x_m} - \vec{x_n})$ est égal à 2. Selon la définition du produit scalaire $\vec{a} \cdot \vec{b}=|\vec{a}| \cdot |\vec{b}| \cdot \cos \theta$, où $\theta$ est l&rsquo;angle entre $\vec{w}$ et $(\vec{x_m} - \vec{x_n})$, nous avons :
$$
|\vec{x_m} - \vec{x_n}| \cdot \cos \theta \cdot |\vec{w}| = 2
$$
En posant $L = |\vec{x_m} - \vec{x_n}| \cdot \cos \theta$, on obtient :
$$
L \cdot |\vec{w}| = 2
$$
En résolvant, on trouve :
$$
L=\frac{2}{|\vec{w}|}
$$</p>
<p>Ici, $L$ est la distance de marge du SVM.</p>
<p>Dans la déduction de la distance de marge, nous avons utilisé la signification géométrique du produit scalaire, c&rsquo;est-à-dire $\vec{a} \cdot \vec{b}=|\vec{a}| \cdot |\vec{b}| \cdot \cos \theta$, où $\theta$ est l&rsquo;angle entre les deux vecteurs. Grâce à cette relation, nous avons transformé le produit scalaire en une relation entre la norme des vecteurs et l&rsquo;angle, ce qui nous a permis de dériver l&rsquo;expression de la distance de marge.</p>
<h2 id="preuve-de-léquivalence-duale" class="heading-element"><span>Preuve de l&rsquo;Équivalence Duale</span>
  <a href="#preuve-de-l%c3%a9quivalence-duale" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans les machines à vecteurs de support (SVM) linéaires, le problème primal est de trouver le vecteur de poids $w$ et le biais $b$ qui minimisent la fonction objectif :</p>
<p>$$
\min_w f(w) = \frac{1}{2} |w|^2
$$</p>
<p>Ici, $|w|^2$ représente le carré de la norme euclidienne du vecteur $w$, c&rsquo;est-à-dire la norme $L_2$. L&rsquo;objectif est de minimiser la largeur de la marge de décision pour obtenir une meilleure capacité de généralisation. Ce problème est soumis à la contrainte suivante :</p>
<p>$$
y_j (w^T x_j + b) - 1 \geq 0
$$</p>
<p>Ici, $x_j$ est le $j$-ième échantillon d&rsquo;entraînement, et $y_j$ est l&rsquo;étiquette correspondante, prenant les valeurs +1 ou -1, ce qui garantit que tous les points de données sont correctement classifiés et sont à au moins une unité de distance de la marge de décision.</p>
<p>Pour traiter ce problème d&rsquo;optimisation sous contrainte, nous construisons la fonction lagrangienne :</p>
<p>$$
L(w, b, \alpha) = f(w) - \sum_{j = 1}^n \alpha_j g_j(w, b)
$$</p>
<p>Ici, $\alpha_j \geq 0$ sont les multiplicateurs de Lagrange, utilisés pour introduire les conditions de contrainte du problème primal $g_j(w, b) = y_j (w^T x_j + b) - 1 \geq 0$.</p>
<p>Ensuite, nous définissons la fonction duale $q(\alpha)$ comme suit :</p>
<p>$$
q(\alpha) = \min_{w, b} L(w, b, \alpha) = \min_{w, b} \left( f(w) - \sum_{j = 1}^n \alpha_j g_j(w, b) \right)
$$</p>
<p>Puisque $\alpha_j \geq 0$ et $g_j(w^{*}, b^{*}) \geq 0$, nous pouvons en déduire :</p>
<p>$$
q(\alpha) = \min_{w, b} \left( f(w) - \sum_{j = 1}^n \alpha_j g_j(w, b) \right) \leq f(w^*) - \sum_{j = 1}^n \alpha_j g_j(w^*, b^*) \leq f(w^*) \leq f(w)
$$</p>
<p>Cela signifie que la fonction duale fournit une borne inférieure du problème primal. Ensuite, nous devons trouver un $\alpha^*$ tel que :</p>
<p>$$
q(\alpha) \leq q(\alpha^*) \leq f(w^*) \leq f(w)
$$</p>
<p>Le problème primal et le problème dual des SVM peuvent être formulés comme suit :</p>
<p>$$
\max_{\alpha} q(\alpha) = \max_{\alpha} \min_{w, b} L(w, b, \alpha)
$$</p>
<p>Avec la contrainte : $ \alpha_i \geq 0 $</p>
<p>Et lorsque la dualité faible est satisfaite, nous avons $q(\alpha^*) \leq f(w^*)$ ; tandis que lorsque la dualité forte est satisfaite, c&rsquo;est-à-dire lorsque la condition de Slater est remplie, nous avons $q(\alpha^*) = f(w^*)$. La condition de Slater exige qu&rsquo;il existe une solution faisable telle que toutes les contraintes d&rsquo;inégalité soient strictement satisfaites, et le SVM linéairement séparable satisfait automatiquement la condition de Slater.</p>
<p>Ainsi, nous avons :</p>
<p>$$
f(w) \geq q(\alpha^*) = f(w^*) \geq q(\alpha_i)
$$</p>
<p>D&rsquo;après cette équation, nous pouvons obtenir :</p>
<p>$$
q(\alpha^*) \geq q(\alpha_i)
$$
$$
f(w^*) \leq f(w)
$$</p>
<p>$f(w)$ a trouvé sa valeur minimale (problème primal), $q(\alpha)$ a trouvé sa valeur maximale (problème dual), et les solutions optimales du problème primal et du problème dual sont égales, c&rsquo;est-à-dire :</p>
<p>$ w^*, b^* $ est la solution du problème primal, $\alpha^*$ est la solution du problème dual, et $f(w^*) = q(\alpha^*)$.</p>
<p>Nous pouvons voir que dans les SVM linéaires, lorsque certaines conditions (conditions de Slater) sont satisfaites, les solutions du problème primal et du problème dual sont cohérentes. Cela constitue une méthode efficace pour résoudre des problèmes d&rsquo;optimisation complexes, en particulier lorsque le problème primal est difficile à résoudre directement, on peut résoudre le problème dual pour le résoudre indirectement.</p>
<h3 id="exemple-simple" class="heading-element"><span>Exemple Simple</span>
  <a href="#exemple-simple" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Pour comprendre plus intuitivement que les solutions du problème primal et du problème dual sont les mêmes, considérons un problème d&rsquo;optimisation simple, défini comme suit :</p>
<p>Problème primal :
$$
\min_x f(x) = x^2
$$
Avec la contrainte :
$$
x - 1 \geq 0
$$</p>
<p>L&rsquo;objectif de ce problème est de minimiser la fonction $f(x) = x^2$, tout en satisfaisant $x \geq 1$. Intuitivement, nous savons que lorsque $x = 1$, $f(x) = 1$, c&rsquo;est la valeur minimale sous la contrainte donnée.</p>
<p>Pour vérifier la dualité, nous construisons la fonction lagrangienne :</p>
<p>$$
q(\alpha) = \min_x L(x, \alpha) = \min_x (x^2 - \alpha(x - 1))
$$</p>
<p>Ici, $\alpha \geq 0$ est le multiplicateur de Lagrange, utilisé pour introduire la contrainte du problème primal $x - 1 \geq 0$. En construisant la fonction lagrangienne, nous avons transformé le problème d&rsquo;optimisation sous contrainte en un problème sans contrainte.</p>
<p>Ensuite, nous dérivons $L(x, \alpha)$ par rapport à $x$ et nous l&rsquo;égalons à zéro :</p>
<p>$$
\frac{\partial L}{\partial x} = 0
2x - \alpha = 0
$$</p>
<p>En résolvant, on trouve :</p>
<p>$$
x = \frac{\alpha}{2}
$$</p>
<p>En substituant $x = \frac{\alpha}{2}$ dans $q(\alpha)$ :</p>
<p>$$
q(\alpha) = - \frac{\alpha^2}{4} + \alpha
$$</p>
<p>Nous avons maintenant obtenu la forme de la fonction duale $q(\alpha)$. Ensuite, nous devons résoudre le problème dual pour trouver le maximum $\max_{\alpha} q(\alpha) $</p>
<p>Pour cela, nous dérivons $q(\alpha)$ par rapport à $\alpha$ et nous l&rsquo;égalons à zéro :</p>
<p>$$
\frac{dq}{d\alpha} = - \frac{\alpha}{2} + 1 = 0
$$</p>
<p>En résolvant, on trouve $$ \alpha = 2 $$</p>
<p>En substituant $\alpha = 2$ dans $x = \frac{\alpha}{2}$, on obtient : $$ x = 1 $$</p>
<p>À ce moment-là, en substituant $\alpha = 2$ dans $q(\alpha)$, on calcule :</p>
<p>$$
q(\alpha) = - \frac{2^2}{4} + 2 = 1
$$</p>
<p>À travers cet exemple simple, nous pouvons voir que la solution du problème primal $x = 1$, $f(x) = 1$, est équivalente à la solution du problème dual $\alpha = 2$, $q(\alpha) = 1$. Cela vérifie que, sous certaines conditions, les solutions du problème dual et du problème primal sont cohérentes.</p>
<p>En appliquant la théorie de la dualité, nous avons non seulement trouvé la solution du problème primal, mais aussi obtenu le même résultat en résolvant le problème dual, vérifiant ainsi l&rsquo;équivalence des solutions du problème dual.</p>
<h2 id="résolution-avec-les-conditions-kkt" class="heading-element"><span>Résolution avec les Conditions KKT</span>
  <a href="#r%c3%a9solution-avec-les-conditions-kkt" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="svm-satisfait-les-conditions-kkt" class="heading-element"><span>SVM Satisfait les Conditions KKT</span>
  <a href="#svm-satisfait-les-conditions-kkt" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Le problème d&rsquo;optimisation original des SVM est un problème d&rsquo;optimisation convexe. La fonction objectif des SVM $\frac{1}{2}|w|^2$ est une fonction quadratique, qui est une <strong>fonction convexe</strong> par rapport à $w$. En même temps, la contrainte $y_i(w \cdot x_i + b) \geq 1$ est linéaire (contrainte <strong>affine</strong>), donc elle est également convexe. Dans un problème d&rsquo;optimisation convexe, une solution localement optimale est également globalement optimale, et les conditions KKT sont des conditions nécessaires et suffisantes. Cela signifie que si un point satisfait les conditions KKT, alors il est globalement optimal.</p>
<p>La fonction objectif $\frac{1}{2}|w|^2$ est continue et différentiable, et la contrainte $y_i(w \cdot x_i + b) \geq 1$ est également continue et différentiable. Cette régularité garantit l&rsquo;existence et l&rsquo;unicité du gradient, permettant ainsi l&rsquo;application efficace des conditions KKT dans lesquelles on dérive par rapport à $w$ et $b$ et on égalise à zéro.</p>
<p>Dans un problème d&rsquo;optimisation convexe, les conditions KKT ne sont pas seulement nécessaires, mais aussi suffisantes. Cela signifie que si un point satisfait les conditions KKT, alors il est nécessairement une solution globalement optimale. Pour les SVM, en résolvant les conditions KKT, nous pouvons trouver les valeurs optimales de $w^*$ et $b^*$, déterminant ainsi le meilleur hyperplan séparateur.</p>
<h3 id="utilisation-des-conditions-kkt-pour-résoudre-les-svm-linéaires" class="heading-element"><span>Utilisation des Conditions KKT pour Résoudre les SVM Linéaires</span>
  <a href="#utilisation-des-conditions-kkt-pour-r%c3%a9soudre-les-svm-lin%c3%a9aires" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Le problème d&rsquo;optimisation original des SVM est de minimiser $\frac{1}{2}|w|^{2}$ tout en satisfaisant la contrainte $y_{i}(w\cdot x_{i}+b)\geqslant1$, où $i = 1,2,\cdots,N$.</p>
<p>Tout d&rsquo;abord, construisons la fonction lagrangienne $L(w,b,\alpha)=\frac{1}{2}|w|^{2}-\sum_{i = 1}^{N}\alpha_{i}(y_{i}(w\cdot x_{i}+b)-1)$, où $\alpha_{i}\geqslant0$ sont les multiplicateurs de Lagrange. Selon les conditions KKT, nous avons :</p>
<p>$$
\nabla_{w}L(w^*,b^*,\alpha^*) = w^*-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}=0
$$</p>
<p>$$
\nabla_{b}L(w^*,b^*,\alpha^*)=-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}=0
$$</p>
<p>$$
\alpha_{i}^*(y_{i}(w^*\cdot x_{i}+b^*)-1)=0
$$</p>
<p>$$
y_{i}(w^*\cdot x_{i}+b^*)-1\geqslant0
$$</p>
<p>$$
\alpha_{i}^*\geqslant0
$$</p>
<p>Ces conditions s&rsquo;appliquent pour tous les $i = 1,2,\cdots,N$.</p>
<p>De $\nabla_{w}L(w^*,b^*,\alpha^*) = w^*-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}=0$, nous pouvons déduire</p>
<p>$$
w^*=\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i} \quad \text{(5)}
$$
Étant donné qu&rsquo;il existe au moins un $\alpha_{j}^*&gt;0$ (si nous supposons que $\alpha_{i}^*=0$, cela conduirait à une contradiction avec la solution donnée par l&rsquo;équation $\nabla_{w}L(w^*,b^*,\alpha^*) = w^*-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}=0$).</p>
<p>Pour résoudre $b^*$, nous pouvons substituer $w^*=\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}$ dans $y_{j}(w^*\cdot x_{j}+b^*)-1 = 0$ (considérant l&rsquo;existence de $\alpha_{j}^*&gt;0$), et en notant que $y_{j}^{2}=1$, nous obtenons :</p>
<p>$$
b^*=y_{j}-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}(x_{i}\cdot x_{j}) \quad \text{(6)}
$$</p>
<p>Basé sur la théorie ci-dessus, l&rsquo;hyperplan séparateur peut être exprimé comme :</p>
<p>$$
\sum_{i = 1}^{N}\alpha_{i}^*y_{i}(x\cdot x_{i})+b^*=0
$$</p>
<p>Ainsi, la fonction de décision de classification peut être écrite comme :</p>
<p>$$
f(x)=\text{sign}(\sum_{i = 1}^{N}\alpha_{i}^*y_{i}(x\cdot x_{i})+b^*)
$$</p>
<p>Dans les SVM, la condition de complémentarité $\alpha_i (y_i(w \cdot x_i + b) - 1) = 0$ indique que si un point d&rsquo;échantillon $x_i$ n&rsquo;est pas un vecteur de support (c&rsquo;est-à-dire $y_i(w \cdot x_i + b) &gt; 1$), alors le multiplicateur de Lagrange correspondant $\alpha_i$ doit être nul. Inversement, si un point d&rsquo;échantillon est un vecteur de support (c&rsquo;est-à-dire $y_i(w \cdot x_i + b) = 1$), alors $\alpha_i$ peut être non nul. Cette condition garantit que seuls les vecteurs de support contribuent à la solution du problème d&rsquo;optimisation, simplifiant ainsi le processus de résolution du problème.</p>
<h2 id="fonction-noyau-polynomial-et-noyau-gaussien" class="heading-element"><span>Fonction Noyau Polynomial et Noyau Gaussien</span>
  <a href="#fonction-noyau-polynomial-et-noyau-gaussien" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Si le problème actuel n&rsquo;est pas linéairement séparable, nous pouvons mapper les données existantes dans un espace de haute dimension, de sorte qu&rsquo;elles deviennent un problème linéairement séparable dans cet espace de haute dimension. Mais effectuer des calculs directement dans l&rsquo;espace de caractéristiques de haute dimension peut être très complexe. D&rsquo;après les équations (5) et (6), nous savons que nous n&rsquo;avons pas vraiment besoin de mapper les données dans un espace de haute dimension, tant que nous connaissons le produit scalaire entre les points de données. Le rôle de la fonction noyau est d&rsquo;éviter de réaliser explicitement le mappage vers un espace de haute dimension, en calculant la valeur de la fonction noyau dans l&rsquo;espace de caractéristiques d&rsquo;origine pour réaliser indirectement le calcul du produit scalaire dans l&rsquo;espace de caractéristiques de haute dimension.</p>
<p>La fonction noyau gaussienne est une fonction noyau courante, de la forme :
$$
K(x, y) = \exp\left(-\gamma |x - y|^2\right)
$$</p>
<p>où $\gamma$ est un paramètre positif, contrôlant la largeur de la fonction noyau.</p>
<p>Nous pouvons développer la fonction exponentielle en série de Taylor :</p>
<p>$$
\exp(z) = \sum_{k=0}^{\infty} \frac{z^k}{k!}
$$</p>
<p>En substituant $ z = -\gamma |x - y|^2 $ dans la formule ci-dessus, on obtient :</p>
<p>$$
K(x, y) = \exp\left(-\gamma |x - y|^2\right) = \sum_{k=0}^{\infty} \frac{(-\gamma |x - y|^2)^k}{k!}
$$</p>
<p>La fonction noyau polynomial est de la forme :</p>
<p>$$
K_{\text{poly}}(x, y) = (x \cdot y + c)^d
$$</p>
<p>où $ c $ est la constante et $ d $ est le degré du polynôme.</p>
<p>$|x - y|^2$ peut être développé comme suit :</p>
<p>$$
|x - y|^2 = (x - y) \cdot (x - y) = x \cdot x + y \cdot y - 2 x \cdot y
$$</p>
<p>En substituant cette expression dans la série de Taylor de la fonction noyau gaussienne :</p>
<p>$$
K(x, y) = \sum_{k=0}^{\infty} \frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^k}{k!}
$$</p>
<p>On peut voir que chaque terme $ \frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^k}{k!} $ est en fait un terme polynomial, c&rsquo;est-à-dire que chaque terme peut être exprimé comme une combinaison de puissances différentes de $ x $ et $ y $.</p>
<p>Si nous examinons attentivement chaque terme, nous pouvons constater que la fonction noyau gaussienne est en réalité obtenue en harmonisant les fonctions noyau polynomiales de différents ordres. Chaque terme $ \frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^k}{k!} $ peut être considéré comme une forme pondérée d&rsquo;une fonction noyau polynomiale d&rsquo;ordre $ k $.</p>
<p>Par exemple, lorsque $ k = 1 $ :</p>
<p>$$
\frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^1}{1!} = -\gamma (x \cdot x + y \cdot y - 2 x \cdot y)
$$</p>
<p>Lorsque $ k = 2 $ :</p>
<p>$$
\frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^2}{2!} = \frac{\gamma^2 (x \cdot x + y \cdot y - 2 x \cdot y)^2}{2}
$$</p>
<p>Ces termes sont tous sous forme polynomiale de $ x $ et $ y $, et sont pondérés par la factorielle $ k! $.</p>
<p>La fonction noyau gaussienne peut être considérée comme étant obtenue en harmonisant les fonctions noyau polynomiales de différents ordres dans un espace de dimensions infinies. Cette harmonisation permet à la fonction noyau gaussienne de capturer des relations non linéaires plus complexes dans l&rsquo;espace de caractéristiques de haute dimension. Par conséquent, dans la plupart des scénarios de tâches non linéaires, la fonction noyau gaussienne est un très bon choix.</p>]]></description>
    </item>
    <item>
      <title>Voyage à Guangzhou pour VLDB 2024</title>
      <link>https://www.zair.top/fr/post/trip-to-guangzhou-during-vldb2024/</link>
      <pubDate>Mon, 23 Sep 2024 11:02:06 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/trip-to-guangzhou-during-vldb2024/</guid>
      <category domain="https://www.zair.top/fr/categories/exp%C3%A9rience/">Expérience</category>
      <description><![CDATA[<blockquote>
<p>VLDB 2024 est une conférence internationale de premier plan dans le domaine de la gestion des données et des bases de données, couvrant des domaines tels que la gestion des données, l&rsquo;architecture des bases de données, la gestion des données graphiques, la confidentialité et la sécurité des données, l&rsquo;exploration de données, l&rsquo;apprentissage automatique, l&rsquo;intelligence artificielle et la recherche sur les systèmes de bases de données. Cette année, la conférence s&rsquo;est tenue du 26 au 30 août à Guangzhou, en Chine, réunissant des chercheurs et des entreprises du monde entier. Le programme était riche, avec plus de 250 présentations de recherche, 11 discours principaux, plusieurs tutoriels et ateliers, offrant aux participants de nombreuses opportunités d&rsquo;apprentissage et d&rsquo;échange.</p>
</blockquote>
<p>Je suis récemment allé à Guangzhou pour participer à VLDB 2024 et j&rsquo;ai vécu l&rsquo;intégralité du processus de la conférence académique. J&rsquo;ai également rencontré de nombreuses choses intéressantes pendant le voyage, et j&rsquo;ai pensé écrire un blog pour partager mon expérience.
<div class="details admonition note open">
  <div class="details-summary admonition-title"><i class="icon fa-fw fa-solid fa-pencil-alt" aria-hidden="true"></i>Remarque<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i></div>
  <div class="details-content">
    <div class="admonition-content">Cet article est un <strong>partage orienté voyage</strong>, contenant des observations sur Guangzhou et une introduction au processus de la conférence académique, sans inclure de détails sur le contenu et les orientations spécifiques des rapports. Vous pouvez le lire en toute tranquillité.</div>
  </div>
</div></p>
<p>Le voyage a duré 6 jours, avec le programme suivant. Les 5 premiers jours se sont déroulés près du centre d&rsquo;exposition de la foire de Canton sur l&rsquo;île de Pazhou, principalement pour assister à la conférence et à la croisière nocturne sur la rivière des Perles ; le dernier jour était consacré à un tourisme éclair, partant de l&rsquo;île de Shamian à l&rsquo;ouest, passant par le musée des Treize Hongs, jusqu&rsquo;à la cathédrale du Sacré-Cœur, et à l&rsquo;est, le mémorial de l&rsquo;académie militaire de Huangpu.
<div class="mapbox" data-options="{&#34;darkStyle&#34;:&#34;mapbox://styles/mapbox/dark-v10?optimize=true&#34;,&#34;fullscreen&#34;:true,&#34;geolocate&#34;:true,&#34;lat&#34;:23.10001,&#34;lightStyle&#34;:&#34;mapbox://styles/mapbox/streets-zh-v1&#34;,&#34;lng&#34;:113.35466,&#34;marked&#34;:true,&#34;markers&#34;:&#34;[{\&#34;lng\&#34;: 113.23979, \&#34;lat\&#34;: 23.10946, \&#34;description\&#34;: \&#34;Île de Shamian\&#34;},{\&#34;lng\&#34;: 113.24564, \&#34;lat\&#34;: 23.11157, \&#34;description\&#34;: \&#34;Musée des Treize Hongs\&#34;},{\&#34;lng\&#34;: 113.254735,\&#34;lat\&#34;: 23.11735, \&#34;description\&#34;: \&#34;Cathédrale du Sacré-Cœur\&#34;},{\&#34;lng\&#34;: 113.317919,\&#34;lat\&#34;: 23.111565, \&#34;description\&#34;: \&#34;Croisière nocturne sur la rivière des Perles\&#34;},{\&#34;lng\&#34;: 113.419044,\&#34;lat\&#34;: 23.08878, \&#34;description\&#34;: \&#34;Académie militaire de Huangpu\&#34;}]&#34;,&#34;navigation&#34;:true,&#34;scale&#34;:true,&#34;zoom&#34;:11}" style="width: 100%; height: 20rem;"></div></p>
<h2 id="jour-0--un-petit-choc-à-guangzhou-pour-les-citadins" class="heading-element"><span>Jour 0 : Un petit choc à Guangzhou pour les citadins</span>
  <a href="#jour-0--un-petit-choc-%c3%a0-guangzhou-pour-les-citadins" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>À 15h, je suis arrivé à la station de métro de Pazhou depuis la gare du sud de Guangzhou. Avant même de sortir de la station, j&rsquo;ai réalisé que quelque chose n&rsquo;allait pas : le métro était rempli de cosplayers. Par un malheureux hasard, la carte m&rsquo;a dirigé vers la sortie du Poly World Trade Center, ce qui m&rsquo;a plongé au cœur d&rsquo;un rassemblement de passionnés de culture anime : de la sortie de métro au sous-sol du centre, du Poly World Trade Center au centre d&rsquo;exposition de la foire de Canton, l&rsquo;île de Pazhou était envahie par les fans d&rsquo;anime ! Non seulement ils étaient nombreux, mais les personnages cosplayés étaient très variés, allant des jeux chinois aux animes japonais, de personnages historiques à des figures politiques&hellip; Le parking était également rempli de voitures décorées, presque aucune voiture électrique, les propriétaires étant probablement aussi de fervents amateurs d&rsquo;anime.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp" alt="Voitures décorées dans le parking" srcset="https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp?size=small, https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp?size=large 2x" data-title="Voitures décorées dans le parking" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Après avoir enfin réussi à me frayer un chemin jusqu&rsquo;à l&rsquo;hôtel, j&rsquo;ai découvert à 21h, en allant dîner, que le salon n&rsquo;était pas encore terminé et qu&rsquo;une scène nocturne avait même été installée le long de la rivière - et le lendemain était un lundi ! L&rsquo;atmosphère de la culture anime à Guangzhou est vraiment très forte.</p>
<h2 id="jour-1--les-sauterelles-académiques-et-le-quiproquo-du-dîner" class="heading-element"><span>Jour 1 : Les sauterelles académiques et le quiproquo du dîner</span>
  <a href="#jour-1--les-sauterelles-acad%c3%a9miques-et-le-quiproquo-du-d%c3%aener" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>VLDB2024 a été organisé par l&rsquo;Université des Sciences et Technologies de Hong Kong (Guangzhou) à l&rsquo;hôtel Langham de Guangzhou. Le premier jour, l&rsquo;enregistrement a commencé à 8h du matin. Étant très excité pour ma première participation à une conférence académique, je suis arrivé très tôt. Lors de l&rsquo;enregistrement, on vous remet un badge, un manuel de la conférence, un programme, des tickets repas, un billet de bateau, une boîte de souvenirs et une pile de publicités de sponsors. Les souvenirs incluent un carnet relié, un stylo à bille et un parapluie, disponibles en deux couleurs : noir et bleu.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp" alt="Lieu d&rsquo;enregistrement" srcset="https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp?size=small, https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp?size=large 2x" data-title="Lieu d&rsquo;enregistrement" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Le contenu de la première journée de la conférence était entièrement organisé sous forme d&rsquo;ateliers. Plusieurs ateliers sur différents thèmes se déroulaient simultanément, il fallait donc choisir à l&rsquo;avance les thèmes qui vous intéressaient. J&rsquo;ai choisi des thèmes liés aux LLM, Knowledge Graph et Vector Database. Comprendre le contenu des présentations n&rsquo;était pas trop difficile, mais lors des discussions, certains intervenants se sont emballés, accélérant leur discours, ce qui m&rsquo;a fait perdre le fil. Mon écoute et mon expression en anglais nécessitent encore du travail.</p>
<div class="details admonition info">
  <div class="details-summary admonition-title"><i class="icon fa-fw fa-solid fa-circle-info" aria-hidden="true"></i>Quels sont les éléments d&rsquo;une conférence académique ?<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i></div>
  <div class="details-content">
    <div class="admonition-content"><h3 id="1-cérémonie-douverture-opening-ceremony" class="heading-element"><span>1. <strong>Cérémonie d&rsquo;ouverture (Opening Ceremony)</strong></span>
  <a href="#1-c%c3%a9r%c3%a9monie-douverture-opening-ceremony" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Le lancement officiel de la conférence.</li>
<li>Discours des responsables de l&rsquo;organisation, présentation du thème de la conférence, du programme et des invités importants.</li>
<li>Parfois, il y a aussi des cérémonies de bienvenue ou des démonstrations culturelles spéciales.</li>
</ul>
<h3 id="2-discours-principal-keynote-speech" class="heading-element"><span>2. <strong>Discours principal (Keynote Speech)</strong></span>
  <a href="#2-discours-principal-keynote-speech" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Présentation par un universitaire ou un expert renommé dans un domaine, généralement autour du thème de la conférence.</li>
<li>Les discours principaux sont souvent inspirants et offrent des perspectives avant-gardistes ou récapitulatives.</li>
<li>C&rsquo;est un moment très attendu de la conférence, généralement plus long (45 minutes à 1 heure).</li>
</ul>
<h3 id="3-sessions-parallèles-parallel-sessions" class="heading-element"><span>3. <strong>Sessions parallèles (Parallel Sessions)</strong></span>
  <a href="#3-sessions-parall%c3%a8les-parallel-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Les participants sont regroupés par domaine de recherche ou thème, dans plusieurs salles simultanément.</li>
<li>Chaque groupe présente plusieurs rapports, les chercheurs exposent leurs résultats de recherche.</li>
<li>Après chaque rapport, il y a une courte session de questions pour permettre aux auditeurs de poser des questions et de discuter.</li>
</ul>
<h3 id="4-session-de-posters-poster-session" class="heading-element"><span>4. <strong>Session de posters (Poster Session)</strong></span>
  <a href="#4-session-de-posters-poster-session" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Les chercheurs présentent leurs résultats de recherche à travers des posters, généralement dans une zone d&rsquo;exposition ou pendant les pauses.</li>
<li>Les participants peuvent visiter librement les stands de posters, interagir avec les chercheurs et discuter.</li>
<li>Les sessions de posters sont idéales pour présenter des projets de recherche novateurs ou en cours de développement.</li>
</ul>
<h3 id="5-table-ronde-panel-discussion" class="heading-element"><span>5. <strong>Table ronde (Panel Discussion)</strong></span>
  <a href="#5-table-ronde-panel-discussion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Un groupe de discussion composé de plusieurs experts débat sur un sujet spécifique.</li>
<li>Chaque expert exprime d&rsquo;abord son point de vue, puis le modérateur guide l&rsquo;interaction et la discussion, avant d&rsquo;ouvrir aux questions du public.</li>
<li>Les tables rondes permettent d&rsquo;approfondir un problème de recherche ou un sujet d&rsquo;actualité dans un domaine académique sous plusieurs angles.</li>
</ul>
<h3 id="6-discussion-en-table-ronde-roundtable-discussion" class="heading-element"><span>6. <strong>Discussion en table ronde (Roundtable Discussion)</strong></span>
  <a href="#6-discussion-en-table-ronde-roundtable-discussion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Les participants discutent librement autour d&rsquo;un thème sous forme de table ronde.</li>
<li>Les discussions en table ronde sont plus interactives, les participants peuvent intervenir à tout moment, poser des questions et partager leurs points de vue.</li>
</ul>
<h3 id="7-atelier-workshop" class="heading-element"><span>7. <strong>Atelier (Workshop)</strong></span>
  <a href="#7-atelier-workshop" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Un moment axé sur la pratique et l&rsquo;apprentissage interactif, où les participants apprennent de nouvelles compétences, méthodes ou outils.</li>
<li>Les ateliers nécessitent généralement une inscription préalable et parfois les participants doivent apporter leurs propres données ou matériaux.</li>
</ul>
<h3 id="8-activités-de-réseautage-networking-sessions" class="heading-element"><span>8. <strong>Activités de réseautage (Networking Sessions)</strong></span>
  <a href="#8-activit%c3%a9s-de-r%c3%a9seautage-networking-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Des moments de socialisation dans la conférence, visant à offrir aux participants un environnement détendu pour des échanges informels et établir des collaborations.</li>
<li>Les activités de réseautage peuvent inclure des dîners, des pauses-café, des déjeuners, des réceptions, etc.</li>
</ul>
<h3 id="9-cérémonie-de-clôture-closing-ceremony" class="heading-element"><span>9. <strong>Cérémonie de clôture (Closing Ceremony)</strong></span>
  <a href="#9-c%c3%a9r%c3%a9monie-de-cl%c3%b4ture-closing-ceremony" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>La conclusion et la clôture de la conférence.</li>
<li>Les organisateurs récapitulent le contenu principal et les résultats de la conférence, et peuvent récompenser les meilleurs rapports, articles ou résultats de recherche.</li>
<li>On annonce généralement les dates et le lieu de la prochaine conférence.</li>
</ul>
<h3 id="10-session-de-questions-réponses-qa-sessions" class="heading-element"><span>10. <strong>Session de questions-réponses (Q&amp;A Sessions)</strong></span>
  <a href="#10-session-de-questions-r%c3%a9ponses-qa-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Après chaque rapport ou discussion thématique, les auditeurs peuvent poser des questions.</li>
<li>Les chercheurs ou intervenants répondent en détail aux questions posées, favorisant un échange bidirectionnel.</li>
</ul>
<h3 id="11-groupes-de-discussion-breakout-sessions" class="heading-element"><span>11. <strong>Groupes de discussion (Breakout Sessions)</strong></span>
  <a href="#11-groupes-de-discussion-breakout-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Dans les grandes conférences, pour discuter de sous-thèmes ou de directions de recherche spécifiques, les participants sont souvent divisés en petits groupes.</li>
<li>Chaque groupe se concentre sur un thème spécifique, puis peut présenter les résultats ou suggestions de la discussion.</li>
</ul>
<h3 id="12-zone-dexposition-exhibition-booths" class="heading-element"><span>12. <strong>Zone d&rsquo;exposition (Exhibition Booths)</strong></span>
  <a href="#12-zone-dexposition-exhibition-booths" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Dans certaines conférences académiques, notamment dans les domaines technologiques ou appliqués, il y a souvent une zone d&rsquo;exposition.</li>
<li>Des institutions, éditeurs, entreprises présentent leurs produits, technologies, services ou publications, et les participants peuvent visiter librement.</li>
</ul>
<h3 id="13-récompenses-et-reconnaissances-awards-and-recognition" class="heading-element"><span>13. <strong>Récompenses et reconnaissances (Awards and Recognition)</strong></span>
  <a href="#13-r%c3%a9compenses-et-reconnaissances-awards-and-recognition" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Certaines conférences incluent des récompenses pour les articles, rapports ou résultats de recherche.</li>
<li>Les chercheurs, articles, présentations ou posters exceptionnels peuvent être récompensés lors de la cérémonie de clôture ou d&rsquo;une cérémonie de remise de prix.</li>
</ul>
<h3 id="14-pauses-café-et-déjeuners-coffee-breaks-and-lunches" class="heading-element"><span>14. <strong>Pauses-café et déjeuners (Coffee Breaks and Lunches)</strong></span>
  <a href="#14-pauses-caf%c3%a9-et-d%c3%a9jeuners-coffee-breaks-and-lunches" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Des moments de pause pendant la conférence, avec des rafraîchissements ou des déjeuners.</li>
<li>Les pauses-café et les déjeuners sont aussi des occasions importantes pour les participants de se rencontrer et de socialiser de manière informelle.</li>
</ul>
</div>
  </div>
</div>
<p>Les pauses-café ont lieu à 10h et 15h, et le petit-déjeuner à 8h est également sous forme de pause-café. Pour les grands chercheurs, les pauses-café sont des moments propices pour socialiser, discuter de recherches ou échanger des contacts. Mais pour moi, simple participant, les pauses-café sont vraiment juste des pauses. Bien que les aliments varient à chaque pause, ils se composent généralement de biscuits, de pain, de gâteaux, de fruits et de boissons. Parmi eux, le gâteau mousse et le gâteau de poisson thaïlandais avec sauce sucrée et épicée sont mes préférés.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp" alt="Pause-café" srcset="https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp?size=small, https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp?size=large 2x" data-title="Pause-café" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Le dîner de bienvenue était également très copieux, sous forme de buffet. Cependant, il y avait tellement de monde dans la file d&rsquo;attente que je n&rsquo;ai pas fait attention aux plats disponibles, et j&rsquo;ai pris deux cuillères de riz en premier, manquant ainsi de nombreux bons plats. Les plats comprenaient environ 30% de cuisine chinoise, le reste étant des plats japonais (sushi et sashimi), curry, salades de légumes, desserts, fruits et boissons (vin rouge et jus de fruits), répondant aux différentes préférences alimentaires. Cependant, parmi ces plats, la cuisine chinoise était plutôt ordinaire, ce qui m&rsquo;a conduit à finir avec du riz au curry et des petits gâteaux. Hélas, il m&rsquo;est difficile de renoncer aux petits gâteaux.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp" alt="Scène du dîner" srcset="https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp?size=small, https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp?size=large 2x" data-title="Scène du dîner" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Pendant le dîner, il y a eu un quiproquo. J&rsquo;étais venu à cette conférence avec un autre étudiant, et nous n&rsquo;avions jamais rencontré notre directeur. Après avoir choisi nos plats et trouvé une table, nous avons commencé à écouter les discussions des autres à notre table. Et nous avons eu le dialogue suivant : &ldquo;Ne trouves-tu pas que celui en face ressemble à notre directeur ?&rdquo; &ldquo;Impossible, quelle coïncidence ?&rdquo; &ldquo;Le domaine de recherche correspond, ils ont dit&hellip;&rdquo; &ldquo;L&rsquo;âge ne correspond pas&hellip;&rdquo; &ldquo;Le nombre de personnes correspond aussi&hellip;&rdquo; &ldquo;La taille correspond aussi&hellip;&rdquo; &ldquo;C&rsquo;est trop ressemblant&hellip;&rdquo; &ldquo;C&rsquo;est carrément lui&hellip;&rdquo; &ldquo;Que faire, on se présente maintenant ?&rdquo; &ldquo;À ce stade, mangeons d&rsquo;abord.&rdquo; Nous avons donc terminé notre repas très nerveusement, et après nous être présentés, nous avons découvert que ce n&rsquo;était pas lui. Ils étaient doctorants de l&rsquo;Université de Tianjin et de l&rsquo;Université normale de Chine de l&rsquo;Est, avec des domaines de recherche similaires. Après nous être présentés, nous avons échangé nos contacts. Plus tard, nous avons découvert que leurs articles étaient nominés pour le meilleur article de recherche, ce qui nous a rendus très envieux.</p>
<h2 id="jour-2--lion-dansant-ouverture-" class="heading-element"><span>Jour 2 : Lion dansant, ouverture !</span>
  <a href="#jour-2--lion-dansant-ouverture-" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Lors de la cérémonie d&rsquo;ouverture, ce qui m&rsquo;a le plus marqué, c&rsquo;est la performance de lion dansant de Shapeng à Guangzhou. Au début de la performance, les danseurs manipulaient le lion pour imiter des mouvements réalistes, reproduisant les habitudes de vie du lion, comme secouer la tête, se gratter, rouler, etc. Le plus remarquable était que les yeux du lion bougeaient (c&rsquo;est ce qui m&rsquo;a permis de reconnaître que c&rsquo;était un lion dansant de Shapeng). Ensuite, le lion a commencé à sauter et à marcher sur des poteaux sur scène, démontrant les compétences précises et la force physique des danseurs. Enfin, les dirigeants sont montés sur scène pour peindre les yeux du lion, et le lion a sorti une banderole de félicitations. Toute la performance, accompagnée du rythme des tambours et des gongs, montrait un lion tantôt puissant, tantôt agile, à la fois plein de force et de charme.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp" alt="Performance de lion dansant lors de la cérémonie d&rsquo;ouverture" srcset="https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp?size=small, https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp?size=large 2x" data-title="Performance de lion dansant lors de la cérémonie d&rsquo;ouverture" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>C&rsquo;était la première fois que je voyais une véritable performance de lion dansant, et c&rsquo;était le lion dansant cantonnais le plus caractéristique. Bien que de nombreux jeux incluent des scènes inspirées du lion dansant cantonnais, en particulier le mouvement emblématique de marcher sur des poteaux, ces scènes se concentrent souvent sur l&rsquo;ambiance de la performance, manquant de l&rsquo;humour des mouvements imitatifs du lion, et la force ressentie n&rsquo;est pas aussi intense que lors d&rsquo;une performance en direct.</p>
<p>Après la performance de lion dansant, le président de la conférence, le professeur Chen Lei de l&rsquo;Université des Sciences et Technologies de Hong Kong, a présenté quelques informations générales sur la conférence : c&rsquo;était la conférence VLDB avec le plus grand nombre de participants de son histoire, avec 60% des participants venant de Chine continentale, c&rsquo;était la conférence la plus riche (half a million dollar), avec le plus grand nombre d&rsquo;articles sur l&rsquo;IA et le moins d&rsquo;articles sur la conception de bases de données.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp" alt="Sessions parallèles" srcset="https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp?size=small, https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp?size=large 2x" data-title="Sessions parallèles" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Après la cérémonie d&rsquo;ouverture, une journée entière de sessions parallèles a commencé. Les sessions parallèles nécessitent également de choisir à l&rsquo;avance les thèmes qui vous intéressent, et il est préférable de lire les articles qui vous intéressent à l&rsquo;avance, voire de préparer des questions à poser. Le dîner était aussi copieux que la veille, la soupe épaisse aux légumes italiens et le mille-feuille étaient excellents ! (Seul) Ce jour-là, il y avait aussi des brochettes, avec des ailes de poulet et du gluten. Après le repas, en faisant le tour, j&rsquo;ai remarqué que toutes les tables avec des Chinois avaient pris des brochettes, et certains mangeaient même du riz blanc avec des brochettes, montrant que tout le monde avait encore un goût chinois. <del>Les barbecues pour informaticiens ont de l&rsquo;avenir.</del></p>
<h2 id="jour-3--du-sommet-de-la-cuisine-cantonaise-au-pont" class="heading-element"><span>Jour 3 : Du sommet de la cuisine cantonaise au pont</span>
  <a href="#jour-3--du-sommet-de-la-cuisine-cantonaise-au-pont" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>La matinée a commencé par un discours principal de Google, sur l&rsquo;impact des grands modèles sur la recherche en bases de données. Ensuite, les sessions parallèles ont continué comme la veille.</p>
<h3 id="cuisine-cantonaise-raffinée" class="heading-element"><span>Cuisine cantonaise raffinée</span>
  <a href="#cuisine-cantonaise-raffin%c3%a9e" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp" alt="Entrée chez Bing Sheng" srcset="https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp?size=small, https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp?size=large 2x" data-title="Entrée chez Bing Sheng" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Le dîner du soir s&rsquo;est déroulé au <a href="http://www.bingsheng.com/intro/11.html"target="_blank" rel="external nofollow noopener noreferrer">restaurant Bing Sheng Pinwei Haizhu<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>. Sur le chemin, j&rsquo;ai rencontré deux étudiants étudiant aux États-Unis, qui ont dit que pour une conférence organisée par des Chinois, il fallait en mettre plein la vue. Ce n&rsquo;était pas faux, j&rsquo;ai découvert plus tard que ce restaurant était à la fois étoilé Michelin et considéré comme le sommet de la cuisine cantonaise. L&rsquo;un d&rsquo;eux, vivant sur la côte ouest des États-Unis, a décrit sa vie comme étant dans un village, sans rien à manger ni à faire ; l&rsquo;autre, sur la côte est, a également mentionné que les conditions alimentaires n&rsquo;étaient pas idéales, mais qu&rsquo;il pouvait pratiquer différents sports tous les jours. En parlant des objectifs de leurs études supérieures, l&rsquo;un d&rsquo;eux a dit que c&rsquo;était pour maintenir une capacité d&rsquo;insight et une mentalité d&rsquo;apprentissage tout au long de la vie, ce avec quoi je suis tout à fait d&rsquo;accord.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp" alt="Dîner chez Bing Sheng" srcset="https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp?size=small, https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp?size=large 2x" data-title="Dîner chez Bing Sheng" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Le dîner était en effet très varié. Comme il n&rsquo;était pas pratique d&rsquo;utiliser un téléphone à table, je ne peux me souvenir que de quelques plats marquants : soupe de côtes au ginseng, cochon de lait rôti entier (mais avec des ampoules rouges dans les yeux, en tant qu&rsquo;étranger, je l&rsquo;appellerais cochon de lait rôti démoniaque), homard de Boston à la vapeur à l&rsquo;ail, gros concombre de mer, poisson, poulet et canard, porc aigre-doux, eau sucrée, tomates et melon, gâteau de riz soufflé et thé Pu&rsquo;er. Dans l&rsquo;ensemble, c&rsquo;était plutôt bon, le cochon de lait rôti était croustillant et tendre, le porc aigre-doux était savoureux, et les ingrédients choisis étaient très typiques de Lingnan. Cependant, peut-être parce que je n&rsquo;y suis pas habitué, certains plats caractéristiques de la cuisine cantonaise étaient les plus difficiles à manger : l&rsquo;eau sucrée était vraiment trop sucrée, le ginseng dans la soupe était acide, et un dessert ressemblait à une pâte de gâteau de lune enveloppant une farce crue de céleri et de porc, ce qui était vraiment difficile à accepter. Curieusement, le restaurant ne fournissait pas de couteaux et de fourchettes par défaut, et certains étrangers étaient obligés d&rsquo;utiliser des baguettes, mais cela ne semblait pas poser de problème.</p>
<p>À notre table, il y avait un chercheur d&rsquo;Amazon et un professeur assistant d&rsquo;une université américaine. Le chercheur d&rsquo;Amazon a dit des choses inappropriées pour les étudiants du point de vue de l&rsquo;industrie, devant mon directeur. Le professeur assistant a parlé de l&rsquo;atmosphère détendue dans les universités américaines, où on peut obtenir un poste permanent en suivant son propre rythme de travail. La soupe de côtes a peut-être été acidifiée par le ginseng à ce moment-là.</p>
<p>Après le repas, tout le monde s&rsquo;est rendu à pied au quai pour participer à une croisière nocturne sur la rivière des Perles. En chemin, j&rsquo;ai rencontré un étudiant en première année de doctorat à l&rsquo;Université de Nagoya, qui a fait l&rsquo;éloge de la vie doctorale au Japon, y compris la liberté laissée par les directeurs, les allocations élevées, le marché de l&rsquo;emploi favorable aux vendeurs et l&rsquo;environnement culturel. Faire un doctorat peut être aussi agréable ?</p>
<h3 id="croisière-nocturne-sur-la-rivière-des-perles" class="heading-element"><span>Croisière nocturne sur la rivière des Perles</span>
  <a href="#croisi%c3%a8re-nocturne-sur-la-rivi%c3%a8re-des-perles" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp" alt="Notre bateau vu depuis un autre bateau" srcset="https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp?size=small, https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp?size=large 2x" data-title="Notre bateau vu depuis un autre bateau" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>À la tombée de la nuit, les lumières des deux rives de la rivière des Perles s&rsquo;illuminent. Nous montons à bord du bateau, naviguant lentement dans la nuit scintillante. Les gratte-ciels des deux rives brillent de mille feux, se reflétant sur l&rsquo;eau ondulante, comme des étoiles tombées dans les vagues.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp" alt="Vue extérieure de la croisière nocturne sur la rivière des Perles" srcset="https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp?size=small, https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp?size=large 2x" data-title="Vue extérieure de la croisière nocturne sur la rivière des Perles" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>En passant devant des bâtiments emblématiques, la tour de Canton se dresse majestueusement, ses lumières changeantes créant une atmosphère onirique. Le quartier des affaires de Zhujiang New Town, avec ses gratte-ciels, dessine la ligne d&rsquo;horizon d&rsquo;une métropole moderne. En passant sous le pont de Haizhu, la circulation sur le pont est dense, tandis que les bateaux naviguent en dessous, créant une scène animée.</p>
<p>La brise caresse le visage, l&rsquo;eau clapote doucement contre la coque. Sous le pont, des musiques folkloriques ajoutent une touche de détente à cette nuit. Les touristes s&rsquo;appuient à la rambarde pour admirer la vue, ou lèvent leurs verres pour discuter, envoûtés par cette nuit enchanteresse.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp" alt="Vue intérieure de la croisière nocturne sur la rivière des Perles" srcset="https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp?size=small, https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp?size=large 2x" data-title="Vue intérieure de la croisière nocturne sur la rivière des Perles" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Les deux heures de croisière passent en un clin d&rsquo;œil. En repensant à tout le voyage, la métropole animée et l&rsquo;histoire ancienne se fondent parfaitement sur cette rivière mère, laissant une impression inoubliable.</p>
<h3 id="nouvelle-forme-de-rencontre" class="heading-element"><span>Nouvelle forme de rencontre</span>
  <a href="#nouvelle-forme-de-rencontre" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Mon camarade et moi étions à l&rsquo;avant du bateau au troisième étage pour admirer le paysage, lorsqu&rsquo;un étranger est arrivé. Il portait un sac à dos, transpirait abondamment et semblait pressé. Il nous a demandé s&rsquo;il y avait du Wi-Fi sur le bateau et si nous connaissions le mot de passe, car il voulait contacter sa famille. Nous avons découvert qu&rsquo;il n&rsquo;y en avait pas, alors nous lui avons proposé de partager notre connexion. Une fois connecté, nous avons pensé que, puisque les applications de réseaux sociaux étrangères sont presque toutes bloquées, cet homme pourrait avoir cherché du Wi-Fi à Guangzhou sans succès. En se mettant à sa place : être dans un pays lointain et mystérieux, chaque Wi-Fi étant bloqué, sans contact avec sa famille pendant trois jours, demander à d&rsquo;autres de partager leur connexion mais personne ne veut &ldquo;partager&rdquo; - c&rsquo;est vraiment triste. Nous avons donc essayé de partager notre VPN via le réseau local, mais cela s&rsquo;est avéré impossible sur un téléphone.</p>
<p>Cependant, nous avons rapidement découvert que cet homme était très sociable. Tout au long du voyage, il a posé des questions : &ldquo;Que signifie ICBC ? Que signifie &lsquo;Liede&rsquo; ? D&rsquo;où venez-vous ? Quel est ce logo ?&rdquo; &hellip; et a insisté pour prendre des photos avec nous.</p>
<p>Ainsi, nous avons discuté tout au long du voyage, ajoutant une touche différente à cette croisière nocturne.</p>
<p>Plus tard, sur Whova, nous avons découvert que cet homme était classé deuxième en termes d&rsquo;activité, travaillait dans une université allemande et avait même une entreprise - cela ne ressemblait pas du tout à quelqu&rsquo;un qui aurait perdu contact avec sa famille et aurait besoin de chercher du Wi-Fi partout.</p>
<h2 id="jour-4--collecte-de-goodies" class="heading-element"><span>Jour 4 : Collecte de goodies</span>
  <a href="#jour-4--collecte-de-goodies" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Pendant VLDB2024, des stands de sponsors tels que Google, Meta, Alibaba et ByteDance étaient présents. Sur ces stands, vous pouviez remplir des questionnaires d&rsquo;enquête et recevoir des goodies. Les questionnaires portaient principalement sur les domaines de recherche et les préférences de carrière, certains demandaient directement des cartes de visite. Parmi tous les goodies, j&rsquo;ai préféré la chemise blanche de Google et le pingouin sur la photo ci-dessous. <del>Si vous ne savez pas de quelle entreprise vient ce pingouin, lorsque vous verrez l&rsquo;autocollant anti-contrefaçon dessus, vous saurez qu&rsquo;il est de Tencent.</del></p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp" alt="Goodie pingouin de Tencent" srcset="https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp?size=small, https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp?size=large 2x" data-title="Goodie pingouin de Tencent" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Les présentations de l&rsquo;après-midi m&rsquo;ont beaucoup inspiré. Certains travaux semblent simples, voire de simples idées, mais après une recherche approfondie, ils peuvent aboutir à un article complet, ce qui est impressionnant. Ce qui m&rsquo;a le plus marqué, c&rsquo;est un chercheur solitaire de l&rsquo;Université Cornell, qui a présenté deux travaux qu&rsquo;il avait réalisés seul lors de la même session. Il tenait le micro d&rsquo;une main, l&rsquo;autre main dans sa poche, les deux bras appuyés sur le pupitre, et ses diapositives étaient d&rsquo;un style simple avec de grands caractères (aucune diapositive ne comportait plus de 30 mots), transformant la présentation en un véritable discours. C&rsquo;est peut-être cela être un grand chercheur, déjà à un niveau supérieur.</p>
<p>Cette journée a marqué la fin de notre programme de conférence. En quittant l&rsquo;hôtel, nous avons été confrontés à un temps orageux extrême, avec une pluie battante.</p>
<h2 id="jour-5--en-une-demi-journée-traverser-cinq-siècles-de-lhistoire-chinoise" class="heading-element"><span>Jour 5 : En une demi-journée, traverser cinq siècles de l&rsquo;histoire chinoise</span>
  <a href="#jour-5--en-une-demi-journ%c3%a9e-traverser-cinq-si%c3%a8cles-de-lhistoire-chinoise" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans l&rsquo;esprit du &ldquo;puisque nous sommes là&rdquo;, j&rsquo;ai planifié une journée de tourisme éclair pour mon dernier jour à Guangzhou. Ce jour-là, j&rsquo;ai parcouru plusieurs sites célèbres de Guangzhou, découvrant la riche histoire et le patrimoine culturel de cette ville.</p>
<p>Tôt le matin, je suis d&rsquo;abord allé sur l&rsquo;île de Shamian, pleine de charme exotique. En me promenant dans cette ancienne concession, les bâtiments européens et les plantes tropicales se mêlent harmonieusement, me transportant dans le passé. Un critère pour juger de la beauté d&rsquo;un lieu est de savoir si des gens y prennent des photos de mariage, comme la gare de Pukou, le parc de la verdure et le mausolée Sun Yat-sen à Nanjing, et l&rsquo;île de Shamian à Guangzhou.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp" alt="Paysage de l&rsquo;île de Shamian" srcset="https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp?size=small, https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp?size=large 2x" data-title="Paysage de l&rsquo;île de Shamian" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Après avoir passé la matinée sur l&rsquo;île de Shamian, je suis allé à pied au musée des Treize Hongs à proximité, pour en apprendre davantage sur l&rsquo;histoire glorieuse de Guangzhou en tant que port important de la route maritime de la soie. Les artefacts et les photos exposés au musée illustrent vividamente la prospérité commerciale de Guangzhou du XVIIe siècle et son statut semi-colonial au XIXe siècle. J&rsquo;ai appris que, après l&rsquo;ouverture forcée de Guangzhou au commerce, les comptoirs étrangers étaient initialement situés le long du centre-ville de l&rsquo;autre côté de la rivière, mais ont été déplacés sur l&rsquo;île de Shamian après un incendie.</p>
<p>Dans l&rsquo;après-midi, je suis allé à la cathédrale du Sacré-Cœur. C&rsquo;est un bâtiment gothique imposant, recommandé sur Xiaohongshu comme un incontournable. Mais en réalité, c&rsquo;est juste un point de repère, avec seulement l&rsquo;entrée accessible, et la plupart du temps, elle n&rsquo;est pas ouverte.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp" alt="Paysage de la cathédrale du Sacré-Cœur" srcset="https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp?size=small, https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp?size=large 2x" data-title="Paysage de la cathédrale du Sacré-Cœur" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>L&rsquo;après-midi, j&rsquo;ai visité le site de l&rsquo;ancienne académie militaire de Huangpu. En me promenant dans cet endroit qui a formé de nombreux révolutionnaires, j&rsquo;espérais ressentir l&rsquo;époque passionnée. N&rsquo;ayant pas fait de recherches préalables, cela ne correspondait pas à mes attentes et j&rsquo;ai été quelque peu déçu. Le site original de l&rsquo;académie militaire de Huangpu a été réduit en cendres par les bombardements japonais pendant la guerre, et les bâtiments actuels sont des reconstructions. En regardant les bâtiments propres et bien rangés, je ne pouvais m&rsquo;empêcher de penser à &ldquo;Fuzimiao&rdquo; - je me sentais simplement dans un site touristique. J&rsquo;ai cherché longtemps la porte principale, mais je n&rsquo;ai pas trouvé la célèbre inscription : &ldquo;Pour ceux qui veulent s&rsquo;enrichir et obtenir des promotions, allez ailleurs ; pour ceux qui craignent la mort, n&rsquo;entrez pas ici.&rdquo;</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp" alt="Paysage du site de l&rsquo;ancienne académie militaire de Huangpu" srcset="https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp?size=small, https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp?size=large 2x" data-title="Paysage du site de l&rsquo;ancienne académie militaire de Huangpu" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>À la tombée de la nuit, je suis retourné au bord de la rivière des Perles, me promenant le long des rives. La nuit à Guangzhou, l&rsquo;horizon et la ligne d&rsquo;horizon, la petite tour et le grand théâtre, sont toujours fascinants. Du pont de Haizhu au pont de Liede, la même rivière des Perles, du XVIIe au XXIe siècle, chaque siècle offre un paysage différent.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp" alt="Paysage nocturne de la rivière des Perles" srcset="https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp?size=small, https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp?size=large 2x" data-title="Paysage nocturne de la rivière des Perles" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Ces jours passés à Guangzhou ont été comme un voyage à travers le temps, de l&rsquo;antiquité à nos jours. De la salle académique de Pazhou aux lumières éblouissantes des rives de la rivière des Perles ; du charme exotique de l&rsquo;île de Shamian aux vestiges révolutionnaires de l&rsquo;académie militaire de Huangpu. Cette ville, avec sa manière unique, fusionne parfaitement l&rsquo;académique, la culture, l&rsquo;histoire et la modernité. À l&rsquo;ombre des gratte-ciels, il y a aussi la vie animée des villages urbains ; sous les ponts bondés, il y a aussi des sans-abri, rappelant que cette ville est toujours en progrès et en inclusion. Mais ces scènes n&rsquo;affaiblissent pas le charme de Guangzhou, elles rendent la ville plus authentique et plus humaine.</p>
<p>Au revoir, Guangzhou.</p>
<div class="bilibili">
  <iframe src="//player.bilibili.com/player.html?bvid=BV1AP1GYfEBS&page=1&autoplay=false&poster=true&muted=false&danmaku=true&t=0" border="0" framespacing="0" allowfullscreen="true"></iframe>
</div>]]></description>
    </item>
    <item>
      <title>Crise de lépuisement des données, le goulot détranglement des données dans le développement de lIA et les mesures à prendre</title>
      <link>https://www.zair.top/fr/post/data-exhaustion-crisis/</link>
      <pubDate>Wed, 21 Aug 2024 15:05:44 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/data-exhaustion-crisis/</guid>
      <category domain="https://www.zair.top/fr/categories/llm/">Llm</category>
      <description><![CDATA[<blockquote>
<p>Nous estimons que le stock de texte public produit par l&rsquo;humanité est d&rsquo;environ 300 000 milliards de tokens. Si la tendance se poursuit, les modèles linguistiques auront épuisé ce stock entre 2026 et 2032, ou même plus tôt en cas de surentraînement. ——Epoch AI</p>
</blockquote>
<p>En 2006, Fei-Fei Li, alors professeur à l&rsquo;Université de l&rsquo;Illinois (aujourd&rsquo;hui à Stanford), a vu le potentiel d&rsquo;Internet pour transformer la recherche en intelligence artificielle (IA). La recherche en linguistique avait identifié 80 000 &ldquo;ensembles de synonymes de noms&rdquo;, c&rsquo;est-à-dire des ensembles de synonymes décrivant la même catégorie d&rsquo;objets. Fei-Fei Li a supposé que parmi les milliards d&rsquo;images sur Internet, il devait y avoir d&rsquo;innombrables exemples de ces ensembles de synonymes. Si suffisamment de ces images pouvaient être collectées, cela permettrait de créer une base de données plus vaste que toute ressource d&rsquo;entraînement en IA antérieure. Elle a déclaré : &ldquo;Beaucoup de gens se concentrent sur les modèles, nous devrions nous concentrer sur les données&rdquo;. Ainsi, le projet ImageNet est né.</p>
<p>Internet a fourni non seulement des images, mais aussi des ressources pour l&rsquo;annotation d&rsquo;images. Après avoir trouvé des images de chats, de chiens, de chaises, etc., via des moteurs de recherche, des personnes sur la plateforme de crowdsourcing Mechanical Turk d&rsquo;Amazon ont vérifié et annoté ces images manuellement. Finalement, une base de données contenant des millions d&rsquo;images vérifiées a été construite. C&rsquo;est en utilisant une partie des données d&rsquo;ImageNet qu&rsquo;AlexNet a démontré en 2012 le potentiel énorme de &ldquo;l&rsquo;apprentissage profond&rdquo;, ouvrant le cycle précédent de l&rsquo;IA et donnant naissance à une industrie dépendante de grandes quantités de données annotées.</p>
<h2 id="lère-de-lia-pilotée-par-les-données" class="heading-element"><span>1 L&rsquo;ère de l&rsquo;IA pilotée par les données</span>
  <a href="#l%c3%a8re-de-lia-pilot%c3%a9e-par-les-donn%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans ce cycle de l&rsquo;IA, le développement de l&rsquo;IA s&rsquo;est étendu aux grands modèles linguistiques (LLM), qui dépendent également des données Internet pour leur entraînement, mais de manière différente. La tâche classique d&rsquo;entraînement en vision par ordinateur (CV) est de prédire le contenu d&rsquo;une image (tâche de classification d&rsquo;images), tandis que la tâche classique d&rsquo;entraînement des LLM est de prédire les mots manquants dans un texte basé sur le contexte.</p>
<p>Cette méthode d&rsquo;entraînement ne nécessite pas de données annotées manuellement, le système peut lui-même masquer des mots, faire des inférences et évaluer la justesse des réponses par &ldquo;entraînement auto-supervisé&rdquo;. Mais cette méthode nécessite de grandes quantités de données. <strong>En général, plus un modèle reçoit de texte et plus le volume de données est grand, meilleures sont ses performances (Scaling Law).</strong> Internet fournit justement des dizaines de milliards de textes, qui pour les LLM ont une signification comparable à celle du carbone déposé pendant des millions d&rsquo;années pour l&rsquo;industrie moderne, une ressource précieuse pouvant être raffinée en carburant.</p>
<p>Une source de données d&rsquo;entraînement courante est Common Crawl, une archive Internet contenant 50 milliards de pages web. Avec le développement des modèles IA, davantage de données ont été ajoutées, comme Books3 - une base de données contenant des milliers de livres. Cependant, avec la croissance de la demande de données textuelles par l&rsquo;IA, l&rsquo;offre de données de qualité sur Internet devient progressivement insuffisante. Selon les estimations d&rsquo;Epoch AI, d&rsquo;ici 2028, les données textuelles de haute qualité sur Internet seront complètement épuisées, et l&rsquo;industrie fera face à ce qu&rsquo;on appelle le &ldquo;mur de données&rdquo;. L&rsquo;Internet chinois est encore plus touché, passant de &ldquo;l&rsquo;Internet chinois s&rsquo;effondre&rdquo; à de grandes plateformes verrouillant leurs portes, une fois que la valeur des données a été reconnue, elles ont été mises en sécurité. Comment surmonter cette barrière pourrait être l&rsquo;un des problèmes les plus épineux pour le développement futur de l&rsquo;IA, et peut-être celui qui pourrait le ralentir le plus.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png" alt="Phénomène du mur de données IA" srcset="https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png?size=small, https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png?size=large 2x" data-title="Phénomène du mur de données IA" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="problèmes-de-propriété-et-de-droits-dauteur-des-données" class="heading-element"><span>2 Problèmes de propriété et de droits d&rsquo;auteur des données</span>
  <a href="#probl%c3%a8mes-de-propri%c3%a9t%c3%a9-et-de-droits-dauteur-des-donn%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les modèles IA dépendent de plus en plus des données Internet, mais les questions de droits d&rsquo;auteur des données sont également controversées. De nombreuses données utilisées pour entraîner les grands modèles linguistiques sont souvent utilisées sans le consentement des détenteurs des droits d&rsquo;auteur, certaines entreprises d&rsquo;IA exploitant même du contenu derrière des paywalls. Bien que les entreprises d&rsquo;IA prétendent que cette utilisation relève de la &ldquo;fair use&rdquo; du droit d&rsquo;auteur, les détenteurs de droits ne sont pas d&rsquo;accord. Getty Images a poursuivi l&rsquo;entreprise de génération d&rsquo;images Stability AI, l&rsquo;accusant d&rsquo;avoir utilisé sa bibliothèque d&rsquo;images sans autorisation. Le New York Times a poursuivi OpenAI et Microsoft, les accusant de violer les droits d&rsquo;auteur de millions d&rsquo;articles. Stack Overflow, Reddit et X (anciennement Twitter) facturent désormais des frais aux entreprises d&rsquo;IA. Zhihu perturbe également les crawlers de Bing et Google avec des caractères illisibles pour limiter l&rsquo;utilisation de son contenu chinois dans les ensembles de données pour l&rsquo;entraînement de l&rsquo;IA.</p>
<p>Les attitudes envers ce problème varient selon les régions. Le Japon et Israël ont adopté une position souple pour promouvoir le développement de leur industrie de l&rsquo;IA. L&rsquo;Union européenne, qui n&rsquo;a pas de concept général de &ldquo;fair use&rdquo;, pourrait être plus stricte. En Chine, un Bureau national des données a été créé, clarifiant que les données ont une double identité de moyen de production et d&rsquo;objet de production.</p>
<h2 id="stratégies-actuelles-dutilisation-des-données" class="heading-element"><span>3 Stratégies actuelles d&rsquo;utilisation des données</span>
  <a href="#strat%c3%a9gies-actuelles-dutilisation-des-donn%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Face au mur de données, le domaine de l&rsquo;IA a proposé plusieurs stratégies pour y faire face. Une stratégie clé est de <strong>se concentrer sur la qualité des données plutôt que sur la quantité</strong>. Les laboratoires d&rsquo;IA ne se contentent plus d&rsquo;utiliser aveuglément toutes les données d&rsquo;Internet pour entraîner leurs modèles, mais accordent plus d&rsquo;importance au filtrage, au nettoyage et à l&rsquo;optimisation des données, garantissant que les modèles peuvent en extraire le contenu le plus précieux. Au cours de l&rsquo;année écoulée (2024), les modèles d&rsquo;OpenAI ne semblent plus &ldquo;largement en avance&rdquo;, les modèles des autres se battent à armes égales, et les différences de performance sur différentes tâches proviennent de la construction des données d&rsquo;entraînement. Après tout, il existe de nombreux algorithmes et modèles open-source, mais très peu de jeux de données open-source.</p>
<p>Obtenir des &ldquo;informations du monde réel&rdquo; est crucial, surtout lorsque les modèles impliquent beaucoup de raisonnement, les ressources autoritaires comme les manuels académiques deviennent particulièrement précieuses. Mais comment <strong>trouver le meilleur équilibre entre différentes sources de données</strong> reste une science occulte.</p>
<p>Dans le processus d&rsquo;utilisation des données, les modèles font également face au problème de &ldquo;l&rsquo;oubli catastrophique&rdquo; - c&rsquo;est-à-dire que lorsque le système est trop entraîné sur certains types de données, il peut exceller dans ce domaine tout en oubliant d&rsquo;autres connaissances précédemment acquises. Par conséquent, <strong>l&rsquo;ordre des données lors de l&rsquo;entraînement</strong> doit également être soigneusement considéré. Si toutes les données sur un sujet (comme les mathématiques) sont concentrées à la fin du processus d&rsquo;entraînement, le modèle pourrait bien performer sur les problèmes mathématiques, mais cela pourrait affaiblir ses capacités dans d&rsquo;autres domaines. Ce déséquilibre dans l&rsquo;entraînement augmente le risque d&rsquo;oubli catastrophique.</p>
<p>Lorsque les données concernent à la fois différents domaines et différentes formes (modalités), ces stratégies deviennent plus complexes. En raison de la pénurie de nouvelles données textuelles, les modèles de pointe comme GPT-4 d&rsquo;OpenAI et Gemini de Google utilisent, en plus des textes, des images, des vidéos et de l&rsquo;audio pour s&rsquo;entraîner lors de l&rsquo;apprentissage auto-supervisé. Cependant, les données vidéo sont particulièrement délicates car les fichiers vidéo contiennent des points de données extrêmement denses. Pour simplifier le problème, les modèles actuels extraient généralement uniquement certaines images clés pour un traitement simplifié, et le monde académique cherche encore des solutions plus efficaces.</p>
<h2 id="données-synthétiques-et-auto-entraînement-de-lia" class="heading-element"><span>4 Données synthétiques et auto-entraînement de l&rsquo;IA</span>
  <a href="#donn%c3%a9es-synth%c3%a9tiques-et-auto-entra%c3%aenement-de-lia" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les capacités des modèles peuvent également être améliorées en utilisant des données supplémentaires pour un réglage fin (fine-tuning) sur la base des versions générées par l&rsquo;apprentissage auto-supervisé (version pré-entraînement). Par exemple, le &ldquo;réglage fin supervisé&rdquo; consiste à fournir au modèle des paires de questions-réponses collectées ou créées par des humains pour lui enseigner ce qu&rsquo;est une bonne réponse. Une autre méthode, &ldquo;l&rsquo;apprentissage par renforcement basé sur le retour d&rsquo;information humain&rdquo; (RLHF), consiste à indiquer au modèle si les réponses satisfont le demandeur.</p>
<p>Dans le RLHF, les utilisateurs donnent leur avis sur la qualité des sorties du modèle, et ces retours sont ensuite utilisés pour ajuster les paramètres (poids) du modèle. Les interactions des utilisateurs avec les chatbots, telles que les likes ou dislikes, sont particulièrement utiles pour le RLHF. C&rsquo;est le mécanisme de la &ldquo;flywheel des données&rdquo; : plus d&rsquo;utilisateurs apportent plus de données, qui à leur tour optimisent de meilleurs modèles. Les entreprises d&rsquo;IA surveillent de près les diverses questions posées à leurs modèles par les utilisateurs, puis collectent des données pour ajuster les modèles afin de couvrir ces sujets. Alibaba, ByteDance et Minimax, entre autres, ont lancé des guerres de prix sur les modèles, difficile de dire qu&rsquo;il n&rsquo;y a pas de considérations à cet égard.</p>
<p>À mesure que les données pré-entraînement sur Internet s&rsquo;épuisent progressivement, l&rsquo;importance de l&rsquo;entraînement postérieur (Post-Training) devient de plus en plus évidente. Des entreprises d&rsquo;annotation comme Scale AI et Surge AI gagnent chaque année des centaines de millions de dollars en collectant des données d&rsquo;entraînement postérieur. Scale a récemment levé 1 milliard de dollars à une valorisation de 14 milliards de dollars. Aujourd&rsquo;hui, le travail d&rsquo;annotation a dépassé l&rsquo;ère de Mechanical Turk : les meilleurs annotateurs peuvent gagner jusqu&rsquo;à 100 dollars de l&rsquo;heure. Bien que l&rsquo;entraînement postérieur contribue à générer de meilleurs modèles et puisse répondre aux besoins de nombreuses applications commerciales, cela reste une amélioration incrémentale, un remède temporaire.</p>
<p>Outre le franchissement progressif du mur de données, une solution consiste à le contourner complètement, c&rsquo;est-à-dire à utiliser des <strong>données synthétiques générées par des machines</strong>. Le modèle AlphaGo Zero de DeepMind (filiale de Google) en est un bon exemple. Le premier modèle de Go réussi de l&rsquo;entreprise a été entraîné sur les données de millions de parties amateurs, tandis qu&rsquo;AlphaGo Zero n&rsquo;a utilisé aucune donnée existante. Au lieu de cela, il a appris le Go en jouant 4,9 millions de parties contre lui-même en trois jours, enregistrant les stratégies réussies. Cet &ldquo;apprentissage par renforcement&rdquo; lui a appris à répondre aux coups de l&rsquo;adversaire en simulant de nombreuses réponses possibles et en choisissant la stratégie avec la plus grande probabilité de succès.</p>
<p>Des méthodes similaires peuvent également être utilisées pour les LLM, comme le modèle open-source le plus puissant actuellement, Llama 3.1. Une proportion significative des données SFT de Llama 3.1 est constituée de données synthétiques générées par le modèle, et une grande partie des données de la phase SFT de Gemma2 est synthétisée par un modèle de plus grande envergure, prouvant que la qualité des données synthétiques n&rsquo;est pas inférieure à celle des données annotées manuellement.</p>
<p>Peut-on alors générer des données synthétiques à l&rsquo;infini, en se reposant sur ses propres lauriers ? Je pense que la réponse est non. Une étude publiée le mois dernier dans &ldquo;Nature&rdquo; a révélé que l&rsquo;utilisation excessive de données synthétiques dans l&rsquo;entraînement des modèles peut entraîner des &ldquo;défauts irréversibles&rdquo;. En utilisant des données synthétiques générées par des modèles pour affiner le modèle, il suffit de quelques cycles pour que le modèle commence à délirer, un phénomène que les chercheurs appellent &ldquo;l&rsquo;effondrement du modèle&rdquo;.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png" alt="Couverture actuelle de Nature : Garbage in, Garbage out." srcset="https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png?size=small, https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png?size=large 2x" data-title="Couverture actuelle de Nature : Garbage in, Garbage out." style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Le problème plus important est de savoir comment étendre cette méthode à des domaines verticaux tels que la médecine ou l&rsquo;éducation. Dans les jeux, la définition de la victoire est claire, et il est plus facile de collecter des données sur la pertinence d&rsquo;une action. Dans d&rsquo;autres domaines, c&rsquo;est beaucoup plus complexe. Les données sur les &ldquo;bonnes&rdquo; décisions sont généralement collectées auprès d&rsquo;experts, mais cela est coûteux et chronophage, et les solutions ne sont pas exhaustives. Comment déterminer si un expert a raison est aussi une question en soi.</p>
<h2 id="conclusion" class="heading-element"><span>5 Conclusion</span>
  <a href="#conclusion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Obtenir plus de données sera essentiel pour maintenir le progrès rapide de l&rsquo;IA. Que ce soit des données spécialisées provenant de sources expertes ou des données synthétiques générées par des machines, le progrès de l&rsquo;IA dépend de l&rsquo;approvisionnement continu en données. À mesure que les réserves de données les plus facilement accessibles s&rsquo;épuisent, l&rsquo;industrie de l&rsquo;IA a fait de nombreux efforts pour atténuer ce problème :</p>
<ul>
<li>Mettre l&rsquo;accent sur la qualité des données, effectuer un nettoyage des données</li>
<li>Augmenter la proportion de données mathématiques, logiques et de code, ajuster l&rsquo;ordre d&rsquo;entraînement</li>
<li>Utiliser des données synthétiques pour compléter les données réelles</li>
</ul>
<p>Mais tout cela semble insoutenable, il est nécessaire de trouver de nouvelles sources de données ou de développer des alternatives durables ; ou de concevoir de nouvelles architectures qui ne dépendent pas des données, ouvrant ainsi la voie au prochain cycle de l&rsquo;IA.</p>
<h2 id="lectures-recommandées" class="heading-element"><span>6 Lectures recommandées</span>
  <a href="#lectures-recommand%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://web.archive.org/web/20240523001943/https:/mp.weixin.qq.com/s/afg3zHPpEyRzSfOR1Aeh3w"target="_blank" rel="external nofollow noopener noreferrer">L&rsquo;Internet chinois s&rsquo;effondre à un rythme accéléré | He Jia Yan<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://epochai.org/blog/will-we-run-out-of-data-limits-of-llm-scaling-based-on-human-generated-data"target="_blank" rel="external nofollow noopener noreferrer">Allons-nous manquer de données ? Limites de l&rsquo;échelle des LLM basées sur les données générées par l&rsquo;homme | EpochAI<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://blog.csdn.net/weixin_41446370/article/details/140030906"target="_blank" rel="external nofollow noopener noreferrer">Zhihu perturbe les crawlers de Bing/Google avec des caractères illisibles | CSDN<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://wallstreetcn.com/articles/3723705"target="_blank" rel="external nofollow noopener noreferrer">Les données d&rsquo;entraînement de l&rsquo;intelligence artificielle s&rsquo;épuisent, les données synthétiques suscitent une énorme controverse | Wall Street Insights<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://developer.volcengine.com/articles/7396884852433551379"target="_blank" rel="external nofollow noopener noreferrer">Discussion sur Llama3.1, de la structure, du processus d&rsquo;entraînement, de l&rsquo;impact à la synthèse des données | Volcan Community<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://www.nature.com/articles/s41586-024-07566-y"target="_blank" rel="external nofollow noopener noreferrer">Les modèles IA s&rsquo;effondrent lorsqu&rsquo;ils sont entraînés sur des données générées de manière récursive | Nature<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>]]></description>
    </item>
    <item>
      <title>Ajustement fin de GPT-4o-mini pour générer des articles de blog</title>
      <link>https://www.zair.top/fr/post/fine-tuning-gpt-4o-mini/</link>
      <pubDate>Wed, 24 Jul 2024 15:05:44 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/fine-tuning-gpt-4o-mini/</guid>
      <category domain="https://www.zair.top/fr/categories/llm/">Llm</category>
      <description><![CDATA[<p>Le nouveau modèle GPT-4o-mini, publié le 18 juillet, dépasse GPT-3.5 et se rapproche des performances de GPT-4, tout en coûtant seulement la moitié de GPT-3.5. Il est également le plus rapide de toute la série de modèles. OpenAI a officiellement ouvert aujourd&rsquo;hui l&rsquo;interface d&rsquo;ajustement fin de GPT-4o-mini, avec une allocation gratuite de 2M tokens par jour jusqu&rsquo;au 23 septembre 2024.</p>
<p><del>Ce n&rsquo;est pas que Llama 3.1 405B soit inabordable, mais GPT-4o-mini offre un meilleur rapport qualité-prix.</del></p>
<h2 id="scénarios-dapplication-de-lajustement-fin" class="heading-element"><span>1 Scénarios d&rsquo;application de l&rsquo;ajustement fin</span>
  <a href="#sc%c3%a9narios-dapplication-de-lajustement-fin" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Pour des tâches simples, il suffit de rédiger des prompts, et le modèle peut bien les accomplir. Si la tâche est plus complexe, on peut essayer d&rsquo;utiliser une chaîne de pensée pour décomposer la tâche en plusieurs étapes et raisonner progressivement. Mais pour des tâches nécessitant une sortie de haute précision et cohérente, un ajustement fin est nécessaire.</p>
<p>Le tableau ci-dessous compare les avantages et inconvénients de ces trois méthodes ainsi que leurs scénarios d&rsquo;application.</p>
<table>
  <thead>
      <tr>
          <th>Méthode</th>
          <th>Avantages</th>
          <th>Inconvénients</th>
          <th>Scénarios d&rsquo;application</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Ajustement fin</td>
          <td>Offre des résultats de haute qualité</td>
          <td>Nécessite beaucoup de temps et de ressources pour préparer et entraîner les données</td>
          <td>Nécessite une sortie stable, fiable et de haute qualité</td>
      </tr>
      <tr>
          <td></td>
          <td>Convient aux tâches complexes et à la personnalisation dans des domaines spécifiques</td>
          <td>Boucle de rétroaction lente, coût d&rsquo;entraînement élevé</td>
          <td>Améliore les performances du modèle dans une tâche ou un domaine spécifique</td>
      </tr>
      <tr>
          <td></td>
          <td>Économise des tokens, réduit la latence</td>
          <td>Nécessite des connaissances de base en apprentissage profond</td>
          <td>Lorsque la tâche nécessite une haute précision ou un style, ton, format unique</td>
      </tr>
      <tr>
          <td>Prompting</td>
          <td>Itération et test rapides</td>
          <td>Dépend de la qualité de conception des prompts</td>
          <td>Prototypage rapide et test de tâches courantes</td>
      </tr>
      <tr>
          <td></td>
          <td>Convient à l&rsquo;exploration initiale et aux tâches générales</td>
          <td>Peut ne pas être assez précis pour des tâches complexes</td>
          <td>Lorsque l&rsquo;on a besoin d&rsquo;ajuster la sortie du modèle de manière flexible</td>
      </tr>
      <tr>
          <td></td>
          <td>Pas besoin de préparation de données supplémentaires ni de ressources d&rsquo;entraînement</td>
          <td></td>
          <td>Ne convient pas aux tâches avec de nombreux exemples et une logique complexe</td>
      </tr>
      <tr>
          <td>Chaîne de pensée</td>
          <td>Fournit une logique et un raisonnement étape par étape</td>
          <td>Augmente la complexité et la longueur des prompts</td>
          <td>Traite les tâches nécessitant raisonnement et étapes logiques</td>
      </tr>
      <tr>
          <td></td>
          <td>Améliore les performances des tâches complexes</td>
          <td>Augmente l&rsquo;utilisation des tokens et la latence</td>
          <td>Scénarios impliquant la résolution de problèmes en plusieurs étapes</td>
      </tr>
      <tr>
          <td></td>
          <td>Facile à combiner avec diverses stratégies et outils</td>
          <td>Peut ne pas suffire pour des tâches très complexes</td>
          <td>Lorsque l&rsquo;on a besoin de processus logiques clairs et d&rsquo;exécution étape par étape</td>
      </tr>
  </tbody>
</table>
<p>Le théorème NFL nous dit qu&rsquo;aucune méthode ne peut s&rsquo;appliquer à tous les scénarios, et c&rsquo;est pareil ici, l&rsquo;ajustement fin n&rsquo;est pas forcément meilleur que les deux autres méthodes. Mais il est clair que <strong>l&rsquo;ajustement fin convient aux tâches &ldquo;difficiles à décrire&rdquo;</strong>, comme un style et un ton particuliers. De plus, ces trois méthodes ne sont pas incompatibles, un modèle ajusté finement utilisant des prompts soigneusement conçus, voire combiné avec une chaîne de pensée, pourrait donner de meilleurs résultats.</p>
<p>Pour simplement écrire un article ou un paragraphe, un prompt suffit. Mais pour un article de blog, si l&rsquo;on considère le SEO, il y a beaucoup de détails, comme la fréquence d&rsquo;apparition des mots-clés principaux, etc. Ces détails ne sont pas forcément bien compris par le grand modèle, et en tant qu&rsquo;utilisateur, on ne peut pas forcément bien les décrire dans le prompt. Ainsi, pour rédiger un tel article de blog, on peut utiliser l&rsquo;ajustement fin.</p>
<h2 id="préparation-des-données" class="heading-element"><span>2 Préparation des données</span>
  <a href="#pr%c3%a9paration-des-donn%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les données doivent être organisées au format <code>jsonl</code>, chaque ligne étant un json. Par exemple :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv est un chatbot factuel qui est aussi sarcastique.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Quelle est la capitale de la France ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Paris, comme si tout le monde ne le savait pas déjà.&#34;</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv est un chatbot factuel qui est aussi sarcastique.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Qui a écrit &#39;Roméo et Juliette&#39; ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Oh, juste un gars nommé William Shakespeare. Vous en avez déjà entendu parler ?&#34;</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv est un chatbot factuel qui est aussi sarcastique.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Quelle est la distance entre la Lune et la Terre ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Environ 384 400 kilomètres. À quelques kilomètres près, comme si cela avait vraiment de l&#39;importance.&#34;</span><span class="p">}]}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Il est également possible de définir des poids dans les dialogues multi-tours, un poids de 0 indiquant au modèle d&rsquo;éviter ce type de réponse.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv est un chatbot factuel qui est aussi sarcastique.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Quelle est la capitale de la France ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Paris&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Peux-tu être plus sarcastique ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Paris, comme si tout le monde ne le savait pas déjà.&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv est un chatbot factuel qui est aussi sarcastique.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Qui a écrit &#39;Roméo et Juliette&#39; ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;William Shakespeare&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Peux-tu être plus sarcastique ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Oh, juste un gars nommé William Shakespeare. Vous en avez déjà entendu parler ?&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv est un chatbot factuel qui est aussi sarcastique.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Quelle est la distance entre la Lune et la Terre ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;384 400 kilomètres&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Peux-tu être plus sarcastique ?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Environ 384 400 kilomètres. À quelques kilomètres près, comme si cela avait vraiment de l&#39;importance.&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Bien sûr, le traitement des données est la partie la plus chronophage, mais vous pouvez également utiliser directement <a href="https://github.com/Ryaang/industry-article-dataset/blob/main/all_filter_2120.jsonl"target="_blank" rel="external nofollow noopener noreferrer">le jeu de données que j&rsquo;ai créé<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>. Ce jeu de données est utilisé pour ajuster finement le grand modèle, provenant de la capture de plus de 3000 pages dans 13 domaines de classification sur le site <a href="https://reads.alibaba.com/"target="_blank" rel="external nofollow noopener noreferrer">reads.alibaba.com<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, avec non seulement les données traitées en open source, mais aussi les données brutes et le code du crawler.</p>
<p>Téléchargez les données préparées et enregistrez l&rsquo;ID du fichier retourné.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">files</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">file</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="s2">&#34;all_filter_2120.jsonl&#34;</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">purpose</span><span class="o">=</span><span class="s2">&#34;fine-tune&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="ajustement-fin-du-modèle" class="heading-element"><span>3 Ajustement fin du modèle</span>
  <a href="#ajustement-fin-du-mod%c3%a8le" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Une fois les données prêtes, vérifiées et le coût en tokens confirmé, vous pouvez créer une tâche d&rsquo;ajustement fin.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">training_file</span><span class="o">=</span><span class="s2">&#34;file-zWptPbsD37ZnemssjpsK6CnF&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">  <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-4o-mini&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Pour une configuration plus détaillée des paramètres, vous pouvez consulter <a href="https://platform.openai.com/docs/api-reference/fine-tuning/create"target="_blank" rel="external nofollow noopener noreferrer">la documentation API officielle<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png" alt="UI d&rsquo;ajustement fin OpenAI" srcset="https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png?size=small, https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png?size=large 2x" data-title="UI d&rsquo;ajustement fin OpenAI" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Ces deux étapes peuvent également être rapidement réalisées via <a href="https://platform.openai.com/finetune"target="_blank" rel="external nofollow noopener noreferrer">l&rsquo;interface utilisateur<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, et après avoir soumis la tâche, vous pouvez également suivre en temps réel la progression et les variations de perte dans l&rsquo;interface utilisateur.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png" alt="Journal du processus d&rsquo;ajustement fin OpenAI" srcset="https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png?size=small, https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png?size=large 2x" data-title="Journal du processus d&rsquo;ajustement fin OpenAI" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="appel-du-modèle" class="heading-element"><span>4 Appel du modèle</span>
  <a href="#appel-du-mod%c3%a8le" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Utilisez le code ci-dessous pour interroger l&rsquo;état de la tâche d&rsquo;ajustement fin. Une fois la tâche réussie, vous verrez le champ <code>fine_tuned_model</code> rempli avec le nom du modèle. Notez ce nom pour pouvoir l&rsquo;appeler.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Liste des tâches d&#39;ajustement fin</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Détails de la tâche d&#39;ajustement fin</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">retrieve</span><span class="p">(</span><span class="s2">&#34;ftjob-gvP0VB7RlWcF3QHdQrEVf49Y&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Annuler une tâche</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">cancel</span><span class="p">(</span><span class="s2">&#34;ftjob-gvP0VB7RlWcF3QHdQrEVf49Y&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Voir le journal des tâches</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">list_events</span><span class="p">(</span><span class="n">fine_tuning_job_id</span><span class="o">=</span><span class="s2">&#34;ftjob-gvP0VB7RlWcF3QHdQrEVf49Y&#34;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Supprimer un modèle ajusté finement</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s2">&#34;ft:gpt-3.5-turbo:acemeco:suffix:abc123&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>La méthode d&rsquo;appel est la même que pour les modèles officiels, il suffit de modifier le nom du modèle, par exemple :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">completion</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">completions</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">model</span><span class="o">=</span><span class="s2">&#34;ft:gpt-4o-mini-2024-07-18:personal:0724:9oMH6S7A&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">messages</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="s2">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Veuillez rédiger un article SEO de pas moins de 800 mots basé sur le titre que je vous ai donné, incluant au moins 4 sous-titres au format HTML. N&#39;incluez pas la balise &lt;h1&gt;, &lt;body&gt;. N&#39;incluez pas la balise &lt;html&gt; au début et à la fin du contenu. Commencez directement par le contenu.&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="s2">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;title:</span><span class="si">{</span><span class="n">task</span><span class="o">.</span><span class="n">title</span><span class="si">}</span><span class="s2">,core keyword:</span><span class="si">{</span><span class="n">task</span><span class="o">.</span><span class="n">coreKeywords</span><span class="si">}</span><span class="s2">,related keyword:</span><span class="si">{</span><span class="n">task</span><span class="o">.</span><span class="n">relatedKeywords</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">completion</span><span class="o">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">message</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="évaluation-des-résultats" class="heading-element"><span>5 Évaluation des résultats</span>
  <a href="#%c3%a9valuation-des-r%c3%a9sultats" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Pendant l&rsquo;entraînement, deux indicateurs sont disponibles : la perte et la précision des tokens. L&rsquo;explication officielle est la suivante :</p>
<blockquote>
<p>La perte de validation et la précision des tokens de validation sont calculées de deux manières différentes : sur un petit lot de données à chaque étape, et sur l&rsquo;ensemble du jeu de validation à la fin de chaque époque. Les indicateurs de perte et de précision des tokens sur l&rsquo;ensemble du jeu de validation sont les plus précis pour suivre les performances globales du modèle. Ces statistiques visent à fournir une vérification de la rationalité pour s&rsquo;assurer que l&rsquo;entraînement se déroule bien (la perte devrait diminuer, la précision des tokens devrait augmenter).</p>
</blockquote>
<p>Cependant, les indicateurs ne sont que des références, et l&rsquo;efficacité réelle doit être évaluée par vous-même. Le modèle ajusté finement présente au moins les améliorations suivantes :</p>
<ul>
<li>Augmentation de 20 % de la longueur des articles</li>
<li>Structure des articles plus proche des données d&rsquo;entraînement</li>
<li>Plus d&rsquo;erreurs de format (comme le format markdown, l&rsquo;ajout de CSS, etc.)</li>
</ul>
<p>Voici un article généré sur le thème &ldquo;Quelle est la différence entre une fresque et une mosaïque ?&rdquo; :</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png" alt="Évaluation des résultats" srcset="https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png?size=small, https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png?size=large 2x" data-title="Évaluation des résultats" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="articles-de-référence" class="heading-element"><span>6 Articles de référence</span>
  <a href="#articles-de-r%c3%a9f%c3%a9rence" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ul>
<li><a href="https://platform.openai.com/docs/guides/fine-tuning"target="_blank" rel="external nofollow noopener noreferrer">https://platform.openai.com/docs/guides/fine-tuning<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>]]></description>
    </item>
    <item>
      <title>Quatre modèles de conception d&#39;agents intelligents AI : une voie incontournable vers l&#39;intelligence artificielle générale</title>
      <link>https://www.zair.top/fr/post/ai-agent-design-pattern/</link>
      <pubDate>Wed, 22 May 2024 18:00:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/ai-agent-design-pattern/</guid>
      <category domain="https://www.zair.top/fr/categories/llm/">Llm</category>
      <description><![CDATA[<h2 id="quatre-modèles-de-conception-dagents-intelligents-ai--une-voie-incontournable-vers-lintelligence-artificielle-générale" class="heading-element"><span>Quatre modèles de conception d&rsquo;agents intelligents AI : une voie incontournable vers l&rsquo;intelligence artificielle générale</span>
  <a href="#quatre-mod%c3%a8les-de-conception-dagents-intelligents-ai--une-voie-incontournable-vers-lintelligence-artificielle-g%c3%a9n%c3%a9rale" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Si l&rsquo;on compare l&rsquo;utilisation de l&rsquo;IA pour accomplir des tâches à la rédaction d&rsquo;un essai, alors la méthode non-agent (Agent) consiste à faire écrire l&rsquo;IA d&rsquo;une traite, sans modification, tandis que la méthode agent permet à l&rsquo;IA de modifier plusieurs fois et de s&rsquo;appuyer sur des outils et de collaborer avec l&rsquo;extérieur pendant le processus de modification. En 2024, l&rsquo;agent est considéré comme l&rsquo;une des voies pour réaliser l&rsquo;intelligence artificielle générale (AGI).</p>
<p>Les modèles de base ont stimulé le développement de l&rsquo;intelligence artificielle générative, permettant aux agents AI d&rsquo;aider automatiquement les utilisateurs à accomplir des tâches. Au cours de l&rsquo;année écoulée, divers agents ont émergé. Inspiré par le discours d&rsquo;Andrew Ng au sommet AI de Sequoia, cet article compile les agents existants à partir des articles publiés et des blogs d&rsquo;ingénierie tels que Langchain, et résume les paradigmes de conception dans l&rsquo;espoir d&rsquo;aider à concevoir des agents basés sur des modèles de base.</p>
<p>Les 16 modèles suivants peuvent être provisoirement compilés dans le tableau ci-dessous :</p>
<table>
  <thead>
      <tr>
          <th>Modèle</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Créateur d&rsquo;objectifs passif</td>
          <td>Analyse les indications explicites de l&rsquo;utilisateur via une interface de dialogue pour maintenir l&rsquo;interactivité, le suivi des objectifs et l&rsquo;intuitivité.</td>
      </tr>
      <tr>
          <td>Créateur d&rsquo;objectifs proactif</td>
          <td>Prévient les objectifs de l&rsquo;utilisateur en comprenant les interactions humaines et en capturant le contexte pour améliorer l&rsquo;interactivité, le suivi des objectifs et l&rsquo;accessibilité.</td>
      </tr>
      <tr>
          <td>Optimiseur de prompt/réponse</td>
          <td>Optimise les prompts/réponses en fonction du contenu et du format attendus des entrées ou sorties pour fournir standardisation, précision des réponses, interopérabilité et adaptabilité.</td>
      </tr>
      <tr>
          <td>Génération augmentée par récupération</td>
          <td>Améliore la capacité de mise à jour des connaissances de l&rsquo;agent tout en préservant la confidentialité des données du système d&rsquo;agent de modèle de base local.</td>
      </tr>
      <tr>
          <td>Interrogation de modèle en un coup</td>
          <td>Accède au modèle de base dans un seul cas pour générer toutes les étapes nécessaires à la planification afin d&rsquo;améliorer l&rsquo;efficacité des coûts et de simplifier le processus.</td>
      </tr>
      <tr>
          <td>Interrogation de modèle incrémentale</td>
          <td>Accède au modèle de base à chaque étape du processus de génération de plan pour fournir un contexte supplémentaire, améliorer la précision des réponses et l&rsquo;explicabilité.</td>
      </tr>
      <tr>
          <td>Générateur de plan à chemin unique</td>
          <td>Coordonne la génération des étapes intermédiaires pour atteindre l&rsquo;objectif de l&rsquo;utilisateur afin d&rsquo;améliorer la certitude, la cohérence et l&rsquo;efficacité du raisonnement.</td>
      </tr>
      <tr>
          <td>Générateur de plan à chemins multiples</td>
          <td>Permet de créer plusieurs options à chaque étape de la réalisation de l&rsquo;objectif de l&rsquo;utilisateur pour améliorer la certitude, la cohérence, l&rsquo;alignement sur les préférences humaines et l&rsquo;inclusivité du raisonnement.</td>
      </tr>
      <tr>
          <td>Auto-réflexion</td>
          <td>Permet à l&rsquo;agent de générer des retours sur le plan et le processus de raisonnement et fournit des conseils d&rsquo;auto-amélioration pour améliorer la certitude, l&rsquo;explicabilité, l&rsquo;amélioration continue et l&rsquo;efficacité du raisonnement.</td>
      </tr>
      <tr>
          <td>Réflexion croisée</td>
          <td>Utilise différents agents ou modèles de base pour fournir des retours et améliorer le plan généré et le processus de raisonnement pour améliorer la certitude, l&rsquo;explicabilité, l&rsquo;interopérabilité, l&rsquo;inclusivité, l&rsquo;évolutivité et l&rsquo;amélioration continue du raisonnement.</td>
      </tr>
      <tr>
          <td>Réflexion humaine</td>
          <td>Collecte des retours humains pour améliorer le plan et le processus de raisonnement, aligner efficacement les préférences humaines, améliorer la contestabilité, l&rsquo;efficacité, l&rsquo;équité et l&rsquo;amélioration continue.</td>
      </tr>
      <tr>
          <td>Coopération basée sur le vote</td>
          <td>Permet aux agents d&rsquo;exprimer librement leurs opinions et de parvenir à un consensus en soumettant des votes pour améliorer la diversité, la division du travail efficace et la tolérance aux erreurs.</td>
      </tr>
      <tr>
          <td>Coopération basée sur les rôles</td>
          <td>Attribue différents rôles et finalise les décisions en fonction des rôles des agents pour améliorer la certitude des décisions, la division du travail, la tolérance aux erreurs, l&rsquo;évolutivité et la responsabilité.</td>
      </tr>
      <tr>
          <td>Coopération basée sur le débat</td>
          <td>Les agents fournissent et reçoivent des retours par le biais de débats, ajustent leurs idées et comportements jusqu&rsquo;à parvenir à un consensus pour améliorer la certitude, l&rsquo;adaptabilité, l&rsquo;explicabilité, la précision des réponses et la pensée critique des décisions.</td>
      </tr>
      <tr>
          <td>Garde-fous multimodaux</td>
          <td>Contrôle les entrées et sorties du modèle de base pour répondre à des exigences spécifiques, telles que les demandes des utilisateurs, les normes éthiques et les réglementations légales, afin d&rsquo;améliorer la robustesse, la sécurité, l&rsquo;alignement des normes et l&rsquo;adaptabilité.</td>
      </tr>
      <tr>
          <td>Registre d&rsquo;outils/agents</td>
          <td>Maintient une source unifiée et pratique pour sélectionner différents agents et outils afin d&rsquo;améliorer la découvrabilité, l&rsquo;efficacité et l&rsquo;applicabilité des outils.</td>
      </tr>
  </tbody>
</table>
<p>Ces 16 modèles peuvent tous être regroupés dans les 4 paradigmes proposés par Andrew Ng dans son discours au sommet AI de Sequoia, à savoir :</p>
<ul>
<li>Réflexion</li>
<li>Utilisation d&rsquo;outils</li>
<li>Planification</li>
<li>Collaboration multi-agents</li>
</ul>
<h2 id="réflexion" class="heading-element"><span>1 Réflexion</span>
  <a href="#r%c3%a9flexion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="réflexion-de-base" class="heading-element"><span>1.1 Réflexion de base</span>
  <a href="#r%c3%a9flexion-de-base" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Dans le contexte de la construction d&rsquo;agents LLM, la réflexion désigne le processus consistant à inciter le LLM à observer ses étapes passées (ainsi que les observations potentielles des outils/environnements) pour évaluer la qualité des actions choisies. Ces retours sont ensuite utilisés pour des tâches en aval telles que la replanification, la recherche ou l&rsquo;évaluation. L&rsquo;image ci-dessous montre un modèle de réflexion de base.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png" alt="Réflexion de base" srcset="https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png?size=large 2x" data-title="Réflexion de base" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Réflexion de base</p>
<h3 id="acteur-reflexion" class="heading-element"><span>1.2 Acteur Reflexion</span>
  <a href="#acteur-reflexion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Proposé par Shinn et al., Reflexion est une architecture qui apprend par le biais de retours linguistiques et d&rsquo;auto-réflexion. Cet agent commente ses résultats de tâches pour générer des résultats finaux de meilleure qualité, mais au prix d&rsquo;un temps d&rsquo;exécution plus long. Il comprend principalement trois composants :</p>
<ol>
<li>Acteur (agent) avec auto-réflexion</li>
<li>Évaluateur externe (spécifique à la tâche, par exemple, étapes de compilation de code)</li>
<li>Mémoire épisodique qui stocke les réflexions de (1).</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png" alt="Acteur Reflexion" srcset="https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png?size=small, https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png?size=large 2x" data-title="Acteur Reflexion" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Acteur Reflexion</p>
<h3 id="lats" class="heading-element"><span>1.3 LATS</span>
  <a href="#lats" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>La recherche d&rsquo;arbre d&rsquo;agents linguistiques (LATS), proposée par Zhou et al., est un algorithme de recherche d&rsquo;agent LLM général qui combine réflexion/évaluation et recherche (en particulier la recherche d&rsquo;arbre de Monte Carlo), capable de réaliser de meilleures performances globales de tâches par rapport à des techniques similaires telles que ReACT, Reflexion ou Tree of Thoughts.</p>
<p>Il comprend quatre étapes principales :</p>
<ol>
<li>
<p>Sélectionner : choisir les meilleures actions suivantes en fonction des récompenses agrégées de l&rsquo;étape (2). Répondre (si une solution est trouvée ou si la profondeur maximale de recherche est atteinte) ou continuer la recherche.</p>
</li>
<li>
<p>Étendre et simuler : sélectionner les 5 meilleures actions potentielles à entreprendre et les exécuter en parallèle.</p>
</li>
<li>
<p>Réfléchir + Évaluer : observer les résultats de ces actions et évaluer les décisions en fonction de la réflexion (et éventuellement des retours externes)</p>
</li>
<li>
<p>Rétropropager : mettre à jour les scores des trajectoires racines en fonction des résultats.</p>
</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png" alt="LATS" srcset="https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png?size=large 2x" data-title="LATS" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>LATS</p>
<h2 id="utilisation-doutils" class="heading-element"><span>2 Utilisation d&rsquo;outils</span>
  <a href="#utilisation-doutils" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Appeler des outils, utiliser sous forme de fonctions.</p>
<h2 id="planification" class="heading-element"><span>3 Planification</span>
  <a href="#planification" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="react" class="heading-element"><span>3.1 ReAct</span>
  <a href="#react" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>ReAct améliore les capacités des agents en combinant raisonnement et action. La méthode ReAct permet aux agents de réagir immédiatement après avoir reçu des informations, plutôt que d&rsquo;attendre que toutes les informations soient traitées. Cette méthode met également l&rsquo;accent sur la combinaison étroite du raisonnement et de l&rsquo;action, où les agents doivent non seulement analyser et comprendre les informations d&rsquo;entrée, mais aussi agir en conséquence. Cette approche est avantageuse en raison de sa flexibilité et de son adaptabilité à l&rsquo;environnement.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png" alt="Cadre ReAct" srcset="https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png?size=large 2x" data-title="Cadre ReAct" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Cadre ReAct</p>
<h3 id="planifier-et-exécuter" class="heading-element"><span>3.2 Planifier et exécuter</span>
  <a href="#planifier-et-ex%c3%a9cuter" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Le cœur de Planifier et exécuter est de d&rsquo;abord établir un plan à plusieurs étapes, puis d&rsquo;exécuter ce plan étape par étape. Après avoir accompli une tâche spécifique, le plan peut être réexaminé et modifié si nécessaire.</p>
<p>Comparé aux agents typiques de style ReAct, qui pensent une étape à la fois, ce style &ldquo;planifier et exécuter&rdquo; présente les avantages suivants :</p>
<ol>
<li>Planification à long terme claire (même les LLM très puissants ont du mal à le faire)</li>
<li>Capacité à utiliser des modèles plus petits/moins puissants pour les étapes d&rsquo;exécution, en utilisant uniquement des modèles plus grands/meilleurs pour les étapes de planification</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png" alt="Planifier et exécuter" srcset="https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png?size=small, https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png?size=large 2x" data-title="Planifier et exécuter" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p><strong>Planifier et exécuter</strong></p>
<h3 id="rewoo" class="heading-element"><span>3.3 ReWOO</span>
  <a href="#rewoo" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Dans ReWOO, Xu et al. ont proposé un agent combinant un planificateur à plusieurs étapes et un remplacement de variables pour une utilisation efficace des outils. Il améliore l&rsquo;architecture des agents de style ReACT dans les aspects suivants :</p>
<ol>
<li>Réduit la consommation de tokens et le temps d&rsquo;exécution en générant une chaîne d&rsquo;outils complète à utiliser en une seule fois. (Les architectures d&rsquo;agents de style ReACT nécessitent de nombreux appels LLM et ont des préfixes redondants car les prompts système et les étapes précédentes sont fournies au LLM à chaque étape de raisonnement)</li>
<li>Simplifie le processus de fine-tuning. Étant donné que les données de planification ne dépendent pas des sorties des outils, le modèle peut théoriquement être fine-tuné sans appeler réellement les outils</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png" alt="Raisonnement sans observation" srcset="https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png?size=large 2x" data-title="Raisonnement sans observation" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p><strong>Raisonnement sans observation</strong></p>
<h3 id="llmcompiler" class="heading-element"><span>3.4 LLMCompiler</span>
  <a href="#llmcompiler" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>LLMCompiler est une architecture d&rsquo;agent qui accélère l&rsquo;exécution des tâches d&rsquo;agent en exécutant les tâches en rafale dans un DAG. Il économise également sur les coûts d&rsquo;utilisation des tokens redondants en réduisant le nombre d&rsquo;appels LLM. Il comprend principalement trois parties :</p>
<ol>
<li>
<p>Planificateur : diffuse un DAG de tâches.</p>
</li>
<li>
<p>Unité de récupération de tâches : planifie et exécute les tâches dès qu&rsquo;elles sont exécutables</p>
</li>
<li>
<p>Assembleur : répond à l&rsquo;utilisateur ou déclenche un deuxième plan</p>
</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png" alt="LLMCompiler" srcset="https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png?size=large 2x" data-title="LLMCompiler" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>LLMCompiler</p>
<h2 id="collaboration-multi-agents" class="heading-element"><span>4 Collaboration multi-agents</span>
  <a href="#collaboration-multi-agents" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="supervision" class="heading-element"><span>4.1 Supervision</span>
  <a href="#supervision" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Gérer et planifier la collaboration de plusieurs agents par un superviseur.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png" alt="Mode de supervision" srcset="https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png?size=large 2x" data-title="Mode de supervision" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Mode de supervision</p>
<h3 id="équipes-hiérarchiques" class="heading-element"><span>4.2 <strong>Équipes hiérarchiques</strong></span>
  <a href="#%c3%a9quipes-hi%c3%a9rarchiques" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Organiser les agents de manière hiérarchique et graduée pour accomplir des tâches complexes et volumineuses. AutoGen est un exemple typique de cette approche.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png" alt="Mode d&rsquo;équipe hiérarchique" srcset="https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png?size=large 2x" data-title="Mode d&rsquo;équipe hiérarchique" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Mode d&rsquo;équipe hiérarchique</p>
<h3 id="collaboration" class="heading-element"><span>4.3 <strong>Collaboration</strong></span>
  <a href="#collaboration" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>La capacité d&rsquo;un agent unique à utiliser plusieurs outils (domaines) est limitée, nécessitant plusieurs agents pour utiliser plus de types d&rsquo;outils. On peut utiliser l&rsquo;idée de &ldquo;diviser pour régner&rdquo;, où chaque agent devient un &ldquo;expert&rdquo; spécialisé dans le traitement d&rsquo;une catégorie de problèmes, puis les faire collaborer.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png" alt="Une forme de collaboration multi-agents de base" srcset="https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png?size=small, https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png?size=large 2x" data-title="Une forme de collaboration multi-agents de base" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Une forme de collaboration multi-agents de base</p>
<h2 id="évaluation" class="heading-element"><span>5 Évaluation</span>
  <a href="#%c3%a9valuation" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Une idée la plus directe est d&rsquo;utiliser un agent comme &ldquo;utilisateur virtuel&rdquo; pour l&rsquo;évaluation, de nombreuses tâches dont les résultats ne peuvent pas être évalués quantitativement peuvent devoir utiliser cette méthode. Mais pour les tâches avec des indicateurs clairs (classification, régression), il peut être possible d&rsquo;utiliser directement un outil pour l&rsquo;évaluation.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png" alt="Évaluation basée sur les agents" srcset="https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png?size=large 2x" data-title="Évaluation basée sur les agents" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Évaluation basée sur les agents</p>
<h2 id="autres-méthodes-pour-lagi" class="heading-element"><span>6 Autres méthodes pour l&rsquo;AGI</span>
  <a href="#autres-m%c3%a9thodes-pour-lagi" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les agents ne sont qu&rsquo;une méthode prometteuse pour réaliser l&rsquo;AGI, mais ce n&rsquo;est pas la seule méthode. La méthode des agents elle-même peut être combinée avec RAG, la participation des utilisateurs et d&rsquo;autres méthodes. Par exemple, Shi et al. ont combiné la méthode des agents et de la récupération pour résoudre des problèmes de programmation olympique avec de grands modèles.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png" alt="Sans titre" srcset="https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png?size=large 2x" data-title="Sans titre" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="lectures-recommandées" class="heading-element"><span>7 Lectures recommandées</span>
  <a href="#lectures-recommand%c3%a9es" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><a href="https://github.com/AGI-Edgerunners/LLM-Agents-Papers?tab=readme-ov-file"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/AGI-Edgerunners/LLM-Agents-Papers<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p><a href="https://github.com/zjunlp/LLMAgentPapers"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/zjunlp/LLMAgentPapers<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p><a href="https://www.cnblogs.com/bonelee/p/18153432"target="_blank" rel="external nofollow noopener noreferrer">Articles classiques sur la décomposition et la planification des tâches des agents intelligents AI - bonelee - Blog Park (cnblogs.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p><a href="https://zhuanlan.zhihu.com/p/691370751"target="_blank" rel="external nofollow noopener noreferrer">Quatre paradigmes d&rsquo;agents | CRITIC : paradigmes de conception d&rsquo;agents promus par Andrew Ng - Zhihu (zhihu.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h2 id="références" class="heading-element"><span>8 Références</span>
  <a href="#r%c3%a9f%c3%a9rences" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li>Kim, Sehoon, Suhong Moon, Ryan Tabrizi, Nicholas Lee, Michael W. Mahoney, Kurt Keutzer, and Amir Gholami. “An LLM Compiler for Parallel Function Calling.” arXiv, February 6, 2024. <a href="https://doi.org/10.48550/arXiv.2312.04511"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2312.04511<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Liu, Yue, Sin Kit Lo, Qinghua Lu, Liming Zhu, Dehai Zhao, Xiwei Xu, Stefan Harrer, and Jon Whittle. “Agent Design Pattern Catalogue: A Collection of Architectural Patterns for Foundation Model Based Agents.” arXiv, May 16, 2024. <a href="https://doi.org/10.48550/arXiv.2405.10467"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2405.10467<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Shi, Quan, Michael Tang, Karthik Narasimhan, and Shunyu Yao. “Can Language Models Solve Olympiad Programming?” arXiv, April 16, 2024. <a href="https://doi.org/10.48550/arXiv.2404.10952"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2404.10952<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Shinn, Noah, Federico Cassano, Edward Berman, Ashwin Gopinath, Karthik Narasimhan, and Shunyu Yao. “Reflexion: Language Agents with Verbal Reinforcement Learning.” arXiv, October 10, 2023. <a href="https://doi.org/10.48550/arXiv.2303.11366"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2303.11366<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Wang, Lei, Wanyu Xu, Yihuai Lan, Zhiqiang Hu, Yunshi Lan, Roy Ka-Wei Lee, and Ee-Peng Lim. “Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models.” arXiv, May 26, 2023. <a href="https://doi.org/10.48550/arXiv.2305.04091"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2305.04091<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Xu, Binfeng, Zhiyuan Peng, Bowen Lei, Subhabrata Mukherjee, Yuchen Liu, and Dongkuan Xu. “ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models.” arXiv, May 22, 2023. <a href="https://doi.org/10.48550/arXiv.2305.18323"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2305.18323<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Yao, Shunyu, Jeffrey Zhao, Dian Yu, Nan Du, Izhak Shafran, Karthik Narasimhan, and Yuan Cao. “ReAct: Synergizing Reasoning and Acting in Language Models.” arXiv, March 9, 2023. <a href="https://doi.org/10.48550/arXiv.2210.03629"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2210.03629<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>“Yoheinakajima/Babyagi.” Accessed May 21, 2024. <a href="https://github.com/yoheinakajima/babyagi/tree/main"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/yoheinakajima/babyagi/tree/main<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>“LangGraph tutorials.” Accessed May 21, 2024.  <a href="https://langchain-ai.github.io/langgraph/tutorials/"target="_blank" rel="external nofollow noopener noreferrer">https://langchain-ai.github.io/langgraph/tutorials/<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li>Zhou, Andy, Kai Yan, Michal Shlapentokh-Rothman, Haohan Wang, and Yu-Xiong Wang. “Language Agent Tree Search Unifies Reasoning Acting and Planning in Language Models.” arXiv, December 5, 2023. <a href="https://doi.org/10.48550/arXiv.2310.04406"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2310.04406<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Zhou, Pei, Jay Pujara, Xiang Ren, Xinyun Chen, Heng-Tze Cheng, Quoc V. Le, Ed H. Chi, Denny Zhou, Swaroop Mishra, and Huaixiu Steven Zheng. “Self-Discover: Large Language Models Self-Compose Reasoning Structures.” arXiv, February 5, 2024. <a href="https://doi.org/10.48550/arXiv.2402.03620"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2402.03620<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
</ol>
]]></description>
    </item>
    <item>
      <title>Comparaison des bases de données vectorielles - Weaviate, Milvus et Qdrant</title>
      <link>https://www.zair.top/fr/post/vector-database-compare/</link>
      <pubDate>Tue, 02 Apr 2024 15:44:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/vector-database-compare/</guid>
      <category domain="https://www.zair.top/fr/categories/llm/">Llm</category>
      <description><![CDATA[<p>Le succès du système RAG dépend en grande partie de sa capacité à acquérir et traiter efficacement une masse d&rsquo;informations. Les bases de données vectorielles jouent un rôle irremplaçable dans ce processus et constituent le cœur du système RAG. Les bases de données vectorielles sont spécialement conçues pour stocker et gérer des données vectorielles de haute dimension. Elles peuvent convertir et stocker des textes, images, audio et même vidéos en vecteurs (ce point sera détaillé plus loin). L&rsquo;efficacité finale du système RAG dépend donc des performances de ces bases de données vectorielles sous-jacentes.</p>
<p>Parmi les nombreuses bases de données vectorielles et bibliothèques de vecteurs, chacune a ses propres caractéristiques, et choisir celle qui convient à son application nécessite une évaluation. Cet article explore en profondeur les facteurs clés à considérer lors du choix d&rsquo;une base de données vectorielle pour le RAG, notamment la disponibilité open source, le support CRUD (création, lecture, mise à jour, suppression), l&rsquo;architecture distribuée, le support des répliques, l&rsquo;évolutivité, les performances et la maintenance continue.</p>
<p>Actuellement, des bases de données conçues spécifiquement pour les vecteurs comme Weaviate, Milvus, Qdrant, Vespa et Pinecone attirent beaucoup d&rsquo;attention dans l&rsquo;industrie. En outre, certaines bibliothèques de vecteurs plus anciennes possèdent également ces fonctionnalités. Cet article compare également diverses bibliothèques de vecteurs telles que FAISS, HNSWLib, ANNOY, ainsi que des bases de données SQL prenant en charge les vecteurs, comme pgvector et Supabase.</p>
<div align="center"><img src="https://cdn1.zair.top/images/2024/04/30c04fed7d88adea8257c73eadc85b1e.png" alt="Recherche sémantique d'images réalisée avec Milvus" style="width: 50%;"></div>
Recherche sémantique d'images réalisée avec Milvus
<h2 id="bibliothèques-de-vecteurs-faiss-hnswlib-annoy" class="heading-element"><span>1 Bibliothèques de vecteurs (FAISS, HNSWLib, ANNOY)</span>
  <a href="#biblioth%c3%a8ques-de-vecteurs-faiss-hnswlib-annoy" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>La différence entre les bases de données vectorielles et les bibliothèques de vecteurs réside dans le fait que les bibliothèques de vecteurs sont principalement utilisées pour stocker des données statiques, où les données d&rsquo;index sont immuables. Cela est dû au fait que les bibliothèques de vecteurs ne stockent que les embeddings vectoriels et <strong>ne stockent pas les objets associés qui génèrent ces embeddings vectoriels</strong>. Par conséquent, contrairement aux bases de données vectorielles, les bibliothèques de vecteurs ne prennent pas en charge les opérations CRUD. Cela signifie qu&rsquo;il peut être difficile d&rsquo;ajouter de nouveaux documents à un index existant dans des bibliothèques de vecteurs comme FAISS ou ANNOY. HNSWLib est une exception, car elle dispose de fonctionnalités CRUD et prend en charge de manière unique les opérations de lecture et d&rsquo;écriture concurrentes. Cependant, elle ne peut échapper aux limitations d&rsquo;une bibliothèque de vecteurs, à savoir l&rsquo;absence de capacité de déploiement d&rsquo;écosystème, de réplication d&rsquo;instances et de tolérance aux pannes.</p>
<h2 id="bases-de-données-de-recherche-en-texte-intégral-elasticsearch-opensearch" class="heading-element"><span>2 Bases de données de recherche en texte intégral (ElasticSearch, OpenSearch)</span>
  <a href="#bases-de-donn%c3%a9es-de-recherche-en-texte-int%c3%a9gral-elasticsearch-opensearch" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les bases de données de recherche en texte intégral (par exemple, ElasticSearch et OpenSearch) peuvent prendre en charge des fonctions de recherche textuelle et d&rsquo;analyse avancée relativement complètes. Cependant, lorsqu&rsquo;il s&rsquo;agit d&rsquo;exécuter des recherches de similarité vectorielle et de traiter des données de haute dimension, elles ne sont pas aussi puissantes que les bases de données vectorielles spécialisées. Ces bases de données nécessitent souvent l&rsquo;utilisation d&rsquo;autres outils pour réaliser des recherches sémantiques, car elles reposent principalement sur des index inversés plutôt que sur des index vectoriels. Selon les résultats des tests de Qdrant, ElasticSearch est à la traîne par rapport à des bases de données vectorielles comme Weaviate, Milvus et Qdrant en termes de performances.</p>
<h2 id="bases-de-données-sql-prenant-en-charge-les-vecteurs-pgvector-supabase-starrocks" class="heading-element"><span>3 Bases de données SQL prenant en charge les vecteurs (pgvector, Supabase, StarRocks)</span>
  <a href="#bases-de-donn%c3%a9es-sql-prenant-en-charge-les-vecteurs-pgvector-supabase-starrocks" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les bases de données SQL comme pgvector, grâce à leurs extensions de support vectoriel, offrent un moyen d&rsquo;intégrer les données vectorielles dans les systèmes de stockage de données existants, mais elles présentent également certains inconvénients évidents par rapport aux bases de données vectorielles spécialisées.</p>
<p>Le défaut le plus évident est le décalage entre le modèle relationnel des bases de données SQL traditionnelles et la nature des données vectorielles non structurées. Ce décalage entraîne une inefficacité des opérations impliquant des recherches de similarité vectorielle, et ces bases de données ne sont pas idéales pour la construction d&rsquo;index et le traitement de grandes quantités de données vectorielles, comme le montre le <a href="https://github.com/erikbern/ann-benchmarks"target="_blank" rel="external nofollow noopener noreferrer">test ANN<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>. De plus, la limite de dimension des vecteurs supportée par pgvector (2000 dimensions) est relativement faible par rapport à des bases de données vectorielles spécialisées comme Weaviate, qui peut traiter des données vectorielles allant jusqu&rsquo;à 65535 dimensions. En termes d&rsquo;évolutivité et d&rsquo;efficacité, les bases de données vectorielles spécialisées ont également un avantage. Les extensions de bases de données SQL prenant en charge les vecteurs, telles que pgvector, conviennent mieux aux scénarios où le volume de données vectorielles est faible (moins de 100 000 vecteurs) et où les données vectorielles ne sont qu&rsquo;une fonction complémentaire de l&rsquo;application. En revanche, si les données vectorielles sont au cœur de l&rsquo;application ou si des exigences élevées en matière d&rsquo;évolutivité sont nécessaires, les bases de données vectorielles spécialisées sont un choix plus approprié.</p>
<p>Quant à StarRocks, c&rsquo;est un autre système fonctionnant sur un cadre SQL, optimisé pour les scénarios de traitement analytique en ligne (OLAP) et de traitement transactionnel en ligne (OLTP), mais il n&rsquo;est pas spécialement optimisé pour les recherches de similarité vectorielle.</p>
<h2 id="bases-de-données-nosql-prenant-en-charge-les-vecteurs-redis-mongodb" class="heading-element"><span>4 Bases de données NoSQL prenant en charge les vecteurs (Redis, MongoDB)</span>
  <a href="#bases-de-donn%c3%a9es-nosql-prenant-en-charge-les-vecteurs-redis-mongodb" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les fonctionnalités de support vectoriel nouvellement ajoutées dans les bases de données NoSQL sont encore à un stade précoce et n&rsquo;ont pas encore été suffisamment testées et vérifiées. Prenons l&rsquo;exemple de la recherche de similarité vectorielle (VSS) de Redis, cette fonctionnalité a été publiée en avril 2022, il y a moins de deux ans. Bien que Redis VSS puisse servir de base de données multifonctionnelle, elle n&rsquo;est pas optimisée et conçue spécifiquement pour la recherche de similarité vectorielle.</p>
<h2 id="bases-de-données-vectorielles-spécialisées-pinecone-milvus-weaviate-qdrant-vald-chroma-vespa-vearch" class="heading-element"><span>5 Bases de données vectorielles spécialisées (Pinecone, Milvus, Weaviate, Qdrant, Vald, Chroma, Vespa, Vearch)</span>
  <a href="#bases-de-donn%c3%a9es-vectorielles-sp%c3%a9cialis%c3%a9es-pinecone-milvus-weaviate-qdrant-vald-chroma-vespa-vearch" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Les bases de données vectorielles spécialisées prennent en charge nativement diverses opérations vectorielles, telles que le produit scalaire, la similarité cosinus, etc. Ces bases de données sont conçues pour traiter des données de haute dimension, capables de gérer un grand nombre de requêtes et de réaliser rapidement des recherches de similarité entre vecteurs. Pour atteindre ces objectifs, elles adoptent diverses stratégies d&rsquo;indexation, souvent basées sur des algorithmes de plus proche voisin approximatif (ANN). Ces algorithmes nécessitent de faire des compromis entre efficacité, occupation de l&rsquo;espace de stockage et précision de la recherche. Par exemple, l&rsquo;index FLAT est un index vectoriel qui n&rsquo;utilise aucune technique d&rsquo;optimisation ou d&rsquo;approximation, ce qui signifie qu&rsquo;il peut atteindre un taux de rappel et une précision de 100 %, mais il est également plus lent et moins efficace que d&rsquo;autres types d&rsquo;index vectoriels ; en revanche, l&rsquo;index IVF_FLAT sacrifie une certaine précision pour obtenir une vitesse de recherche plus rapide ; l&rsquo;index HNSW offre un compromis entre précision et vitesse de recherche.</p>
<p>Pinecone est une base de données vectorielle à code source fermé, maintenue par une équipe professionnelle, dont la version gratuite offre des fonctionnalités limitées en termes d&rsquo;évolutivité. Chroma est un système spécialement conçu pour les données audio, mais il n&rsquo;a pas été particulièrement optimisé pour le traitement des données textuelles. Par rapport à d&rsquo;autres bases de données vectorielles grand public, Chroma manque de documentation sur les tests de performance globale. Étant donné que Chroma utilise SQLite comme méthode de stockage de documents dans sa version 0.4, il peut ne pas être aussi évolutif et efficace que d&rsquo;autres solutions de stockage conçues spécifiquement pour les données vectorielles.</p>
<p>Vearch et Vald présentent des lacunes en matière d&rsquo;intégration avec Langchain, ce qui est défavorable au développement et à l&rsquo;utilisation. Par rapport à des concurrents comme Milvus, leur communauté de développeurs est plus petite et la maintenance de la communauté open source n&rsquo;est pas très active.</p>
<p>Par conséquent, pour le RAG, Weaviate, Milvus, Qdrant et Vespa pourraient être les meilleurs choix. En théorie, le choix du système le plus approprié devrait être basé sur les tests de performance et d&rsquo;évolutivité (voir ci-dessous les benchmarks ANN) mais il y a aussi des caractéristiques de conception du système et des fonctionnalités à comparer. Le tableau ci-dessous présente une comparaison visuelle de ces aspects.</p>
<table>
  <thead>
      <tr>
          <th>Base de données</th>
          <th>Qdrant</th>
          <th>Weaviate</th>
          <th>Milvus</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Open source et auto-hébergeable</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Licence open source</td>
          <td>Apache-2.0</td>
          <td>BSD</td>
          <td>Apache-2.0</td>
      </tr>
      <tr>
          <td>Langage de développement</td>
          <td>Rust</td>
          <td>Go</td>
          <td>Go, C++</td>
      </tr>
      <tr>
          <td>Étoiles GitHub</td>
          <td>17k</td>
          <td>9.2k</td>
          <td>26.2k</td>
      </tr>
      <tr>
          <td>Date de première publication</td>
          <td>2021</td>
          <td>2019</td>
          <td>2019</td>
      </tr>
      <tr>
          <td>SDK</td>
          <td>Python, JS, Go, Java, .Net, Rust</td>
          <td>Python, JS, Java, Go</td>
          <td>Python, Java, JS, Go</td>
      </tr>
      <tr>
          <td>Service cloud hébergé</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Intégration de texte intégrée</td>
          <td><a href="https://qdrant.github.io/fastembed/examples/Supported_Models/">✅FastEmbed</a></td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>Recherche hybride</td>
          <td>❌</td>
          <td>✅RRF*+RSF*</td>
          <td><a href="https://milvus.io/docs/multi-vector-search.md"> ✅Recherche multi-vecteurs dans la table</a></td>
      </tr>
      <tr>
          <td>Filtrage des métadonnées</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Support BM25</td>
          <td>❌</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Recherche de texte</td>
          <td>✅</td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>Multi-vecteurs par point</td>
          <td>✅</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>Recherche Tensor</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>Intégration Langchain</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Intégration de l&rsquo;index Llama</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Recherche d&rsquo;informations géographiques</td>
          <td>✅</td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>Support multi-locataires</td>
          <td>✅ via collections/métadonnées</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>Limite de taille des métadonnées et des documents</td>
          <td>Illimitée</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Dimension maximale</td>
          <td>Illimitée</td>
          <td>65535</td>
          <td>32768</td>
      </tr>
      <tr>
          <td>Types d&rsquo;index</td>
          <td>HNSW</td>
          <td>HNSW</td>
          <td>ANNOY, FAISS, HNSW, ScANN …</td>
      </tr>
      <tr>
          <td>Indexation en flux</td>
          <td>❌</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Support des vecteurs clairsemés</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>Support des index temporaires (sans serveur)</td>
          <td>✅</td>
          <td>❌</td>
          <td></td>
      </tr>
      <tr>
          <td>Sharding</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Prix</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Facettes (agrégation avec comptage)</td>
          <td>❌</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>Intégration d&rsquo;images intégrée</td>
          <td></td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>API de recommandation</td>
          <td>✅</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Personnalisation</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Événements utilisateur</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Utilisation de LLM intégré pour le RAG</td>
          <td></td>
          <td><a href="https://weaviate.io/developers/weaviate/modules/reader-generator-modules/generative-openai">✅Recherche générative </a></td>
          <td></td>
      </tr>
  </tbody>
</table>
<table>
  <thead>
      <tr>
          <th>Base de données</th>
          <th>Qdrant</th>
          <th>Weaviate</th>
          <th>Milvus</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Avantages subjectifs</td>
          <td>1. Peut stocker plusieurs types de vecteurs (images, texte, etc.) dans une collection <br>2. Consommation de ressources très faible</td>
          <td>1. Performances relativement bonnes <br> 2. Supporte l&rsquo;intégration intégrée <br> 3. Supporte la recherche de texte <br> 4. API GraphQL <br> 5. Supporte la sauvegarde S3</td>
          <td>1. Interface d&rsquo;opération visuelle supportée officiellement<br> 2. Précision de recherche élevée<br> 3. SDK riche<br> 4. Accélération GPU</td>
      </tr>
  </tbody>
</table>
<p>En résumé, Qdrant a des coûts particulièrement faibles, <strong>Weaviate supporte la combinaison de la recherche vectorielle, du stockage d&rsquo;objets et de l&rsquo;index inversé</strong>, Milvus a les performances les plus fortes et le plus de fonctionnalités.</p>
<h2 id="comparaison-des-méthodes-de-recherche-des-bases-de-données-vectorielles" class="heading-element"><span>6 Comparaison des méthodes de recherche des bases de données vectorielles</span>
  <a href="#comparaison-des-m%c3%a9thodes-de-recherche-des-bases-de-donn%c3%a9es-vectorielles" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><div align="center"><img src="https://cdn1.zair.top/images/2024/04/15d0b710c084965f99586dceccb62898.png" alt="Comparaison des méthodes de recherche des bases de données vectorielles" style="width: 75%;"></div>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Milvus</th>
          <th>Weaviate</th>
          <th>Qdrant</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Méthode de recherche unique</td>
          <td>Recherche multi-vecteurs</td>
          <td>Recherche par mots-clés BM25 + recherche hybride</td>
          <td>Filtrage par mots-clés appliqué à la recherche vectorielle</td>
      </tr>
  </tbody>
</table>
<h3 id="milvus" class="heading-element"><span>6.1 Milvus</span>
  <a href="#milvus" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Milvus supporte deux types de recherche, selon le nombre de champs vectoriels dans la collection : recherche mono-vecteur et recherche multi-vecteurs.</p>
<p>La recherche mono-vecteur utilise la méthode search(), compare le vecteur de requête avec les vecteurs existants dans la collection, et renvoie l&rsquo;ID des entités les plus similaires et la distance entre elles. Il est également possible de renvoyer les valeurs vectorielles et les métadonnées des résultats de manière optionnelle.</p>
<p>La recherche multi-vecteurs est adaptée aux collections ayant deux champs vectoriels ou plus, et est exécutée via la méthode hybrid_search(), qui exécute plusieurs requêtes de recherche de plus proche voisin approximatif (ANN) et combine les résultats pour renvoyer les correspondances les plus pertinentes. (La dernière version 2.4.x supporte jusqu&rsquo;à 10 vecteurs pour la recherche)</p>
<p><strong>La recherche multi-vecteurs</strong> est particulièrement adaptée aux situations complexes nécessitant une haute précision, notamment lorsque la même entité peut être représentée par plusieurs vecteurs différents. Cela s&rsquo;applique aux mêmes données (comme une phrase) traitées par différents modèles d&rsquo;intégration, ou lorsque des informations multimodales (comme des images, empreintes digitales et empreintes vocales d&rsquo;une personne) sont converties en divers formats vectoriels. Grâce au &ldquo;rappel multi-chemins&rdquo; à l&rsquo;échelle de la table et à l&rsquo;attribution de poids à ces vecteurs, leur action combinée peut augmenter considérablement la capacité de rappel et améliorer l&rsquo;efficacité des résultats de recherche.</p>
<p>Autres opérations de recherche de base :</p>
<ul>
<li>La recherche de base comprend la recherche mono-vecteur, la recherche par lots de vecteurs, la recherche par partition et la recherche avec des champs de sortie spécifiés.</li>
<li>La recherche par filtrage affine les résultats de recherche en fonction des conditions de filtrage des champs scalaires.</li>
<li>La recherche par plage trouve les vecteurs situés dans une plage de distance spécifique par rapport au vecteur de requête.</li>
<li>La recherche par regroupement regroupe les résultats de recherche en fonction d&rsquo;un champ spécifique pour assurer la diversité des résultats.</li>
</ul>
<h3 id="weaviate" class="heading-element"><span>6.2 Weaviate</span>
  <a href="#weaviate" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>Recherche de similarité vectorielle : couvre une gamme de méthodes de recherche approximative, cette recherche cherche les objets les plus similaires à la représentation vectorielle de la requête.</li>
<li>Recherche d&rsquo;images : utilise des images comme entrée pour la recherche de similarité.</li>
<li><strong>Recherche par mots-clés : une recherche par mots-clés utilisant l&rsquo;algorithme BM25F pour classer les résultats.</strong></li>
<li><strong>Recherche hybride : combine BM25 et la recherche de similarité pour classer les résultats.</strong></li>
<li>Recherche générative : utilise les résultats de recherche comme prompts pour les LLM.</li>
<li>Réorganisation : réorganise les résultats de recherche récupérés à l&rsquo;aide d&rsquo;un module de réorganisation.</li>
<li>Agrégation : agrège les données à partir de l&rsquo;ensemble des résultats.</li>
<li>Filtres : applique des filtres conditionnels à la recherche.</li>
</ul>
<h3 id="qdrant" class="heading-element"><span>6.3 Qdrant</span>
  <a href="#qdrant" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Opérations de recherche de base supportées :</p>
<ul>
<li>Filtrage par score de pertinence</li>
<li>Chargement de plusieurs opérations de recherche dans une seule requête</li>
<li>API de recommandation</li>
<li>Opérations de regroupement</li>
</ul>
<p>Autres méthodes de recherche supportées par Qdrant :</p>
<blockquote>
<p><a href="https://qdrant.tech/documentation/faq/qdrant-fundamentals/#does-qdrant-support-a-full-text-search-or-a-hybrid-search"target="_blank" rel="external nofollow noopener noreferrer">Qdrant supporte-t-il une recherche en texte intégral ou une recherche hybride ?<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
</blockquote>
<blockquote>
<p>Qdrant est avant tout un moteur de recherche vectorielle, nous ne mettons en œuvre un support complet du texte que si cela n&rsquo;affecte pas les cas d&rsquo;utilisation de la recherche vectorielle. Cela inclut l&rsquo;interface et les performances.</p>
<p>Ce que Qdrant peut faire :</p>
<ul>
<li>Recherche avec des filtres de texte intégral</li>
<li><strong>Appliquer des filtres de texte intégral à la recherche vectorielle</strong> (c&rsquo;est-à-dire effectuer une recherche vectorielle dans les enregistrements contenant un mot ou une phrase spécifique)</li>
<li>Faire des recherches par préfixe et des recherches sémantiques instantanées</li>
</ul>
<p>Fonctionnalités que Qdrant prévoit d&rsquo;introduire à l&rsquo;avenir :</p>
<ul>
<li>Support des vecteurs clairsemés, comme ceux utilisés dans SPLADE ou des modèles similaires</li>
</ul>
<p>Fonctionnalités que Qdrant ne prévoit pas de supporter :</p>
<ul>
<li>BM25 ou d&rsquo;autres fonctions de récupération ou de classement non basées sur les vecteurs</li>
<li>Ontologie intégrée ou graphe de connaissances</li>
<li>Analyseur de requêtes et autres outils NLP</li>
</ul>
</blockquote>
<div class="details admonition question open">
  <div class="details-summary admonition-title"><i class="icon fa-fw fa-regular fa-circle-question" aria-hidden="true"></i>Quelle est la différence entre BM25 et une simple recherche par mots-clés ?<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i></div>
  <div class="details-content">
    <div class="admonition-content"><ol>
<li><strong>Score de pertinence</strong> :
<ul>
<li><strong>Une simple recherche par mots-clés</strong> est généralement basée sur la fréquence des mots : si un mot apparaît dans un document, alors ce document est considéré comme pertinent. Cette méthode peut simplement compter le nombre d&rsquo;occurrences des mots-clés, et tous les mots-clés sont considérés comme également importants.</li>
<li><strong>BM25</strong> utilise un algorithme plus complexe qui prend en compte non seulement la fréquence des mots, mais aussi la longueur du document et la fréquence inverse des documents (c&rsquo;est-à-dire la rareté du mot dans l&rsquo;ensemble des documents). Cela signifie que BM25 peut fournir un score de pertinence plus finement ajusté, reflétant mieux la correspondance entre la requête et le document.</li>
</ul>
</li>
<li><strong>Traitement de la longueur du document</strong> :
<ul>
<li>Une simple recherche par mots-clés peut ne pas tenir compte de la longueur du document. Cela peut conduire à une préférence excessive pour les documents plus longs (contenant plus de mots) simplement parce qu&rsquo;ils ont plus de chances de contenir les mots-clés.</li>
<li>BM25 prend en compte la longueur du document par un processus de normalisation interne à son algorithme, évitant ainsi ce biais et assurant une équité dans le score de pertinence entre les documents longs et courts.</li>
</ul>
</li>
<li><strong>Importance des mots de la requête</strong> :
<ul>
<li>Dans une simple recherche par mots-clés, tous les mots-clés peuvent être traités de manière égale, indépendamment de leur universalité.</li>
<li>BM25 utilise la fréquence inverse des documents (IDF) pour ajuster l&rsquo;importance de chaque mot de la requête. Cela signifie que les mots apparaissant dans moins de documents (plus uniques) auront un impact plus important sur le score de pertinence du document.</li>
</ul>
</li>
<li><strong>Réglage des paramètres</strong> :
<ul>
<li>Une simple recherche par mots-clés n&rsquo;offre généralement pas beaucoup de paramètres configurables pour optimiser les résultats de recherche.</li>
<li>BM25 fournit des paramètres (comme k1 et b) permettant un ajustement fin de la sensibilité de l&rsquo;algorithme pour s&rsquo;adapter à différents types de textes et besoins de recherche.</li>
</ul>
</li>
</ol>
<p>Comparé à une simple recherche par mots-clés, BM25 offre une méthode plus complexe et raffinée pour évaluer la pertinence entre les documents et les requêtes, pouvant produire des résultats de recherche plus précis et mieux alignés avec les attentes des utilisateurs.</p></div>
  </div>
</div>
<p>Actuellement, la question qui se pose est de savoir s&rsquo;il existe une solution qui permette à la fois de bénéficier des caractéristiques de recherche sémantique des bases de données vectorielles et de la précision de la recherche par mots-clés traditionnelle.</p>
<h2 id="annexe" class="heading-element"><span>7 Annexe</span>
  <a href="#annexe" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="benchmarks-ann" class="heading-element"><span>7.1 Benchmarks ANN</span>
  <a href="#benchmarks-ann" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><blockquote>
<p>Les benchmarks peuvent être perturbés par divers facteurs influençant les performances des bases de données, tels que le type de recherche (recherche filtrée ou recherche régulière), les paramètres de configuration, l&rsquo;algorithme d&rsquo;indexation, l&rsquo;intégration des données, le matériel, etc. Outre les performances des benchmarks, le choix d&rsquo;une bibliothèque de vecteurs doit également prendre en compte la capacité de distribution, le support des répliques en mémoire et du cache, l&rsquo;algorithme d&rsquo;indexation utilisé, la capacité de recherche de similarité vectorielle (y compris la recherche hybride, le filtrage et les mesures de similarité multiples), le mécanisme de sharding, la méthode de clustering, le potentiel d&rsquo;évolutivité, la cohérence des données et la disponibilité globale du système.</p>
</blockquote>
<p><a href="https://github.com/erikbern/ann-benchmarks"target="_blank" rel="external nofollow noopener noreferrer">ANN-Benchmarks<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> est la principale plateforme de benchmark pour évaluer les performances de recherche des algorithmes de plus proche voisin approximatif. Dans la recherche de texte, les performances des bases de données vectorielles sur les mesures angulaires sont souvent plus importantes que leurs performances sur les mesures euclidiennes. En effet, les mesures angulaires sont plus sensibles à la similarité sémantique des documents textuels, tandis que les mesures euclidiennes sont plus sensibles à la longueur et à l&rsquo;échelle des documents. Par conséquent, lors de l&rsquo;évaluation du contexte généré par la recherche, il est plus important de se concentrer sur l&rsquo;évaluation des performances des bases de données vectorielles sur des ensembles de données angulaires couvrant différentes dimensions.</p>
<h4 id="glove-100-angular" class="heading-element"><span>7.1.1 glove-100-angular</span>
  <a href="#glove-100-angular" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div align="center"><img src="https://cdn1.zair.top/images/2024/04/77413edaa99720289808ab7dd1da27cc.png" alt="glove-100-angular benchmark" style="width: 75%;"></div>
Il est évident que Milvus a le débit le plus élevé lorsque la valeur de rappel est inférieure à 0,95. Lorsque la valeur de rappel dépasse 0,95, l'écart de débit se réduit. Vespa a le temps de construction le plus long. Weaviate et Milvus ont des temps de construction similaires, mais Milvus est légèrement plus long. En termes de taille d'index, Weaviate a l'index le plus petit. Bien que l'index de Milvus soit le plus grand, il est également inférieur à 1,5 Go (ensemble de données contenant 1,2 million de vecteurs, chaque vecteur ayant 100 dimensions).
<h4 id="nytimes-256-angular" class="heading-element"><span>7.1.2 nytimes-256-angular</span>
  <a href="#nytimes-256-angular" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div align="center"><img src="https://cdn1.zair.top/images/2024/04/d2ef6ccb67567ccf48793c7df8520f65.png" alt="nytimes-256-angular benchmark" style="width: 75%;"></div>
Les résultats sur cet ensemble de données sont similaires à ceux de l'ensemble de données glove-100-angular. Weaviate a le temps de construction le plus long et l'index le plus petit sur cet ensemble de données. L'index de Milvus est le plus grand, mais il ne fait que 440 Mo (ensemble de données contenant 290 000 vecteurs, chaque vecteur ayant 256 dimensions).
<h3 id="indicateurs-de-similarité-vectorielle" class="heading-element"><span>7.2 Indicateurs de similarité vectorielle</span>
  <a href="#indicateurs-de-similarit%c3%a9-vectorielle" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><table>
  <thead>
      <tr>
          <th>Indicateur</th>
          <th>Description</th>
          <th>Bases de données supportées</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Distance cosinus</td>
          <td>Mesure la valeur du cosinus de l&rsquo;angle entre deux vecteurs</td>
          <td>pgvector, Pinecone, Weaviate, Qdrant, Milvus, Vespa</td>
      </tr>
      <tr>
          <td>Distance euclidienne (L2)</td>
          <td>Calcule la distance en ligne droite entre deux vecteurs dans un espace multidimensionnel</td>
          <td>pgvector, Pinecone, Qdrant, Milvus, Vespa</td>
      </tr>
      <tr>
          <td>Produit scalaire (produit point)</td>
          <td>Calcule la somme des produits des composantes correspondantes des vecteurs</td>
          <td>pgvector, Pinecone, Weaviate, Qdrant, Milvus</td>
      </tr>
      <tr>
          <td>Distance L2 au carré</td>
          <td>Carré de la distance euclidienne entre deux vecteurs</td>
          <td>Weaviate</td>
      </tr>
      <tr>
          <td>Distance de Hamming</td>
          <td>Mesure le nombre de différences entre les vecteurs sur chaque dimension</td>
          <td>Weaviate, Milvus, Vespa</td>
      </tr>
      <tr>
          <td>Distance de Manhattan</td>
          <td>Mesure la distance entre les dimensions des vecteurs le long des axes orthogonaux</td>
          <td>Weaviate</td>
      </tr>
  </tbody>
</table>
<p>Voici une présentation détaillée de chaque indicateur, y compris leurs avantages et inconvénients relatifs, ainsi que les scénarios d&rsquo;utilisation adaptés.</p>
<h4 id="distance-cosinus" class="heading-element"><span>7.2.1 Distance cosinus</span>
  <a href="#distance-cosinus" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>La distance cosinus mesure la valeur du cosinus de l&rsquo;angle entre deux vecteurs, souvent utilisée pour traiter des ensembles normalisés ou convexes.</p>
<ul>
<li>Avantages : Prend principalement en compte la direction des vecteurs, ce qui la rend très adaptée aux espaces de haute dimension, comme la comparaison de textes, car dans ce contexte, la longueur des documents est moins importante.</li>
<li>Inconvénients : Pas adaptée aux scénarios nécessitant une correspondance des dimensions des vecteurs, par exemple lors de la comparaison des embeddings d&rsquo;images basés sur la densité des pixels. Si les données ne forment pas un ensemble convexe, elle peut ne pas fournir une mesure de similarité précise.</li>
</ul>
<p>La distance cosinus est adaptée à la classification de documents, à la recherche sémantique, aux systèmes de recommandation et à toute autre tâche impliquant des données de haute dimension et normalisées. Dans la recherche d&rsquo;informations, la distance cosinus est souvent utilisée pour mesurer la similarité entre le contenu de la requête et les vecteurs de documents, en ignorant leur longueur mais en se concentrant sur la signification sémantique.</p>
<h4 id="distance-euclidienne-l2" class="heading-element"><span>7.2.2 Distance euclidienne L2</span>
  <a href="#distance-euclidienne-l2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>La distance euclidienne calcule la distance en ligne droite entre deux vecteurs dans un espace multidimensionnel, également appelée norme-2.</p>
<ul>
<li>Avantages : Intuitive, facile à calculer, sensible à la fois à la taille et à la direction des vecteurs.</li>
<li>Inconvénients : Peut ne pas bien fonctionner dans les espaces de haute dimension en raison de la &ldquo;malédiction de la dimensionnalité&rdquo;.</li>
</ul>
<p>Adaptée aux scénarios de reconnaissance d&rsquo;images, de reconnaissance vocale, d&rsquo;analyse d&rsquo;écriture manuscrite, etc.</p>
<h4 id="produit-scalaire" class="heading-element"><span>7.2.3 Produit scalaire</span>
  <a href="#produit-scalaire" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>Le produit scalaire calcule la somme des produits des composantes correspondantes des vecteurs, également appelé norme-n.</p>
<ul>
<li>Avantages : Calcul rapide, peut refléter la taille et la direction des vecteurs.</li>
<li>Inconvénients : Sensible à la fois à la direction et à la taille des vecteurs.</li>
</ul>
<p>L&rsquo;application la plus classique du produit scalaire se trouve dans le domaine des systèmes de recommandation. Dans les systèmes de recommandation, le produit scalaire peut être utilisé pour déterminer la similarité entre les vecteurs utilisateur et les vecteurs d&rsquo;articles, aidant à prédire l&rsquo;intérêt d&rsquo;un utilisateur pour un article. Le produit scalaire est adapté aux systèmes de recommandation, au filtrage collaboratif, à la décomposition matricielle.</p>
<h4 id="distance-l2-au-carré" class="heading-element"><span>7.2.4 Distance L2 au carré</span>
  <a href="#distance-l2-au-carr%c3%a9" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>Carré de la distance euclidienne entre deux vecteurs.</p>
<ul>
<li>Avantages : Pénalise les grandes différences entre les éléments des vecteurs, ce qui peut être utile dans certains cas.</li>
<li>Inconvénients : L&rsquo;opération de mise au carré peut fausser les distances et est sensible aux valeurs aberrantes.</li>
</ul>
<p>La distance L2 au carré est particulièrement adaptée aux problèmes de différence d&rsquo;éléments individuels, par exemple dans le traitement d&rsquo;images, pour comparer les différences entre deux images.</p>
<h4 id="distance-de-hamming" class="heading-element"><span>7.2.5 Distance de Hamming</span>
  <a href="#distance-de-hamming" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>Mesure le nombre de différences entre les vecteurs sur chaque dimension.</p>
<ul>
<li>Avantages : Adaptée à la comparaison de données binaires ou catégorielles.</li>
<li>Inconvénients : Pas adaptée aux données continues ou numériques.</li>
</ul>
<p>Les scénarios d&rsquo;application sont également assez spécifiques, par exemple la détection et la correction d&rsquo;erreurs (données catégorielles) ; mesure de la distance génétique entre deux chaînes d&rsquo;ADN.</p>
<h4 id="distance-de-manhattan-l1" class="heading-element"><span>7.2.6 Distance de Manhattan L1</span>
  <a href="#distance-de-manhattan-l1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>Mesure la distance entre les dimensions des vecteurs le long des axes orthogonaux, également appelée norme-1.</p>
<ul>
<li>Avantages : Plus résistante aux valeurs aberrantes que la distance euclidienne.</li>
<li>Inconvénients : Moins intuitive en termes de signification géométrique que la distance euclidienne.</li>
</ul>
<p>Adaptée au calcul de la distance sur un échiquier, aux problèmes de planification logistique des chemins les plus courts.</p>
<h2 id="références" class="heading-element"><span>8 Références</span>
  <a href="#r%c3%a9f%c3%a9rences" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://github.com/milvus-io/milvus"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/milvus-io/milvus<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://www.farfetchtechblog.com/en/blog/post/powering-ai-with-vector-databases-a-benchmark-part-i/"target="_blank" rel="external nofollow noopener noreferrer">Powering AI With Vector Databases: A Benchmark - Part I - Data - Blog - F-Tech (farfetchtechblog.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://qdrant.tech/documentation/faq/qdrant-fundamentals/"target="_blank" rel="external nofollow noopener noreferrer">Fundamentals - Qdrant<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://milvus.io/docs"target="_blank" rel="external nofollow noopener noreferrer">Milvus documentation<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://weaviate.io/developers/weaviate"target="_blank" rel="external nofollow noopener noreferrer">Home | Weaviate - Vector Database<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://qdrant.tech/documentation/"target="_blank" rel="external nofollow noopener noreferrer">Qdrant Documentation - Qdrant<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://qdrant.tech/use-cases/"target="_blank" rel="external nofollow noopener noreferrer">Vector Database Use Cases - Qdrant<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>
]]></description>
    </item>
    <item>
      <title>De la base de connaissances d&#39;IA à RAG</title>
      <link>https://www.zair.top/fr/post/rag-knowledge-base/</link>
      <pubDate>Thu, 21 Mar 2024 17:14:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/rag-knowledge-base/</guid>
      <category domain="https://www.zair.top/fr/categories/llm/">Llm</category>
      <description><![CDATA[<p>Lors de la création d&rsquo;applications d&rsquo;IA, on rencontre le problème de &ldquo;l&rsquo;IA n&rsquo;a pas vu les données de la tâche&rdquo;. Par exemple, pour les entreprises, l&rsquo;IA ne peut pas maîtriser les informations de chaque client ; pour les particuliers, l&rsquo;IA ne connaît pas bien certaines informations personnelles ou privées. Même si l&rsquo;IA est très performante (même dans un modèle de monde idéal), elle perd la capacité d&rsquo;&ldquo;analyser des problèmes spécifiques&rdquo; en l&rsquo;absence de données spécifiques à la tâche.</p>
<h2 id="quest-ce-que-rag" class="heading-element"><span>1 Qu&rsquo;est-ce que RAG</span>
  <a href="#quest-ce-que-rag" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Améliorer la précision et la fiabilité des modèles d&rsquo;IA génératifs en récupérant des informations externes est ce qu&rsquo;on appelle la technologie de génération augmentée par la récupération (<strong>R</strong>etrieval-<strong>A</strong>ugmented <strong>G</strong>eneration). Si l&rsquo;on compare le processus de réalisation de tâches par les grands modèles de langage (LLM) à un examen, alors un grand modèle avec RAG équivaut à un examen à livre ouvert, tandis que sans RAG, c&rsquo;est comme un examen à livre fermé. RAG est une technologie qui aide les LLM à <strong>récupérer</strong> des informations pour améliorer l&rsquo;effet de <strong>génération</strong>.</p>
<p>RAG a été proposé pour la première fois par Patrick Lewis et al. dans <a href="https://arxiv.org/pdf/2005.11401.pdf"target="_blank" rel="external nofollow noopener noreferrer">cet article<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, et leur entreprise est Cohere, qui propose actuellement des services API incluant des modèles d&rsquo;Embedding et de Rerank, avec de bonnes performances.</p>
<h2 id="pourquoi-avons-nous-besoin-de-rag" class="heading-element"><span>2 Pourquoi avons-nous besoin de RAG</span>
  <a href="#pourquoi-avons-nous-besoin-de-rag" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>L&rsquo;apparition de RAG vise à résoudre certains problèmes et insuffisances des grands modèles de langage lors de leur application. Le point le plus notable est le <strong>problème des hallucinations des grands modèles</strong>, c&rsquo;est-à-dire que la sortie des grands modèles peut ne pas correspondre aux faits ou inventer des réponses. De plus, les données utilisées pour entraîner les LLM peuvent être obsolètes, et les LLM ne connaissent rien des informations récentes.</p>
<p>RAG permet aux LLM d&rsquo;accéder à des informations récentes ou personnalisées et permet aux utilisateurs de vérifier les sources d&rsquo;information des LLM pour garantir leur exactitude. Les données récupérées par RAG peuvent être publiques (comme les moteurs de recherche) ou privées (comme les informations d&rsquo;entreprise, les données personnelles sensibles), ce qui offre un large éventail d&rsquo;applications pour RAG. RAG est déjà largement utilisé, par exemple, le NeMo Retriever de Nvidia lit les informations internes de l&rsquo;entreprise, et Kimi Chat de Dark Side of the Moon utilise des moteurs de recherche pour répondre.</p>
<div align="center"><img src="https://cdn1.zair.top/images/2024%2F03%2Fa4c4933267645b81ed019e29ccc8ced6.png" alt="Jensen Huang présentant le NeMo Retriever à GTC2024" style="width: 75%;"></div>
Jensen Huang présentant le NeMo Retriever à GTC2024
<h2 id="base-de-connaissances-construite-autour-de-rag" class="heading-element"><span>3 Base de connaissances construite autour de RAG</span>
  <a href="#base-de-connaissances-construite-autour-de-rag" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>La base de connaissances d&rsquo;IA est un outil important pour permettre à l&rsquo;IA de &ldquo;s&rsquo;adapter aux besoins&rdquo;. En aidant l&rsquo;IA à mieux accomplir les tâches grâce à la base de connaissances, la construction de bases de connaissances d&rsquo;IA peut actuellement se faire de trois manières :</p>
<ul>
<li>Ingénierie des invites (Prompt Engineering)</li>
<li>Réglage fin (Fine Tuning)</li>
<li>Embedding (Embedding)</li>
</ul>
<p>L&rsquo;ingénierie des invites consiste à construire directement une base de connaissances dans les invites, en plaçant toutes les informations dans les invites. Cette méthode convient à une utilisation à petite échelle, mais le nombre de tokens d&rsquo;entrée des modèles d&rsquo;IA actuels ne peut généralement pas répondre à cette méthode. En fait, même avec le développement de l&rsquo;IA, le jour où la fenêtre d&rsquo;entrée de l&rsquo;IA sera suffisamment grande pour contenir une base de connaissances générale, la construction de bases de connaissances aura toujours sa valeur. Car la longueur du contenu d&rsquo;entrée affecte les performances de l&rsquo;IA (<del>du moins pour les modèles actuels</del>), comme le montre <a href="https://github.com/gkamradt/LLMTest_NeedleInAHaystack"target="_blank" rel="external nofollow noopener noreferrer">Needle In A Haystack - Pressure Testing LLMs<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</p>
<p>Le réglage fin est une forme populaire dans le milieu académique, utilisant des données de tâches spécifiques pour ajuster un modèle pré-entraîné. Cette méthode est en fait adaptée pour créer un grand modèle générique pour un secteur, comme un grand modèle pour le secteur juridique, un grand modèle pour le secteur médical, etc. D&rsquo;une part, les données d&rsquo;entraînement nécessaires pour le réglage fin ne sont pas peu nombreuses, et le coût est élevé ; d&rsquo;autre part, le réglage fin n&rsquo;est pas assez flexible, par exemple pour s&rsquo;ajuster rapidement en fonction d&rsquo;un ou deux documents. Le processus de réglage fin consiste en fait à apprendre et généraliser les données d&rsquo;entraînement, plutôt qu&rsquo;à mémoriser le contenu, il s&rsquo;agit plutôt d&rsquo;améliorer les capacités dans un domaine particulier.</p>
<p>Ainsi, la méthode la plus courante pour construire une base de connaissances est actuellement l&rsquo;Embedding. Et ce type de base de connaissances nécessite également une combinaison avec RAG pour être efficace.</p>
<h2 id="composants-de-base-de-rag" class="heading-element"><span>4 Composants de base de RAG</span>
  <a href="#composants-de-base-de-rag" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Une composition classique et basique de RAG est illustrée ci-dessous.</p>
<div align="center"><img src="https://cdn1.zair.top/images/2024/03/rag-base.drawio.svg" alt="Composants de base de RAG" style="width: 75%;"></div>
Le système RAG comprend principalement trois étapes : indexation, récupération et génération.
<h3 id="embedding" class="heading-element"><span>4.1 Embedding</span>
  <a href="#embedding" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Dans ce processus, l&rsquo;utilisateur doit d&rsquo;abord télécharger des documents, que le système stocke dans une base de données vectorielle après les avoir passés par l&rsquo;Embedding. L&rsquo;Embedding consiste à convertir des textes sémantiquement similaires en vecteurs proches, ce qui est communément appelé vectorisation.</p>
<h3 id="récupération" class="heading-element"><span>4.2 Récupération</span>
  <a href="#r%c3%a9cup%c3%a9ration" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Lorsque l&rsquo;utilisateur pose une question au LLM, le contenu de la question est converti en vecteur et correspond dans la base de données vectorielle, récupérant une série de contenus. C&rsquo;est la première étape de la récupération.</p>
<h3 id="rerank" class="heading-element"><span>4.3 Rerank</span>
  <a href="#rerank" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Le contenu récupéré directement dans la base de données vectorielle peut ne pas être parfait, et les résultats ne correspondent souvent pas au contenu de la requête, nécessitant une deuxième étape de récupération, appelée Rerank. À cette étape, le modèle Rerank réorganise le contenu récupéré lors de l&rsquo;étape précédente, en produisant un classement des résultats selon leur pertinence. Une fois le Rerank terminé, on peut appliquer le Top K dans la phase de génération suivante.</p>
<h2 id="implémentation-de-rag-en-5-lignes-de-code" class="heading-element"><span>5 Implémentation de RAG en 5 lignes de code</span>
  <a href="#impl%c3%a9mentation-de-rag-en-5-lignes-de-code" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><blockquote>
<p><del>Une instruction d&rsquo;affectation compte pour une ligne</del></p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">transformers</span> <span class="kn">import</span> <span class="n">RagTokenizer</span><span class="p">,</span> <span class="n">RagRetriever</span><span class="p">,</span> <span class="n">RagTokenForGeneration</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datasets</span> <span class="kn">import</span> <span class="n">load_dataset</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">retriever</span> <span class="o">=</span> <span class="n">RagRetriever</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">config_name</span> <span class="o">=</span> <span class="s2">&#34;facebook/rag-token-nq&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">index_name</span> <span class="o">=</span> <span class="s2">&#34;compressed&#34;</span><span class="p">,</span>  <span class="c1"># Type d&#39;index</span>
</span></span><span class="line"><span class="cl">    <span class="n">use_dummy_dataset</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>  <span class="c1"># Utiliser un jeu de données factice pour tester</span>
</span></span><span class="line"><span class="cl">    <span class="n">dataset</span> <span class="o">=</span> <span class="s2">&#34;wiki_dpr&#34;</span>  <span class="c1"># Jeu de données utilisé pour la récupération</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Charger le tokenizer et le modèle pré-entraînés</span>
</span></span><span class="line"><span class="cl"><span class="n">tokenizer</span> <span class="o">=</span> <span class="n">RagTokenizer</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span><span class="s2">&#34;facebook/rag-token-nq&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">model</span> <span class="o">=</span> <span class="n">RagTokenForGeneration</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span><span class="s2">&#34;facebook/rag-token-nq&#34;</span><span class="p">,</span> <span class="n">retriever</span><span class="o">=</span><span class="n">retriever</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Entrer une question et la convertir en vecteur</span>
</span></span><span class="line"><span class="cl"><span class="n">input_ids</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">(</span><span class="n">input_text</span> <span class="o">=</span> <span class="s2">&#34;What is the capital of France?&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">		<span class="n">return_tensors</span><span class="o">=</span><span class="s2">&#34;pt&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">input_ids</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Générer une réponse</span>
</span></span><span class="line"><span class="cl"><span class="n">outputs</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="n">input_ids</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">tokenizer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">outputs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">skip_special_tokens</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span></span></span></code></pre></td></tr></table>
</div>
</div><p><code>RagTokenizer</code> est utilisé pour le tokenisation du texte, <code>RagTokenForGeneration</code> est la partie génératrice du modèle RAG, et <code>RagRetriever</code> est responsable de la récupération. <code>RagTokenizer.from_pretrained(&quot;facebook/rag-token-nq&quot;)</code> charge un tokenizer pré-entraîné pour convertir le texte en un format compréhensible par le modèle (c&rsquo;est-à-dire le tokenisation). <code>RagTokenForGeneration.from_pretrained(&quot;facebook/rag-token-nq&quot;, retriever=retriever)</code> charge le modèle RAG pré-entraîné. <code>facebook/rag-token-nq</code> est le nom du modèle et du tokenizer, qui sont pré-entraînés sur le jeu de données Natural Questions.</p>
<h2 id="implémentations-open-source-de-rag" class="heading-element"><span>6 Implémentations open-source de RAG</span>
  <a href="#impl%c3%a9mentations-open-source-de-rag" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><a href="https://github.com/langgenius/dify"target="_blank" rel="external nofollow noopener noreferrer">Dify<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> est une plateforme de développement d&rsquo;applications LLM, avec plus de 100 000 applications construites sur <a href="http://dify.ai/"target="_blank" rel="external nofollow noopener noreferrer">Dify.AI<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>. Elle intègre les concepts de Backend as Service et LLMOps, couvrant la pile technologique de base nécessaire pour construire des applications natives d&rsquo;IA générative, <strong>y compris un moteur RAG intégré</strong>. Avec Dify, vous pouvez déployer des capacités similaires à Assistants API et GPTs sur n&rsquo;importe quel modèle. Ce projet est dirigé par une entreprise de Suzhou et propose des services SaaS.</p>
<p><a href="https://github.com/chatchat-space/Langchain-Chatchat"target="_blank" rel="external nofollow noopener noreferrer">Langchain-Chatchat<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> est un projet de base de connaissances RAG de grands modèles de langage, open-source et déployable hors ligne, basé sur des modèles de langage tels que ChatGLM et des cadres d&rsquo;application tels que Langchain. Initialement, il ne supportait que le modèle ChatGLM, mais il a ensuite ajouté le support de nombreux modèles open-source et en ligne.</p>
<p>Le tableau comparatif des fonctionnalités des deux projets est le suivant :</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Dify-api</th>
          <th>ChatChat</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Capacités périphériques</td>
          <td>Lecture de documents ordinaires</td>
          <td>Documents ordinaires <br> OCR d&rsquo;image</td>
      </tr>
      <tr>
          <td>Source de données</td>
          <td>Contenu textuel des documents <br> Base de données vectorielle</td>
          <td>Moteur de recherche <br> Base de données vectorielle</td>
      </tr>
      <tr>
          <td>Support des modèles</td>
          <td>Modèle d&rsquo;Embedding en ligne <br> Modèle de Rerank en ligne <br> LLM en ligne</td>
          <td>Modèle d&rsquo;Embedding en ligne <br> Modèle d&rsquo;Embedding hors ligne <br> LLM hors ligne</td>
      </tr>
      <tr>
          <td>Fonctionnalités avancées</td>
          <td>Récupération hybride ES</td>
          <td>Aucune</td>
      </tr>
      <tr>
          <td>RAG avancé</td>
          <td>Non supporté</td>
          <td>Non supporté</td>
      </tr>
  </tbody>
</table>
<p>En fait, il existe encore certaines fonctionnalités que les projets open-source actuels ne couvrent pas complètement, telles que :</p>
<ul>
<li>Capacités multimodales</li>
<li>Support des bases de données relationnelles traditionnelles</li>
<li>Récupération multi-bases/unifiée</li>
<li>Fonction de citation</li>
<li>RAG avancé</li>
<li>Indicateurs d&rsquo;évaluation</li>
</ul>
<h2 id="références" class="heading-element"><span>7 Références</span>
  <a href="#r%c3%a9f%c3%a9rences" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://github.com/gkamradt/LLMTest_NeedleInAHaystack"target="_blank" rel="external nofollow noopener noreferrer">gkamradt/LLMTest_NeedleInAHaystack: Doing simple retrieval from LLM models at various context lengths to measure accuracy (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://research.ibm.com/blog/retrieval-augmented-generation-RAG"target="_blank" rel="external nofollow noopener noreferrer">What is retrieval-augmented generation? | IBM Research Blog<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://www.langchain.com/retrieval"target="_blank" rel="external nofollow noopener noreferrer">Retrieval (langchain.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://github.com/langgenius/dify"target="_blank" rel="external nofollow noopener noreferrer">langgenius/dify (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://github.com/chatchat-space/Langchain-Chatchat"target="_blank" rel="external nofollow noopener noreferrer">Langchain-Chatchat (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>
]]></description>
    </item>
    <item>
      <title>stderr et stdout : comprendre les journaux et la sortie</title>
      <link>https://www.zair.top/fr/post/standard-output/</link>
      <pubDate>Sat, 17 Feb 2024 20:42:32 +0000</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/standard-output/</guid>
      <category domain="https://www.zair.top/fr/categories/technologie-informatique/">Technologie-Informatique</category>
      <category domain="https://www.zair.top/fr/categories/codage/">Codage</category>
      <description><![CDATA[<p>Les concepts de sortie standard (<code>stdout</code>) et d&rsquo;erreur standard (<code>stderr</code>), bien que simples, jouent un rôle central dans l&rsquo;enregistrement des journaux, la gestion des erreurs et la gestion des flux de données. Cet article explorera les différences et les applications de <code>stdout</code> et <code>stderr</code>, en particulier comment les utiliser efficacement dans un environnement Python.</p>
<h2 id="sortie-standard-stdout-et-erreur-standard-stderr" class="heading-element"><span>1 Sortie standard (<code>stdout</code>) et erreur standard (<code>stderr</code>)</span>
  <a href="#sortie-standard-stdout-et-erreur-standard-stderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans la plupart des systèmes d&rsquo;exploitation, la sortie standard et l&rsquo;erreur standard sont les deux principaux flux de sortie d&rsquo;un processus. Ils fournissent un mécanisme permettant au processus d&rsquo;envoyer des informations et des messages d&rsquo;erreur au terminal ou à un fichier. Bien que ces deux flux puissent être physiquement identiques (par exemple, affichés dans la même interface terminal), ils sont logiquement utilisés à des fins différentes :</p>
<ul>
<li><strong>Sortie standard (<code>stdout</code>)</strong> : généralement utilisée pour afficher les résultats de l&rsquo;exécution du programme ou des informations de fonctionnement normales.</li>
<li><strong>Erreur standard (<code>stderr</code>)</strong> : spécifiquement utilisée pour afficher des messages d&rsquo;erreur ou des avertissements, même lorsque la sortie standard est redirigée, ces informations doivent généralement être vues ou enregistrées.</li>
</ul>
<h2 id="print-et-logging-en-python" class="heading-element"><span>2 <code>print</code> et <code>logging</code> en Python</span>
  <a href="#print-et-logging-en-python" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>En Python, la fonction <code>print</code> envoie par défaut les informations à <code>stdout</code>, tandis que le module <code>logging</code> envoie par défaut les messages de journal à <code>stderr</code>. L&rsquo;objectif est de distinguer la sortie normale du programme des sorties de journal (y compris les erreurs et les informations de débogage), permettant ainsi aux développeurs de gérer et de filtrer plus facilement les informations de sortie.</p>
<h3 id="utilisation-de-print" class="heading-element"><span>2.1 Utilisation de <code>print</code></span>
  <a href="#utilisation-de-print" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><code>print</code> est la fonction de sortie la plus basique en Python, utilisée pour envoyer des informations au flux de sortie standard. Elle est simple à utiliser et convient pour un débogage rapide ou pour afficher des informations à l&rsquo;utilisateur. Par exemple :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Hello, world!&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="utilisation-de-logging" class="heading-element"><span>2.2 Utilisation de <code>logging</code></span>
  <a href="#utilisation-de-logging" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Le module <code>logging</code> fournit un cadre flexible pour ajouter des messages de journal dans une application. Contrairement à <code>print</code>, <code>logging</code> prend en charge différents niveaux de journalisation (DEBUG, INFO, WARNING, ERROR, CRITICAL), permettant aux développeurs d&rsquo;ajuster le niveau de détail et l&rsquo;emplacement de la sortie des journaux selon leurs besoins. Par exemple :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;This is an error message&#39;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="tqdm-et-stderr" class="heading-element"><span>3 tqdm et <code>stderr</code></span>
  <a href="#tqdm-et-stderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans les programmes complexes ou de longue durée, l&rsquo;utilisation d&rsquo;une barre de progression est un moyen efficace de montrer à l&rsquo;utilisateur l&rsquo;avancement du processus. La bibliothèque <code>tqdm</code> de Python est un outil largement utilisé pour ajouter des barres de progression dans la ligne de commande. <code>tqdm</code> envoie par défaut les informations de progression à <code>stderr</code> pour éviter d&rsquo;interférer avec la sortie normale du programme (<code>stdout</code>).</p>
<h3 id="séparation-de-stdout-et-stderr" class="heading-element"><span>3.1 Séparation de <code>stdout</code> et <code>stderr</code></span>
  <a href="#s%c3%a9paration-de-stdout-et-stderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Dans certains cas, il est utile de séparer la sortie normale des messages d&rsquo;erreur ou de journal, par exemple en les redirigeant vers des fichiers ou des terminaux différents. En ligne de commande, vous pouvez utiliser les opérateurs de redirection <code>&gt;</code> et <code>2&gt;</code> pour y parvenir. Dans le code Python, vous pouvez configurer le module <code>logging</code> ou utiliser des objets de fichier spécifiques pour un contrôle plus granulaire.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python script.py &gt; output.log 2&gt; error.log</span></span></code></pre></td></tr></table>
</div>
</div><p>Grâce à la redirection en ligne de commande, à la fonction <code>print</code> de Python et même au module <code>logging</code>, vous pouvez contrôler et séparer de manière flexible ces deux types de sortie, rendant ainsi la gestion des erreurs, l&rsquo;enregistrement des journaux et l&rsquo;interaction avec l&rsquo;utilisateur plus clairs et ordonnés.</p>
<h2 id="utilisation-de-nohup-pour-gérer-stdout-et-stderr" class="heading-element"><span>4 Utilisation de <code>nohup</code> pour gérer <code>stdout</code> et <code>stderr</code></span>
  <a href="#utilisation-de-nohup-pour-g%c3%a9rer-stdout-et-stderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Lors du déploiement de processus en arrière-plan de longue durée, la commande <code>nohup</code> devient un outil important. <code>nohup</code>, ou &ldquo;no hang up&rdquo;, permet à une commande de continuer à s&rsquo;exécuter après la déconnexion de l&rsquo;utilisateur, ce qui est particulièrement utile pour lancer des tâches à distance. Une caractéristique clé de <code>nohup</code> est sa capacité à gérer <code>stdout</code> et <code>stderr</code>.</p>
<p>Par défaut, l&rsquo;utilisation de <code>nohup</code> pour exécuter une commande redirige <code>stdout</code> et <code>stderr</code> vers le fichier <code>nohup.out</code>, sauf indication contraire. Cela signifie que les sorties normales et les messages d&rsquo;erreur seront capturés dans le même fichier, ce qui est pratique pour un examen ultérieur. Cependant, dans certains cas, il peut être plus utile de séparer ces deux types de sortie.</p>
<h3 id="séparation-de-stdout-et-stderr-avec-nohup" class="heading-element"><span>4.1 Séparation de <code>stdout</code> et <code>stderr</code> avec <code>nohup</code></span>
  <a href="#s%c3%a9paration-de-stdout-et-stderr-avec-nohup" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Pour séparer les sorties <code>stdout</code> et <code>stderr</code> lors de l&rsquo;utilisation de <code>nohup</code>, vous pouvez combiner les opérateurs de redirection. Par exemple :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nohup python script.py &gt; output.log 2&gt; error.log <span class="p">&amp;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Cette commande redirige <code>stdout</code> vers <code>output.log</code>, <code>stderr</code> vers <code>error.log</code>, et exécute le programme en arrière-plan avec <code>&amp;</code>. Ainsi, même si le terminal ou la session SSH est fermé, le programme continuera de s&rsquo;exécuter et ses sorties seront correctement enregistrées.</p>
<h2 id="comportement-de-mise-en-mémoire-tampon-en-python" class="heading-element"><span>5 Comportement de mise en mémoire tampon en Python</span>
  <a href="#comportement-de-mise-en-m%c3%a9moire-tampon-en-python" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><code>stdout</code> et <code>stderr</code> ont des comportements différents en matière de mise en mémoire tampon. Par défaut, <code>stdout</code> est mis en mémoire tampon par ligne lorsqu&rsquo;il est connecté à un terminal, ce qui signifie qu&rsquo;il met en mémoire tampon les données jusqu&rsquo;à ce qu&rsquo;un saut de ligne soit reçu ou que le tampon soit plein ; en mode non interactif, <code>stdout</code> est mis en mémoire tampon par bloc (comme un fichier). En revanche, <code>stderr</code> est toujours mis en mémoire tampon par ligne (avant la version 3.9 de Python, il était mis en mémoire tampon par bloc en mode non interactif). Les informations suivantes proviennent de la documentation officielle <a href="https://docs.python.org/3.12/library/sys.html#sys.stdout"target="_blank" rel="external nofollow noopener noreferrer">sys &mdash; Paramètres et fonctions liés au système — Documentation Python 3.12.2<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<blockquote>
<p>Lorsque interactif, le flux <code>stdout</code> est mis en mémoire tampon par ligne. Sinon, il est mis en mémoire tampon par bloc comme les fichiers texte réguliers. Le flux <code>stderr</code> est mis en mémoire tampon par ligne dans les deux cas. Vous pouvez rendre les deux flux non mis en mémoire tampon en passant l&rsquo;option de ligne de commande <code>-u</code> ou en définissant la variable d&rsquo;environnement <code>PYTHONUNBUFFERED</code>.</p>
<p><em>Changé dans la version 3.9:</em> <code>stderr</code> non interactif est maintenant mis en mémoire tampon par ligne au lieu d&rsquo;être entièrement mis en mémoire tampon.</p>
</blockquote>
<p>Plus la granularité de la mise en mémoire tampon est petite, plus la sortie est rapide, mais le coût d&rsquo;E/S est plus élevé. Avant Python 3.9, <code>stdout</code> et <code>stderr</code> avaient la même granularité de mise en mémoire tampon, ce qui n&rsquo;était pas très raisonnable ; après la version 3.9, <code>stderr</code> a une granularité de mise en mémoire tampon plus petite, ce qui signifie que chaque opération d&rsquo;écriture est plus rapide que <code>stdout</code>. Cette différence rend <code>stderr</code> adapté aux informations d&rsquo;erreur et de journal, garantissant que même en cas de plantage ou de sortie anormale du programme, ces informations ont une priorité plus élevée que la sortie standard.</p>
<p>En C++, l&rsquo;erreur standard n&rsquo;est pas mise en mémoire tampon (voir ci-dessous), ce qui est plus agressif, mais je pense personnellement que c&rsquo;est plus raisonnable.</p>
<p>Heureusement, en Python, vous pouvez désactiver ce comportement de mise en mémoire tampon en utilisant <code>python -u</code> ou en définissant la variable d&rsquo;environnement <code>PYTHONUNBUFFERED</code>, ou en utilisant directement <code>sys.stdout.flush()</code> pour contrôler le moment de la sortie.</p>
<h2 id="comportement-en-environnement-concurrent-en-python" class="heading-element"><span>6 Comportement en environnement concurrent en Python</span>
  <a href="#comportement-en-environnement-concurrent-en-python" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Lors de l&rsquo;utilisation de <code>stdout</code> et <code>stderr</code> dans un environnement multithread ou multiprocessus, les sorties peuvent être entremêlées ou désordonnées, car les sorties provenant de différents threads ou processus peuvent interférer les unes avec les autres lors de l&rsquo;écriture sur le terminal ou le fichier. Une solution à ce problème est de créer des fichiers de sortie distincts pour chaque thread ou processus, ou d&rsquo;utiliser des verrous de thread (thread locks) ou des mécanismes de synchronisation de processus (comme <code>multiprocessing.Lock</code>) pour synchroniser l&rsquo;accès à <code>stdout</code> ou <code>stderr</code>.</p>
<h2 id="contrôle-de-stdout-et-stderr-en-python" class="heading-element"><span>7 Contrôle de <code>stdout</code> et <code>stderr</code> en Python</span>
  <a href="#contr%c3%b4le-de-stdout-et-stderr-en-python" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans des applications complexes, vous pouvez avoir besoin de contrôler plus flexiblement la destination des flux de sortie. Python offre plusieurs moyens pour y parvenir :</p>
<ul>
<li><strong>Redirection de <code>stdout</code> et <code>stderr</code></strong> : vous pouvez rediriger la sortie standard et l&rsquo;erreur standard d&rsquo;un programme Python en modifiant les valeurs de <code>sys.stdout</code> et <code>sys.stderr</code>. Cela est particulièrement utile pour capturer et analyser les sorties, ou pour rediriger les sorties vers des interfaces graphiques ou d&rsquo;autres dispositifs de sortie non standards.</li>
<li><strong>Utilisation du module <code>subprocess</code></strong> : lors de l&rsquo;exécution de commandes ou de scripts externes, le module <code>subprocess</code> vous permet de contrôler les flux <code>stdout</code> et <code>stderr</code> de la commande, y compris les rediriger vers des variables internes du programme Python, ou les séparer ou les combiner.</li>
<li><strong>Utilisation avancée du module de journalisation</strong> : le module <code>logging</code> de Python prend en charge l&rsquo;envoi des journaux vers plusieurs destinations, y compris des fichiers, la sortie standard, le réseau, etc. En configurant différents gestionnaires de journaux (handlers), vous pouvez mettre en œuvre des solutions de gestion de journaux complexes, telles que la séparation des journaux en fonction du niveau ou du contenu du message vers différentes sorties.</li>
</ul>
<h3 id="conseils" class="heading-element"><span>7.1 Conseils</span>
  <a href="#conseils" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li><strong>Gérer les sorties avec précaution</strong> : lors de la conception de logiciels, distinguer clairement la sortie destinée à l&rsquo;interaction avec l&rsquo;utilisateur (<code>stdout</code>) de celle destinée au rapport d&rsquo;erreurs ou à l&rsquo;enregistrement des journaux (<code>stderr</code>). Cela aide à améliorer la convivialité et la maintenabilité du programme.</li>
<li><strong>Optimiser les performances</strong> : tenir compte de l&rsquo;impact des opérations de sortie sur les performances, en particulier dans les scénarios de journalisation ou de sortie de données à haute fréquence. Une utilisation raisonnable de la mise en mémoire tampon et du traitement par lots peut réduire l&rsquo;impact sur les performances.</li>
<li><strong>Considérations de sécurité</strong> : avant de sortir des informations sensibles, effectuer un filtrage et une désensibilisation appropriés pour éviter de divulguer des données sensibles par le biais des journaux.</li>
</ul>
<p>En comprenant en profondeur et en appliquant de manière flexible <code>stdout</code> et <code>stderr</code>, vous pouvez construire des applications Python plus robustes et plus faciles à gérer, traiter efficacement les journaux et les sorties, et améliorer l&rsquo;expérience utilisateur et la stabilité de l&rsquo;application.</p>
<h2 id="comportement-de-mise-en-mémoire-tampon-en-c" class="heading-element"><span>8 Comportement de mise en mémoire tampon en C++</span>
  <a href="#comportement-de-mise-en-m%c3%a9moire-tampon-en-c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>En C++, <code>stdout</code> (généralement associé à <code>std::cout</code>) et <code>stderr</code> (associé à <code>std::cerr</code>) ont des stratégies de mise en mémoire tampon différentes :</p>
<ul>
<li><strong><code>std::cout</code></strong> est par défaut mis en mémoire tampon par ligne, ce qui signifie que lorsqu&rsquo;il est connecté à un terminal, la sortie est rafraîchie à chaque saut de ligne ou lorsque le tampon est plein.</li>
<li><strong><code>std::cerr</code></strong> est par défaut non mis en mémoire tampon, donc chaque donnée écrite dans <code>std::cerr</code> est immédiatement sortie, ce qui est très utile pour signaler des messages d&rsquo;erreur, car cela réduit le risque que des informations d&rsquo;erreur ne soient pas sorties en cas de plantage du programme.</li>
</ul>
<h2 id="redirection-de-stdout-et-stderr" class="heading-element"><span>9 Redirection de <code>stdout</code> et <code>stderr</code></span>
  <a href="#redirection-de-stdout-et-stderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans un programme C++, vous pouvez rediriger <code>stdout</code> et <code>stderr</code> de plusieurs manières. Une méthode courante consiste à utiliser la fonction <code>freopen</code> pour rediriger la sortie standard ou l&rsquo;erreur standard vers un fichier pendant l&rsquo;exécution du programme :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">freopen</span><span class="p">(</span><span class="s">&#34;output.txt&#34;</span><span class="p">,</span> <span class="s">&#34;w&#34;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">freopen</span><span class="p">(</span><span class="s">&#34;error.log&#34;</span><span class="p">,</span> <span class="s">&#34;w&#34;</span><span class="p">,</span> <span class="n">stderr</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Cette méthode peut être utilisée pour rediriger la sortie vers un fichier, facilitant ainsi l&rsquo;analyse et le débogage ultérieurs.</p>
<h2 id="utilisation-en-environnement-multithread-en-c" class="heading-element"><span>10 Utilisation en environnement multithread en C++</span>
  <a href="#utilisation-en-environnement-multithread-en-c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Dans un programme C++ multithread, l&rsquo;utilisation de <code>std::cout</code> et <code>std::cerr</code> peut entraîner des conditions de concurrence, entraînant une sortie désordonnée. Pour éviter cela, il est recommandé d&rsquo;utiliser des verrous mutex (comme <code>std::mutex</code>) pour synchroniser l&rsquo;accès à ces flux :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;mutex&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;thread&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">mutex</span> <span class="n">cout_mutex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">thread_function</span><span class="p">(</span><span class="kt">int</span> <span class="n">id</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">mutex</span><span class="o">&gt;</span> <span class="n">lock</span><span class="p">(</span><span class="n">cout_mutex</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Thread &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">id</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; is running</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">t1</span><span class="p">(</span><span class="n">thread_function</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">t2</span><span class="p">(</span><span class="n">thread_function</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">t1</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">t2</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="contrôle-de-la-sortie-en-c" class="heading-element"><span>11 Contrôle de la sortie en C++</span>
  <a href="#contr%c3%b4le-de-la-sortie-en-c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>La bibliothèque standard C++ fournit <code>std::streambuf</code>, qui peut être utilisé pour un contrôle plus fin de <code>std::cout</code> et <code>std::cerr</code>, y compris la redirection et le comportement de mise en mémoire tampon personnalisé. En héritant de <code>std::streambuf</code> et en réécrivant les fonctions membres correspondantes, vous pouvez créer des stratégies de mise en mémoire tampon personnalisées ou rediriger la sortie vers des composants GUI, des connexions réseau, etc.</p>
<h3 id="conseils-1" class="heading-element"><span>11.1 Conseils</span>
  <a href="#conseils-1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li><strong>Utiliser la mise en mémoire tampon de manière appropriée</strong> : choisir une stratégie de mise en mémoire tampon appropriée en fonction du scénario d&rsquo;application. Pour les informations d&rsquo;erreur nécessitant un retour immédiat, utiliser <code>std::cerr</code> ou rafraîchir manuellement <code>std::cout</code>.</li>
<li><strong>Éviter d&rsquo;utiliser directement la sortie standard dans un environnement multithread</strong> : utiliser des verrous mutex ou d&rsquo;autres mécanismes de synchronisation pour garantir la cohérence et l&rsquo;ordre de la sortie.</li>
<li><strong>Utiliser la redirection et des <code>streambuf</code> personnalisés</strong> : pour traiter les sorties de manière plus flexible, envisager d&rsquo;utiliser la redirection ou des <code>streambuf</code> personnalisés pour répondre à des besoins de sortie spécifiques, tels que l&rsquo;enregistrement des journaux, la transmission sur le réseau, etc.</li>
</ul>
<p>En maîtrisant ces techniques avancées, vous pouvez gérer et contrôler efficacement la sortie des programmes C++ tout en garantissant la robustesse et la flexibilité du programme.</p>
]]></description>
    </item>
    <item>
      <title>Outil de segmentation automatique des captures d&#39;écran longues de pages web</title>
      <link>https://www.zair.top/fr/post/web-page-screenshot-segmentation/</link>
      <pubDate>Tue, 06 Feb 2024 11:29:01 +0000</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/fr/post/web-page-screenshot-segmentation/</guid>
      <category domain="https://www.zair.top/fr/categories/outils-applications/">Outils-Applications</category>
      <description><![CDATA[<h2 id="contexte" class="heading-element"><span>1 Contexte</span>
  <a href="#contexte" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Lorsqu&rsquo;il s&rsquo;agit de partager ou d&rsquo;analyser du contenu web, les captures d&rsquo;écran longues sont une forme très pratique car elles permettent de montrer la page entière. Cependant, traiter ces captures d&rsquo;écran longues pour maintenir l&rsquo;intégrité et la lisibilité des informations tout en facilitant les opérations ultérieures a toujours été un défi. Par exemple, à l&rsquo;heure actuelle (début 2024), les modèles d&rsquo;images AI grand public ne peuvent toujours pas traiter des images très grandes et complexes. Si l&rsquo;on force une capture d&rsquo;écran longue dans le modèle, cela peut entraîner une dégradation des performances du modèle (de nombreux détails ne peuvent pas être reconnus). Pour résoudre ce problème, j&rsquo;ai développé un outil basé sur OpenCV visant à simplifier le processus de traitement des captures d&rsquo;écran longues tout en maintenant l&rsquo;intégrité et la lisibilité de leur contenu.</p>
<p>Ce projet est open-source sur mon Github : <a href="https://github.com/Ryaang/Web-page-Screenshot-Segmentation"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/Ryaang/Web-page-Screenshot-Segmentation<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p>Contrairement à de nombreux outils ou méthodes existants, Web-page-Screenshot-Segmentation utilise OpenCV pour identifier et suivre automatiquement les lignes de séparation naturelles du contenu web, trouvant ainsi les points de segmentation les plus appropriés. Cela signifie que les titres, paragraphes ou graphiques peuvent être conservés de manière ordonnée dans les images segmentées, sans rupture ou omission de contenu.</p>
<p>L&rsquo;utilisation de Web-page-Screenshot-Segmentation est très simple : il suffit de préparer une capture d&rsquo;écran longue, et l&rsquo;outil analysera automatiquement le contenu de l&rsquo;image et déterminera intelligemment les points de segmentation. Vous obtiendrez finalement une série d&rsquo;images complètes et bien structurées, prêtes à être partagées et traitées ultérieurement.</p>
<h2 id="présentation" class="heading-element"><span>2 Présentation</span>
  <a href="#pr%c3%a9sentation" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Ce projet est utilisé pour segmenter une capture d&rsquo;écran longue d&rsquo;une page web en plusieurs parties selon la hauteur du texte. L&rsquo;idée principale est de trouver les zones de faible variation de l&rsquo;image, puis de trouver les lignes de segmentation dans ces zones de faible variation.</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png" alt="image-20240229161346869" srcset="https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png?size=small, https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png?size=medium 1.5x, https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png?size=large 2x" data-title="image-20240229161346869" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Le résultat est une série de petites images complètes de la page web, qui peuvent être utilisées pour générer des pages web ou entraîner des modèles avec <a href="https://github.com/abi/screenshot-to-code"target="_blank" rel="external nofollow noopener noreferrer">Screen-to-code<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>. Plus de résultats peuvent être trouvés dans le répertoire <a href="https://raw.githubusercontent.com/Ryaang/Web-page-Screenshot-Segmentation/main/images/"target="_blank" rel="external nofollow noopener noreferrer">images<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</p>
<h2 id="commencer-à-utiliser" class="heading-element"><span>3 Commencer à utiliser</span>
  <a href="#commencer-%c3%a0-utiliser" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="installation" class="heading-element"><span>3.1 Installation</span>
  <a href="#installation" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> pip install Web-page-Screenshot-Segmentation</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="utilisation-en-ligne-de-commande" class="heading-element"><span>4 Utilisation en ligne de commande</span>
  <a href="#utilisation-en-ligne-de-commande" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Obtenez la hauteur des lignes de segmentation de l&rsquo;image</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.master -f <span class="s2">&#34;path/to/img&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>La sortie devrait être une liste : <code>[6, 868, 1912, 2672, 3568, 4444, 5124, 6036, 7698]</code>. C&rsquo;est la liste des hauteurs des lignes de segmentation de l&rsquo;image.
Si vous souhaitez afficher cette ligne de segmentation dans l&rsquo;image, vous pouvez ajouter le paramètre <code>-s True</code> :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.master -f <span class="s2">&#34;path/to/img&#34;</span> -s True</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="dessiner-les-lignes-de-segmentation-sur-limage" class="heading-element"><span>4.1 Dessiner les lignes de segmentation sur l&rsquo;image</span>
  <a href="#dessiner-les-lignes-de-segmentation-sur-limage" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.drawer --image_file path/to/image.jpg --hl <span class="o">[</span>100,200<span class="o">]</span> --color <span class="o">(</span>0,255,0<span class="o">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="découper-limage" class="heading-element"><span>4.2 Découper l&rsquo;image</span>
  <a href="#d%c3%a9couper-limage" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.spliter --f path/to/image.jpg -ht <span class="s2">&#34;[233,456]&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Vous obtiendrez les images segmentées, enregistrées dans le chemin retourné par la commande.</p>
<p>Pour plus d&rsquo;explications sur l&rsquo;utilisation, veuillez vous référer à l&rsquo;aide :</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python master.py --help
</span></span><span class="line"><span class="cl">python spliter.py --help</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="utilisation-à-partir-du-code-source" class="heading-element"><span>5 Utilisation à partir du code source</span>
  <a href="#utilisation-%c3%a0-partir-du-code-source" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="fonction-split_heights" class="heading-element"><span>5.1 Fonction split_heights</span>
  <a href="#fonction-split_heights" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>La fonction <code>split_heights</code> est utilisée pour segmenter une image en plusieurs parties selon divers seuils. Elle accepte les paramètres suivants :</p>
<ul>
<li><code>file_path</code>: Le chemin du fichier image.</li>
<li><code>split</code>: Un booléen indiquant s&rsquo;il faut segmenter l&rsquo;image.</li>
<li><code>height_threshold</code>: Le seuil de hauteur pour les zones de faible variation.</li>
<li><code>variation_threshold</code>: Le seuil de variation pour les zones de faible variation.</li>
<li><code>color_threshold</code>: Le seuil de différence de couleur.</li>
<li><code>color_variation_threshold</code>: Le seuil de variation de différence de couleur.</li>
<li><code>merge_threshold</code>: Le seuil de distance minimale entre deux lignes.</li>
</ul>
<p>Si <code>split</code> est <code>False</code>, la fonction retourne la liste des hauteurs des lignes de segmentation ; si <code>split</code> est <code>True</code>, elle retourne le chemin des images segmentées.</p>
<h4 id="exemple-dutilisation" class="heading-element"><span>5.1.1 Exemple d&rsquo;utilisation</span>
  <a href="#exemple-dutilisation" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">Web_page_Screenshot_Segmentation</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Web_page_Screenshot_Segmentation.master</span> <span class="kn">import</span> <span class="n">split_heights</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Segmente l&#39;image &#39;path/to/image.jpg&#39; en plusieurs parties</span>
</span></span><span class="line"><span class="cl"><span class="n">split_image_path</span> <span class="o">=</span> <span class="n">split_heights</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">file_path</span><span class="o">=</span><span class="s1">&#39;path/to/image.jpg&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">split</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">height_threshold</span><span class="o">=</span><span class="mi">102</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">variation_threshold</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">color_threshold</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">color_variation_threshold</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">merge_threshold</span><span class="o">=</span><span class="mi">350</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Les images segmentées sont enregistrées dans </span><span class="si">{</span><span class="n">split_image_path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Dans cet exemple, l&rsquo;image &lsquo;path/to/image.jpg&rsquo; est segmentée en plusieurs parties selon les seuils fournis. Les images segmentées sont enregistrées dans le chemin retourné par la fonction.</p>
<h3 id="fonction-draw_line_from_file" class="heading-element"><span>5.2 Fonction draw_line_from_file</span>
  <a href="#fonction-draw_line_from_file" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>La fonction <code>draw_line_from_file</code> est utilisée pour dessiner des lignes sur une image à des hauteurs spécifiées. Elle accepte les paramètres suivants :</p>
<ul>
<li><code>image_file</code>: Le chemin du fichier image.</li>
<li><code>heights</code>: La liste des hauteurs où dessiner les lignes.</li>
<li><code>color</code>: La couleur des lignes. La couleur par défaut est rouge <code>(0, 0, 255)</code>.</li>
</ul>
<p>Cette fonction lit l&rsquo;image à partir du chemin de fichier fourni, dessine des lignes aux hauteurs spécifiées, puis enregistre l&rsquo;image modifiée dans un nouveau fichier. Le nouveau fichier est enregistré dans le répertoire <code>result</code>, avec le même nom que le fichier original mais avec &lsquo;result&rsquo; ajouté avant l&rsquo;extension du fichier.</p>
<p>Si la fonction rencontre une erreur lors de la lecture du fichier image (par exemple, si le chemin du fichier contient des &lsquo;.&rsquo; ou des caractères chinois), elle lèvera une exception.</p>
<h4 id="exemple-dutilisation-1" class="heading-element"><span>5.2.1 Exemple d&rsquo;utilisation</span>
  <a href="#exemple-dutilisation-1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">Web_page_Screenshot_Segmentation</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Web_page_Screenshot_Segmentation.spliter</span> <span class="kn">import</span> <span class="n">draw_line_from_file</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Dessine des lignes sur l&#39;image &#39;path/to/image.jpg&#39; aux hauteurs 100 et 200</span>
</span></span><span class="line"><span class="cl"><span class="n">result_image_path</span> <span class="o">=</span> <span class="n">draw_line_from_file</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">image_file</span><span class="o">=</span><span class="s1">&#39;path/to/image.jpg&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">heights</span><span class="o">=</span><span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># Dessine les lignes en vert</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;L&#39;image modifiée est enregistrée dans </span><span class="si">{</span><span class="n">result_image_path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Dans cet exemple, l&rsquo;image &lsquo;path/to/image.jpg&rsquo; est modifiée pour dessiner des lignes vertes aux hauteurs 100 et 200. L&rsquo;image modifiée est enregistrée dans le chemin retourné par la fonction.</p>
]]></description>
    </item>
  </channel>
</rss>
