<?xml
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Les services IA de DnC</title>
	<link>https://ia.dnc.global/</link>
	<description>En mati&#232;re d'intelligence artificielle (IA), DnC met l'accent sur la s&#233;curit&#233; en offrant aux entreprises le moyen de conserver leurs donn&#233;es et les traitements &#224; l'int&#233;rieur de leur r&#233;seau d'entreprise plut&#244;t que dans le Cloud.</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://ia.dnc.global/spip.php?id_rubrique=9&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Comment ReActAgent s'ins&#232;re dans le Workflow LlamaIndex</title>
		<link>https://ia.dnc.global/Comment-ReActAgent-s-insere-dans-le-Workflow-LlamaIndex.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/Comment-ReActAgent-s-insere-dans-le-Workflow-LlamaIndex.html</guid>
		<dc:date>2026-04-13T10:15:10Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Dans LlamaIndex, la boucle ReAct repose sur un principe simple : le workflow orchestre, l'agent raisonne. &#192; chaque appel, g&#233;n&#232;re un prompt, interroge le LLM, reconstruit une &#233;tape de raisonnement et laisse le finalizer d&#233;cider de la suite. Une m&#233;canique minimale c&#244;t&#233; workflow, une intelligence maximale c&#244;t&#233; agent. &lt;br class='autobr' /&gt; #La boucle de raisonnement ReAct &lt;br class='autobr' /&gt;
