Skip to content

Commit

Permalink
Built site for gh-pages
Browse files Browse the repository at this point in the history
  • Loading branch information
Quarto GHA Workflow Runner committed Nov 7, 2024
1 parent a92d3d1 commit a2810c4
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .nojekyll
Original file line number Diff line number Diff line change
@@ -1 +1 @@
ad52a401
76787792
9 changes: 4 additions & 5 deletions II-Developpements/2_Utilisation_LLM.html
Original file line number Diff line number Diff line change
Expand Up @@ -306,9 +306,9 @@ <h4 class="anchored" data-anchor-id="bonnes-pratiques">Bonnes pratiques</h4>
<ul>
<li><p><strong>Donner un rôle au modèle</strong> : Par exemple, dire au modèle qu’il est un magistrat honnête et impartial pourra l’aider à générer du texte formel, neutre et juridique. Le rôle est bien sûr à adapter en fonction des exigences de chaque tâche.</p></li>
<li><p><strong>Structurer le prompt</strong> : Il est important de bien différencier le <em>prompt système</em> du <em>prompt utilisateur</em>. Le premier donnera des instructions générales quant au style, à la tâche, au contexte, etc., alors que le second pourra donner des instructions spécifiques ou un texte à analyser. Il est également pertinent d’organiser ou de séparer clairement les instructions.</p></li>
<li><p><strong>Etre le plus précis possible</strong> :</p></li>
<li><p><strong>Contraindre le modèle au maximum</strong> :</p></li>
<li><p><strong>Donner des exemples</strong> : Cf. paragraphe suivant.</p></li>
<li><p><strong>Etre le plus précis possible</strong> : Rajouter le plus de détails possibles, voire se répéter dans les instructions en changeant de formulation permet de bien insister sur les éléments les plus importants.</p></li>
<li><p><strong>Contraindre le modèle au maximum</strong> : Si l’on souhaite un format de sortie précis (JSON par exemple), donner un exemple concret de sortie attendue, et insister sur le besoin de se conformer à ce format.</p></li>
<li><p><strong>Donner des exemples</strong> : Cf. paragraphe suivant (few-shot prompting).</p></li>
</ul>
<p>Le papier <a href="https://arxiv.org/abs/2312.16171">Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4</a> donne un certains nombre de principes pour améliorer les prompts. Parmi ces principes (très nombreux), on trouve par exemple :</p>
<ul>
Expand Down Expand Up @@ -349,7 +349,6 @@ <h3 class="anchored" data-anchor-id="quelles-questions-se-poser-pour-faire-les-b
<section id="utiliser-un-llm" class="level4">
<h4 class="anchored" data-anchor-id="utiliser-un-llm">Utiliser un LLM</h4>
<p>La première question à se poser est la nécessité ou non d’utiliser un LLM. Certaines tâches peuvent se résoudre avec un LLM, mais ce n’est pas toujours la solution la plus pertinente. Par exemple, un LLM est normalement capable de parser un fichier xml sans problème, mais un script naïf sera largement aussi efficace, à bien moindre coût (environnemental, humain, financier). L’utilisation d’un LLM doit venir d’un besoin de compréhension fine du langage naturel.</p>
<p><strong>Donner quelques exemples de cas d’usages</strong></p>
</section>
<section id="quels-modèles-utiliser" class="level4">
<h4 class="anchored" data-anchor-id="quels-modèles-utiliser">Quel(s) modèle(s) utiliser</h4>
Expand Down Expand Up @@ -395,7 +394,7 @@ <h4 class="anchored" data-anchor-id="quand-faire-du-fine-tuning">Quand faire du
</section>
<section id="f.-combiner-plusieurs-techniques" class="level4">
<h4 class="anchored" data-anchor-id="f.-combiner-plusieurs-techniques">F. Combiner plusieurs techniques</h4>
<p>RAG + fine-tuning = <a href="https://arxiv.org/abs/2403.10131">RAFT</a></p>
<p>Il est tout à fait possible de fine-tuner un LLM sur une tâche de RAG par exemple. Peu de travaux ont été faits sur cette combinaison, mais le papier <a href="https://arxiv.org/abs/2403.10131">RAFT</a> (Retrieval Augmented Fine-Tuning) en donne une vision d’ensemble et en propose une méthode.</p>


