diff --git a/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb b/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb index aa3703715c..ff6f285102 100644 --- a/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb +++ b/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb @@ -442,11 +442,23 @@ }, { "cell_type": "markdown", + "id": "ef9f8d8c", "metadata": {}, "source": [ - "**Lecture de la conversation** — l'orchestrateur a produit un échange de **charade** : le Père Fouras ouvre (« Mon premier est une préposition... Mon deuxième est une graine... Mon troisième évoque les règles d'un texte fondamental »), et Laurent Jalabert devine **tour par tour** (« 'à' ? » → non → « 'dans' ? » → non → « 'de' ? » → « Bravo ! Mon premier est effectivement 'de' ! »), puis « grain » et « loi » confirmés.\n", + "### Lecture — l'orchestrateur alterne les agents tout seul\n", "\n", - "**Ce que cet output démontre** : la trace alterne rigoureusement `Pere_Fouras` / `Laurent_Jalabert` sans qu'aucun code ne dicte l'ordre — c'est la **stratégie de sélection** du `AgentGroupChat`. Notez aussi que les agents **improvisent** : la charade générée ne décompose pas exactement `Anticonstitutionnellement` — le modèle crée sa propre énigme cohérente. C'est une propriété émergente des systèmes multi-agent : le comportement naît de l'interaction des prompts, pas d'un script." + "La sortie committée montre **3 tours** :\n", + "1. **Père Fouras** : une charade en 4 parties (« Mon premier est le contraire de pro… Mon quatrième se termine par ment »). Le modèle a *inventé* sa propre charade — elle ne décompose pas `Anticonstitutionnellement` de façon canonique, mais reste cohérente.\n", + "2. **Laurent Jalabert** : propose « amendement » — **faux** mais proche (le mot commence par une longue suite de lettres).\n", + "3. **Père Fouras** : encourage (« Tu t'approches ») sans révéler — la stratégie de sélection lui redonne la parole automatiquement.\n", + "\n", + "Ce que le code fait et que l'output démontre :\n", + "- **`chat.ResetAsync()` + `chat.IsComplete = false`** : on repart d'un historique vide — rejouer la cellule relance une partie fraîche.\n", + "- **`await foreach (var content in chat.InvokeAsync())`** : la boucle consomme un flux asynchrone. L'orchestrateur décide *à chaque tour* quel agent parle (sélection) et s'il faut s'arrêter (terminaison). Le code ne dicte pas l'ordre.\n", + "- **`content.AuthorName`** : rend la trace lisible (`Pere_Fouras` / `Laurent_Jalabert`). C'est le `Name` posé en cell 9 — sans lui, la trace serait indistinguible.\n", + "- **La terminaison n'a pas déclenché** : Laurent n'a pas dit `Anticonstitutionnellement` — la sortie s'arrête à 3 tours (output tronqué, l'itération continue au-delà). Le `MaximumIterations = 10` protège contre une partie infinie.\n", + "\n", + "Notez aussi que les agents **improvisent** : la charade générée ne décompose pas exactement `Anticonstitutionnellement` — le modèle crée sa propre énigme cohérente. C'est une propriété émergente des systèmes multi-agent : le comportement naît de l'interaction des prompts, pas d'un script.\n" ] }, {