##Comment `ReActAgent` s'ins&#232;re dans le Workflow LlamaIndex &lt;br class='autobr' /&gt;
LlamaIndex ReActAgent, construit sur Workflow, fournit le code du **step** dans un workflow. (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans LlamaIndex, la boucle ReAct repose sur un principe simple : le workflow orchestre, l'agent raisonne. &#192; chaque appel, g&#233;n&#232;re un prompt, interroge le LLM, reconstruit une &#233;tape de raisonnement et laisse le finalizer d&#233;cider de la suite. Une m&#233;canique minimale c&#244;t&#233; workflow, une intelligence maximale c&#244;t&#233; agent.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;hr /&gt;
&lt;h1&gt;La boucle de raisonnement ReAct&lt;/h1&gt;
&lt;h2&gt;Comment &lt;code&gt;ReActAgent&lt;/code&gt; s'ins&#232;re dans le Workflow LlamaIndex&lt;/h2&gt;
&lt;p&gt;LlamaIndex ReActAgent, construit sur Workflow, fournit le code du &lt;strong&gt;step&lt;/strong&gt; dans un workflow. Le workflow appelle :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BaseAgent.run_agent_step() &#8594; ReActAgent.take_step()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Donc :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;le workflow = &lt;strong&gt;chef d'orchestre&lt;/strong&gt; (encore un !)&lt;/li&gt;
&lt;li&gt;l'agent = &lt;strong&gt;une &#233;tape du workflow&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;take_step()&lt;/code&gt; = &lt;strong&gt;la logique ReAct pour une &#233;tape&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Comment sont construites les steps ReAct ?&lt;/h2&gt;
&lt;p&gt;En v&#233;rit&#233; : Le Workflow ne construit pas des steps ReAct. C'est ReActAgent qui les fait construire par le LLM.
Le Workflow ne fait que :&lt;/p&gt;
&lt;ol class=&#034;spip&#034;&gt;
&lt;li&gt;appeler &lt;code&gt;take_step()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;attendre un &lt;code&gt;AgentStepOutput&lt;/code&gt; (Thought, Action, Action Input ...)&lt;/li&gt;
&lt;li&gt;d&#233;cider avec ReActFinalizer si une nouvelle &#233;tape doit &#234;tre ex&#233;cut&#233;e&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici ce qui se passe dans &lt;code&gt;ReActAgent.take_step()&lt;/code&gt; pour construire une &#233;tape :&lt;/p&gt;
&lt;h3&gt;&#201;tape 1 &#8212; Construire le prompt ReAct&lt;/h3&gt;
&lt;p&gt;L'agent g&#233;n&#232;re le prompt ReAct qui fixe les r&#232;gles que devra suivre le LLM pour &#233;laborer les THOUGHT, ACTION et ACTION INPUT, pour appeler les outils etc. Le prompt contient &#233;galement l'historique des &#233;changes et, in fine, la question de l'utilisateur. Voici un exemple tr&#232;s na&#239;f :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;You are a ReAct agent.
First, think step-by-step and write:
THOUGHT:
Then, if needed, write:
ACTION:
ACTION INPUT:
&lt;context&gt;
&lt;query&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&#201;tape 2 &#8212; Appeler le LLM&lt;/h3&gt;
&lt;p&gt;L'agent appelle :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;llm.stream(prompt)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le LLM g&#233;n&#232;re la r&#233;ponse au prompt. &#8594; Le LLM produit progressivement, par petits fragments, les &lt;strong&gt;deltas&lt;/strong&gt;. &lt;/p&gt;
&lt;h3&gt;&#201;tape 3 &#8212; Le parser reconstruit les blocs&lt;/h3&gt;
&lt;p&gt;Le &lt;code&gt;ReActStreamParser&lt;/code&gt; transforme les deltas en blocs :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;THOUGHT: ...
ACTION: ...
OBSERVATION: ...
...
FINAL_ANSWER: ...&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&#201;tape 4 &#8212; Le ReActFinalizer d&#233;cide si l'&#233;tape est termin&#233;e&lt;/h3&gt;
&lt;p&gt;Le finalizer :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;valide les blocs&lt;/li&gt;
&lt;li&gt;d&#233;tecte les erreurs&lt;/li&gt;
&lt;li&gt;emp&#234;che les boucles&lt;/li&gt;
&lt;li&gt;d&#233;cide si une nouvelle &#233;tape doit &#234;tre lanc&#233;e&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&#201;tape 5 &#8212; Le workflow relance &lt;code&gt;take_step()&lt;/code&gt; si n&#233;cessaire&lt;/h3&gt;
&lt;p&gt;Si le finalizer dit &#8220;continue&#8221;, alors :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;workflow &#8594; BaseAgent.run_agent_step &#8594; ReActAgent.take_step()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et une nouvelle &#233;tape ReAct est produite.&lt;/p&gt;
&lt;h3&gt;En r&#233;sum&#233; : r&#244;le du Workflow&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Le workflow LlamaIndex ne fait qu'appeler &lt;code&gt;take_step()&lt;/code&gt; en boucle.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ReActAgent.take_step()&lt;/code&gt; g&#233;n&#232;re une &lt;em&gt;&#233;tape ReAct&lt;/em&gt; en appelant le LLM.&lt;/li&gt;
&lt;li&gt;Le &lt;code&gt;ReActStreamParser&lt;/code&gt; reconstruit les blocs ReAct &#224; partir des deltas.&lt;/li&gt;
&lt;li&gt;Le &lt;code&gt;ReActFinalizer&lt;/code&gt; d&#233;cide si une nouvelle &#233;tape doit &#234;tre lanc&#233;e.&lt;/li&gt;
&lt;li&gt;Le workflow relance &lt;code&gt;take_step()&lt;/code&gt; si n&#233;cessaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class='spip_document_26 spip_documents spip_documents_center'&gt;
&lt;img src='https://ia.dnc.global/local/cache-vignettes/L428xH753/bouclereact_1-e5172.png?1776293294' width='428' height='753' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Voyez aussi :&lt;/strong&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://ia.dnc.global/ReActEngine-v1-Modules-et-traitements.html' class='spip_in'&gt;ReActEngine v1 : Modules et traitements&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>RAG : Compression contextuelle</title>
		<link>https://ia.dnc.global/RAG-Compression-contextuelle.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/RAG-Compression-contextuelle.html</guid>
		<dc:date>2026-02-12T08:19:12Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;La contextual compression est un sujet qui est devenu central dans les RAG modernes. &lt;br class='autobr' /&gt;
C'est une technique qui permet de r&#233;duire dynamiquement - c'est &#224; dire en fonction du contexte - la quantit&#233; de texte envoy&#233;e au LLM en ne gardant que ce qui est pertinent pour la requ&#234;te. &lt;br class='autobr' /&gt; On ne renvoit pas les documents bruts, mais une version compress&#233;e, filtr&#233;e, ou r&#233;sum&#233;e, adapt&#233;e &#224; la question. &lt;br class='autobr' /&gt;
C'est un *pr&#233;&#8209;processing intelligent* du contexte. &lt;br class='autobr' /&gt;
#C'est devenu indispensable &lt;br class='autobr' /&gt;
Parce que : les fen&#234;tres de contexte (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La contextual compression est un sujet qui est devenu central dans les RAG modernes.&lt;/p&gt;
&lt;p&gt;C'est une technique qui permet de r&#233;duire dynamiquement - c'est &#224; dire en fonction du contexte - la quantit&#233; de texte envoy&#233;e au LLM en ne gardant que ce qui est pertinent pour la requ&#234;te.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;On ne renvoit pas les documents bruts, mais une version compress&#233;e, filtr&#233;e, ou r&#233;sum&#233;e, adapt&#233;e &#224; la question.&lt;/p&gt;
&lt;p&gt;C'est un &lt;em&gt;pr&#233;&#8209;processing intelligent&lt;/em&gt; du contexte.&lt;/p&gt;
&lt;h1&gt;C'est devenu indispensable&lt;/h1&gt;
&lt;p&gt;Parce que :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;les fen&#234;tres de contexte sont grandes mais pas infinies,&lt;/li&gt;
&lt;li&gt;les chunks bruts sont souvent trop verbeux,&lt;/li&gt;
&lt;li&gt;les embeddings r&#233;cup&#232;rent parfois trop de documents,&lt;/li&gt;
&lt;li&gt;les mod&#232;les hallucinent moins quand le contexte est &lt;em&gt;pr&#233;cis&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La contextual compression permet :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;d'augmenter la pr&#233;cision,&lt;/li&gt;
&lt;li&gt;de r&#233;duire le bruit,&lt;/li&gt;
&lt;li&gt;d'am&#233;liorer la factualit&#233;,&lt;/li&gt;
&lt;li&gt;de diminuer le co&#251;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Les 3 grandes familles de contextual compression&lt;/h1&gt;
&lt;h2&gt;1. Compression par r&#233;sum&#233; (LLM summarization)&lt;/h2&gt;
&lt;p&gt;On r&#233;cup&#232;re les documents pertinents, puis on demandes au LLM :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&#171; R&#233;sume uniquement les parties utiles pour r&#233;pondre &#224; la requ&#234;te X. &#187;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est la version la plus simple et la plus efficace.&lt;/p&gt;
&lt;h3&gt;Exemple&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Document : 3 pages&lt;/li&gt;
&lt;li&gt;Requ&#234;te : &#171; Quels sont les effets secondaires du m&#233;dicament ? &#187;&lt;/li&gt;
&lt;li&gt;R&#233;sum&#233; compress&#233; : 4 lignes cibl&#233;es&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Compression par extraction (LLM extraction)&lt;/h2&gt;
&lt;p&gt;Le LLM ne r&#233;sume pas : il &lt;strong&gt;extrait&lt;/strong&gt; les passages pertinents.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&#171; Extrait uniquement les phrases qui r&#233;pondent &#224; la question X. &#187;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est plus pr&#233;cis et moins risqu&#233; que le r&#233;sum&#233;.&lt;/p&gt;
&lt;h2&gt;3. Compression par filtrage s&#233;mantique (embedding&#8209;based filtering)&lt;/h2&gt;
&lt;p&gt;On fait un &lt;em&gt;re&#8209;ranking&lt;/em&gt; interne :&lt;/p&gt;
&lt;ol class=&#034;spip&#034;&gt;
&lt;li&gt;r&#233;cup&#233;rer les chunks via embeddings.&lt;/li&gt;
&lt;li&gt;re&#8209;embed de chaque chunk &lt;strong&gt;par rapport &#224; la requ&#234;te&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&#233;limination des chunks peu pertinents.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est du &lt;em&gt;semantic pruning&lt;/em&gt;.&lt;/p&gt;
&lt;h1&gt;Comment &#231;a s'int&#232;gre dans un pipeline RAG ?&lt;/h1&gt;
&lt;p&gt;Voici le pipeline classique :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User query
&#8594; embedding de la requ&#234;te
&#8594; retrieval (top&#8209;k documents)
&#8594; contextual compression (r&#233;sum&#233; / extraction / filtrage)
&#8594; Prompt final = system + historique + requ&#234;te + contexte compress&#233;
&#8594; LLM&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La compression intervient entre le retrieval et le prompt final.&lt;/p&gt;
&lt;h1&gt;Pourquoi c'est sup&#233;rieur au RAG na&#239;f ?&lt;/h1&gt;
&lt;h3&gt;Sans compression :&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;envoit trop de texte,&lt;/li&gt;
&lt;li&gt;d&#233;passe la fen&#234;tre,&lt;/li&gt;
&lt;li&gt;ajoute du bruit,&lt;/li&gt;
&lt;li&gt;augmente les hallucinations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Avec compression :&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;n'envoie que l'essentiel,&lt;/li&gt;
&lt;li&gt;reste dans la fen&#234;tre,&lt;/li&gt;
&lt;li&gt;augmente la pr&#233;cision,&lt;/li&gt;
&lt;li&gt;r&#233;duit le co&#251;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le point cl&#233; : la compression est contextuelle&lt;br /&gt;
Ce n'est pas un r&#233;sum&#233; g&#233;n&#233;rique.&lt;br /&gt;
C'est un r&#233;sum&#233; &lt;strong&gt;conditionn&#233; par la requ&#234;te&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Requ&#234;te A : &#171; Quels sont les risques ? &#187;&lt;/li&gt;
&lt;li&gt;Requ&#234;te B : &#171; Quels sont les b&#233;n&#233;fices ? &#187;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le m&#234;me document donnera &lt;strong&gt;deux compressions diff&#233;rentes&lt;/strong&gt; pour des requ&#234;tes diff&#233;rentes.&lt;/p&gt;
&lt;p&gt;Notons que, par requ&#234;te, on peut entendre historique + question. Ainsi, la m&#234;me question de l'utilisateur, apr&#232;s avoir pos&#233; diff&#233;rentes questions et obtenu diff&#233;rentes r&#233;ponses, une nouvelle question sera trait&#233;e en tenant compte des pr&#233;c&#233;dentes.&lt;/p&gt;
&lt;p&gt;C'est ce qui rend la technique si puissante.&lt;/p&gt;
&lt;h1&gt;Les erreurs fr&#233;quentes&lt;/h1&gt;
&lt;p&gt;-r&#233;sumer les documents &lt;em&gt;avant&lt;/em&gt; le retrieval&lt;br /&gt;
&#8594; tu perds de l'information utile&lt;/p&gt;
&lt;p&gt;-compresser sans conditionner sur la requ&#234;te&lt;br /&gt;
&#8594; tu obtiens un r&#233;sum&#233; g&#233;n&#233;rique, inutile&lt;/p&gt;
&lt;p&gt;-compresser trop t&#244;t dans le pipeline&lt;br /&gt;
&#8594; tu risques de biaiser la recherche&lt;/p&gt;
&lt;p&gt;-compresser avec un mod&#232;le trop faible&lt;br /&gt;
&#8594; tu introduis des erreurs dans le contexte&lt;/p&gt;
&lt;h1&gt;Comment faire une contextual compression robuste ?&lt;/h1&gt;
&lt;h3&gt;&#201;tape 1 &#8212; Retrieval large (top&#8209;20 ou top&#8209;50)&lt;/h3&gt;
&lt;p&gt;On r&#233;cup&#232;re large pour ne rien rater.&lt;/p&gt;
&lt;h3&gt;&#201;tape 2 &#8212; Re&#8209;ranking (embedding ou cross&#8209;encoder)&lt;/h3&gt;
&lt;p&gt;On r&#233;duit &#224; top&#8209;5 ou top&#8209;10.&lt;/p&gt;
&lt;h3&gt;&#201;tape 3 &#8212; Compression LLM (r&#233;sum&#233;/extraction)&lt;/h3&gt;
&lt;p&gt;On produit un contexte propre, court, pr&#233;cis.&lt;/p&gt;
&lt;h3&gt;&#201;tape 4 &#8212; Prompt final&lt;/h3&gt;
&lt;p&gt;On injecte uniquement la version compress&#233;e.&lt;/p&gt;
&lt;p&gt;Ce pipeline est beaucoup plus stable que le RAG na&#239;f.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>ReAct : le nommage des outils.</title>
		<link>https://ia.dnc.global/ReAct-le-nommage-des-outils.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/ReAct-le-nommage-des-outils.html</guid>
		<dc:date>2026-01-28T10:00:52Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Dans la s&#233;lection d'un outil par le LLM, il appara&#238;t que le nom de l'outil est prioritaire, et que la description est secondaire. De toute &#233;vidence, la description ne peut compl&#233;ter un nom de fonction ambigu et ne servira au LLM qu'en deuxi&#232;me intention. Quelles sont les r&#232;gles &#224; appliquer pour le nommage des outils ? &lt;br class='autobr' /&gt; Dans le choix de l'outil par le LLM, il apparait que le nom de la fonction (= le nom de l'outil) est totalement prioritaire, que la la Docstring vient ensuite, elle-m&#234;me prioritaire sur (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://ia.dnc.global/local/cache-vignettes/L150xH137/arton58-33bf4.png?1776303657' width='150' height='137' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans la s&#233;lection d'un outil par le LLM, il appara&#238;t que le nom de l'outil est prioritaire, et que la description est secondaire. De toute &#233;vidence, la description ne peut compl&#233;ter un nom de fonction ambigu et ne servira au LLM qu'en deuxi&#232;me intention.&lt;br class='autobr' /&gt;
Quelles sont les r&#232;gles &#224; appliquer pour le nommage des outils ?&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Dans le choix de l'outil par le LLM, il apparait que le nom de la fonction (= le nom de l'outil) est totalement prioritaire, que la la Docstring vient ensuite, elle-m&#234;me prioritaire sur la m&#233;tadonn&#233;e 'description'&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb1' class='spip_note' rel='appendix' title='La distinction entre Docstring et m&#233;tadonn&#233;e 'description' existe dans l'objet (...)' id='nh1'&gt;1&lt;/a&gt;]&lt;/span&gt; . De toute &#233;vidence, ni la Docstring ni la description ne peuvent corriger un nom de fonction ambigu, elle ne serviront qu'en cas de deuxi&#232;me intention du LLM, apr&#232;s avoir constat&#233; une erreur.&lt;/p&gt;
&lt;h2&gt;Exemple d'ambigu&#239;t&#233;&lt;/h2&gt;
&lt;p&gt;Consid&#233;rons un outil qui convertit une date lisible par un humain (human-readable date) en timestamp. Initialement nomm&#233; 'convert_date_to_timestamp'. On peut constater que l'usage de l'outil est mal compris par le LLM qui, notamment, peut tenter de l'utiliser &#224; l'envers.&lt;/p&gt;
&lt;p&gt;Le mot &#034;date&#034; est trop g&#233;n&#233;rique, et dans un contexte LLM, il peut d&#233;signer aussi bien une date lisible qu'un timestamp. &lt;/p&gt;
&lt;p&gt;Pour &#233;viter toute ambigu&#239;t&#233;, il faut que le nom de l'outil encode clairement :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;le &lt;strong&gt;type d'entr&#233;e attendu&lt;/strong&gt; (ex. : texte lisible par un humain),&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;type de sortie produit&lt;/strong&gt; (ex. : timestamp num&#233;rique),&lt;/li&gt;
&lt;li&gt;et id&#233;alement, la &lt;strong&gt;direction de la conversion&lt;/strong&gt; : l'entr&#233;e en t&#234;te, la sortie en queue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un meilleur choix serait : &lt;strong&gt;&lt;code&gt;readable_date_to_timestamp&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;code&gt;readable_date&lt;/code&gt; d&#233;sambigu&#239;se imm&#233;diatement : ce n'est pas un timestamp.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;to_timestamp&lt;/code&gt; indique clairement la direction.&lt;/li&gt;
&lt;li&gt;C'est court, typiquement LLM-friendly, et sans ambigu&#239;t&#233;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce qu'il faut &#233;viter :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Des noms ambigus comme &lt;code&gt;convert_dates&lt;/code&gt; ou &lt;code&gt;parse_date&lt;/code&gt; (trop flous)&lt;/li&gt;
&lt;li&gt;Des noms au singulier pour des fonctions vectoris&#233;es (ex. &lt;code&gt;date_to_timestamp&lt;/code&gt; qui prend une liste)&lt;/li&gt;
&lt;li&gt;Des noms inverses (&lt;code&gt;timestamp_to_date&lt;/code&gt;) qui risquent d'&#234;tre utilis&#233;s &#224; contresens si mal nomm&#233;s&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Distinction entre fonction unitaire et vectoris&#233;e&lt;/h2&gt;
&lt;p&gt;L'outil &lt;code&gt;readable_date_to_timestamp&lt;/code&gt; est 'unitaire' dans le sens o&#249; il n'effectue qu'une seule conversion. &lt;/p&gt;
&lt;p&gt;Prenons le cas d'un outil qui transformerait une liste de dates humainement lisibles en la liste des timestamps correspondants. Comment nommer un tel outil ?
Un nom comme &lt;strong&gt;&lt;code&gt;readable_dates_to_timestamps&lt;/code&gt;&lt;/strong&gt; sera bien interpr&#233;t&#233; par un LLM comme une op&#233;ration &lt;strong&gt;vectoris&#233;e&lt;/strong&gt; (liste &#8594; liste), surtout si :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;le nom est au &lt;strong&gt;pluriel&lt;/strong&gt; (&lt;code&gt;dates&lt;/code&gt;, &lt;code&gt;timestamps&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;il suit une convention claire et r&#233;guli&#232;re dans l'ensemble des outils,&lt;/li&gt;
&lt;li&gt;la Docstring ou l'intension associ&#233; confirme ce comportement,&lt;/li&gt;
&lt;li&gt;on &#233;vite (faut-il le pr&#233;ciser ?) de cr&#233;er des outils d'intention diff&#233;rente avec un nom similaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Pourquoi ce nom est bien compris :&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;readable_dates&lt;/code&gt;&lt;/strong&gt; &#8594; explicite que l'entr&#233;e est une liste de dates lisibles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;to_timestamps&lt;/code&gt;&lt;/strong&gt; &#8594; sugg&#232;re une transformation vers une liste de timestamps.&lt;/li&gt;
&lt;li&gt;Le pluriel des deux c&#244;t&#233;s &lt;strong&gt;induit une correspondance &#233;l&#233;ment par &#233;l&#233;ment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mais il y a quelques subtilit&#233;s &#224; garder en t&#234;te pour &#233;viter toute confusion. C'est une convention que les LLM comprennent bien, surtout si :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;on l'applique syst&#233;matiquement (ex. : &lt;code&gt;texts_to_embeddings&lt;/code&gt;, &lt;code&gt;urls_to_titles&lt;/code&gt;, etc.),&lt;/li&gt;
&lt;li&gt;il existe (comme dans notre exemple) la version unitaire.&lt;/li&gt;
&lt;li&gt;l'outil expose une Docstring explicite et non contradictoire :&lt;pre&gt;&lt;code class=&#034;language-python&#034;&gt;&#034;&#034;&#034;
Converts a list of human-readable date strings into a list of UNIX timestamps in milliseconds.
&#034;&#034;&#034;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;on expose aussi une version unitaire :
&lt;code&gt;readable_date_to_timestamp&lt;/code&gt; &#8594; pour une seule date
&lt;code&gt;readable_dates_to_timestamps&lt;/code&gt; &#8594; pour une liste&lt;/li&gt;
&lt;li&gt;on &#233;vite les inversions en exposant les outils inverses :
&lt;code&gt;timestamp_to_readable_date&lt;/code&gt; &#8594; pour une seule date
&lt;code&gt;timestamp_to_readable_date&lt;/code&gt; &#8594; pour une liste&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Encore un d&#233;faut !&lt;/h3&gt;
&lt;p&gt;Cependant, notre exemple pr&#233;sente encore un d&#233;faut : la Docstring fait appara&#238;tre le timestamp comme &#233;tant un 'UNIX timestamps in milliseconds'. Or, fin 1990-d&#233;but 2000 sont apparus les timestamp en microsecondes puis, dans les ann&#233;es 2010, en nanosecondes.&lt;/p&gt;
&lt;p&gt;Le LLM risque de d&#233;couvrir trop tard (en reprenant le raisonnement apr&#232;s avoir constat&#233; l'erreur, si elle est d&#233;tect&#233;e) que l'outil ne fonctionne qu'avec des timestamps en millisecondes !&lt;/p&gt;
&lt;p&gt;Prenant mod&#232;le sur Python, il faut renommer nos fonctions avec timestamp_ms ou timestamp_ns&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2' class='spip_note' rel='appendix' title='Cependant, Python n'a pas de fonction pour traiter les microsecondes ; on (...)' id='nh2'&gt;2&lt;/a&gt;]&lt;/span&gt; . Voici donc le jeu complet (pour un format millisecondes) :
&lt;code&gt;readable_date_to_timestamp_ms&lt;/code&gt; &lt;code&gt;readable_dates_to_timestamps_ms&lt;/code&gt; &lt;code&gt;timestamp_ms_to_readable_date&lt;/code&gt;
&lt;code&gt;timestamp_ms_to_readable_date&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur ce sujet, voir &#233;galement : &lt;a href='https://ia.dnc.global/ReAct-l-Intent-Map.html' class='spip_in'&gt;ReAct : la carte des intentions : Intent Map&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh1' class='spip_note' title='Notes 1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;La distinction entre Docstring et m&#233;tadonn&#233;e 'description' existe dans l'objet FunctionTool mais pas dans le mod&#232;le de donn&#233;es MCP dans lequel il n'existe que la description de l'outil.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2' class='spip_note' title='Notes 2' rev='appendix'&gt;2&lt;/a&gt;] &lt;/span&gt;Cependant, Python n'a pas de fonction pour traiter les microsecondes ; on adoptera timestamp_us ?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>ReAct : la carte des intentions : Intent Map</title>
		<link>https://ia.dnc.global/ReAct-l-Intent-Map.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/ReAct-l-Intent-Map.html</guid>
		<dc:date>2025-12-15T12:31:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Dans la s&#233;lection d'un outil par le LLM, le nom de l'outil est prioritaire, la description est secondaire. Il va falloir op&#233;rer une pr&#233;-s&#233;lection des outils sur une meilleure base, avant de les passer au LLM. C'est ici qu'appara&#238;t la carte des intentions (Intent Map). &lt;br class='autobr' /&gt; Dans la s&#233;lection d'un outil par le LLM, il appara&#238;t que le nom de l'outil est prioritaire, et que la description est secondaire. De toute &#233;vidence, la description ne sert au LLM qu'en deuxi&#232;me intention, le plus souvent sur une reprise (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://ia.dnc.global/local/cache-vignettes/L150xH137/arton61-70a30.png?1776388474' width='150' height='137' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans la s&#233;lection d'un outil par le LLM, le nom de l'outil est prioritaire, la description est secondaire. Il va falloir op&#233;rer une pr&#233;-s&#233;lection des outils sur une meilleure base, avant de les passer au LLM. &lt;br class='autobr' /&gt;
C'est ici qu'appara&#238;t la carte des intentions (Intent Map).&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;hr /&gt;
&lt;p&gt;Dans la s&#233;lection d'un outil par le LLM, il appara&#238;t que le nom de l'outil est prioritaire, et que la description est secondaire&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-1' class='spip_note' rel='appendix' title='En revanche, la description sera utile pour d&#233;finir le sch&#233;ma d'entr&#233;es (...)' id='nh2-1'&gt;1&lt;/a&gt;]&lt;/span&gt;. De toute &#233;vidence, la description ne sert au LLM qu'en deuxi&#232;me intention, le plus souvent sur une reprise apr&#232;s erreur. La premi&#232;re s&#233;lection de l'outil est fond&#233;e sur une base trop sommaire. &lt;/p&gt;
&lt;h2&gt;La carte des intentions (Intent Map)&lt;/h2&gt;
&lt;p&gt;Puisque le LLM ne fait pas le travail avec suffisamment de discernement, il va falloir op&#233;rer une pr&#233;-s&#233;lection des outils au niveau de l'orchestrateur, avant de les passer au LLM. Il convient &#233;galement de limiter le nombre d'outils pass&#233;s avec le prompt afin de ma&#238;triser le nombre de tokens envoy&#233;s au LLM.&lt;/p&gt;
&lt;p&gt;C'est ici qu'appara&#238;t la carte des intentions (Intent Map). &lt;/p&gt;
&lt;p&gt;L'&lt;strong&gt;Intent Map&lt;/strong&gt; fait le lien entre les &lt;strong&gt;noms techniques des outils&lt;/strong&gt; et leur &lt;strong&gt;intention m&#233;tier explicite&lt;/strong&gt;. C'est un dictionnaire de la forme :&lt;/p&gt;&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;```&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;intent_map &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;readable_dates_to_timestamps_ms&#034;&lt;/span&gt;: &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Convert a list of human-readable dates into a list of UNIX timestamp expressed in milliseconds.&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;extract_dates&#034;&lt;/span&gt;: &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Extraire une plage de dates &#224; partir d'un texte&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;filter_by_range&#034;&lt;/span&gt;: &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Filtrer une liste d'interventions selon une p&#233;riode&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;summarize_notes&#034;&lt;/span&gt;: &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;R&#233;sumer une s&#233;rie de notes m&#233;dicales&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: black;&#034;&gt;&#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;``` &lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/77941835a50bc433ed7669f28fdb6d00.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Pour les toolbox que nous g&#233;rons, l'Intent Map pourra &#234;tre g&#233;n&#233;r&#233;e automatiquement &#224; partir d'une m&#233;tadonn&#233;e 'intent' des outils, ou d'une propri&#233;t&#233; 'intent_map' de la toolbox.
Sinon, l'Intent Map devra &#234;tre &#233;crite manuellement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'Intent Map permet &#224; l'orchestrateur (classe ToolRouter) de s&#233;lectionner les outils selon l'intention.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;De plus, notre outil de cr&#233;ation de macro-outil (classe MacroToolBuilder) pourra cr&#233;er automatiquement la Docstring macroscopique en se fondant sur les intentions des outils qui la composent. &lt;/p&gt;
&lt;h2&gt;Des cas o&#249; l'Intent Map est essentielle !&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ToolFactory&lt;/strong&gt; : Dans cet article &lt;a href='https://ia.dnc.global/ReAct-Tool-Factory.html' class='spip_in'&gt;ReAct : ToolFactory&lt;/a&gt; nous montrons comment la classe ToolFactory peut cr&#233;er automatiquement des outils &#224; partir de fonctions des biblioth&#232;ques Python. On peut constater que les descriptions des fonctions sont particuli&#232;rement pauvres et parfois inadapt&#233;es &#224; la s&#233;lection par un LLM.
Dans ce cas, une Intent Map sera essentielle &#224; la bonne s&#233;lection des outils. Il est &#224; craindre qu'il faille la construire manuellement !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt; : Dans le cas des outils MCP (Model Context Protocole), les noms d'outils et leur description sont g&#233;r&#233;s du c&#244;t&#233; du serveur MCP, possiblement hors de port&#233;e de l'organisation. Si les descriptions sont mal r&#233;dig&#233;es, ou r&#233;dig&#233;es avec un vocabulaire hors du m&#233;tier, une Intent Map sera essentielle &#224; la bonne s&#233;lection des outils.
Il faudra &#233;videmment la construire manuellement. &lt;/p&gt;
&lt;h2&gt;Comprendre la s&#233;lection des outils&lt;/h2&gt;
&lt;p&gt;Il est important de consid&#233;rer la mani&#232;re dont un agent ReAct s&#233;lectionne et priorise les outils. Ce sera la m&#234;me m&#233;thode pour la pr&#233;-s&#233;lection au niveau de l'orchestrateur. &lt;/p&gt;
&lt;p&gt;C'est &lt;strong&gt;tool.metadata.description&lt;/strong&gt; qui est envoy&#233;e au LLM. &lt;/p&gt;
&lt;p&gt;Le LLM lit la description pour choisir un outil, pas pour comprendre toute la documentation. Lorsqu'un agent ReAct doit choisir un outil, il cherche une correspondance s&#233;mantique forte sur les points suivants :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;em&gt;Quel est le nom de l'outil ?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Quelle est l'action principale ?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Sur quel type d'objet travaille-t-il ?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Seule l'intention est r&#233;ellement utile pour la s&#233;lection d'outil.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Le reste (d&#233;tails, param&#232;tres, avertissements) n'aide pas &#224; la s&#233;lection, au contraire : plus la description est longue, plus on augmente le risque d'erreurs de s&#233;lection. &lt;strong&gt;Une description longue rend l'outil moins distinctif dans l'espace vectoriel du mod&#232;le&lt;/strong&gt; et abouti &#224; une moindre pr&#233;cision dans la s&#233;lection.&lt;/p&gt;
&lt;h2&gt;Bonnes pratiques pour la r&#233;daction des Intentions :**&lt;/h2&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Les valeurs doivent &#234;tre des &lt;strong&gt;descriptions m&#233;tier claires&lt;/strong&gt;, pas des signatures techniques.&lt;/li&gt;
&lt;li&gt;Elles doivent &#234;tre &lt;strong&gt;formul&#233;es &#224; l'infinitif&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Elles doivent &lt;strong&gt;&#233;viter les termes ambigus&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Bien d&#233;finir le vocabulaire (les mots et leur s&#233;mantique) dans un &lt;strong&gt;lexique du m&#233;tier&lt;/strong&gt;, et s'y conformer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Exemple concret (de ce qu'il ne faut pas faire) :&lt;/h3&gt;
&lt;p&gt;Si on envoie ceci :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;extract_values_by_key(dict_list, key)
Extract all values associated with a given key from a list of dictionaries.
Retrieve the values corresponding to a specific key within a collection of objects.
Iterates through a list of items and returns only the values for which:
- the item is a dictionary
- the key exists&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On augmente les collisions avec d'autres outils. :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&#8220;collection of objects&#8221; &#8594; outil g&#233;n&#233;rique &lt;/li&gt;
&lt;li&gt;&#8220;iterate through items&#8221; &#8594; ressemble &#224; un filtre &lt;/li&gt;
&lt;li&gt;&#8220;values&#8221; &#8594; ressemble &#224; un extracteur &lt;/li&gt;
&lt;li&gt;&#8220;dictionary&#8221; &#8594; structure sp&#233;cifique &lt;/li&gt;
&lt;li&gt;&#8220;key exists&#8221; &#8594; condition logique &lt;/li&gt;
&lt;li&gt;&#8220;list&#8221; &#8594; structure s&#233;quentielle &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce qu'il faut &#233;crire :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;extract_values_by_key(dict_list, key)
Extract all values associated with a given key from a list of dictionaries.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C'est tout !&lt;/p&gt;
&lt;h2&gt;La g&#233;n&#233;ration syst&#233;matique de la description&lt;/h2&gt;
&lt;p&gt;Il faut consid&#233;rer deux champs : tool.description et tool.metadata.description.&lt;/p&gt;
&lt;p&gt;Si on ne d&#233;finit pas le champ 'description' de l'outil, tool.metadata.description sera &#233;labor&#233; par LlamaIndex &#224; partir de la Docstring, en lui appliquant des heuristiques qui ajoutent parfois la signature, reformate, supprime certains &#233;l&#233;ments, interpr&#232;te le Markdown, modifie l'ordre des lignes etc.. Bref : on ne peut se fonder dessus pour fournir l'intention.&lt;/p&gt;
&lt;p&gt;Pour garantir que la premi&#232;re ligne soit un r&#233;sum&#233; clair, LlamaIndex ajoute parfois la signature en appliquant cette heuristique :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Si la docstring commence par une phrase simple &#8594; pas de signature&lt;/li&gt;
&lt;li&gt;Si la docstring commence par du Markdown, une ligne vide, un titre, du gras, etc. &#8594; signature ajout&#233;e.
Ce comportement est : non document&#233;, non stable, diff&#233;rent selon les versions, influenc&#233; par le format de la docstring. De plus, la signature est sans valeur s&#233;mantique, elle ajoute du bruit et d&#233;gradera la s&#233;lection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;metadata.description doit n'avoir que l'intention sur une ligne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour reprendre le contr&#244;le, &lt;strong&gt;il faut toujours d&#233;finir le champ description, et ce, sous la forme d'une Intention&lt;/strong&gt;.
cela &#233;crasera metadata.description. Le LLM verra exactement ce que l'on veut qu'il voie.&lt;/p&gt;
&lt;p&gt;La meilleure pratique :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Garder la docstring pour les humains et pour la deuxi&#232;me intention. &lt;/li&gt;
&lt;li&gt;Pour le LLM, fournir explicitement `metadata.description='intention' en une phrase. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Le r&#244;le de la docstring pour la deuxi&#232;me intention&lt;/h2&gt;
&lt;p&gt;Il s'agit d'un un autre m&#233;canisme de LlamaIndex qui entre en jeu &lt;strong&gt;uniquement apr&#232;s une erreur&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Quand un outil &#233;choue (exception Python, mauvais arguments, etc.), LlamaIndex renvoie au LLM un &lt;em&gt;Tool Error Message&lt;/em&gt;.
Ce message contient :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;l'erreur Python, &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;la docstring compl&#232;te de l'outil&lt;/strong&gt; (ou une version nettoy&#233;e), &lt;/li&gt;
&lt;li&gt;parfois la signature, &lt;/li&gt;
&lt;li&gt;parfois des instructions suppl&#233;mentaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En effet, pour poursuivre le raisonnement en le modifiant (ne pas r&#233;p&#233;ter l'erreur), le LLM doit &#234;tre capable de :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;comprendre pourquoi l'appel a &#233;chou&#233;, &lt;/li&gt;
&lt;li&gt;reformuler un appel correct, &lt;/li&gt;
&lt;li&gt;r&#233;essayer avec les bons arguments, &lt;/li&gt;
&lt;li&gt;ajuster son comportement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et pour &#231;a, il a besoin d'informations plus d&#233;taill&#233;es que celles utilis&#233;es pour la s&#233;lection initiale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Premi&#232;re intention : s&#233;lection d'outil &#8594; intention courte&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Deuxi&#232;me intention : correction d'erreur &#8594; docstring d&#233;taill&#233;e&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En r&#233;sum&#233; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Le LLM ne voit que &lt;code&gt;metadata.description&lt;/code&gt; pour choisir un outil. &lt;/li&gt;
&lt;li&gt;Le LLM voit la docstring compl&#232;te uniquement apr&#232;s une erreur. &lt;/li&gt;
&lt;li&gt;il faut &#233;crire des docstrings d&#233;taill&#233;es. &lt;/li&gt;
&lt;li&gt;on doit mettre uniquement l'intention dans &lt;code&gt;metadata.description&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sur ce sujet, voir &#233;galement :&lt;/strong&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://ia.dnc.global/ReAct-le-nommage-des-outils.html' class='spip_in'&gt;ReAct : le nommage des outils.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb2-1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-1' class='spip_note' title='Notes 2-1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;En revanche, la description sera utile pour d&#233;finir le sch&#233;ma d'entr&#233;es attendues par l'outil.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>ReAct : ToolFactory</title>
		<link>https://ia.dnc.global/ReAct-Tool-Factory.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/ReAct-Tool-Factory.html</guid>
		<dc:date>2025-12-02T13:30:48Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;ToolFactory est une biblioth&#232;que d'utilitaires permettant de cr&#233;er des Outils de Fonction (FunctionTool) &#224; partir d'une biblioth&#232;que de fonctions Python. La fonction auto_toolkit &lt;br class='autobr' /&gt;
Cette fonction g&#233;n&#232;re dynamiquement une liste de `FunctionTool` LlamaIndex &#224; partir des fonctions publiques d'un module Python. &lt;br class='autobr' /&gt;
Elle inspecte les fonctions du module fourni, applique des filtres d'inclusion/exclusion, et transforme chaque fonction retenue en outil agentifiable (`FunctionTool`) via l'examen de sa signature (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;ToolFactory est une biblioth&#232;que d'utilitaires permettant de cr&#233;er des Outils de Fonction (FunctionTool) &#224; partir d'une biblioth&#232;que de fonctions Python.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class=&#034;spip&#034;&gt;La fonction auto_toolkit&lt;/h3&gt;
&lt;p&gt;Cette fonction g&#233;n&#232;re dynamiquement une liste de `FunctionTool` LlamaIndex &#224; partir des fonctions publiques d'un module Python.&lt;/p&gt;
&lt;p&gt;Elle inspecte les fonctions du module fourni, applique des filtres d'inclusion/exclusion, et transforme chaque fonction retenue en outil agentifiable (`FunctionTool`) via l'examen de sa signature et de sa documentation.&lt;/p&gt;
&lt;p&gt; Param&#232;tres :&lt;br class='autobr' /&gt; module (ModuleType) :&lt;br class='autobr' /&gt; Le module Python &#224; analyser (ex. : `statistics`, `math`, ou un module m&#233;tier).&lt;br class='autobr' /&gt; include (List[str], optionnel) :&lt;br class='autobr' /&gt; Liste blanche : noms de fonctions &#224; inclure explicitement. Si None, inclut toutes les fonctions publiques.&lt;br class='autobr' /&gt; exclude (List[str], optionnel) :&lt;br class='autobr' /&gt; Liste noire : noms de fonctions &#224; ignorer. Prioritaire sur `include`.&lt;br class='autobr' /&gt; verbose (bool, optionnel) :&lt;br class='autobr' /&gt; Si True, affiche dans la console les outils ajout&#233;s et les erreurs &#233;ventuelles.&lt;/p&gt;
&lt;p&gt; Retour :&lt;br class='autobr' /&gt; List[FunctionTool] :&lt;br class='autobr' /&gt; Liste des objets `FunctionTool` g&#233;n&#233;r&#233;s &#224; partir des fonctions s&#233;lectionn&#233;es.&lt;/p&gt;
&lt;p&gt; Usage :&lt;br class='autobr' /&gt; from modules.tools.tool_factory import auto_toolkit&lt;br class='autobr' /&gt; tools = auto_toolkit(&lt;br class='autobr' /&gt; statistics,&lt;br class='autobr' /&gt; include=[&#034;mean&#034;, &#034;stdev&#034;, &#034;median&#034;],&lt;br class='autobr' /&gt; tags=[&#034;statistique&#034;],&lt;br class='autobr' /&gt; verbose=True&lt;/p&gt;
&lt;p&gt;Voici l'essentiel du code :&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;## Usinage ##&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;def&lt;/span&gt; auto_toolkit&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; module: ModuleType&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; *&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; include: List&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #008000;&#034;&gt;str&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;None&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; exclude: List&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #008000;&#034;&gt;str&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;None&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; verbose: &lt;span style=&#034;color: #008000;&#034;&gt;bool&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;False&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; **kwargs&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; -&lt;span style=&#034;color: #66cc66;&#034;&gt;&gt;&lt;/span&gt; List&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;FunctionTool&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;&#034;&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; G&#233;n&#232;re une liste de FunctionTool LlamaIndex &#224; partir des fonctions publiques d'un module.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Applique automatiquement les d&#233;corateurs d'entr&#233;e/sortie pour compatibilit&#233; agentique.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Test : test_auto_toolkit.py&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Param&#232;tres&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; ----------&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; module : ModuleType&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Module Python &#224; inspecter (ex. statistics, math, ou module maison)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; include : list of str, optional&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Liste blanche : noms de fonctions &#224; inclure (si sp&#233;cifi&#233;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; exclude : list of str, optional&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Liste noire : noms de fonctions &#224; ignorer&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; verbose : bool&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Si True, affiche les outils ajout&#233;s&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; **kwargs : dict&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; M&#233;tadonn&#233;es suppl&#233;mentaires &#224; passer &#224; `as_llama_tool` (ex. tags, metadata, etc.)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Returns&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; -------&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; List[FunctionTool]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Liste d'outils LlamaIndex pr&#234;ts &#224; &#234;tre enregistr&#233;s dans un agent&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; &#034;&#034;&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tools &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; total &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #ff4500;&#034;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; success &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #ff4500;&#034;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; name&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; fn &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: #dc143c;&#034;&gt;inspect&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;getmembers&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;module&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #dc143c;&#034;&gt;inspect&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;isfunction&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; name.&lt;span style=&#034;color: black;&#034;&gt;startswith&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;_&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; include &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;and&lt;/span&gt; name &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;not&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; include:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; exclude &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;and&lt;/span&gt; name &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; exclude:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; total +&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #ff4500;&#034;&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# Application des d&#233;corateurs d'entr&#233;e et de sortie&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; decorated_fn &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; react_tool_output&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;react_tool_input&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;fn&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; decorated_fn &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; react_tool_output&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;decorated_fn &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# Cr&#233;ation du FunctionTool avec m&#233;tadonn&#233;es&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tool &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; as_llama_tool&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; name&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;name&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; **kwargs&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;decorated_fn&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tools.&lt;span style=&#034;color: black;&#034;&gt;append&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;tool&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; success +&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #ff4500;&#034;&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; verbose:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; trace&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Outil ajout&#233; : {get_tool_name(tool)}&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; logger&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;except&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;Exception&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;as&lt;/span&gt; e:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; trace&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Erreur lors de l'ajout de l'outil '{name}': {e}&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; logger&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; trace&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;{success} outils ajout&#233;s avec succ&#232;s sur {total} fonctions inspect&#233;es.&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; logger&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; tools&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/d1f04eaec18f44b6538d4fec8b8cab29.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Voici le code pour g&#233;n&#233;rer automatiquement des outils de fonction &#224; partir du module 'statistiques. Noter que l'on peut choisir les fonctions &#224; importer.&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;from&lt;/span&gt; modules.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tool_factory&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;import&lt;/span&gt; auto_toolkit&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tools +&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; auto_toolkit&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; statistics&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; include&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;mean&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;stdev&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;median&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;variance&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; verbose&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;&lt;span style=&#034;color: #008000;&#034;&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/70785e05cc149f1bfa72e008e197d19b.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Modules Python et fonctions utilisables&lt;/h3&gt;&lt;p&gt;Tous les modules Python ne sont pas pertinents pour produire des &lt;em&gt;FunctionTool&lt;/em&gt; exploitables dans un agent. Voici une &lt;strong&gt;s&#233;lection affin&#233;e&lt;/strong&gt;, class&#233;e selon leur **pertinence, c'est-&#224;-dire leur capacit&#233; &#224; fournir des fonctions :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;publiques&lt;/li&gt;
&lt;li&gt;pures ou quasi-pures&lt;/li&gt;
&lt;li&gt;typ&#233;es&lt;/li&gt;
&lt;li&gt;document&#233;es&lt;/li&gt;
&lt;li&gt;auto-validables via &lt;em&gt;fn_schema&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Pertinence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;statistics&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Fonctions bien typ&#233;es, docstring claires, signatures simples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;math&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Fonctions scalaires pures, typ&#233;es, robustes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;cmath&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Idem, mais pour les complexes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;decimal&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Fonctions pr&#233;cises pour calculs financiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;fractions&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Manipulation exacte de rationnels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;datetime&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Fonctions de manipulation de dates (attention &#224; la mutabilit&#233;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;calendar&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Fonctions pures sur les jours, semaines, ann&#233;es&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;itertools&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;G&#233;n&#233;rateurs utiles, mais n&#233;cessite des wrappers pour &#234;tre agentifiables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;functools&lt;/em&gt; (partiellement)&lt;/td&gt;
&lt;td&gt;Quelques fonctions d&#233;corables (ex. &lt;em&gt;reduce&lt;/em&gt;) si bien encapsul&#233;es&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Voici un tableau synth&#233;tique des fonctions principales pour chaque module Python standard qui peuvent &#234;tre transform&#233;s en FunctionTool par &lt;em&gt;tool_factory&lt;/em&gt;, avec leur description.*&lt;em&gt; Ces fonctions sont typ&#233;es, document&#233;es, et g&#233;n&#233;ralement compatibles avec &lt;/em&gt;FunctionTool*.&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;statistics&lt;/em&gt; &#8212; Statistiques descriptives&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;mean(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Moyenne arithm&#233;tique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;fmean(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Moyenne arithm&#233;tique rapide (float uniquement)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;geometric_mean(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Moyenne g&#233;om&#233;trique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;harmonic_mean(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Moyenne harmonique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;median(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;M&#233;diane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;median_low(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Plus grande valeur &#8804; m&#233;diane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;median_high(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Plus petite valeur &#8805; m&#233;diane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;median_grouped(data, interval=1)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;M&#233;diane pour donn&#233;es group&#233;es&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;mode(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Valeur la plus fr&#233;quente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;multimode(data)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Liste des valeurs les plus fr&#233;quentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;pstdev(data, mu=None)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&#201;cart-type de la population&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;stdev(data, xbar=None)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&#201;cart-type de l'&#233;chantillon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;pvariance(data, mu=None)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Variance de la population&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;variance(data, xbar=None)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Variance de l'&#233;chantillon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;quantiles(data, &lt;/em&gt;, n=4, method='exclusive')*&lt;/td&gt;
&lt;td&gt;D&#233;coupe en quantiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;covariance(x, y)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Covariance entre deux s&#233;ries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;correlation(x, y)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Corr&#233;lation de Pearson&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;linear_regression(x, y)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;R&#233;gression lin&#233;aire (renvoie pente et intercept)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;em&gt;math&lt;/em&gt; &#8212; Math&#233;matiques de base&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;sqrt(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Racine carr&#233;e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;exp(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Exponentielle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;log(x, base=math.e)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Logarithme (base e par d&#233;faut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;log10(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Logarithme d&#233;cimal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;log2(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Logarithme base 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;pow(x, y)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Puissance ( x^y )&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;fabs(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Valeur absolue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;factorial(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Factorielle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;gcd(a, b)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Plus grand commun diviseur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;lcm(a, b)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Plus petit commun multiple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;ceil(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Arrondi sup&#233;rieur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;floor(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Arrondi inf&#233;rieur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;trunc(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Troncature (partie enti&#232;re)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;sin(x), cos(x), tan(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Fonctions trigonom&#233;triques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;degrees(x), radians(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Conversion angle &#8596; radians&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;isclose(a, b)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Comparaison flottante&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;isnan(x), isinf(x), isfinite(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Tests num&#233;riques&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;em&gt;cmath&lt;/em&gt; &#8212; Math&#233;matiques complexes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;sqrt(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Racine carr&#233;e complexe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;exp(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Exponentielle complexe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;log(x, base=math.e)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Log complexe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;phase(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Argument (angle) d'un nombre complexe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;polar(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Coordonn&#233;es polaires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;rect(r, phi)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Conversion polaire &#8594; cart&#233;sien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;sin(x), cos(x), tan(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Trigonom&#233;trie complexe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;em&gt;decimal&lt;/em&gt; &#8212; Calculs d&#233;cimaux pr&#233;cis&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Decimal(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Cr&#233;e un nombre d&#233;cimal pr&#233;cis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;getcontext()&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Acc&#232;s au contexte (pr&#233;cision, arrondi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;setcontext(ctx)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;D&#233;finit un contexte personnalis&#233;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;localcontext()&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Contexte temporaire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&#233;thodes : &lt;em&gt;sqrt()&lt;/em&gt;, &lt;em&gt;ln()&lt;/em&gt;, &lt;em&gt;exp()&lt;/em&gt;, &lt;em&gt;quantize()&lt;/em&gt;, etc.&lt;/td&gt;
&lt;td&gt;Op&#233;rations pr&#233;cises sur &lt;em&gt;Decimal&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;em&gt;fractions&lt;/em&gt; &#8212; Calculs exacts avec fractions&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Fraction(x)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Cr&#233;e une fraction exacte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;limit_denominator(max_denominator)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Approximation avec d&#233;nominateur born&#233;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Op&#233;rations : &lt;em&gt;+&lt;/em&gt;, &lt;em&gt;-&lt;/em&gt;, *&lt;strong&gt;, &lt;em&gt;/&lt;/em&gt;, **&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Calculs exacts entre fractions ou entiers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;em&gt;datetime&lt;/em&gt; &#8212; Dates et heures&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;datetime(year, month, day, ...)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Objet date-heure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;date(year, month, day)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Objet date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;time(hour, minute, ...)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Objet heure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;timedelta(...)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Dur&#233;e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;now(), today(), utcnow()&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Horodatages actuels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&#233;thodes : &lt;em&gt;isoformat()&lt;/em&gt;, &lt;em&gt;weekday()&lt;/em&gt;, &lt;em&gt;strftime()&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Formatage et manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;em&gt;calendar&lt;/em&gt; &#8212; Calendriers&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;isleap(year)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Ann&#233;e bissextile ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;monthrange(year, month)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Premier jour et nombre de jours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;monthcalendar(year, month)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Matrice des semaines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;weekday(year, month, day)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Jour de la semaine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;month_name&lt;/em&gt;, &lt;em&gt;day_name&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Noms localis&#233;s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Sources :&lt;/strong&gt; &lt;a href=&#034;https://docs.python.org/3/library/index.html&#034;&gt;Python 3.14 Standard Library Documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Glossaire et conventions de nommage</title>
		<link>https://ia.dnc.global/Glossaire-et-conventions-de-nommage-53.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/Glossaire-et-conventions-de-nommage-53.html</guid>
		<dc:date>2025-12-02T09:46:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Glossaire et conventions pour outils agentiques (ReAct, FunctionTool, ToolRouter) Glossaire Terme D&#233;finition op&#233;rationnelle Remarques Outil (Tool) Fonction callable expos&#233;e &#224; l'agent, avec nom, description, sch&#233;ma d'entr&#233;e, et logique m&#233;tier Peut &#234;tre d&#233;cor&#233;e ou encapsul&#233;e FunctionTool Repr&#233;sentation structur&#233;e d'un outil, incluant nom, description, param&#232;tres typ&#233;s, fonction Python, etc. Format utilis&#233; dans LangChain, CrewAI, ou orchestrateurs maison Observation R&#233;sultat retourn&#233; par un outil, (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;hr /&gt;
&lt;h1&gt;Glossaire et conventions pour outils agentiques (ReAct, FunctionTool, ToolRouter)&lt;/h1&gt;
&lt;h2&gt;Glossaire&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Terme&lt;/th&gt;
&lt;th&gt;D&#233;finition op&#233;rationnelle&lt;/th&gt;
&lt;th&gt;Remarques&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outil&lt;/strong&gt; (&lt;code&gt;Tool&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Fonction callable expos&#233;e &#224; l'agent, avec nom, description, sch&#233;ma d'entr&#233;e, et logique m&#233;tier&lt;/td&gt;
&lt;td&gt;Peut &#234;tre d&#233;cor&#233;e ou encapsul&#233;e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FunctionTool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Repr&#233;sentation structur&#233;e d'un outil, incluant nom, description, param&#232;tres typ&#233;s, fonction Python, etc.&lt;/td&gt;
&lt;td&gt;Format utilis&#233; dans LangChain, CrewAI, ou orchestrateurs maison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;R&#233;sultat retourn&#233; par un outil, interpr&#233;t&#233; par l'agent comme une r&#233;ponse &#224; une action&lt;/td&gt;
&lt;td&gt;Doit &#234;tre lisible, typ&#233;e, et sans ambigu&#239;t&#233;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ReAct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paradigme Reasoning + Acting : l'agent r&#233;fl&#233;chit, choisit un outil, observe le r&#233;sultat, et recommence&lt;/td&gt;
&lt;td&gt;N&#233;cessite des outils bien d&#233;crits et des observations claires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;D&#233;corateur ReAct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fonction qui encapsule un outil pour g&#233;rer les cas nuls, erreurs, ou formats d'observation&lt;/td&gt;
&lt;td&gt;Ex : &lt;code&gt;@react_tool_output&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Toolkit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Collection d'outils regroup&#233;s par domaine ou usage, souvent inject&#233;e dans un agent&lt;/td&gt;
&lt;td&gt;Peut &#234;tre statique ou g&#233;n&#233;r&#233;e dynamiquement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ToolRouter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;M&#233;canisme de filtrage intelligent qui s&#233;lectionne dynamiquement les outils pertinents &#224; injecter dans le contexte&lt;/td&gt;
&lt;td&gt;Peut &#234;tre bas&#233; sur tags, embeddings, ou r&#232;gles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vectorisation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transformation d'un texte (requ&#234;te ou description) en vecteur s&#233;mantique pour calcul de similarit&#233;&lt;/td&gt;
&lt;td&gt;Terme pr&#233;f&#233;r&#233; &#224; &#8220;encodage&#8221;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Matching s&#233;mantique&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Comparaison de vecteurs pour identifier les outils les plus proches d'une requ&#234;te&lt;/td&gt;
&lt;td&gt;Utilise souvent la similarit&#233; cosinus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&#201;tiquette s&#233;mantique associ&#233;e &#224; un outil (&lt;code&gt;&#034;math&#034;&lt;/code&gt;, &lt;code&gt;&#034;stat&#034;&lt;/code&gt;, &lt;code&gt;&#034;juridique&#034;&lt;/code&gt;, etc.) pour faciliter le routage&lt;/td&gt;
&lt;td&gt;Peut &#234;tre manuel ou g&#233;n&#233;r&#233; automatiquement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sch&#233;ma Pydantic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;D&#233;finition typ&#233;e des param&#232;tres d'un outil, utilis&#233;e pour validation, documentation, ou g&#233;n&#233;ration automatique&lt;/td&gt;
&lt;td&gt;Peut &#234;tre d&#233;riv&#233; des annotations Python&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Conventions de nommage et structuration&lt;/h2&gt;
&lt;h3&gt;Outils (&lt;code&gt;FunctionTool&lt;/code&gt;)&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nom&lt;/strong&gt; : &lt;code&gt;snake_case&lt;/code&gt;, explicite (&lt;code&gt;calcul_moyenne&lt;/code&gt;, &lt;code&gt;recherche_siret&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : phrase compl&#232;te, actionnable, sans jargon&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Param&#232;tres&lt;/strong&gt; : typ&#233;s, nomm&#233;s en fran&#231;ais si l'agent est francophone&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt; : typ&#233;, clair, sans structure parasite&lt;/p&gt;
&lt;md&gt;
### Toolkits
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regroup&#233;s par domaine : &lt;code&gt;math_tools&lt;/code&gt;, &lt;code&gt;stat_tools&lt;/code&gt;, &lt;code&gt;admin_tools&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;G&#233;n&#233;r&#233;s via &lt;code&gt;auto_toolkit(module, tags=...)&lt;/code&gt; si besoin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;D&#233;corateurs&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;code&gt;@react_tool_output&lt;/code&gt; : appliqu&#233; uniquement si gestion des cas nuls ou erreurs souhait&#233;e&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@as_function_tool(...)&lt;/code&gt; : pour enregistrer automatiquement dans un registre&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Routage&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;code&gt;ToolRouter&lt;/code&gt; vectoriel : bas&#233; sur &lt;code&gt;SentenceTransformer&lt;/code&gt; ou &lt;code&gt;OpenAIEmbeddings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tags&lt;/strong&gt; : utilis&#233;s comme filtre rapide avant vectorisation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Matching&lt;/strong&gt; : top-k outils par similarit&#233; cosinus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback&lt;/strong&gt; : si aucun outil n'est pertinent, retour explicite &lt;code&gt;&#034;Aucun outil pertinent trouv&#233;&#034;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>LLM-based Retrieval ou Embedding-based Retrieval ?</title>
		<link>https://ia.dnc.global/LLM-based-Retrieval-ou-Embedding-based-Retrieval.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/LLM-based-Retrieval-ou-Embedding-based-Retrieval.html</guid>
		<dc:date>2025-11-25T10:05:11Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;LLM-based Retrieval utilise directement la capacit&#233; des grands mod&#232;les de langage &#224; comprendre et raisonner sur une requ&#234;te ; Embedding-based Retrieval transforme documents et requ&#234;tes en vecteurs et r&#233;cup&#232;re par similarit&#233;.
&lt;br class='autobr' /&gt;
Chacune a ses forces : compr&#233;hension contextuelle et flexibilit&#233; pour les LLMs ; scalabilit&#233; et rapidit&#233; pour les embeddings. &lt;br class='autobr' /&gt;
Pour les donn&#233;es structur&#233;es et les s&#233;lections exhaustives, les LLM sont inadapt&#233;s et les embeddings montrent des limites ; la solution propos&#233;e combine ReAct (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://ia.dnc.global/local/cache-vignettes/L150xH105/arton22-959dc.png?1776284810' width='150' height='105' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;LLM-based Retrieval utilise directement la capacit&#233; des grands mod&#232;les de langage &#224; comprendre et raisonner sur une requ&#234;te ; Embedding-based Retrieval transforme documents et requ&#234;tes en vecteurs et r&#233;cup&#232;re par similarit&#233;.&lt;br class='autobr' /&gt;
Chacune a ses forces : compr&#233;hension contextuelle et flexibilit&#233; pour les LLMs ; scalabilit&#233; et rapidit&#233; pour les embeddings.&lt;/p&gt;
&lt;p&gt;Pour les donn&#233;es structur&#233;es et les s&#233;lections exhaustives, les LLM sont inadapt&#233;s et les embeddings montrent des limites ; la solution propos&#233;e combine ReAct (orchestrateur LLM) + outils d&#233;terministes + RAG pour tirer parti des deux approches.&lt;/p&gt;
&lt;p&gt;Nous &#233;voquons des d&#233;veloppements qui iraient dans le m&#234;me sens : embeddings avec filtrage, recherche hybride.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;LLM-based Retrieval&lt;/strong&gt; et &lt;strong&gt;Embedding-based Retrieval&lt;/strong&gt; sont deux approches utilis&#233;es pour r&#233;cup&#233;rer des informations dans un syst&#232;me de recherche, mais elles diff&#232;rent par leur fonctionnement et leurs applications. Voici une comparaison d&#233;taill&#233;e :&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. LLM-based Retrieval (Bas&#233; sur les Large Language Models)&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;Principe&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Les &lt;strong&gt;Large Language Models (LLMs)&lt;/strong&gt;, comme OpenAI GPT, MistralAI ou d'autres mod&#232;les similaires, sont directement utilis&#233;s pour comprendre une requ&#234;te et r&#233;cup&#233;rer des informations pertinentes.&lt;/li&gt;
&lt;li&gt;La r&#233;cup&#233;ration se fait en s'appuyant sur la capacit&#233; du LLM &#224; &lt;strong&gt;comprendre le langage naturel&lt;/strong&gt; et &#224; &lt;strong&gt;raisonner&lt;/strong&gt; sur les donn&#233;es ou documents disponibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;M&#233;thode&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Le mod&#232;le est &#034;interrog&#233;&#034; avec une requ&#234;te.&lt;/li&gt;
&lt;li&gt;Il peut soit :&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;G&#233;n&#233;rer une r&#233;ponse directement en s'appuyant sur son entra&#238;nement (s'il est pr&#233;-entra&#238;n&#233; sur un large corpus).&lt;/li&gt;
&lt;li&gt;S'appuyer sur un &lt;strong&gt;context augmenter&lt;/strong&gt; en consultant des bases de connaissances ou des donn&#233;es suppl&#233;mentaires pertinentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;Avantages&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;Compr&#233;hension contextuelle avanc&#233;e&lt;/strong&gt; : LLM peut raisonner sur des requ&#234;tes complexes en tenant compte des subtilit&#233;s linguistiques.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible&lt;/strong&gt; : Peut fournir une r&#233;ponse directe ou agir comme un interm&#233;diaire intelligent pour filtrer et reformuler des r&#233;sultats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peu d'efforts de pr&#233;-traitement n&#233;cessaires&lt;/strong&gt; : La requ&#234;te peut &#234;tre en langage naturel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;Inconv&#233;nients&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;Co&#251;t computationnel &#233;lev&#233;&lt;/strong&gt; : L'interrogation d'un LLM n&#233;cessite g&#233;n&#233;ralement beaucoup de ressources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risque d'erreurs contextuelles&lt;/strong&gt; : Si les informations sont absentes ou mal structur&#233;es, les LLM peuvent &#034;halluciner&#034; (inventer des r&#233;ponses).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moins adapt&#233; pour des ensembles de donn&#233;es massifs&lt;/strong&gt; sans techniques d'indexation suppl&#233;mentaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2. Embedding-based Retrieval (Bas&#233; sur les embeddings)&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;Principe&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Les &lt;strong&gt;embeddings&lt;/strong&gt; sont des repr&#233;sentations vectorielles denses de donn&#233;es (textes, requ&#234;tes, documents, etc.).&lt;/li&gt;
&lt;li&gt;Une r&#233;cup&#233;ration bas&#233;e sur les embeddings repose sur la similarit&#233; entre les repr&#233;sentations vectorielles de la requ&#234;te et des documents.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;M&#233;thode&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Les textes (documents ou requ&#234;tes) sont transform&#233;s en vecteurs denses &#224; l'aide d'un mod&#232;le pr&#233;-entra&#238;n&#233; (par exemple, Sentence-BERT, OpenAI embeddings, etc.).&lt;/li&gt;
&lt;li&gt;Une fois les vecteurs g&#233;n&#233;r&#233;s :&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;La requ&#234;te est &#233;galement convertie en vecteur.&lt;/li&gt;
&lt;li&gt;Une recherche de proximit&#233; est effectu&#233;e (par exemple, en utilisant la &lt;strong&gt;cosine similarity&lt;/strong&gt; ou une autre m&#233;trique) pour trouver les documents les plus pertinents.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;Avantages&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;Efficacit&#233; sur de grands ensembles de donn&#233;es&lt;/strong&gt; : Une fois les embeddings g&#233;n&#233;r&#233;s, les recherches sont rapides gr&#226;ce &#224; des techniques comme l'approximation de la recherche des plus proches voisins (&lt;strong&gt;ANN&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robustesse aux variations linguistiques&lt;/strong&gt; : Les embeddings capturent les relations s&#233;mantiques m&#234;me si les mots exacts diff&#232;rent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalabilit&#233;&lt;/strong&gt; : Bien adapt&#233; pour des millions ou milliards de documents.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;Inconv&#233;nients&lt;/strong&gt;&lt;/h4&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;N&#233;cessite un pr&#233;traitement initial&lt;/strong&gt; : Les documents doivent &#234;tre convertis en embeddings &#224; l'avance. Cela va dans le sens de la frugalit&#233; et, le plus souvent, c'est la norme s'agissant du RAG dans les entreprises.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moins bon pour les requ&#234;tes complexes&lt;/strong&gt; : Peut manquer de compr&#233;hension contextuelle avanc&#233;e compar&#233;e &#224; un LLM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D&#233;pend des donn&#233;es d'entra&#238;nement du mod&#232;le&lt;/strong&gt; : Si les embeddings ne capturent pas correctement les relations dans un domaine sp&#233;cifique, la r&#233;cup&#233;ration sera sous-optimale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;R&#233;sum&#233; des diff&#233;rences&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Aspect&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;LLM-based Retrieval&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Embedding-based Retrieval&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approche principale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;R&#233;cup&#233;ration bas&#233;e sur les capacit&#233;s du LLM &#224; g&#233;n&#233;rer ou filtrer des r&#233;sultats en langage naturel.&lt;/td&gt;
&lt;td&gt;Bas&#233;e sur des vecteurs s&#233;mantiques pr&#233;-calcul&#233;s.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compr&#233;hension contextuelle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tr&#232;s &#233;lev&#233;e (gr&#226;ce &#224; la puissance des LLM).&lt;/td&gt;
&lt;td&gt;Mod&#233;r&#233;e (limit&#233;e aux relations s&#233;mantiques captur&#233;es).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Efficacit&#233;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moins efficace pour les bases de donn&#233;es massives (co&#251;t &#233;lev&#233;).&lt;/td&gt;
&lt;td&gt;Tr&#232;s efficace apr&#232;s le calcul initial des embeddings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Co&#251;t&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Co&#251;t computationnel &#233;lev&#233; &#224; chaque requ&#234;te.&lt;/td&gt;
&lt;td&gt;Co&#251;t initial pour le calcul des embeddings, faible co&#251;t pour la recherche.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Applications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Questions complexes, dialogue, synth&#232;se d'informations.&lt;/td&gt;
&lt;td&gt;Recherche dans des bases massives de documents.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;strong&gt;Cas d'utilisation typiques&lt;/strong&gt;&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;LLM-based Retrieval&lt;/strong&gt; : Syst&#232;mes de dialogue, assistant virtuel, recherche contextuelle avanc&#233;e dans des donn&#233;es limit&#233;es. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embedding-based Retrieval&lt;/strong&gt; : Moteurs de recherche, r&#233;cup&#233;ration de documents scientifiques, bases de donn&#233;es denses. Les deux approches peuvent &#234;tre combin&#233;es dans un syst&#232;me hybride pour tirer parti des forces de chacune (par exemple, utilisation d'embeddings pour une recherche rapide suivie d'un raisonnement contextuel via un LLM). C'est la base des outils RAG que nous d&#233;veloppons : &lt;a href='https://ia.dnc.global/-Outils-d-IA-textuels-.html' class='spip_in'&gt;Outils d'IA textuels&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Les limites de la recherche par embeddings&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Cet article : &lt;a href=&#034;https://noailabs.medium.com/on-the-theoretical-limitations-of-embedding-based-retrieval-new-research-paper-c70dc3edc817&#034; class='spip_out' rel='external'&gt;Theoretical Limitations of Embedding-Based Retrieval&lt;/a&gt; met en avant les limitations de la recherche par embeddings. &lt;/p&gt;
&lt;p&gt;On y d&#233;montre l'incapacit&#233; d'une recherche par embeddings &#224; retrouver 46 documents simples parmi un corpus de 50.000 documents ( &lt;em&gt;noter que la recherche par LLM ne fait pas mieux, c'est d'ailleurs la raison pour laquelle l'article mentionn&#233; reste sur une solution par embeddings&lt;/em&gt; ) .&lt;/p&gt;
&lt;p&gt;On peut observer que les &#034;petits documents&#034; sont des assertions simples telles que &#034;Ellis Smith likes apples.&#034; Ces documents du genre &#034;X aime Y&#034;, &#034;W n'aime pas Z&#034; etc. sont des assertions qui, d'un point de vue s&#233;mantique, ont peu ou pas de chances de partager un contexte commun : elles sont donc tr&#232;s dispers&#233;es dans l'espace vectoriel. Une requ&#234;te par embeddings ne peut les s&#233;lectionner en une fois. L'exp&#233;rience &#233;tant confirm&#233;e par la th&#233;orie, ceci est indiscutable.&lt;/p&gt;
&lt;p&gt;Une fois cette d&#233;monstration faite, la suite de l'article porte sur une am&#233;lioration de la recherche par embeddings en introduisant une indexation multi vectorielle. Nous ne pouvons suivre cette voie qui proc&#232;de de la recherche, pas de l'ing&#233;nierie.&lt;/p&gt;
&lt;p&gt;Posons un constat :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;les &#034;petits documents&#034; ont une forme quasi-format&#233;e, assimilables &#224; des donn&#233;es,&lt;/li&gt;
&lt;li&gt;l'objectif du test est d'obtenir une s&#233;lection exhaustive,&lt;/li&gt;
&lt;li&gt;le nombre de r&#233;sultats recherch&#233;s d&#233;passe largement le petit nombre de r&#233;sultats qu'un LLM est capable de traiter en aval de la recherche - on s'accorde g&#233;n&#233;ralement sur un nombre de 3 &#224; 10 (le fameux param&#232;tre top-k).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La conclusion est &#233;vidente :&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;La recherche par embeddings n'est pas adapt&#233;e &#224; la s&#233;lection exhaustive de donn&#233;es structur&#233;es.&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Cependant, n'oublions pas que :
&lt;em&gt;La recherche par embeddings a fait ses preuves dans le domaine de la recherche informelle, notamment pour r&#233;aliser des chat bots, des aides en ligne etc .&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Quelle solution pour traiter des donn&#233;es structur&#233;es ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Nous sommes guid&#233;s par ce principe :&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;Aux outils les s&#233;lections d&#233;terministes pour s&#233;lectionner des donn&#233;es structur&#233;es et en extraire de l'informel. A l'IA le travail d'analyse et de synth&#232;se sur de l'informel.&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Notre solution - d&#233;crite ici &lt;a href='https://ia.dnc.global/Classe-ChatEngine-version-1-5-x-pour-ChattyBot.html' class='spip_in'&gt;RAG : Chat Engine ReAct avec outils&lt;/a&gt; - consiste &#224; :&lt;/p&gt;
&lt;p&gt;Construire notre application sur un algorithme ReAct (donc un LLM capable de fonctions) acc&#233;dant &#224; : &lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;des outils de s&#233;lection de donn&#233;es m&#233;tier, structur&#233;es ; ces outils sont d&#233;terministes et donnent des r&#233;sultats exhaustifs, &lt;/li&gt;
&lt;li&gt;un outil RAG, fond&#233; sur la recherche par embeddings, dont le r&#233;sultat est fourni au LLM pour analyse et synth&#232;se .&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En amont, ReAct s&#233;lectionnera les outils en fonction de la question. En aval, ReAct fera appel au LLM pour mettre en forme la r&#233;ponse. &lt;/p&gt;
&lt;p&gt;Prenons le cas id&#233;al de la maintenance technique : les donn&#233;es sont &#224; la fois structur&#233;es ( identifiants, cat&#233;gorie, dates etc. ) et peuvent comporter des informations textuelles. &lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Les outils de s&#233;lection permettent d'acc&#233;der aux donn&#233;es de fa&#231;on d&#233;terministe : les r&#233;ponses sont exactes et compl&#232;tes.&lt;/li&gt;
&lt;li&gt;L'outil RAG sera employ&#233; pour synth&#233;tiser les informations textuelles contenues dans les r&#233;ponses (telles que des commentaires, des observations) en effectuant des rapprochements avec les documents m&#233;tiers (tels que des notices techniques, des prescriptions, des compte-rendus, des historiques etc.) . &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ainsi, des questions de l'utilisateur pourront &#234;tre :&lt;/p&gt;
&lt;p&gt;&#034;Recherche les interventions sur la pompe N-92c et effectue une synth&#232;se des pannes mentionn&#233;es&#034;&lt;/p&gt;
&lt;p&gt;&#034;Fais moi une synth&#232;se des pannes sur les pompes de la m&#234;me r&#233;f&#233;rence&#034; &lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Aller plus loin&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;Hybrid Search&lt;/h4&gt;
&lt;p&gt;L'article mentionne &#233;galement la sup&#233;riorit&#233; de l'&lt;strong&gt;&lt;em&gt;algorithme BM25&lt;/em&gt;&lt;/strong&gt;.
BM25 capte les correspondances exactes et les mots&#8209;cl&#233;s ; les embeddings captent le sens et les synonymes. Les combiner corrige les faiblesses de chaque m&#233;thode.
Le &lt;strong&gt;&lt;em&gt;concept hybrid search&lt;/em&gt;&lt;/strong&gt; d&#233;signe la combinaison d'une recherche lexicale (BM25/keyword) et d'une recherche s&#233;mantique (embeddings).&lt;/p&gt;
&lt;h4&gt;Filtrage par m&#233;tadonn&#233;es&lt;/h4&gt;
&lt;p&gt;L'hybrid search pourrait &#234;tre renforc&#233; par filtrage : cela consiste &#224; ne s&#233;lectionner que les documents qui respectent des contraintes structur&#233;es avant ou apr&#232;s la recherche par embeddings.&lt;/p&gt;
&lt;p&gt;&#8226; Pr&#233;&#8209;filtre : appliquer la contrainte sur une table de m&#233;tadonn&#233;es des documents puis construire la requ&#234;te dense/BM25 sur ce sous&#8209;ensemble.&lt;/p&gt;
&lt;p&gt;&#8226; Post&#8209;filtre : ex&#233;cuter la recherche dense puis &#233;liminer les r&#233;sultats dont les m&#233;tadonn&#233;es ne correspondent pas (utile si le vector store ne supporte pas de filtre natif).&lt;/p&gt;
&lt;p&gt;Il serait id&#233;al de fournir &#224; ReAct &lt;a href='https://ia.dnc.global/ReAct-un-outil-embedding-based-retrieval.html' class='spip_in'&gt;un outil de recherche fond&#233; sur ces principes&lt;/a&gt;. Il en r&#233;sulterait non seulement un avantage de pr&#233;cision, mais aussi une &lt;strong&gt;&lt;em&gt;&#233;conomie d'appel au LLM&lt;/em&gt;&lt;/strong&gt;. Time is Energie !&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Comparaison entre `class ReActAgent(Workflow)` et `ReActAgent` pr&#233;construit...</title>
		<link>https://ia.dnc.global/Comparaison-entre-class-ReActAgent-Workflow-et-ReActAgent-preconstruit.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/Comparaison-entre-class-ReActAgent-Workflow-et-ReActAgent-preconstruit.html</guid>
		<dc:date>2025-11-16T08:45:30Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Cet article compare deux approches pour concevoir un agent ReAct dans LlamaIndex : &lt;br class='autobr' /&gt;
&#8211; l'utilisation directe de l'agent ReAct fourni par la biblioth&#232;que.
&lt;br class='autobr' /&gt;
&#8211; l'impl&#233;mentation personnalis&#233;e par h&#233;ritage de `Workflow` &lt;br class='autobr' /&gt;
L'approche par h&#233;ritage de `Workflow` est recommand&#233;e pour construire un syst&#232;me &#233;volutif. Elle permet une ma&#238;trise fine du raisonnement, notamment en permettant une meilleure utilisation des outils. 1. Utiliser `ReActAgent` depuis `llama_index.core.agent.workflow`D&#233;finition &lt;br class='autobr' /&gt;
Utilisation de (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://ia.dnc.global/local/cache-vignettes/L150xH103/arton47-a2340.png?1776385621' width='150' height='103' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Cet article compare deux approches pour concevoir un agent ReAct dans LlamaIndex : &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; l'utilisation directe de l'agent ReAct fourni par la biblioth&#232;que.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; l'impl&#233;mentation personnalis&#233;e par h&#233;ritage de `Workflow`&lt;/p&gt;
&lt;p&gt;L'approche par h&#233;ritage de `Workflow` est recommand&#233;e pour construire un syst&#232;me &#233;volutif. Elle permet une ma&#238;trise fine du raisonnement, notamment en permettant une meilleure utilisation des outils.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class=&#034;spip&#034;&gt;1. Utiliser `ReActAgent` depuis `llama_index.core.agent.workflow`&lt;/h3&gt;&lt;h3 class=&#034;spip&#034;&gt;D&#233;finition&lt;/h3&gt;
&lt;p&gt;Utilisation de l'agent ReAct pr&#233;configur&#233; :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;from llama_index.core.agent.workflow import ReActAgent&lt;br /&gt; &lt;br /&gt; agent = ReActAgent.from_tools(tools=[...], llm=..., memory=...)&lt;br /&gt; response = agent.chat(&#034;Quel est le prix du bitcoin ?&#034;)&lt;/code&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Caract&#233;ristiques&lt;/h3&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Agent ReAct pr&#234;t &#224; l'emploi avec moteur de raisonnement, formatter et parser int&#233;gr&#233;s.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Ne n&#233;cessite pas de d&#233;finition de graphe ou d'&#233;tapes personnalis&#233;es.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Moins flexible pour les cas avanc&#233;s.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Cas d'usage&lt;/h3&gt;
&lt;p&gt;Approche adapt&#233;e pour :&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Prototypage rapide ou d&#233;monstration.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Cas simples de question-r&#233;ponse avec outils.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Utilisation sans personnalisation profonde du raisonnement.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;2. H&#233;riter de `Workflow` pour construire un agent personnalis&#233;&lt;/h3&gt;&lt;h3 class=&#034;spip&#034;&gt;D&#233;finition&lt;/h3&gt;
&lt;p&gt;Cr&#233;ation d'un agent en h&#233;ritant explicitement de la classe `Workflow` :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;from llama_index.core.workflow import Workflow&lt;br /&gt; &lt;br /&gt; class ReActAgent(Workflow):&lt;br /&gt; ...&lt;/code&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Caract&#233;ristiques&lt;/h3&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Permet de d&#233;finir un &lt;strong&gt;graphe explicite&lt;/strong&gt; d'&#233;tapes connect&#233;es via `add_step(...)` et `connect(...)`.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Offre un &lt;strong&gt;contr&#244;le total&lt;/strong&gt; sur la logique de raisonnement, l'injection de m&#233;moire, la gestion du contexte, &lt;strong&gt;l'utilisation des outils&lt;/strong&gt;, etc.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Autorise l'ajout d'&#233;tapes personnalis&#233;es (pr&#233;traitement, validation, r&#233;sum&#233;s, appels API&#8230;).
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Requiert une bonne compr&#233;hension des &#233;v&#233;nements (`StartEvent`, `PrepEvent`, etc.) et du moteur `Workflow`.&lt;/p&gt;
&lt;p&gt;Voici, par exemple, une &#233;criture de l'&#233;tape handle_tool_call qui permet une validation via introspection Pydantic de l'appel aux outils, avant l'&#233;tape d'observation (lignes 15 &#224; 49). En effet, ReAct a la mauvaise habitude d'essayer d'utiliser les outils avant de prendre en compte la d&#233;finition des sch&#233;ma d'entr&#233;e. On gagne du temps en bloquant les appels faits avec des formats erron&#233;s.&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;@&lt;/span&gt;step&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; async &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;def&lt;/span&gt; handle_tool_calls&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; ctx: Context&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; ev: ToolCallEvent&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; -&lt;span style=&#034;color: #66cc66;&#034;&gt;&gt;&lt;/span&gt; PrepEvent:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;&#034;&#034; Appeller les outils en toute s&#233;curit&#233; en g&#233;rant les erreurs et en ajoutant leurs r&#233;sultats au raisonnement en cours. Ensuite, en &#233;mettant un PrepEvent, effectuer une nouvelle it&#233;ration d'invite et d'analyse ReAct.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; &#034;&#034;&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tool_calls &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; ev.&lt;span style=&#034;color: black;&#034;&gt;tool_calls&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tools_by_name &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&#123;&lt;/span&gt;tool.&lt;span style=&#034;color: black;&#034;&gt;metadata&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;get_name&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;: tool &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; tool &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; current_reasoning &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; await ctx.&lt;span style=&#034;color: black;&#034;&gt;store&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;get&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;current_reasoning&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; default&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; sources &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; await ctx.&lt;span style=&#034;color: black;&#034;&gt;store&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;get&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;sources&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; default&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; validation anticip&#233;e via introspection Pydantic&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; On intercepte chaque appel, et pour chaque outil :&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; 1. Identifier sa classe d'entr&#233;e Pydantic.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; 2. Instancier cette classe avec les tool_kwargs.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; 3. Si la validation &#233;choue &#8594; bloquer l'appel et injecter une observation.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; 4. Sinon ex&#233;cuter normalement.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; '''&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; tool_call &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; tool_calls:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tool_name &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; tool_call.&lt;span style=&#034;color: black;&#034;&gt;tool_name&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tool &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; tools_by_name.&lt;span style=&#034;color: black;&#034;&gt;get&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;tool_name&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;not&lt;/span&gt; tool:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; current_reasoning.&lt;span style=&#034;color: black;&#034;&gt;append&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; ObservationReasoningStep&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;observation&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Tool {tool_name} does not exist&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# &#201;tape 1 : r&#233;cup&#233;rer la classe Pydantic d'entr&#233;e&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; input_model &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;getattr&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;tool.&lt;span style=&#034;color: black;&#034;&gt;metadata&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;input_model&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;None&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; input_model:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# &#201;tape 2 : valider les kwargs via Pydantic&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; input_model&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;**tool_call.&lt;span style=&#034;color: black;&#034;&gt;tool_kwargs&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;except&lt;/span&gt; ValidationError &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;as&lt;/span&gt; ve:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# &#201;tape 3 : bloquer l'appel et injecter l'erreur&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; current_reasoning.&lt;span style=&#034;color: black;&#034;&gt;append&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; ObservationReasoningStep&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; observation&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Appel bloqu&#233; : les param&#232;tres fournis pour l'outil '{tool_name}' &#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;sont invalides selon sa d&#233;finition. D&#233;tail : {ve.errors()}&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# &#201;tape 4 : poursuivre si tout est valide&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; tool_output &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; tool&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;**tool_call.&lt;span style=&#034;color: black;&#034;&gt;tool_kwargs&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; sources.&lt;span style=&#034;color: black;&#034;&gt;append&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;tool_output&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; current_reasoning.&lt;span style=&#034;color: black;&#034;&gt;append&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; ObservationReasoningStep&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;observation&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;tool_output.&lt;span style=&#034;color: black;&#034;&gt;content&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;except&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;Exception&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;as&lt;/span&gt; e:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; current_reasoning.&lt;span style=&#034;color: black;&#034;&gt;append&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; ObservationReasoningStep&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; observation&lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt;f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;Error calling tool {tool.metadata.get_name()}: {e}&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/8d35bc30f6050e3953416264d06929d1.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Cas d'usage&lt;/h3&gt;
&lt;p&gt;Approche recommand&#233;e pour :&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Architectures modulaires et extensibles.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Tracabilit&#233; et audit du raisonnement &#233;tape par &#233;tape.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Utilisation du debugger Python dans le moteur ReAct.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Int&#233;gration de politiques techniques explicites.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Meilleur contr&#244;le de l'utilisation des outils.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; D&#233;veloppement d'agents complexes ou hybrides.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Tableau comparatif&lt;/h3&gt;&lt;table class=&#034;spip&#034;&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;Crit&#232;re&lt;/td&gt;
&lt;td&gt;`class ReActAgent(Workflow)`&lt;/td&gt;
&lt;td&gt;`ReActAgent` pr&#233;construit&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;Personnalis&#233;e, modulaire&lt;/td&gt;
&lt;td&gt;Pr&#233;configur&#233;e&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;Graphe d'&#233;tapes&lt;/td&gt;
&lt;td&gt;D&#233;fini manuellement (`add_step`)&lt;/td&gt;
&lt;td&gt;Interne, non modifiable&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;Injection m&#233;moire/contexte&lt;/td&gt;
&lt;td&gt;Libre et dynamique&lt;/td&gt;
&lt;td&gt;Partielle via `.chat()`&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;Contr&#244;le sur le raisonnement&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;Limit&#233;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;Extensibilit&#233;&lt;/td&gt;
&lt;td&gt;&#201;lev&#233;e&lt;/td&gt;
&lt;td&gt;Faible&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;Complexit&#233; de mise en &#339;uvre&lt;/td&gt;
&lt;td&gt;Moyenne &#224; &#233;lev&#233;e&lt;/td&gt;
&lt;td&gt;Faible&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;Cas d'usage&lt;/td&gt;
&lt;td&gt;Agents complexes, auditables, debuggables&lt;/td&gt;
&lt;td&gt;Agents simples, rapides&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;h3 class=&#034;spip&#034;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;L'approche par h&#233;ritage de `Workflow` est recommand&#233;e pour les syst&#232;mes robustes, auditables et &#233;volutifs. Elle permet une ma&#238;trise fine du raisonnement, de l'utilisation des outils et une architecture extensible. &lt;br class='autobr' /&gt;
L'agent ReAct pr&#233;construit est utile pour des cas simples ou des prototypes rapides, mais offre peu de flexibilit&#233;.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div &lt;div class='rss_ps'&gt;&lt;h3 class=&#034;spip&#034;&gt;Impl&#233;mentations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;agent ReAct pr&#233;configur&#233;&lt;/strong&gt; : react_engine_mistral_v100a.py, react_engine_mistral_v12x&lt;br class='autobr' /&gt;
&lt;strong&gt;agent ReAct construit sur Workflow&lt;/strong&gt; : react_workflow_v1xx&lt;/p&gt;
&lt;p&gt;Nota : il existe &#233;galement en cours de d&#233;veloppement des versions react_workflow_v2xx encore plus middle-level car fond&#233;es sur sur BaseWorkflowAgent.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>RAG : Chat Engine ReAct avec outils</title>
		<link>https://ia.dnc.global/Classe-ChatEngine-version-1-5-x-pour-ChattyBot.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/Classe-ChatEngine-version-1-5-x-pour-ChattyBot.html</guid>
		<dc:date>2025-08-02T14:08:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Cette nouvelle version du ChatEngine met en oeuvre un moteur d'inf&#233;rences React et des outils. Le Query Engine RAG des versions pr&#233;c&#233;dentes est int&#233;gr&#233; comme l'un de ces outils. Les autres outils comprennent des outils g&#233;n&#233;raux (par exemple calculs math&#233;matiques et statistiques) et des outils particularis&#233;s selon le m&#233;tier et d&#233;finis dans le th&#232;me. &lt;br class='autobr' /&gt;
Une attention particuli&#232;re est apport&#233;e &#224; l'extraction de donn&#233;es en temps r&#233;el, notamment avec des outils obtenus par Model Context Protocol (MCP) . (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://ia.dnc.global/local/cache-vignettes/L150xH105/arton38-137d1.png?1776385621' width='150' height='105' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Cette nouvelle version du ChatEngine met en oeuvre un moteur d'inf&#233;rences React et des outils. Le Query Engine RAG des versions pr&#233;c&#233;dentes est int&#233;gr&#233; comme l'un de ces outils. Les autres outils comprennent des outils g&#233;n&#233;raux (par exemple calculs math&#233;matiques et statistiques) et des outils particularis&#233;s selon le m&#233;tier et d&#233;finis dans le th&#232;me. &lt;br class='autobr' /&gt;
Une attention particuli&#232;re est apport&#233;e &#224; l'extraction de donn&#233;es en temps r&#233;el, notamment avec des outils obtenus par Model Context Protocol (MCP) .&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;L'&#233;volution consiste &#224; utiliser un &lt;strong&gt;moteur d'inf&#233;rences 'React'&lt;/strong&gt; (Reasoning and Acting).&lt;br class='autobr' /&gt;
Cela permet &#224; l'agent LLM de &lt;strong&gt;raisonner et agir en utilisant des outils&lt;/strong&gt;, dans une boucle logique inspir&#233;e du document : &lt;a href=&#034;https://react-lm.github.io&#034; class='spip_out' rel='external'&gt;Synergizing Reasoning and Acting in Language Models&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans cette architecture, les outils comprennent :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; un outil QueryEngineTool pour mettre en oeuvre le RAG sur les index cr&#233;&#233;s par &lt;a href='https://ia.dnc.global/Ingestion-le-RAG-Manager.html' class='spip_in'&gt;RAG Manager&lt;/a&gt; ou &lt;a href='https://ia.dnc.global/Ingestion-RAG-le-script-ingestcmd-py.html' class='spip_in'&gt;IngestCmd&lt;/a&gt; ;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; des outils g&#233;n&#233;raux tels que calculs statistiques etc.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; des outils personnalis&#233;s (FunctionTools) selon le th&#232;me. On peut par exemple int&#233;grer de fa&#231;on dynamique des donn&#233;es &#034;temps r&#233;el&#034;.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_19 spip_documents spip_documents_center'&gt;
&lt;img src='https://ia.dnc.global/local/cache-vignettes/L500xH349/react_outils-29e89.png?1776388474' width='500' height='349' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;L'outil Query Engine RAG&lt;/h3&gt;
&lt;p&gt;Un QueryEngine semblable &#224; celui des versions pr&#233;c&#233;dentes est int&#233;gr&#233; au moteur d'inf&#233;rences React en tant que QueryEngineTool, directement dans la classe ChatEngine. Il fonctionne avec le m&#234;me param&#233;trage que les versions pr&#233;c&#233;dentes et ne requiert donc aucune modification de ChattyBot.&lt;/p&gt;
&lt;p&gt;Contrairement aux versions pr&#233;c&#233;dentes dans lesquelles le Query Engine n'&#233;tait appel&#233; qu'une fois par cycle question-r&#233;ponse (une seule inf&#233;rence), le moteur d'inf&#233;rences peut l'appeler plusieurs fois pour une recherche par &#233;tapes dans le cadre d'un raisonnement. Ceci am&#233;liore grandement la qualit&#233; des r&#233;ponses, notamment leur concision au regard de la question pos&#233;e.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Les outils g&#233;n&#233;raux&lt;/h3&gt;
&lt;p&gt;La classe GeneralToolKit (modules/tools/_general_.py) expose des outils g&#233;n&#233;raux. Ses outils sont syst&#233;matiquement mis &#224; disposition du moteur d'inf&#233;rences React.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Les outils personnalis&#233;s&lt;/h3&gt;
&lt;p&gt;Chaque th&#232;me peut, de fa&#231;on optionnelle, mettre des outils sp&#233;cifiques &#224; disposition du moteur d'inf&#233;rences React.&lt;br class='autobr' /&gt;
Une classe ThemeToolKit (modules/tools/theme.py) expose des outils sp&#233;cifiques du th&#232;me.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Saisie de donn&#233;es &#034;temps r&#233;el&#034;&lt;/h3&gt;
&lt;p&gt; Un ToolKit particulier expose des outils capables de fournir des donn&#233;es &#034;temps r&#233;el&#034; issues d'applications ou de service tiers (qu'ils soient priv&#233;s ou sur le cloud).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Principe g&#233;n&#233;ral&lt;/strong&gt;&lt;br class='autobr' /&gt;
Par donn&#233;es &#034;temps r&#233;el&#034;, nous entendons des valeurs obtenues au moyen d'un outil qui interroge un service selon un protocole donn&#233;. Le service r&#233;pond en fournissant les derni&#232;res valeurs ou informations connues avec datation. Nous nous limitons &#224; une interrogation &#034;passive&#034;, ainsi, la s&#233;curit&#233; du syst&#232;me de donn&#233;es du c&#244;t&#233; du serveur est pr&#233;serv&#233;e, aucune action n'&#233;tant d&#233;clench&#233;e du c&#244;t&#233; de l'application serveur.&lt;/p&gt;
&lt;p&gt;Les donn&#233;es &#034;temps r&#233;el&#034; peuvent &#234;tre saisies par appel &#224; un simple &lt;strong&gt;Web Service&lt;/strong&gt; attach&#233; &#224; une source de donn&#233;es.&lt;br class='autobr' /&gt;
Il est &#233;galement possible d'utiliser &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; pour acc&#233;der &#224; des sources sous ce standard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choix entre MCP ou Web Service simple&lt;/strong&gt;&lt;/p&gt;
&lt;table class=&#034;spip&#034;&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;Crit&#232;re&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;WS&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;Externalisation de traitement LLM&lt;/td&gt;
&lt;td&gt;standard&lt;/td&gt;
&lt;td&gt;non&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;d&#233;finition des outils&lt;/td&gt;
&lt;td&gt;c&#244;t&#233; serveur&lt;/td&gt;
&lt;td&gt;c&#244;t&#233; client&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;protocole&lt;/td&gt;
&lt;td&gt;standard&lt;/td&gt;
&lt;td&gt;propri&#233;taire&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;s&#233;curit&#233; publique&lt;/td&gt;
&lt;td&gt;OAuth2 et OpenID Connect&lt;/td&gt;
&lt;td&gt;&#224; d&#233;velopper&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Au vu de ce simple tableau, on voit que MCP est adapt&#233; &#224; des traitements d'IA r&#233;partis sur r&#233;seau ouvert, au prix d'une certaine complexit&#233; c&#244;t&#233; serveur.&lt;/p&gt;
&lt;p&gt;Dans le cas de MCP, il faut noter que la description d'un outil est effectu&#233;e c&#244;t&#233; serveur, ce qui peut poser des probl&#232;me de compr&#233;hension de leur fonctionnalit&#233; par le moteur d'inf&#233;rence, d'instructions mal adapt&#233;es ou manquantes ou encore des conflits avec d'autres outils.&lt;/p&gt;
&lt;p&gt;Dans tous les cas, il est utile (n&#233;cessaire ?) d'orchestrer le choix des outils par la boucle ReAct au moyen d'instructions particuli&#232;res. Ceci se fait du c&#244;t&#233; client au moyen du &lt;strong&gt;routage&lt;/strong&gt;, en d&#233;finissant un plan pour chaque outil ainsi que des formats de question et de r&#233;ponse.&lt;/p&gt;
&lt;p&gt;En conclusion :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Si on veut utiliser des outils existants (par exemple WolframAlpha) ainsi que des ressources LLM, le serveur MCP, lorsqu'il est offert, sera une alternative &#224; la cr&#233;ation d'outils sur l'API. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Si on n'a besoin que d'une simple extraction de donn&#233;es en communiquant dans un espace de confiance, un Web Service est plus simple et mieux ma&#238;trisable. Ceci est d'autant plus vrai que le serveur MCP peut &#234;tre &lt;a href=&#034;https://www.open-mcp.org/servers/creating-a-server#private-mcp-servers&#034; class='spip_out' rel='external'&gt;construit sur une API REST&lt;/a&gt; ou &#233;quivalent.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Un peu de strat&#233;gie...&lt;/h3&gt;
&lt;p&gt;Le principe d'un outil, vu de l'IA, est d'ex&#233;cuter une t&#226;che au cours de la boucle d'ex&#233;cution ReAct. Un des outils est notre bon vieux RAG qui travaille sur des donn&#233;es informelles. Les autres sont des fonctions d&#233;terministes auxquelles la boucle ReAct passe des param&#232;tres pour obtenir un retour formel. Elle choisit ses outils d'apr&#232;s leur description fonctionnelle et celle des E/S.&lt;/p&gt;
&lt;p&gt;Le propre de l'IA g&#233;n&#233;rative est de travailler sur de l'informel. Lui faire faire des s&#233;lections de fa&#231;on d&#233;terministe, c'est le marteau-pilon qui &#233;crase la mouche, les pingouins qui se d&#233;sesp&#232;rent etc.&lt;/p&gt;
&lt;p&gt;Voici donc le principe qui doit nous guider :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aux outils les s&#233;lections d&#233;terministes pour s&#233;lectionner des donn&#233;es structur&#233;es et en extraire de l'informel. A l'IA le travail d'analyse et de synth&#232;se sur de l'informel.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;La boucle ReAct &#034;native&#034;&lt;/h3&gt;
&lt;p&gt;Le moteur ReAct de LlamaIndex fonctionne comme ceci :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le mod&#232;le (LLM) re&#231;oit le prompt.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Il r&#233;fl&#233;chit (Reasoning), choisit un outil (Action), l'ex&#233;cute (Observation).&lt;br class='autobr' /&gt;
&#224; cette &#233;tape, le mod&#232;le peut :&lt;br class='autobr' /&gt; - Revenir au prompt pour v&#233;rifier s'il manque des &#233;l&#233;ments ou s'il faut ajuster le raisonnement.&lt;br class='autobr' /&gt; - Comparer l'observation au prompt pour voir si elle r&#233;pond &#224; la demande ou si elle n&#233;cessite une nouvelle action.&lt;br class='autobr' /&gt; - Utiliser l'observation pour nourrir une nouvelle phase de raisonnement (parfois en int&#233;grant des sous-questions implicites du prompt).
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Il r&#233;p&#232;te le cycle jusqu'&#224; produire une r&#233;ponse.&lt;/p&gt;
&lt;p&gt;Dans la boucle ReAct &#034;native&#034; de Llamaindex, l'outil s&#233;lectionn&#233; d&#233;pend enti&#232;rement :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; du contenu du &lt;strong&gt;prompt&lt;/strong&gt;, y compris un system prompt par d&#233;faut,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; de la &lt;strong&gt;description des outils&lt;/strong&gt; (ToolMetadata.description)
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; et de la logique d'analyse du LLM.&lt;/p&gt;
&lt;p&gt;On notera que :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le routage (d&#233;crit par la suite) permet la prise en compte, au bon moment du raisonnement, d'outils particuliers.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le mod&#232;le utilise le prompt initial comme point de d&#233;part pour raisonner. Mais lorsqu'il d&#233;cide d'appeler un outil, il formule un nouveau prompt, adapt&#233; &#224; cet outil. Ce nouveau prompt est souvent :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Plus cibl&#233; : reformul&#233; pour coller &#224; ce que l'outil attend ou peut g&#233;rer.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Contextualis&#233; : enrichi avec des &#233;l&#233;ments issus du raisonnement ou d'une observation pr&#233;c&#233;dente.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Optimis&#233; : pour maximiser la qualit&#233; ou la pertinence de la r&#233;ponse de l'outil.&lt;/p&gt;
&lt;p&gt;Ainsi d&#233;crite, &lt;strong&gt;la boucle ReAct est un processus r&#233;flexif&lt;/strong&gt; par lequel le moteur d'inf&#233;rences peut revenir au prompt tout au long du cycle pour r&#233;&#233;valuer ou r&#233;orienter sa strat&#233;gie dans le but de fournir une r&#233;ponse pertinente&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb4-1' class='spip_note' rel='appendix' title='On notera que ceci conduit &#224; des r&#233;ponses tr&#232;s cibl&#233;es, voire succinctes, car (...)' id='nh4-1'&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Prompt(s)&lt;/h3&gt;
&lt;p&gt;Il faut distinguer :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; le prompt de l'utilisateur (que nous pr&#233;f&#233;rons appeler &#034;question&#034; ou &#034;query&#034; ou encore &#034;user query&#034;),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; le system prompt du Query Engine RAG,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; celui de l'agent ReAct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;System prompt du Query Engine RAG&lt;/strong&gt;&lt;br class='autobr' /&gt;
Nous avons deux possibilit&#233;s : &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; transformer en outil un des Query Engines RAG construits pr&#233;c&#233;demment sans modification, donc avec son system prompt, &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; recr&#233;er sur ces mod&#232;les un Query Engine simplifi&#233;, ayant notamment un system prompt minimal, ou pas de system prompt, et utiliser le routage pour lui affecter un system prompt et des formats particuliers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;System prompt de l'agent ReAct, par d&#233;faut&lt;/strong&gt;&lt;br class='autobr' /&gt;
le ReActAgent dans LlamaIndex utilise un system prompt par d&#233;faut appel&#233; react_header, qui d&#233;finit son comportement g&#233;n&#233;ral, son format de r&#233;ponse, et la mani&#232;re dont il interagit avec les outils.&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;You are designed to help with a variety of tasks, from answering questions to providing summaries and other types of analyses.&lt;br /&gt; &lt;br /&gt; ## Tools&lt;br /&gt; You have access to a wide variety of tools. You are responsible for using the tools in any sequence you deem appropriate to complete the task at hand.&lt;br /&gt; This may require breaking the task into subtasks and using different tools to complete each subtask.&lt;br /&gt; &lt;br /&gt; You have access to the following tools: {tool_desc}&lt;br /&gt; &lt;br /&gt; ## Output Format&lt;br /&gt; Please answer in the same language as the question and use the following format:&lt;br /&gt; &lt;br /&gt; Thought: The current language of the user is: (user's language). I need to use a tool to help me answer the question.&lt;br /&gt; Action: tool name (one of {tool_names})&lt;br /&gt; Action Input: JSON format of the tool input&lt;br /&gt; &lt;br /&gt; Observation: tool response&lt;br /&gt; &lt;br /&gt; Repeat until you can answer without tools.&lt;br /&gt; &lt;br /&gt; Then respond with:&lt;br /&gt; Thought: I can answer without using any more tools.&lt;br /&gt; Answer: [your answer here]&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;On notera l'absence de format de r&#233;ponse dans ce system prompt. Ce sera r&#233;gl&#233; dans le cadre du routage.&lt;/p&gt;
&lt;p&gt;Le system prompt par d&#233;faut est inject&#233; automatiquement lors de la cr&#233;ation du ReActAgent via ReActAgent.from_tools(...). On peut le r&#233;cup&#233;rer ou le modifier avec :&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034; data-clipboard-text=&#034;agent.get_prompts()[&#034;react_header&#034;]&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;agent.&lt;span style=&#034;color: black;&#034;&gt;get_prompts&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;react_header&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;On peut le modifier comme ceci :&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;from&lt;/span&gt; llama_index.&lt;span style=&#034;color: black;&#034;&gt;core&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;import&lt;/span&gt; PromptTemplate&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;custom_prompt &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; PromptTemplate&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;...ton prompt ici...&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;agent.&lt;span style=&#034;color: black;&#034;&gt;update_prompts&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&#123;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;react_header&#034;&lt;/span&gt;: custom_prompt&lt;span style=&#034;color: black;&#034;&gt;&#125;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/dcb506734dfa0931304e95b86feb143a.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Routage&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Le routeur&lt;/strong&gt;&lt;br class='autobr' /&gt;
Un routeur, comme la fonction detect_tool_and_plan(query), intervient avant ReAct. Il sert &#224; :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; r&#233;pondre &#224; une requ&#234;te simple par appel direct &#224; un l'outil appropri&#233; (Direct Agent),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; rediriger certaines requ&#234;tes vers des agents ou des plans d&#233;di&#233;s (wikipedia_plan, rag_plan, etc.) (Tool Agent),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; d&#233;cider s'il faut ex&#233;cuter un plan complexe, une requ&#234;te enrichie, ou laisser ReAct agir (React Agent).&lt;br class='autobr' /&gt;
&lt;span class='spip_document_20 spip_documents spip_documents_center'&gt;
&lt;img src='https://ia.dnc.global/local/cache-vignettes/L500xH281/routage_1-548c7.png?1776388474' width='500' height='281' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;br class='autobr' /&gt;
C'est un niveau d'orchestration au-dessus de ReAct.&lt;br class='autobr' /&gt;
Il permet d'avoir une logique m&#233;tier plus explicite :&lt;br class='autobr' /&gt;
&#8220;Si on parle de documents &#8594; je pr&#233;f&#232;re un plan RAG avec rag_search plut&#244;t que laisser ReAct improviser.&#8221;&lt;/p&gt;
&lt;p&gt;Un plan est un script pour l'encha&#238;nement logique qui pr&#233;cise :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; quel outil appeler (ex : rag_search, arxiv_api, wikipedia, etc.),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; comment poser la question &#224; l'outil (formulation, prompt),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &#233;ventuellement comment reformuler ou enrichir la r&#233;ponse.&lt;/p&gt;
&lt;p&gt;La fonction detect_tool_and_plan() agit comme un routeur s&#233;mantique, en amont de la logique ReAct :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Elle choisit un &#8220;plan&#8221; selon les mots-cl&#233;s &#8594; chaque plan g&#233;n&#232;re un prompt_enrichi.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Ce prompt est envoy&#233; &#224; ton SmartReActAgent, qui choisit l'outil en se basant sur son raisonnement LLM et les descriptions de tools.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Finalement, l'agent ex&#233;cute l'action (ex : recherche, calcul, extraction) et renvoie une r&#233;ponse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qu'est-ce qu'un &#8220;routeur intelligent&#8221; ?&lt;/strong&gt;&lt;br class='autobr' /&gt;
C'est une composante logique qui analyse une requ&#234;te (ou un signal) en s'appuyant sur un LLM et d&#233;cide dynamiquement de quel chemin suivre ou quelle action d&#233;clencher. L'intelligence vient de sa capacit&#233; &#224; :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Comprendre le contexte ou les mots-cl&#233;s dans la requ&#234;te
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Choisir parmi plusieurs options selon des crit&#232;res (domaines, intentions, fiabilit&#233;, etc.)
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Rediriger vers une m&#233;thode adapt&#233;e &#8211; ici, un plan sp&#233;cifique qui enrichit le prompt pour ReAct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sauter ReAct ?&lt;/strong&gt;&lt;br class='autobr' /&gt;
Comme nous sommes en amont de ReAct, il sera possible de r&#233;pondre &#224; une requ&#234;te simple par un appel direct &#224; un outil, sans poursuivre avec la boucle ReAct. &lt;br class='autobr' /&gt;
Deux cas s'imposent :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la question est une requ&#234;te de donn&#233;es &#233;l&#233;mentaire (comme l'interrogation d'une table),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la question ne n&#233;cessite que l'outil RAG, et on r&#233;pondra directement avec cet outil.&lt;/p&gt;
&lt;p&gt;Pourquoi &#8220;intelligent&#8221; ?&lt;br class='autobr' /&gt;
Ce n'est pas juste un if...else statique. Le routeur peut :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; G&#233;rer plusieurs entr&#233;es lexicales ou s&#233;mantiques
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; S'adapter &#224; de nouveaux mots-cl&#233;s,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Faire des choix de plan ou m&#234;me court-circuiter ReAct si besoin.&lt;br class='autobr' /&gt;
Il est m&#234;me possible de l'enrichir avec un syst&#232;me de scoring ou une couche classificatrice ML l&#233;g&#232;re, pour qu'il anticipe encore mieux le plan optimal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outils &#034;simples&#034;&lt;/strong&gt;&lt;br class='autobr' /&gt;
Ces outils sont stateless, locaux et d&#233;terministes, donc il n'y a pas besoin de routage complexe comme pour les outils d'info ou de recherche.&lt;/p&gt;
&lt;p&gt;Les outils comme calcul_tool, tva_tool, stats_tool, etc. :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Ne requi&#232;rent pas d'acc&#232;s &#224; des sources externes
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Ont une structure d'appel directe : input &#8594; output
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Peuvent &#234;tre utilis&#233;s d&#232;s que leur n&#233;cessit&#233; est d&#233;tect&#233;e dans la requ&#234;te&lt;br class='autobr' /&gt;
De ce fait, il n'y a pas besoin de s&#233;lectionner dynamiquement entre eux &#8212; on peut d&#233;clencher leur usage avec un simple pattern matching ou un classificateur s&#233;mantique. &lt;br class='autobr' /&gt;
La m&#233;thode call_tool() permet d'interroger un outil sans passer par un agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Routage ou non ?&lt;/strong&gt;&lt;br class='autobr' /&gt;
On peut tr&#232;s bien combiner les deux approches :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le routeur pr&#233;-analyse la requ&#234;te
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Si elle concerne un domaine sp&#233;cifique (scientifique, corpus&#8230;) &#8594; il lance un plan
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Sinon &#8594; il laisse le moteur ReAct la traiter avec ses propres outils.&lt;br class='autobr' /&gt;
&#199;a donne une architecture hybride o&#249; la s&#233;mantique m&#233;tier guide l'agent ReAct, mais sans l'enfermer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi les plans ne sont pas des m&#233;thodes de la classe d'outil correspondante ?&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb4-2' class='spip_note' rel='appendix' title='On comprend que je me suis &#233;gar&#233; un long moment &#224; cr&#233;er une m&#233;thode d'outil (...)' id='nh4-2'&gt;2&lt;/a&gt;]&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bien que chaque plan utilise un outil, il est con&#231;u comme une strat&#233;gie ind&#233;pendante, pour permettre :&lt;/p&gt;
&lt;p&gt;1. D&#233;couplage clair entre logique m&#233;tier et ex&#233;cution technique
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le plan d&#233;crit quoi faire et pourquoi (thought), l'outil ex&#233;cute comment le faire.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Ce d&#233;couplage permet de composer plusieurs outils dans un plan &#8212; donc un outil ne peut pas forc&#233;ment poss&#233;der le plan qui l'utilise.&lt;/p&gt;
&lt;p&gt;2. Flexibilit&#233; multi-outils
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Un plan peut appeler plusieurs outils en s&#233;quence (exemple : stats_tool &#8594; format_tool &#8594; alert_tool).
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Du coup, aucun outil seul ne peut repr&#233;senter cette orchestration compl&#232;te.&lt;/p&gt;
&lt;p&gt;3. R&#233;utilisation des outils dans diff&#233;rents plans
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Un outil comme stats_tool pourrait &#234;tre utilis&#233; dans :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; stats_plan
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; alerte_plan
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; fallback_plan&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb4-3' class='spip_note' rel='appendix' title='Mauvais exemple !' id='nh4-3'&gt;3&lt;/a&gt;]&lt;/span&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Si le plan vivait dans l'outil, cette flexibilit&#233; serait r&#233;duite.&lt;/p&gt;
&lt;p&gt;4. Contr&#244;le sur les prompts enrichis
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le plan peut adapter le action_input ou injecter des thought sp&#233;cifiques selon le contexte.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; C'est une logique situ&#233;e, pas g&#233;n&#233;rale &#8212; donc mieux g&#233;r&#233;e en dehors de l'outil.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixer les formats dans le system prompt ou dans le plan du routeur ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le format (ou sch&#233;ma) permet de valider et documenter les donn&#233;es.&lt;/p&gt;
&lt;p&gt;Fixer le format de question/r&#233;ponse dans le system prompt ou dans le plan du routeur (comme dans un MultiModalRouter ou QueryPlan) peut sembler similaire, mais ces deux approches ont des implications diff&#233;rentes en termes de contr&#244;le, flexibilit&#233; et modularit&#233;.&lt;/p&gt;
&lt;p&gt;1. System Prompt&lt;br class='autobr' /&gt;
Le format est d&#233;fini dans le prompt initial de l'agent (ex. : react_header pour ReActAgent).&lt;br class='autobr' /&gt;
Cependant il est difficile d'adapter le format &#224; des outils requ&#233;rant un format de requ&#234;te et/ou de r&#233;ponse particulier.&lt;br class='autobr' /&gt;
Si plusieurs outils ou branches du raisonnement sont impliqu&#233;s, le format unique peut ne pas convenir &#224; tous.&lt;/p&gt;
&lt;p&gt;2. Plan du routeur (Router Plan / QueryPlan)&lt;br class='autobr' /&gt;
Le format est d&#233;fini dans chaque branche ou &#233;tape du plan, souvent via des prompts ou des instructions sp&#233;cifiques &#224; chaque outil ou sous-agent. Cette solution pr&#233;sente l'avantage d'adapter le format &#224; chaque sous-t&#226;che ou outil (ex. : tableau pour l'analyse, texte libre pour la synth&#232;se).&lt;/p&gt;
&lt;p&gt;Notre approche consistera &#224; conserver le format g&#233;n&#233;ral d&#233;fini dans le system prompt de ReAct, compl&#233;t&#233; par les formats d'objets particuliers (par exemple stats_descriptives) d&#233;finis dans les plans du routeur (voir 'Orchestrateur' et 'Routines').&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Annexe : Lister les outils disponibles&lt;/h3&gt;
&lt;p&gt;Nous nous pla&#231;ons dans un th&#232;me-m&#233;tier du suivi de maintenance .&lt;/p&gt;
&lt;p&gt;Pour obtenir la liste des outils et leur description, posons la question &#224; ChattyBot :&lt;/p&gt;
&lt;p&gt;Q : &lt;br class='autobr' /&gt;
De quels function tools disposes-tu ?&lt;/p&gt;
&lt;p&gt;R : &lt;br class='autobr' /&gt;
Voici la liste des outils fonctionnels (tools) dont je dispose, organis&#233;s par cat&#233;gories pour faciliter leur utilisation :&lt;br class='autobr' /&gt;
1. Recherche et Acc&#232;s aux Connaissances&lt;/p&gt;
&lt;p&gt; rag_search : Recherche des informations dans une base documentaire index&#233;e pour r&#233;pondre &#224; des questions factuelles.&lt;/p&gt;
&lt;p&gt;2. Gestion des Entit&#233;s&lt;/p&gt;
&lt;p&gt; R&#233;cup&#233;ration d'entit&#233;s :&lt;br class='autobr' /&gt; entitiesGetEntityByEntityId : Par ID d'entit&#233;.&lt;br class='autobr' /&gt; entitiesGetEntitiesByEntitiesIds : Plusieurs entit&#233;s par leurs IDs.&lt;br class='autobr' /&gt; entitiesGetEntityIdByName : ID d'une entit&#233; par son nom exact.&lt;br class='autobr' /&gt; entitiesGetFirstEntityIdByStartOfName : ID de la premi&#232;re entit&#233; dont le nom commence par une cha&#238;ne donn&#233;e.&lt;br class='autobr' /&gt; entitiesGetFirstEntityIdByPartOfName : ID de la premi&#232;re entit&#233; dont le nom contient une cha&#238;ne donn&#233;e.&lt;/p&gt;
&lt;p&gt; Comptage d'entit&#233;s :&lt;br class='autobr' /&gt; entitiesGetEntitiesCount : Nombre total d'entit&#233;s.&lt;br class='autobr' /&gt; entitiesGetCountByTemplateName : Nombre d'entit&#233;s par nom de mod&#232;le.&lt;br class='autobr' /&gt; entitiesGetCountByTemplateCode : Nombre d'entit&#233;s par code de mod&#232;le.&lt;/p&gt;
&lt;p&gt;3. Gestion des Mod&#232;les (Templates)&lt;/p&gt;
&lt;p&gt; templatesGetTemplateCodeByName : Code d'un mod&#232;le par son nom exact.&lt;br class='autobr' /&gt; templatesGetFirstTemplateCodeByStartOfName : Code du premier mod&#232;le dont le nom commence par une cha&#238;ne donn&#233;e.&lt;br class='autobr' /&gt; templatesGetFirstTemplateCodeByPartOfName : Code du premier mod&#232;le dont le nom contient une cha&#238;ne donn&#233;e.&lt;/p&gt;
&lt;p&gt;4. Gestion des Interventions&lt;/p&gt;
&lt;p&gt; R&#233;cup&#233;ration par ID :&lt;br class='autobr' /&gt; interventionsGetInterventionByInterventionId : Une intervention par son ID.&lt;br class='autobr' /&gt; interventionsGetInterventionsByInterventionsIds : Plusieurs interventions par leurs IDs.&lt;/p&gt;
&lt;p&gt; Filtres temporels par statut :&lt;br class='autobr' /&gt; interventionsGetCompletedInterventionsOfEntityId : Interventions termin&#233;es entre deux timestamps.&lt;br class='autobr' /&gt; interventionsGetStartedInterventionsOfEntityId : Interventions d&#233;marr&#233;es entre deux timestamps.&lt;br class='autobr' /&gt; interventionsGetScheduledInterventionsOfEntityId : Interventions planifi&#233;es entre deux timestamps.&lt;br class='autobr' /&gt; interventionsGetInterventionsOfEntityIdWorkedOnWithinInterval : Interventions en cours de traitement entre deux timestamps.&lt;br class='autobr' /&gt; interventionsGetInterventionsOfEntityIdFullyDoneWithinInterval : Interventions ayant compl&#233;t&#233; un cycle complet (de &#034;d&#233;marr&#233;&#034; &#224; &#034;termin&#233;&#034;) entre deux timestamps.&lt;/p&gt;
&lt;p&gt;5. Conversion et Validation de Dates/Timestamps&lt;/p&gt;
&lt;p&gt; current_timestamp_ms : Timestamp actuel en millisecondes.&lt;br class='autobr' /&gt; timestamp_from_date : Conversion d'une date (YYYY-MM-DD) en timestamp (ms).&lt;br class='autobr' /&gt; timestamp_from_date_batch : Conversion group&#233;e de dates en timestamps.&lt;br class='autobr' /&gt; is_valid_timestamp : V&#233;rifie si un timestamp est plausible (entre 2000 et 2100).&lt;/p&gt;
&lt;p&gt;6. Traitement de Donn&#233;es&lt;/p&gt;
&lt;p&gt; filter_data_list : Filtre une liste de dictionnaires selon des crit&#232;res (ex : &lt;i&gt;&#034;key&#034; : &#034;age&#034;, &#034;value&#034; : 30, &#034;operator&#034; : &#034;gt&#034;&lt;/i&gt;).&lt;br class='autobr' /&gt; extract_values_by_key : Extrait les valeurs d'une cl&#233; sp&#233;cifique dans une liste de dictionnaires.&lt;/p&gt;
&lt;p&gt;7. Calculs Math&#233;matiques et Financiers&lt;/p&gt;
&lt;p&gt; arithmetic_tool : Op&#233;rations arithm&#233;tiques (add, sub, mul, div, etc.).&lt;br class='autobr' /&gt; Prix et TVA :&lt;br class='autobr' /&gt; price_tva_tool : Calcule la TVA &#224; partir d'un prix HT.&lt;br class='autobr' /&gt; price_ttc_tool : Calcule le prix TTC &#224; partir d'un prix HT + taux de TVA.&lt;br class='autobr' /&gt; price_ht_tool : Calcule le prix HT &#224; partir d'un prix TTC + taux de TVA.&lt;/p&gt;
&lt;p&gt;8. Analyses Statistiques&lt;/p&gt;
&lt;p&gt; stats_descriptives : Statistiques descriptives (moyenne, m&#233;diane, &#233;cart-type, tendance lin&#233;aire) sur une s&#233;rie temporelle.&lt;br class='autobr' /&gt; alerte_deviation_temporelle : D&#233;tecte les &#233;carts significatifs par rapport &#224; une tendance lin&#233;aire.&lt;br class='autobr' /&gt; valeurs_hors_tendance : Identifie les valeurs anormales dans une s&#233;rie temporelle.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div &lt;div class='rss_ps'&gt;&lt;h3 class=&#034;spip&#034;&gt;Notes&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Class CallToolResult&lt;/strong&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Structure des r&#233;pertoires, exemples de fichiers&lt;/h3&gt;
&lt;p&gt;Structure des r&#233;pertoires sur &lt;a href=&#034;https://chat.ia.dnc.global&#034; class='spip_url spip_out auto' rel='nofollow external'&gt;https://chat.ia.dnc.global&lt;/a&gt; :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;PythonApp/chat/&lt;br /&gt; &#9474;&lt;br /&gt; &#9500;&#9472;&#9472; chatitego/&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; streamlit_custom/ &lt;br /&gt; &#9474; &#9500;&#9472;&#9472; __init__.py &lt;br /&gt; &#9474; &#9500;&#9472;&#9472; chatitego_v122.py &lt;br /&gt; &#9474; &#9500;&#9472;&#9472; chatitego_v123.py&lt;br /&gt; &#9474; &#9492;&#9472;&#9472; ... &lt;br /&gt; &#9500;&#9472;&#9472; modules/&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; __init__.py &lt;br /&gt; &#9474; &#9500;&#9472;&#9472; reactagent/&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; __init__.py&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; reactagent.py&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; utils/&lt;br /&gt; &#9474; &#9474; &#9474; &#9500;&#9472;&#9472; __init__.py&lt;br /&gt; &#9474; &#9474; &#9474; &#9492;&#9472;&#9472; _routeur.py&lt;br /&gt; &#9474; &#9474; &#9492;&#9472;&#9472; toolkits/&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; __init__.py&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; _general_.py&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; _mcp_client_.py&lt;br /&gt; &#9474; &#9474; &#9500;&#9472;&#9472; _multisource_.py&lt;br /&gt; &#9474; &#9474; &#9492;&#9472;&#9472; ...&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; chatengine_mistral_v120.py&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; chatengine_mistral_v132.py&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; chatengine_mistral_react_v100.py&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; config.ini&lt;br /&gt; &#9474; &#9492;&#9472;&#9472; ...&lt;br /&gt; &#9500;&#9472;&#9472; tools/&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; __init__.py &lt;br /&gt; &#9474; &#9500;&#9472;&#9472; configloader.py&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; logger.py&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; prompt.py&lt;br /&gt; &#9474; &#9500;&#9472;&#9472; themelock.py&lt;br /&gt; &#9500;&#9472;&#9472; __init__.py&lt;br /&gt; &#9492;&#9472;&#9472; chatitego.py # appelle (par exemple) chatitego_v123.py&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb4-1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh4-1' class='spip_note' title='Notes 4-1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;On notera que ceci conduit &#224; des r&#233;ponses tr&#232;s cibl&#233;es, voire succinctes, car tout contenu ne r&#233;pondant pas directement &#224; la question est &#233;limin&#233;. Ceci contraste avec un simple moteur de recherche en une passe qui donnera des informations connexes. On en d&#233;duit que :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; ReAct est appropri&#233; &#224; l'&#233;laboration de r&#233;ponses pr&#233;cises &#224; des questions d&#233;taill&#233;es, voire complexes,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Un simple Query Engine donne des r&#233;ponses d&#233;taill&#233;es &#224; des questions simples.&lt;br class='autobr' /&gt;
La deuxi&#232;me approche convient &#224; une d&#233;marche de d&#233;couverte par un n&#233;ophyte (comme un chatbot de FAQ), tandis que la deuxi&#232;me serait plus professionnelle (comme un outil pour data analyst).&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb4-2'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh4-2' class='spip_note' title='Notes 4-2' rev='appendix'&gt;2&lt;/a&gt;] &lt;/span&gt;On comprend que je me suis &#233;gar&#233; un long moment &#224; cr&#233;er une m&#233;thode d'outil pour fournir le plan : fausse piste ! Parfois la programmation OO n'est qu'une tentation esth&#233;tique...&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb4-3'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh4-3' class='spip_note' title='Notes 4-3' rev='appendix'&gt;3&lt;/a&gt;] &lt;/span&gt;Mauvais exemple !&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Routage</title>
		<link>https://ia.dnc.global/Routage.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/Routage.html</guid>
		<dc:date>2025-08-02T07:54:51Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Objectif : &#233;pargner les ressources et l'environnement. Il s'agit de cr&#233;er un pipeline hybride avec Llama-index o&#249; : Les requ&#234;tes simples sont trait&#233;es directement par un outil l&#233;ger. Les requ&#234;tes complexes sont rout&#233;es vers un ReAct agent (avec les outils), le routeur fond&#233; sur un LLM d&#233;cidant dynamiquement du chemin &#224; suivre. &lt;br class='autobr' /&gt;
Note : le Routage fait partie l'Orchestration qui ordonne l'ensemble du processus. &lt;br class='autobr' /&gt;
Objectif et principe du routage Le routage intervient en amont de ReAct, le but &#233;tant d'&#233;viter (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Architecture-et-traitements-.html" rel="directory"&gt;Architecture et traitements&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://ia.dnc.global/local/cache-vignettes/L150xH108/arton40-cfecc.png?1776388474' width='150' height='108' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Objectif : &#233;pargner les ressources et l'environnement. &lt;br class='autobr' /&gt;
Il s'agit de cr&#233;er un pipeline hybride avec Llama-index o&#249; :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Les requ&#234;tes simples sont trait&#233;es directement par un outil l&#233;ger.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Les requ&#234;tes complexes sont rout&#233;es vers un ReAct agent (avec les outils), le routeur fond&#233; sur un LLM d&#233;cidant dynamiquement du chemin &#224; suivre.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;i&gt;Note : le Routage fait partie l'Orchestration qui ordonne l'ensemble du processus.&lt;/i&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Objectif et principe du routage&lt;/h3&gt;
&lt;p&gt;&lt;span class='spip_document_21 spip_documents spip_documents_left' style='float:left;'&gt;
&lt;img src='https://ia.dnc.global/local/cache-vignettes/L256xH384/mouche_et_marteau_pilon_25pc-3e787.png?1776290421' width='256' height='384' alt=&#034;Un marteau-pilon pour une mouche ?&#034; title=&#034;Un marteau-pilon pour une mouche ?&#034; /&gt;&lt;/span&gt;&lt;br class='autobr' /&gt;
Le routage intervient en amont de ReAct, le but &#233;tant d'&#233;viter d'utiliser un marteau-pilon pour &#233;craser une mouche. Avec sa cons&#233;quence pour l'environnement : &lt;br class='autobr' /&gt;
&lt;span class='spip_document_22 spip_documents'&gt;&lt;img src='https://ia.dnc.global/local/cache-vignettes/L256xH170/pinguoins_banquise_malheureux-ec72e.jpg?1776290421' width='256' height='170' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Nous d&#233;crirons :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la classification de la requ&#234;te,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la logique du routage,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; l'int&#233;gration des outils.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Classification de la requ&#234;te&lt;/h3&gt;
&lt;p&gt;On commence par classer la requ&#234;te avec un LLM router (ou Query Classifier). Nous distinguons trois classifications : 'direct', 'tool', 'react'.&lt;br class='autobr' /&gt;
&lt;span class='spip_document_20 spip_documents'&gt;&lt;img src='https://ia.dnc.global/local/cache-vignettes/L500xH281/routage_1-548c7.png?1776388474' width='500' height='281' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;class&lt;/span&gt; ComplexityRouter:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;def&lt;/span&gt; &lt;span style=&#034;color: #0000cd;&#034;&gt;__init__&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; tools: &lt;span style=&#034;color: #008000;&#034;&gt;list&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;FunctionTool&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; tools&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;def&lt;/span&gt; route&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; query: &lt;span style=&#034;color: #008000;&#034;&gt;str&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; -&lt;span style=&#034;color: #66cc66;&#034;&gt;&gt;&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;list&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;FunctionTool&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# Heuristique simple : route selon mots-cl&#233;s&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;any&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;word &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; query.&lt;span style=&#034;color: black;&#034;&gt;lower&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; word &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;moyenne&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;&#233;cart&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;tendance&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;t &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; t &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;getattr&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;t&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;complexity&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;None&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;==&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;tool&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;elif&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;any&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;word &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; query.&lt;span style=&#034;color: black;&#034;&gt;lower&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; word &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;tva&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;prix&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;ht&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;ttc&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;t &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; t &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;getattr&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;t&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;complexity&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;None&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;==&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;simple&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;elif&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;any&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;word &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; query.&lt;span style=&#034;color: black;&#034;&gt;lower&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; word &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;croiser&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;relier&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;jointure&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;t &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; t &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;getattr&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;t&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;complexity&#034;&lt;/span&gt;&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;None&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #66cc66;&#034;&gt;==&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;react&#034;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;else&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #808080; font-style: italic;&#034;&gt;# Fallback : tout proposer&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;self&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;tools&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/ff5b9750001358f07bb74e7fad16bea6.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Ce code est simpliste : dans un sc&#233;nario r&#233;el, on d&#233;veloppera le routage en s'appuyant de fa&#231;on dynamique, toujours avec un appel au LLM, sur la description des outils s&#233;lectionn&#233;s ou cr&#233;&#233;s pour les besoins du sc&#233;nario. &lt;br class='autobr' /&gt;
On comprend que la classification va d&#233;pendre &#233;troitement de l'application, raison pour laquelle nous avons d&#233;fini des &lt;a href='https://ia.dnc.global/Les-Themes-et-les-Modes-une-originalite-de-l-IA-de-DnC.html' class='spip_in'&gt;th&#232;mes&lt;/a&gt; permettant des configurations particularis&#233;es dans une approche multi-utilisateurs.&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;def&lt;/span&gt; classify_query&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;query: &lt;span style=&#034;color: #008000;&#034;&gt;str&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt; -&lt;span style=&#034;color: #66cc66;&#034;&gt;&gt;&lt;/span&gt; &lt;span style=&#034;color: #008000;&#034;&gt;str&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; prompt &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; f&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;&#034;&#034;Classify the following query:&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; - If it's factual/simple, return 'direct'&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; - If it needs a tool (search, calculator, etc.), return 'tool'&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; - If it needs reasoning and tool use, return 'react' :&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Query: {query}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt; Classification:&#034;&#034;&#034;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; llm.&lt;span style=&#034;color: black;&#034;&gt;predict&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;prompt&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;strip&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&#034;color: black;&#034;&gt;lower&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/8cb1d5868e97c06d108522a76cd3900e.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Pourquoi un LLM est pertinent ici ?
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Il comprend le langage naturel dans sa richesse.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Il peut d&#233;tecter des requ&#234;tes multi-&#233;tapes, m&#234;me si elles sont formul&#233;es subtilement.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Il peut juger si une requ&#234;te n&#233;cessite du raisonnement, de la planification, ou une coordination d'outils.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Logique du routage&lt;/h3&gt;&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_python code&#034;&gt;&lt;div class=&#034;python&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;def&lt;/span&gt; route_query&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;query: &lt;span style=&#034;color: #008000;&#034;&gt;str&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; category &lt;span style=&#034;color: #66cc66;&#034;&gt;=&lt;/span&gt; classify_query&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;query&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; category &lt;span style=&#034;color: #66cc66;&#034;&gt;==&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;direct&#034;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; direct_agent.&lt;span style=&#034;color: black;&#034;&gt;query&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;query&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;elif&lt;/span&gt; category &lt;span style=&#034;color: #66cc66;&#034;&gt;==&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;tool&#034;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; tool_agent.&lt;span style=&#034;color: black;&#034;&gt;query&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;query&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;else&lt;/span&gt; category &lt;span style=&#034;color: #66cc66;&#034;&gt;==&lt;/span&gt; &lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;react&#034;&lt;/span&gt;:&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; react_agent.&lt;span style=&#034;color: black;&#034;&gt;query&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;query&lt;span style=&#034;color: black;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/cf77e24457451a79a1933e1715c97806.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;On observera que ReAct devra traiter non seulement les questions complexes, mais &#233;galement, en dernier ressort, celles qui n'auront pas &#233;t&#233; classifi&#233;es comme 'simple' ou 'tool'.&lt;/p&gt;
&lt;p&gt;Il est important de noter que, si ReAct est mis en jeu, tous les outils pourront &#234;tre s&#233;lectionn&#233;s aux &#233;tapes du raisonnement.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;int&#233;gration des outils&lt;/h3&gt;
&lt;p&gt;Une de ces trois classes d'agent sera utilis&#233;e en fonction de la classification :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direct Agent&lt;/strong&gt;&lt;br class='autobr' /&gt;
On retrouvera dans cette classe notre &lt;a href='https://ia.dnc.global/Classe-ChatEngine-version-1-5-x-pour-ChattyBot.html' class='spip_in'&gt;agent RAG&lt;/a&gt; : un moteur de requ&#234;te sur un VectorStoreIndex.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool Agent&lt;/strong&gt;&lt;br class='autobr' /&gt;
Agent outil : utilise ToolNode ou QueryTool avec des API externes, en particulier fournies par Model Context Protocol (MCP) .&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ReAct Agent&lt;/strong&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Agent ReAct : utilise LLMRouter et ReActAgent du framework d'agents LlamaIndex.&lt;br class='autobr' /&gt;
Tous les outils seront mis &#224; disposition de la boucle ReAct.&lt;/p&gt;
&lt;p&gt;La classification &#034;react&#034; est sp&#233;ciale : elle ne d&#233;crit pas un outil en soi, mais plut&#244;t une strat&#233;gie de raisonnement. Autrement dit :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Un outil &#034;simple&#034; : r&#233;pond directement (recherche, calcul, transformation),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Un outil &#034;tool&#034; : interagit avec une source externe ou fait un traitement structur&#233;,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Un outil &#034;react&#034; : n'est pas un outil, mais une combinaison d'outils orchestr&#233;e par un agent ReAct.&lt;/p&gt;
&lt;p&gt;Le processus de s&#233;lection et d'ex&#233;cution de ReAct se d&#233;roule comme ceci :&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_24 spip_documents spip_documents_center'&gt;
&lt;img src='https://ia.dnc.global/local/cache-vignettes/L500xH1001/react_flowchart-c7888.jpg?1776388475' width='500' height='1001' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