</section>
Expand Down
16 changes: 8 additions & 8 deletions IV-Exemples/2_Classification_accords_entreprise.html
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ <h3 class="anchored" data-anchor-id="récupération-des-données">Récupération
<p>Les données sont disponibles sur <a href="https://www.legifrance.gouv.fr/search/acco?tab_selection=acco&amp;searchField=ALL&amp;query=%2A&amp;searchType=ALL&amp;typePagination=DEFAULT&amp;sortValue=PERTINENCE&amp;pageSize=25&amp;page=1#acco">Légifrance</a>. Le stock des textes est également publié par le <a href="https://echanges.dila.gouv.fr/OPENDATA/ACCO/">FTP de la DILA</a> et les thématiques déclarées sont à la fois dans les métadonnées XML publié conjointement avec les textes, ou retrouvables sur Légifrance.</p>
<p>Pour des raisons pratiques, nous travaillerons avec une <a href="https://minio.lab.sspcloud.fr/cthiounn2/Accords/10p_accords_publics_et_thematiques_240815.parquet">photographie du stock au 1er semestre 2024</a> et sur un <a href="https://minio.lab.sspcloud.fr/cthiounn2/Accords/10p_accords_publics_et_thematiques_240815_sample_of_1000.parquet">échantillon des 1000 textes d’accords</a>, convertis au format parquet.</p>
<p>Ces données comportent le numéro de dossier de l’accord, identifiant unique, puis le texte et les thématiques déclarées, et enfin suivies des thématiques une à une :</p>
<div id="98fdb354" class="cell" data-execution_count="1">
<div id="91175b1f" class="cell" data-execution_count="1">
<div class="cell-output cell-output-display">
<div>

