<?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?page=backend" rel="self" type="application/rss+xml" />




<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/IMG/arton58.png?1769594445' 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/IMG/arton61.png?1769603467' 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='#nb1' 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='nh1'&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. Une description longue rend l'outil moins distinctif dans l'espace vectoriel du mod&#232;le 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='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;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>ReAct et int&#233;gration des donn&#233;es temps r&#233;el avec MCP ( Model Context Protocol ) </title>
		<link>https://ia.dnc.global/ReAct-et-integration-des-donnees-temps-reel-avec-MCP.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/ReAct-et-integration-des-donnees-temps-reel-avec-MCP.html</guid>
		<dc:date>2025-11-25T16:55:27Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;L'int&#233;gration du standard MCP ( Model Context Protocol ) dans une architecture ReAct permet de d&#233;ployer des agents IA capables de raisonner en s'appuyant sur les donn&#233;es de l'entreprise en temps r&#233;el tout en simplifiant les connexions, r&#233;duisant les co&#251;ts d'int&#233;gration, et renfor&#231;ant la s&#233;curit&#233;. C'est un levier puissant pour industrialiser l'IA dans les environnements m&#233;tiers de l'industrie 4.0. &lt;br class='autobr' /&gt; ###**Moteur ReAct et int&#233;gration de donn&#233;es actualis&#233;es** &lt;br class='autobr' /&gt;