Expand Down Expand Up @@ -416,7 +416,7 @@ <h4 class="anchored" data-anchor-id="lecture-de-données">Lecture de données</h
jupyter==1.1.1
ipykernel==6.29.5</code></pre>
<p>Nous allons dans cet exemple, extraire 10 textes pour des raisons de rapidité :</p>
<div id="f3dba9be" class="cell" data-execution_count="2">
<div id="8e0489e0" class="cell" data-execution_count="2">
<div class="sourceCode cell-code" id="cb5"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> json</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> pandas <span class="im">as</span> pd</span>
Expand Down Expand Up @@ -445,7 +445,7 @@ <h4 class="anchored" data-anchor-id="lecture-de-données">Lecture de données</h
<section id="vectoriser-nos-textes-avec-chromadb" class="level4">
<h4 class="anchored" data-anchor-id="vectoriser-nos-textes-avec-chromadb">Vectoriser nos textes avec ChromaDB</h4>
<p>Pour vectoriser nos textes, nous utilisons ChromaDB qui s’intègre avec Langchain. Nous allons découper en morceau des 3000 caractères à chaque saut à ligne, ce qui correspond à un paragraphe. Les morceaux de textes, ici paragraphes, sont stockés dans une boutique de vecteur avec le numéro de dossier et le numéro de paragraphe en métadonnées.</p>
<div id="02b1bc52" class="cell" data-execution_count="3">
<div id="8112fa5a" class="cell" data-execution_count="3">
<div class="sourceCode cell-code" id="cb6"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a>text_splitter <span class="op">=</span> CharacterTextSplitter(</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a> separator<span class="op">=</span><span class="st">"</span><span class="ch">\n\n</span><span class="st">"</span>,</span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a> chunk_size<span class="op">=</span><span class="dv">3000</span>,</span>
Expand All @@ -472,7 +472,7 @@ <h4 class="anchored" data-anchor-id="vectoriser-nos-textes-avec-chromadb">Vector
<section id="interroger-un-llm-en-mode-api" class="level4">
<h4 class="anchored" data-anchor-id="interroger-un-llm-en-mode-api">Interroger un LLM en mode API</h4>
<p>Pour interroger le LLM, nous construisons une classe qui permet de générer les requêtes et de traiter les réponses :</p>
<div id="7260d6d8" class="cell" data-execution_count="4">
<div id="bc1dbb5f" class="cell" data-execution_count="4">
<div class="sourceCode cell-code" id="cb7"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a>MODEL<span class="op">=</span><span class="st">"llama3.1"</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a></span>
Expand All @@ -493,7 +493,7 @@ <h4 class="anchored" data-anchor-id="interroger-un-llm-en-mode-api">Interroger u
<span id="cb7-18"><a href="#cb7-18" aria-hidden="true" tabindex="-1"></a> llm <span class="op">=</span> LocalOllamaLLM(api_url<span class="op">=</span><span class="st">"http://127.0.0.1:11434"</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
</div>
<p>Nous définissons également un prompt de base, améliorable par la suite, et une chaîne LangChain entre le prompt et le LLM :</p>
<div id="a24bd1a9" class="cell" data-execution_count="5">
<div id="5cf92618" class="cell" data-execution_count="5">
<div class="sourceCode cell-code" id="cb8"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a>system_prompt <span class="op">=</span> (</span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a> <span class="st">" Répondez à la question posée "</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a> <span class="st">" Utilisez le contexte (sélection des meilleurs paragraphes liés à la question) donné pour répondre à la question "</span></span>
Expand All @@ -510,7 +510,7 @@ <h4 class="anchored" data-anchor-id="interroger-un-llm-en-mode-api">Interroger u
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true" tabindex="-1"></a>question_answer_chain <span class="op">=</span> create_stuff_documents_chain(llm, prompt)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
</div>
<p>Nous définissons une fonction pour effectuer le RAG, avec à la fois la recherche de similarité par rapport à la question, et la soumission augmentée pour une réponse du LLM :</p>
<div id="878ed90a" class="cell" data-execution_count="6">
<div id="695e13e3" class="cell" data-execution_count="6">
<div class="sourceCode cell-code" id="cb9"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> search_and_invoke_llm(vector_store,index,query,k<span class="op">=</span><span class="dv">5</span>):</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> k<span class="op">==</span><span class="dv">0</span>:</span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span>(<span class="ss">f"bug with </span><span class="sc">{</span>index<span class="sc">}</span><span class="ss">"</span>)</span>
Expand All @@ -535,7 +535,7 @@ <h4 class="anchored" data-anchor-id="interroger-un-llm-en-mode-api">Interroger u
<section id="automatiser-la-classification-sur-lensemble-des-thématiques" class="level4">
<h4 class="anchored" data-anchor-id="automatiser-la-classification-sur-lensemble-des-thématiques">Automatiser la classification sur l’ensemble des thématiques</h4>
<p>Nous automatisons ici la classification sous forme de classification binaire pour chaque thématique, en posant une question “oui ou non” et en inférant oui si la réponse commence par oui, non sinon.</p>
<div id="b85c326f" class="cell" data-execution_count="7">
<div id="2157fd91" class="cell" data-execution_count="7">
<div class="sourceCode cell-code" id="cb10"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>THEMATIQUES<span class="op">=</span>{</span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a> <span class="st">"accord_methode_penibilite"</span>:<span class="st">"Accords de méthode (pénibilité)"</span>,</span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a><span class="st">"accord_methode_pse"</span>:<span class="st">"Accords de méthode (PSE)"</span>,</span>
Expand Down Expand Up @@ -626,7 +626,7 @@ <h4 class="anchored" data-anchor-id="automatiser-la-classification-sur-lensemble
<section id="evaluation" class="level3">
<h3 class="anchored" data-anchor-id="evaluation">Evaluation</h3>
<p>Nous évaluons les performances de cette solution simple, en affichant la matrice de confusion et les différentes métriques, pour chaque thématique :</p>
<div id="d4e5455e" class="cell" data-execution_count="8">
<div id="d2ff4d54" class="cell" data-execution_count="8">
<div class="sourceCode cell-code" id="cb11"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> sklearn.metrics <span class="im">import</span> confusion_matrix</span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> sklearn.metrics <span class="im">import</span> accuracy_score, precision_score, recall_score, f1_score, classification_report</span>
Expand Down
Loading

0 comments on commit a2810c4

Please sign in to comment.