**ReAct ( Reasoning and Acting )** est un (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-rubrique5-.html" rel="directory"&gt;IA&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/IMG/arton50.png?1764144864' width='150' height='105' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;L'int&#233;gration du standard MCP ( Model Context Protocol ) dans une architecture ReAct permet de d&#233;ployer des agents IA capables de raisonner en s'appuyant sur les donn&#233;es de l'entreprise en temps r&#233;el tout en simplifiant les connexions, r&#233;duisant les co&#251;ts d'int&#233;gration, et renfor&#231;ant la s&#233;curit&#233;. C'est un levier puissant pour industrialiser l'IA dans les environnements m&#233;tiers de l'industrie 4.0.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Moteur ReAct et int&#233;gration de donn&#233;es actualis&#233;es&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ReAct ( Reasoning and Acting )&lt;/strong&gt; est un algorithme qui permet &#224; une intelligence artificielle de &lt;strong&gt;raisonner &#233;tape par &#233;tape en interagissant avec des outils m&#233;tier ou des sources de donn&#233;es&lt;/strong&gt;. Plut&#244;t que de r&#233;pondre directement &#224; une question, l'IA peut d&#233;composer le probl&#232;me, expliquer sa d&#233;marche, chercher des informations &#224; chaque &#233;tape, puis formuler une r&#233;ponse pr&#233;cise et pertinente. C'est particuli&#232;rement utile dans les environnements complexes ou dynamiques, comme ceux de l'industrie 4.0, o&#249; les d&#233;cisions doivent s'appuyer sur des donn&#233;es actualis&#233;es et des raisonnements structur&#233;s.&lt;/p&gt;
&lt;p&gt;Gr&#226;ce &#224; l'approche ReAct, le syst&#232;me est d&#233;sormais capable de conduire des raisonnements en plusieurs &#233;tapes au sein d'un m&#234;me &#233;change. Cette capacit&#233; lui permet de mieux comprendre les intentions de l'utilisateur, d'ajuster ses hypoth&#232;ses en temps r&#233;el et de formuler des r&#233;ponses plus pr&#233;cises, contextualis&#233;es et explicites.
Il s'appuie pour cela sur &lt;strong&gt;des donn&#233;es dynamiques, issues en temps r&#233;el des outils et services de l'entreprise, crois&#233;es intelligemment avec la documentation interne&lt;/strong&gt;. Ce double ancrage garantit une pertinence accrue des r&#233;ponses, m&#234;me dans des contextes complexes, ambigus ou en constante &#233;volution.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_25 spip_documents spip_documents_center'&gt;
&lt;img src='https://ia.dnc.global/IMG/png/react_outils_usine.png?1764164361' width='500' height='349' alt=&#034;ReAct, RAG et MCP&#034; title=&#034;ReAct, RAG et MCP&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Cette facult&#233; d'interaction s'inscrit pleinement dans la logique de l'Industrie 4.0, o&#249; l'intelligence artificielle agit comme une aide cognitive, interconnect&#233; aux syst&#232;mes physiques et num&#233;riques pour renforcer la r&#233;activit&#233;, la tra&#231;abilit&#233; et la prise de d&#233;cision.&lt;/p&gt;
&lt;p&gt;Mais d&#233;j&#224;, l'horizon s'&#233;largit : avec l'&#233;mergence de l'Industrie 5.0, l'accent se d&#233;place vers une collaboration plus &#233;troite entre l'humain et la machine. Les &lt;strong&gt;jumeaux num&#233;riques&lt;/strong&gt;, en particulier, deviennent des instruments puissants d'intelligibilit&#233; op&#233;rationnelle, offrant aux op&#233;rateurs &lt;strong&gt;une vision fine, pr&#233;dictive et explicable des processus industriels&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Architecture modulaire de nos outils ReAct&lt;/strong&gt;&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;&lt;strong&gt;GeneralToolKit&lt;/strong&gt; : Fournit des outils g&#233;n&#233;riques toujours disponibles pour tous les raisonnements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ThemeToolKit&lt;/strong&gt; : Permet &#224; chaque th&#232;me m&#233;tier d'exposer ses propres outils sp&#233;cifiques, y compris un &lt;strong&gt;outil RAG&lt;/strong&gt; (Research Augmented Generation) pour exploiter la documentation priv&#233;e de l'entreprise. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ToolKit temps r&#233;el&lt;/strong&gt; : Un module d&#233;di&#233; expose des &lt;strong&gt;outils connect&#233;s &#224; des sources de donn&#233;es en temps r&#233;el&lt;/strong&gt;, qu'elles soient &lt;strong&gt;internes &#224; l'entreprise&lt;/strong&gt; ou issues de &lt;strong&gt;services tiers (cloud ou edge-on-premise)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;L'outil RAG (Research Augmented Generation)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;La m&#233;thode RAG permet de construire des agents conversationnels (chat bots) int&#233;grant la documentation de l'entreprise. Ces donn&#233;es ont un caract&#232;re statique, m&#234;me si de nouveaux documents ou de nouvelles versions des documents peuvent &#234;tre ing&#233;r&#233;es tr&#232;s r&#233;guli&#232;rement. L'entreprise y int&#232;grera ses historiques et sa documentation de r&#233;f&#233;rence.&lt;/p&gt;
&lt;p&gt;Dans notre architecture, un module RAG est mis &#224; la disposition de la boucle ReAct sous forme d'outil, lui permettant d'appuyer ses raisonnements sur :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;des &lt;strong&gt;documents historiques&lt;/strong&gt; (rapports, donn&#233;es informelles ...),&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;r&#233;f&#233;rentiel documentaire&lt;/strong&gt; (proc&#233;dures, notices techniques ...),&lt;/li&gt;
&lt;li&gt;des &lt;strong&gt;routines&lt;/strong&gt; permettant d'orienter le raisonnement pour effectuer des t&#226;ches r&#233;p&#233;titives. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Acc&#232;s aux donn&#233;es d'entreprise en temps r&#233;el&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Le ToolKit temps r&#233;el, fond&#233; sur MCP (Model Context Protocol), est crucial pour les cas d'usage m&#233;tier avanc&#233;s. Il permet au moteur ReAct de :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;Interroger dynamiquement des &lt;strong&gt;donn&#233;es m&#233;tiers&lt;/strong&gt; (ERP, CRM, documentation interne, notices techniques, proc&#233;dures etc.)&lt;/li&gt;
&lt;li&gt;Consommer des &lt;strong&gt;flux de donn&#233;es actualis&#233;es&lt;/strong&gt; (API internes, capteurs, machines, services cloud)&lt;/li&gt;
&lt;li&gt;Fournir des r&#233;ponses &lt;strong&gt;contextuelles et &#224; jour&lt;/strong&gt;, en s'appuyant sur des &lt;strong&gt;donn&#233;es op&#233;rationnelles en direct&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les outils du ToolKit temps r&#233;el font appel au standard MCP pour l'importation des donn&#233;es.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Le standard MCP&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Le standard MCP permet de connecter facilement une IA &#224; des donn&#233;es et outils d'entreprise en temps r&#233;el, ce qui renforce consid&#233;rablement les capacit&#233;s du moteur ReAct d&#233;crit pr&#233;c&#233;demment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est un protocole ouvert lanc&#233; fin 2024 par Anthropic. Il vise &#224; &lt;strong&gt;standardiser la connexion entre les mod&#232;les d'intelligence artificielle (comme les LLMs ou agents ReAct) et les sources de donn&#233;es ou outils externes&lt;/strong&gt; (ERP, CRM, bases de donn&#233;es, APIs, capteurs, machines etc.).&lt;/p&gt;
&lt;p&gt;On le compare souvent &#224; un &lt;strong&gt;&#034;USB-C de l'IA&#034;&lt;/strong&gt; : une interface universelle qui remplace les int&#233;grations sur mesure, souvent complexes, co&#251;teuses et peu maintenables.&lt;/p&gt;
&lt;h3&gt;Quels b&#233;n&#233;fices avec le moteur ReAct et les donn&#233;es temps r&#233;el ?&lt;/h3&gt;
&lt;p&gt;Dans le contexte du moteur ReAct que nous mettons en oeuvre, MCP apporte plusieurs avantages cl&#233;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connexion directe aux donn&#233;es d'entreprise en temps r&#233;el&lt;/strong&gt; : MCP permet d'interroger des syst&#232;mes internes ou des services cloud sans passer par des int&#233;grations sp&#233;cifiques. Cela compl&#232;te parfaitement le &lt;em&gt;ToolKit temps r&#233;el&lt;/em&gt; mentionn&#233; dans ton document.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recherche par &#233;tapes plus fluide&lt;/strong&gt; : Gr&#226;ce &#224; MCP, chaque appel du moteur ReAct &#224; un outil externe (comme le QueryEngineTool) peut se faire via une interface unifi&#233;e, facilitant les raisonnements multi-&#233;tapes avec des donn&#233;es toujours &#224; jour.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;R&#233;duction de la dette technique&lt;/strong&gt; : Plus besoin de maintenir des connecteurs maison ou des orchestrateurs complexes. MCP simplifie l'architecture et am&#233;liore la maintenabilit&#233; des agents IA.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interop&#233;rabilit&#233; et &#233;volutivit&#233;&lt;/strong&gt; : Le moteur ReAct peut s'adapter &#224; diff&#233;rents environnements m&#233;tiers sans modification profonde, en s'appuyant sur le standard MCP pour acc&#233;der aux bons outils et donn&#233;es.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S&#233;curit&#233; renforc&#233;e&lt;/strong&gt; : Le protocole MCP int&#232;gre des m&#233;canismes de contr&#244;le d'acc&#232;s et de journalisation, ce qui est crucial pour les environnements sensibles ou r&#233;glement&#233;s.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;B&#233;n&#233;fices pour la prise de d&#233;cision&lt;/strong&gt;&lt;/h3&gt;
&lt;ul class=&#034;spip&#034;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;R&#233;activit&#233; accrue&lt;/strong&gt; : Les agents peuvent s'adapter &#224; l'&#233;volution des donn&#233;es sans red&#233;ploiement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personnalisation m&#233;tier&lt;/strong&gt; : Les outils sp&#233;cifiques par th&#232;me permettent d'aligner les raisonnements sur les donn&#233;es m&#233;tier et le vocabulaire de chaque domaine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interop&#233;rabilit&#233;&lt;/strong&gt; : Ouverture aux syst&#232;mes d'information existants via des connecteurs temps r&#233;el standardis&#233;s.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Un outil Hybrid Search pour ReAct</title>
		<link>https://ia.dnc.global/ReAct-un-outil-embedding-based-retrieval.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/ReAct-un-outil-embedding-based-retrieval.html</guid>
		<dc:date>2025-11-25T10:27:36Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Un outil ReAct pour LlamaIndex qui effectue des recherches RAG via embedding-based retrieval. A partir d'une question de l'utilisateur, c'est une approche en deux temps : On construit un outil ReAct pr&#234;t &#224; brancher sur nos index RAG existants : un objet RetrieverTool qui ex&#233;cute une recherche par embeddings, renvoie les passages top&#8209;k format&#233;s pour l'agent, et supporte le filtrage par m&#233;tadonn&#233;es et hybrid search. On passe le r&#233;sultat au LLM pour mettre la r&#233;ponse en forme. &lt;br class='autobr' /&gt;
Nota : d&#233;veloppement en (...)&lt;/p&gt;


-
&lt;a href="https://ia.dnc.global/-Aspects-techniques-.html" rel="directory"&gt;Aspects techniques&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Un outil ReAct pour LlamaIndex qui effectue des recherches RAG via &lt;a href='https://ia.dnc.global/LLM-based-Retrieval-ou-Embedding-based-Retrieval.html' class='spip_in'&gt;embedding-based retrieval&lt;/a&gt;.&lt;br class='autobr' /&gt;
A partir d'une question de l'utilisateur, c'est une approche en deux temps :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; On construit un outil ReAct pr&#234;t &#224; brancher sur nos index RAG existants : un objet RetrieverTool qui ex&#233;cute une recherche par embeddings, renvoie les passages top&#8209;k format&#233;s pour l'agent, et supporte le filtrage par m&#233;tadonn&#233;es et hybrid search.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; On passe le r&#233;sultat au LLM pour mettre la r&#233;ponse en forme.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;i&gt;Nota : d&#233;veloppement en cours&lt;/i&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Contexte et Pr&#233;requis&lt;/h3&gt;
&lt;p&gt;Contexte :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; un serveur priv&#233;,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; le langage Python, &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; les biblioth&#232;ques LlamaIndex et HugginFace,
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; un LLM capable de fonctions (ex. : Mistral medium ou large),
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; un mod&#232;le d'embeddings compatible (ex. : Sentence-BERT, OpenAI embeddings, BAAI Bge small etc.).&lt;/p&gt;
&lt;p&gt;Pr&#233;requis :&lt;br class='autobr' /&gt;
Un index de documents construit avec nos outils : &lt;a href='https://ia.dnc.global/Ingestion-le-RAG-Manager.html' class='spip_in'&gt;Ingestion : le RAG Manager&lt;/a&gt;, &lt;a href='https://ia.dnc.global/Le-Web-Service-IngestWSG.html' class='spip_in'&gt;Le Web Service IngestWSG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt; La construction de l'outil RetrieverTool&lt;/h3&gt;&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code classe=&#034;puthon&#034;&gt;# retriever_tool.py&lt;br /&gt; from typing import List, Dict, Any&lt;br /&gt; from llama_index import Document&lt;br /&gt; &lt;br /&gt; class RetrieverTool:&lt;br /&gt; def __init__(self, retriever, embedder=None, hybrid_fn=None):&lt;br /&gt; self.retriever = retriever&lt;br /&gt; self.embedder = embedder&lt;br /&gt; self.hybrid_fn = hybrid_fn&lt;br /&gt; &lt;br /&gt; def run(self, query: str, k: int = 5, metadata_filter: Dict[str,Any] = None, hybrid: bool = False) -&gt; List[Dict]:&lt;br /&gt; # Optionnel : hybrid search combine lexical + vector&lt;br /&gt; if hybrid and self.hybrid_fn:&lt;br /&gt; hits = self.hybrid_fn(query, k=k, metadata_filter=metadata_filter)&lt;br /&gt; else:&lt;br /&gt; # LlamaIndex retriever: get top-k documents (API may be retrieve or get_relevant_documents)&lt;br /&gt; hits = self.retriever.retrieve(query, search_kwargs={&#034;k&#034;: k, &#034;filter&#034;: metadata_filter})&lt;br /&gt; results = []&lt;br /&gt; for doc in hits:&lt;br /&gt; text = getattr(doc, &#034;text&#034;, str(doc))&lt;br /&gt; meta = getattr(doc, &#034;metadata&#034;, {})&lt;br /&gt; # Optionnel : tronquer / extraire passage le plus pertinent&lt;br /&gt; snippet = text[:1000]&lt;br /&gt; results.append({&#034;snippet&#034;: snippet, &#034;metadata&#034;: meta, &#034;source_id&#034;: meta.get(&#034;source_id&#034;)})&lt;br /&gt; return results&lt;/code&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Filtrage par m&#233;tadonn&#233;es&lt;/h3&gt;
&lt;p&gt;Le filtrage par m&#233;tadonn&#233;es consiste &#224; appliquer des contraintes bool&#233;ennes ou de plage avant ou apr&#232;s la recherche vectorielle pour ne consid&#233;rer que les documents pertinents au contexte m&#233;tier. Exemples de m&#233;tadonn&#233;es : source, langue, date, client_id, mention de confidentialit&#233; etc.&lt;/p&gt;
&lt;p&gt;En pratique on peut :&lt;br class='autobr' /&gt;
&#8226; Pr&#233;&#8209;filtrer l'ensemble index&#233; (ex. ) puis ex&#233;cuter la recherche vectorielle sur ce sous&#8209;ensemble ;&lt;br class='autobr' /&gt;
&#8226; Post&#8209;filtrer les r&#233;sultats vectoriels (r&#233;duire ou r&#233;ordonner) si le moteur vectoriel ne supporte pas de filtre natif.&lt;br class='autobr' /&gt;
Avantage cl&#233; : r&#233;duit le bruit et &#233;vite que des documents hors&#8209;contexte soient ramen&#233;s au LLM, ce qui diminue les hallucinations et le co&#251;t des appels LLM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patterns d'impl&#233;mentation&lt;/strong&gt;&lt;br class='autobr' /&gt;
&#8226; Filtres simples : dictionnaire transmis au retriever (beaucoup de vector stores supportent un param&#232;tre filter).&lt;br class='autobr' /&gt;
&#8226; Filtres complexes : expressions bool&#233;ennes ou fonctions de scoring m&#233;tier (ex. boost si client_id correspond).&lt;br class='autobr' /&gt;
&#8226; S&#233;curit&#233; : appliquer les r&#232;gles d'acc&#232;s (ACL) en pr&#233;&#8209;filtre pour &#233;viter toute fuite d'information.&lt;/p&gt;
&lt;p&gt;Bonnes pratiques : &lt;br class='autobr' /&gt;
&#8226; limiter le nombre de documents renvoy&#233;s (k = 3&#8211;10),&lt;br class='autobr' /&gt;
&#8226; renvoyer des snippets + m&#233;tadonn&#233;es pour que l'agent puisse raisonner.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Hybrid Search&lt;/h3&gt;
&lt;p&gt;Le concept &lt;i&gt;hybrid search&lt;/i&gt; d&#233;signe la combinaison d'une recherche lexicale (BM25/keyword) et d'une recherche s&#233;mantique (embeddings) pour am&#233;liorer pr&#233;cision et rappel.&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;hybrid search&lt;/strong&gt; combine une recherche lexicale (BM25 ou TF&#8209;IDF) et une recherche vectorielle (embeddings) pour tirer parti des forces compl&#233;mentaires : &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;BM25&lt;/strong&gt; excelle sur les correspondances exactes et mots&#8209;cl&#233;s,&lt;br class='autobr' /&gt; - les &lt;strong&gt;embeddings&lt;/strong&gt; capturent le sens et les synonymes. &lt;br class='autobr' /&gt;
Le flux typique consiste &#224; ex&#233;cuter BM25 et vector search s&#233;par&#233;ment, fusionner les listes et reranker (ou reranker uniquement les top N).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strat&#233;gies de fusion et pond&#233;ration&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; Score normalis&#233; : normaliser scores BM25 et vectoriels (min&#8209;max) puis combiner : `score = &#945; * score_vector + (1-&#945;) * score_bm25`. Ajuster `&#945;` selon requ&#234;te (courte &#8594; plus lexical). &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Ensemble / cascade : BM25 pour r&#233;cup&#233;rer candidates (large), puis rerank par similarit&#233; vectorielle. Ou inversement si on veut donner la priorit&#233; au s&#233;mantique. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Reranking par LLM : prendre top&#8209;N fusionn&#233;s et demander au LLM de reranker ou d'extraire les passages cl&#233;s.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conseils pratiques et pi&#232;ges &#224; &#233;viter&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; Mesurer : A/B test avec m&#233;triques de rappel/precision et qualit&#233; des r&#233;ponses LLM. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Co&#251;t : hybrid augmente les op&#233;rations (deux recherches) &#8212; cache les embeddings de requ&#234;tes et les r&#233;sultats fr&#233;quents. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Normalisation : tokenisation coh&#233;rente entre index lexical et embeddings. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; S&#233;curit&#233; et filtres : toujours appliquer ACL en pr&#233;&#8209;filtre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple minimal (pseudocode)&lt;/strong&gt;&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code classe=&#034;python&#034;&gt;bm25_hits = bm25.search(query, k=50)&lt;br /&gt; vec_hits = vector_store.search(query_embedding, k=50, filter=meta_filter)&lt;br /&gt; candidates = merge_and_dedup(bm25_hits, vec_hits)&lt;br /&gt; for c in candidates: c.score = alpha*norm(c.vec_score)+(1-alpha)*norm(c.bm25_score)&lt;br /&gt; top = sorted(candidates, key=lambda x: x.score, reverse=True)[:k]&lt;/code&gt;&lt;/div&gt;
&lt;p&gt; &lt;strong&gt;exemple concret&lt;/strong&gt; pour FAISS + BM25 (code pr&#234;t &#224; brancher sur l'index) :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code classe=&#034;python&#034;&gt;from rank_bm25 import BM25Okapi&lt;br /&gt; from sentence_transformers import SentenceTransformer&lt;br /&gt; import faiss&lt;br /&gt; import numpy as np&lt;br /&gt; &lt;br /&gt; # documents: list of dicts {'id':int,'text':str,'meta':{...}}&lt;br /&gt; docs = load_documents() &lt;br /&gt; &lt;br /&gt; # BM25&lt;br /&gt; tokenized = [d['text'].split() for d in docs]&lt;br /&gt; bm25 = BM25Okapi(tokenized)&lt;br /&gt; &lt;br /&gt; # Embeddings + FAISS&lt;br /&gt; model = SentenceTransformer('paraphrase-MiniLM-L6-v2')&lt;br /&gt; embs = model.encode([d['text'] for d in docs]).astype('float32')&lt;br /&gt; index = faiss.IndexFlatL2(embs.shape[1])&lt;br /&gt; index.add(embs)&lt;br /&gt; id_map = {i: docs[i]['id'] for i in range(len(docs))}&lt;br /&gt; meta_map = {d['id']: d['meta'] for d in docs}&lt;br /&gt; &lt;br /&gt; def hybrid_search(query, k=10, meta_filter=None, alpha=0.6):&lt;br /&gt; # BM25 candidates&lt;br /&gt; bm25_scores = bm25.get_scores(query.split())&lt;br /&gt; bm25_top = np.argsort(bm25_scores)[-200:][::-1]&lt;br /&gt; &lt;br /&gt; # Vector candidates (apply meta_filter by masking ids)&lt;br /&gt; q_emb = model.encode([query]).astype('float32')&lt;br /&gt; D, I = index.search(q_emb, 200)&lt;br /&gt; vec_candidates = I[0]&lt;br /&gt; &lt;br /&gt; # Merge and dedupe&lt;br /&gt; candidates = []&lt;br /&gt; seen = set()&lt;br /&gt; for idx in list(bm25_top) + list(vec_candidates):&lt;br /&gt; doc_id = id_map[idx]&lt;br /&gt; if meta_filter and not meta_matches(meta_map[doc_id], meta_filter):&lt;br /&gt; continue&lt;br /&gt; if doc_id in seen: continue&lt;br /&gt; seen.add(doc_id)&lt;br /&gt; candidates.append({&lt;br /&gt; 'doc_id': doc_id,&lt;br /&gt; 'bm25_score': float(bm25_scores[idx]),&lt;br /&gt; 'vec_score': float(1.0 / (1.0 + D[0][list(vec_candidates).index(idx)]) ) if idx in vec_candidates else 0.0&lt;br /&gt; })&lt;br /&gt; &lt;br /&gt; # Normalize and combine&lt;br /&gt; bm = np.array([c['bm25_score'] for c in candidates])&lt;br /&gt; ve = np.array([c['vec_score'] for c in candidates])&lt;br /&gt; if len(bm)&gt;0:&lt;br /&gt; bm_n = (bm - bm.min())/(bm.ptp()+1e-9)&lt;br /&gt; ve_n = (ve - ve.min())/(ve.ptp()+1e-9)&lt;br /&gt; for i,c in enumerate(candidates):&lt;br /&gt; c['score'] = alpha*ve_n[i] + (1-alpha)*bm_n[i]&lt;br /&gt; &lt;br /&gt; topk = sorted(candidates, key=lambda x: x['score'], reverse=True)[:k]&lt;br /&gt; return topk&lt;/code&gt;&lt;/div&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/IMG/arton22.png?1764065105' 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/IMG/arton47.png?1763286188' 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>ReAct : Sch&#233;mas d'entr&#233;e et de sortie</title>
		<link>https://ia.dnc.global/ReAct-Schemas-d-entree-et-de-sortie.html</link>
		<guid isPermaLink="true">https://ia.dnc.global/ReAct-Schemas-d-entree-et-de-sortie.html</guid>
		<dc:date>2025-09-12T08:37:58Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Degoy</dc:creator>



		<description>
&lt;p&gt;Une d&#233;finition compl&#232;te et rigoureuse d'outils pour ReAct ( Function Tools ) comprend la d&#233;finition des classes d'E/S Pydantic dans deux buts : aider ReAct &#224; identifier le bon outil, passer des donn&#233;es d'entr&#233;e sous le bon format, valider les sch&#233;mas de sortie ... Oui, mais cela ralentit consid&#233;rablement l'ex&#233;cution et cela demande d'&#233;crire des centaines de lignes de code. Inutilement ? &lt;br class='autobr' /&gt;
Faut-il utiliser les sch&#233;mas Pydantic ? &lt;br class='autobr' /&gt;
Sans sch&#233;ma Pydantic = moins de v&#233;rifications explicites &lt;br class='autobr' /&gt;
Quand on (...)&lt;/p&gt;


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


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Une d&#233;finition compl&#232;te et rigoureuse d'outils pour ReAct ( Function Tools ) comprend la d&#233;finition des classes d'E/S Pydantic dans deux buts : &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; aider ReAct &#224; identifier le bon outil, &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; passer des donn&#233;es d'entr&#233;e sous le bon format, valider les sch&#233;mas de sortie ...&lt;br class='autobr' /&gt;
Oui, mais cela ralentit consid&#233;rablement l'ex&#233;cution et cela demande d'&#233;crire des centaines de lignes de code. &lt;br class='autobr' /&gt;
Inutilement ?&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class=&#034;spip&#034;&gt;Faut-il utiliser les sch&#233;mas Pydantic ?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Sans sch&#233;ma Pydantic = moins de v&#233;rifications explicites&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quand on n'utilise pas de classe Pydantic, on relie l'outil via un sch&#233;ma JSON brut (dans la description de l'outil). Dans ce cas :&lt;br class='autobr' /&gt;
&#8226; Le LLM ne fait pas de validation stricte c&#244;t&#233; Python.&lt;br class='autobr' /&gt;
&#8226; Il fait confiance au sch&#233;ma JSON pour comprendre les types attendus.&lt;br class='autobr' /&gt;
&#8226; Il g&#233;n&#232;re les inputs en se basant sur la description, mais sans v&#233;rification automatique des types ou des valeurs.&lt;br class='autobr' /&gt;
R&#233;sultat :&lt;br class='autobr' /&gt;
&#9989; Ex&#233;cution plus rapide&lt;br class='autobr' /&gt;
&#9989; Moins de friction&lt;br class='autobr' /&gt;
&#9888;&#65039; Moins de s&#233;curit&#233; sur les entr&#233;es (si l'agent hallucine ou malformate les donn&#233;es)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avec Pydantic = validation rigoureuse&lt;/strong&gt;&lt;br class='autobr' /&gt;
Si on utilise une classe Pydantic (d&#233;clar&#233; dans le param&#232;tre fn_schema du FunctionTool) pour d&#233;finir les param&#232;tres :&lt;br class='autobr' /&gt;
&#8226; Le LLM doit conformer les inputs &#224; la structure attendue.&lt;br class='autobr' /&gt;
&#8226; Chaque champ est valid&#233; (type, pr&#233;sence, valeur).&lt;br class='autobr' /&gt;
&#8226; Tu obtiens des erreurs explicites si l'input est mal form&#233;.&lt;br class='autobr' /&gt;
R&#233;sultat :&lt;br class='autobr' /&gt;
&#9989; Robustesse&lt;br class='autobr' /&gt;
&#9989; Clart&#233; des erreurs&lt;br class='autobr' /&gt;
&#9888;&#65039; Temps de traitement plus long&lt;br class='autobr' /&gt;
&#9888;&#65039; Risque de blocage si le LLM ne formate pas parfaitement.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Gestion des retours de fonction&lt;/h3&gt;
&lt;p&gt;C'est un point souvent n&#233;glig&#233; dans les workflows ReAct : la gestion des retours de fonction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment ReAct g&#232;re les retours de fonction&lt;/strong&gt;&lt;br class='autobr' /&gt;
Dans LlamaIndex ReAct, l'agent ne lit pas directement le code Python de la fonction. Il se base sur :&lt;br class='autobr' /&gt;
1. La docstring de la fonction (si elle est fournie)&lt;br class='autobr' /&gt;
2. Le nom de la fonction&lt;br class='autobr' /&gt;
3. Le contexte de la requ&#234;te utilisateur&lt;br class='autobr' /&gt;
4. L'observation du r&#233;sultat apr&#232;s appel de la fonction&lt;br class='autobr' /&gt;
Autrement dit, il ne sait pas &#224; l'avance ce que la fonction retourne, sauf cela lui est expliqu&#233;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bonnes pratiques pour que ReAct comprenne le retour&lt;/strong&gt;&lt;br class='autobr' /&gt;
Voici comment on peut l'aider &#224; bien interpr&#233;ter le r&#233;sultat :&lt;br class='autobr' /&gt;
1. Docstring explicite dans la fonction :&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; extract_values_by_key&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;data_list&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; key&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: #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; Retourne une liste contenant les valeurs associ&#233;es &#224; une cl&#233; donn&#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;&lt;span style=&#034;color: #483d8b;&#034;&gt; dans chaque dictionnaire de la liste.&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: #ff7700;font-weight:bold;&#034;&gt;return&lt;/span&gt; &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;item&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;key&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; item &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; data_list &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; key &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; item&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;p class='download code_download'&gt;&lt;a href='https://ia.dnc.global/local/cache-code/49d62259824459c578477b8818690769.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;2. Description claire dans le sch&#233;ma JSON :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code class=&#034;json&#034;&gt;&#034;description&#034;: &#034;Retourne une liste des valeurs correspondant &#224; une cl&#233; sp&#233;cifique dans une liste de dictionnaires.&#034;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;3. Nom de fonction &#233;vocateur&lt;br class='autobr' /&gt;
Un nom comme 'extract_values_by_key' est d&#233;j&#224; tr&#232;s parlant. &#201;viter les noms trop g&#233;n&#233;riques comme 'process_data'.&lt;br class='autobr' /&gt;
4. Observation du r&#233;sultat&lt;br class='autobr' /&gt;
Apr&#232;s appel de la fonction, l'agent voit le retour (par exemple ['Alice','Bob','Charlie']) et peut l'utiliser dans sa cha&#238;ne de raisonnement suivante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'annotation de type de retour () dans la signature Python&lt;/strong&gt; est utile pour le d&#233;veloppeur, mais elle n'a aucun impact direct sur le comportement de l'agent ReAct :&lt;br class='autobr' /&gt;
LlamaIndex ReAct ne lit pas le code source de la fonction. Il ne fait pas d'analyse statique comme un IDE ou un linter. Ce qu'il utilise pour comprendre le comportement d'un outil, c'est :&lt;br class='autobr' /&gt;
&#8226; Le nom de la fonction,&lt;br class='autobr' /&gt;
&#8226; La description (dans le sch&#233;ma JSON ou la docstring),&lt;br class='autobr' /&gt;
&#8226; Les param&#232;tres d&#233;finis dans le sch&#233;ma,&lt;br class='autobr' /&gt;
&#8226; Le r&#233;sultat observ&#233; apr&#232;s ex&#233;cution.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Pour aller plus loin&#8230;&lt;/h3&gt;
&lt;p&gt;On peut aussi encapsuler le retour dans un dictionnaire pour le rendre plus lisible :&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; extract_values_by_key&lt;span style=&#034;color: black;&#034;&gt;&amp;#40;&lt;/span&gt;data_list&lt;span style=&#034;color: #66cc66;&#034;&gt;,&lt;/span&gt; key&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;&#123;&lt;/span&gt;&lt;span style=&#034;color: #483d8b;&#034;&gt;&#034;values&#034;&lt;/span&gt;: &lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;item&lt;span style=&#034;color: black;&#034;&gt;&amp;#91;&lt;/span&gt;key&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;for&lt;/span&gt; item &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; data_list &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;if&lt;/span&gt; key &lt;span style=&#034;color: #ff7700;font-weight:bold;&#034;&gt;in&lt;/span&gt; item&lt;span style=&#034;color: black;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: black;&#034;&gt;&#125;&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/7cf5b3fb5b1a467ac1d4c89be56807a9.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Cela permet &#224; l'agent de mieux comprendre la structure du r&#233;sultat, surtout si tu veux encha&#238;ner avec d'autres outils.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
