diff --git a/MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/09-KernelMemory-Multimodal.ipynb b/MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/09-KernelMemory-Multimodal.ipynb index 8130f99510..a4eb6279b8 100644 --- a/MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/09-KernelMemory-Multimodal.ipynb +++ b/MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/09-KernelMemory-Multimodal.ipynb @@ -5,10 +5,10 @@ "id": "md001", "metadata": { "papermill": { - "duration": 0.00333, - "end_time": "2026-08-31T16:23:21.097182", + "duration": 0.006266, + "end_time": "2026-09-18T00:04:12.617231+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.093852", + "start_time": "2026-09-18T00:04:12.610965+00:00", "status": "completed" }, "tags": [] @@ -58,10 +58,10 @@ "id": "md002", "metadata": { "papermill": { - "duration": 0.004146, - "end_time": "2026-08-31T16:23:21.105153", + "duration": 0.005232, + "end_time": "2026-09-18T00:04:12.628278+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.101007", + "start_time": "2026-09-18T00:04:12.623046+00:00", "status": "completed" }, "tags": [] @@ -84,16 +84,16 @@ "id": "cd003", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:23:21.114026Z", - "iopub.status.busy": "2026-08-31T16:23:21.113694Z", - "iopub.status.idle": "2026-08-31T16:23:21.216323Z", - "shell.execute_reply": "2026-08-31T16:23:21.215641Z" + "iopub.execute_input": "2026-09-18T00:04:12.640719Z", + "iopub.status.busy": "2026-09-18T00:04:12.640301Z", + "iopub.status.idle": "2026-09-18T00:04:12.897180Z", + "shell.execute_reply": "2026-09-18T00:04:12.895792Z" }, "papermill": { - "duration": 0.109118, - "end_time": "2026-08-31T16:23:21.217535", + "duration": 0.264786, + "end_time": "2026-09-18T00:04:12.898246+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.108417", + "start_time": "2026-09-18T00:04:12.633460+00:00", "status": "completed" }, "tags": [] @@ -105,10 +105,10 @@ "text": [ ".env charge : .env (MyIA.AI.Notebooks/GenAI)\n", "Endpoint embeddings : openrouter.ai\n", - "Endpoint vision : api.medium.text-generation-webui.myia.io (cle presente)\n", + "Endpoint vision : api.medium.text-generation-webui.myia.io (CLE ABSENTE)\n", "Modele embeddings : text-embedding-3-small\n", "Modele vision : qwen3.6-35b-a3b (vLLM maison ; secours openrouter : google/gemini-3.7-flash)\n", - "Corpus provisoire : km09_corpus_38z37am3/ (repertoire temporaire)\n" + "Corpus provisoire : km09_corpus_jmcjkgov/ (repertoire temporaire)\n" ] } ], @@ -187,10 +187,10 @@ "id": "md004", "metadata": { "papermill": { - "duration": 0.006934, - "end_time": "2026-08-31T16:23:21.229326", + "duration": 0.005659, + "end_time": "2026-09-18T00:04:12.909791+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.222392", + "start_time": "2026-09-18T00:04:12.904132+00:00", "status": "completed" }, "tags": [] @@ -212,16 +212,16 @@ "id": "cd005", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:23:21.243669Z", - "iopub.status.busy": "2026-08-31T16:23:21.243457Z", - "iopub.status.idle": "2026-08-31T16:23:21.606425Z", - "shell.execute_reply": "2026-08-31T16:23:21.605971Z" + "iopub.execute_input": "2026-09-18T00:04:12.923362Z", + "iopub.status.busy": "2026-09-18T00:04:12.922839Z", + "iopub.status.idle": "2026-09-18T00:04:27.472671Z", + "shell.execute_reply": "2026-09-18T00:04:27.471160Z" }, "papermill": { - "duration": 0.371084, - "end_time": "2026-08-31T16:23:21.607218", + "duration": 14.558085, + "end_time": "2026-09-18T00:04:27.473666+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.236134", + "start_time": "2026-09-18T00:04:12.915581+00:00", "status": "completed" }, "tags": [] @@ -231,7 +231,27 @@ "name": "stdout", "output_type": "stream", "text": [ - "Docker dispo : True\n", + "Docker dispo : True\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Conteneur Qdrant lance (rc=0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Conteneur service KM lance (rc=0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Qdrant pret : True | service KM pret : True\n", "INFRA_OK (mesure possible) : True\n" ] @@ -322,10 +342,10 @@ "id": "md006", "metadata": { "papermill": { - "duration": 0.007062, - "end_time": "2026-08-31T16:23:21.619718", + "duration": 0.005167, + "end_time": "2026-09-18T00:04:27.486764+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.612656", + "start_time": "2026-09-18T00:04:27.481597+00:00", "status": "completed" }, "tags": [] @@ -359,16 +379,16 @@ "id": "cd007", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:23:21.631943Z", - "iopub.status.busy": "2026-08-31T16:23:21.631583Z", - "iopub.status.idle": "2026-08-31T16:23:21.681200Z", - "shell.execute_reply": "2026-08-31T16:23:21.680579Z" + "iopub.execute_input": "2026-09-18T00:04:27.499207Z", + "iopub.status.busy": "2026-09-18T00:04:27.498743Z", + "iopub.status.idle": "2026-09-18T00:04:27.580777Z", + "shell.execute_reply": "2026-09-18T00:04:27.579315Z" }, "papermill": { - "duration": 0.056663, - "end_time": "2026-08-31T16:23:21.682063", + "duration": 0.089707, + "end_time": "2026-09-18T00:04:27.581875+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.625400", + "start_time": "2026-09-18T00:04:27.492168+00:00", "status": "completed" }, "tags": [] @@ -378,13 +398,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Corpus : 6 documents dans km09_corpus_38z37am3/\n", + "Corpus : 6 documents dans km09_corpus_jmcjkgov/\n", " - pdf-cours [pdf] cours-introduction-ia.pdf (1291133 octets)\n", " - s1-partition [txt] s1-partition.txt (225 octets)\n", " - s2-formats [txt] s2-formats.txt (250 octets)\n", " - s3-pont-vision [txt] s3-pont-vision.txt (236 octets)\n", " - s4-distracteur [txt] s4-distracteur.txt (226 octets)\n", - " - schema-png [png] schema-capteur.png (4217 octets)\n" + " - schema-png [png] schema-capteur.png (4219 octets)\n" ] } ], @@ -457,10 +477,10 @@ "id": "md008", "metadata": { "papermill": { - "duration": 0.006104, - "end_time": "2026-08-31T16:23:21.691776", + "duration": 0.006784, + "end_time": "2026-09-18T00:04:27.594469+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.685672", + "start_time": "2026-09-18T00:04:27.587685+00:00", "status": "completed" }, "tags": [] @@ -489,16 +509,16 @@ "id": "cd009", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:23:21.702282Z", - "iopub.status.busy": "2026-08-31T16:23:21.702002Z", - "iopub.status.idle": "2026-08-31T16:23:22.912779Z", - "shell.execute_reply": "2026-08-31T16:23:22.912100Z" + "iopub.execute_input": "2026-09-18T00:04:27.607952Z", + "iopub.status.busy": "2026-09-18T00:04:27.607498Z", + "iopub.status.idle": "2026-09-18T00:04:28.862366Z", + "shell.execute_reply": "2026-09-18T00:04:28.861087Z" }, "papermill": { - "duration": 1.217357, - "end_time": "2026-08-31T16:23:22.913595", + "duration": 1.263155, + "end_time": "2026-09-18T00:04:28.863384+00:00", "exception": false, - "start_time": "2026-08-31T16:23:21.696238", + "start_time": "2026-09-18T00:04:27.600229+00:00", "status": "completed" }, "tags": [] @@ -555,16 +575,16 @@ "id": "cd010", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:23:22.922428Z", - "iopub.status.busy": "2026-08-31T16:23:22.922158Z", - "iopub.status.idle": "2026-08-31T16:25:55.698023Z", - "shell.execute_reply": "2026-08-31T16:25:55.697356Z" + "iopub.execute_input": "2026-09-18T00:04:28.876966Z", + "iopub.status.busy": "2026-09-18T00:04:28.876549Z", + "iopub.status.idle": "2026-09-18T00:07:01.235555Z", + "shell.execute_reply": "2026-09-18T00:07:01.234161Z" }, "papermill": { - "duration": 152.7827, - "end_time": "2026-08-31T16:25:55.701009", + "duration": 152.371794, + "end_time": "2026-09-18T00:07:01.241270+00:00", "exception": false, - "start_time": "2026-08-31T16:23:22.918309", + "start_time": "2026-09-18T00:04:28.869476+00:00", "status": "completed" }, "tags": [] @@ -576,7 +596,7 @@ "text": [ "Documents completes : 5/6 (borne de polling 150s, ecoule 152s)\n", "Toujours en attente (pipeline bloque a une etape) : ['schema-png']\n", - " statut brut du premier bloque : {\"completed\": false, \"empty\": false, \"index\": \"km13421-multi\", \"document_id\": \"schema-png\", \"tags\": {}, \"creation\": \"2026-08-31T16:23:22.9075611+00:00\", \"last_update\": \"2026-08-31T16:23:22.9080704+00:00\", \"steps\": [\"extract\", \"partition\", \"gen_embeddings\", \"save_records\"], \"remaining_steps\": [\"extract\", \"partition\", \"gen_embeddings\", \"save_records\"], \"completed_steps\": []}\n", + " statut brut du premier bloque : {\"completed\": false, \"empty\": false, \"index\": \"km13421-multi\", \"document_id\": \"schema-png\", \"tags\": {}, \"creation\": \"2026-09-18T00:04:28.8548719+00:00\", \"last_update\": \"2026-09-18T00:04:28.8558797+00:00\", \"steps\": [\"extract\", \"partition\", \"gen_embeddings\", \"save_records\"], \"remaining_steps\": [\"extract\", \"partition\", \"gen_embeddings\", \"save_records\"], \"completed_steps\": []}\n", " Steps du pipeline (complets) :\n", " - extract [EN ATTENTE]\n", " - partition [EN ATTENTE]\n", @@ -637,16 +657,16 @@ "id": "cd011", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:25:55.709562Z", - "iopub.status.busy": "2026-08-31T16:25:55.709040Z", - "iopub.status.idle": "2026-08-31T16:25:55.731724Z", - "shell.execute_reply": "2026-08-31T16:25:55.731113Z" + "iopub.execute_input": "2026-09-18T00:07:01.254415Z", + "iopub.status.busy": "2026-09-18T00:07:01.253960Z", + "iopub.status.idle": "2026-09-18T00:07:01.275639Z", + "shell.execute_reply": "2026-09-18T00:07:01.274387Z" }, "papermill": { - "duration": 0.028242, - "end_time": "2026-08-31T16:25:55.732642", + "duration": 0.029753, + "end_time": "2026-09-18T00:07:01.276863+00:00", "exception": false, - "start_time": "2026-08-31T16:25:55.704400", + "start_time": "2026-09-18T00:07:01.247110+00:00", "status": "completed" }, "tags": [] @@ -701,10 +721,10 @@ "id": "md012", "metadata": { "papermill": { - "duration": 0.003325, - "end_time": "2026-08-31T16:25:55.739299", + "duration": 0.005823, + "end_time": "2026-09-18T00:07:01.289419+00:00", "exception": false, - "start_time": "2026-08-31T16:25:55.735974", + "start_time": "2026-09-18T00:07:01.283596+00:00", "status": "completed" }, "tags": [] @@ -726,16 +746,16 @@ "id": "cd013", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:25:55.747486Z", - "iopub.status.busy": "2026-08-31T16:25:55.746887Z", - "iopub.status.idle": "2026-08-31T16:25:57.677541Z", - "shell.execute_reply": "2026-08-31T16:25:57.677072Z" + "iopub.execute_input": "2026-09-18T00:07:01.303143Z", + "iopub.status.busy": "2026-09-18T00:07:01.302695Z", + "iopub.status.idle": "2026-09-18T00:07:02.093786Z", + "shell.execute_reply": "2026-09-18T00:07:02.092401Z" }, "papermill": { - "duration": 1.935739, - "end_time": "2026-08-31T16:25:57.678310", + "duration": 0.799634, + "end_time": "2026-09-18T00:07:02.094903+00:00", "exception": false, - "start_time": "2026-08-31T16:25:55.742571", + "start_time": "2026-09-18T00:07:01.295269+00:00", "status": "completed" }, "tags": [] @@ -745,13 +765,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "AVANT q1 'capteur impairfaux' -> pdf-cours\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "AVANT q1 'capteur impairfaux' -> pdf-cours\n", "AVANT q2 'comment limiter les faux negatifs de detection' -> s4-distracteur\n" ] }, @@ -795,10 +809,10 @@ "id": "md014", "metadata": { "papermill": { - "duration": 0.003001, - "end_time": "2026-08-31T16:25:57.684785", + "duration": 0.006054, + "end_time": "2026-09-18T00:07:02.107471+00:00", "exception": false, - "start_time": "2026-08-31T16:25:57.681784", + "start_time": "2026-09-18T00:07:02.101417+00:00", "status": "completed" }, "tags": [] @@ -827,10 +841,10 @@ "id": "f7eebe0e", "metadata": { "papermill": { - "duration": 0.003007, - "end_time": "2026-08-31T16:25:57.691061", + "duration": 0.005785, + "end_time": "2026-09-18T00:07:02.119892+00:00", "exception": false, - "start_time": "2026-08-31T16:25:57.688054", + "start_time": "2026-09-18T00:07:02.114107+00:00", "status": "completed" }, "tags": [] @@ -841,8 +855,10 @@ "Le stall du [3] n'est pas un bug du service Kernel Memory OSS : il n'embarque pas de\n", "connecteur OCR, point. La question pedagogique devient : **que ferait un extracteur\n", "dedie** sur ce corpus ? Le cluster heberge un container Apache Tika (image `apache/tika:latest-full`\n", - "qui embarque Tesseract ; **3.2.3** mesure sur `/version`, pas 4.0.0 comme annonce\n", - "precedemment) sur le port hote `http://localhost:9917` (le port interne du conteneur\n", + "qui embarque Tesseract ; la version est lue du service via `/version` et imprimee par la cellule\n", + "d'extraction -- **4.0.0** sur le conteneur de ce run, 3.2.3 mesure sur l'hote\n", + "distant au run precedent : la version est celle de l'image qui repond sur\n", + "9917, et la mesure a deux bras reproduit les memes valeurs sous les deux) sur le port hote `http://localhost:9917` (le port interne du conteneur\n", "est 9998 : l'hote publie 9917, d'ou le mapping `0.0.0.0:9917->9998/tcp`). C'est\n", "l'outil canonique d'extraction multi-format, exactement le role que le service OSS\n", "laisse vide.\n", @@ -867,21 +883,28 @@ "id": "6ddbb386", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:25:57.698142Z", - "iopub.status.busy": "2026-08-31T16:25:57.697939Z", - "iopub.status.idle": "2026-08-31T16:26:02.401713Z", - "shell.execute_reply": "2026-08-31T16:26:02.401120Z" + "iopub.execute_input": "2026-09-18T00:07:02.134339Z", + "iopub.status.busy": "2026-09-18T00:07:02.133893Z", + "iopub.status.idle": "2026-09-18T00:07:09.541976Z", + "shell.execute_reply": "2026-09-18T00:07:09.540601Z" }, "papermill": { - "duration": 4.708703, - "end_time": "2026-08-31T16:26:02.402834", + "duration": 7.417207, + "end_time": "2026-09-18T00:07:09.543098+00:00", "exception": false, - "start_time": "2026-08-31T16:25:57.694131", + "start_time": "2026-09-18T00:07:02.125891+00:00", "status": "completed" }, "tags": [] }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moteur d'extraction : Apache Tika 4.0.0 (http://localhost:9917)\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -906,6 +929,12 @@ "TIKA_URL = os.getenv(\"TIKA_URL\", \"http://localhost:9917\").rstrip(\"/\") # port hote (9917 publie 9998 interne conteneur)\n", "ATTENDUS_PNG = [\"Qdrant\", \"hybride\", \"BM25\", \"RRF\", \"capteur\"]\n", "\n", + "try:\n", + " tika_version = requests.get(f\"{TIKA_URL}/version\", timeout=15).text.strip()\n", + "except Exception as e:\n", + " tika_version = f\"(version illisible : {e})\"\n", + "print(f\"Moteur d'extraction : {tika_version} ({TIKA_URL})\")\n", + "\n", "def tika_text(path: Path, mime: str) -> str:\n", " r = requests.put(\n", " f\"{TIKA_URL}/tika\",\n", @@ -936,15 +965,102 @@ " print(f\"PNG : ECHEC -- {e}\")" ] }, + { + "cell_type": "code", + "execution_count": 9, + "id": "mesure-deux-bras", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T00:07:09.557436Z", + "iopub.status.busy": "2026-09-18T00:07:09.556928Z", + "iopub.status.idle": "2026-09-18T00:07:10.867444Z", + "shell.execute_reply": "2026-09-18T00:07:10.866018Z" + }, + "papermill": { + "duration": 1.319291, + "end_time": "2026-09-18T00:07:10.868811+00:00", + "exception": false, + "start_time": "2026-09-18T00:07:09.549520+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mesure a deux bras -- 4 variantes, meme moteur Tesseract :\n", + " A fixture d'origine (~11 px) 2/5 '(drant hybride: B25 dense fusion RAF capteur impairfaux faux ne'\n", + " A+ X-Tika-OCRpageSegMode=6 (controle) 2/5 '(drant hybride: B25 dense fusion RAF capteur impairfaux faux ne'\n", + " A+ X-Tika-OCRdensity=300 (controle) 2/5 '(drant hybride: B25 dense fusion RAF capteur impairfaux faux ne'\n", + " B meme image x3 LANCZOS 5/5 'Qdrant hybride : BM25 dense fusion RRF capteur impairfaux faux '\n", + "\n", + "Lecture : A = 2/5, B = 5/5. Entre A et B, seuls les pixels changent\n", + "(meme texte genere, meme moteur, meme parametrage par defaut) : le facteur\n", + "explicatif du plafond est la taille de rendu, pas la nature du vocabulaire.\n" + ] + } + ], + "source": [ + "# --- 4b. Mesure a deux bras : la taille de rendu, pas le vocabulaire -----\n", + "# Le meme PNG part deux fois au meme moteur Tesseract, avec le meme parametrage\n", + "# par defaut : une fois tel quel (bras A), une fois agrandi x3 par interpolation\n", + "# Lanczos sans reecriture de glyphes (bras B). Deux reglages Tika appliques au\n", + "# bras A servent de controles : aucun effet attendu -- la piste d'un defaut de\n", + "# parametrage du moteur s'ecarte en meme temps que celle du vocabulaire.\n", + "\n", + "import io\n", + "\n", + "def ocr_tika_png(img, reglages=None):\n", + " \"\"\"OCR Tika d'une image PIL ; rend (texte brut, tokens attendus exacts).\"\"\"\n", + " buf = io.BytesIO()\n", + " img.save(buf, format=\"PNG\")\n", + " headers = {\"Content-Type\": \"image/png\", \"Accept\": \"text/plain\"}\n", + " if reglages:\n", + " headers.update(reglages)\n", + " r = requests.put(f\"{TIKA_URL}/tika\", data=buf.getvalue(),\n", + " headers=headers, timeout=120)\n", + " r.raise_for_status()\n", + " txt = r.text.strip()\n", + " return txt, [t for t in ATTENDUS_PNG if t in txt]\n", + "\n", + "DEUX_BRAS = []\n", + "if PIL_OK:\n", + " img_a = Image.open(PNG_PATH) # fixture d'origine de [2c], pixels intacts\n", + " variantes = [\n", + " (\"A fixture d'origine (~11 px)\", img_a, None),\n", + " (\"A+ X-Tika-OCRpageSegMode=6 (controle)\", img_a, {\"X-Tika-OCRpageSegMode\": \"6\"}),\n", + " (\"A+ X-Tika-OCRdensity=300 (controle)\", img_a, {\"X-Tika-OCRdensity\": \"300\"}),\n", + " (\"B meme image x3 LANCZOS\",\n", + " img_a.resize((img_a.width * 3, img_a.height * 3), Image.LANCZOS), None),\n", + " ]\n", + " for label, img, reglages in variantes:\n", + " txt, exacts = ocr_tika_png(img, reglages)\n", + " DEUX_BRAS.append((label, exacts, txt))\n", + "\n", + " print(f\"Mesure a deux bras -- {len(DEUX_BRAS)} variantes, meme moteur Tesseract :\")\n", + " for label, exacts, txt in DEUX_BRAS:\n", + " print(f\" {label:40s} {len(exacts)}/5 {txt[:64]!r}\")\n", + " print()\n", + " n_a = len(DEUX_BRAS[0][1])\n", + " n_b = len(DEUX_BRAS[-1][1])\n", + " print(f\"Lecture : A = {n_a}/5, B = {n_b}/5. Entre A et B, seuls les pixels changent\")\n", + " print(\"(meme texte genere, meme moteur, meme parametrage par defaut) : le facteur\")\n", + " print(\"explicatif du plafond est la taille de rendu, pas la nature du vocabulaire.\")\n", + "else:\n", + " print(\"Mesure a deux bras sautee : Pillow absent (schema PNG non genere en [2c])\")\n" + ] + }, { "cell_type": "markdown", "id": "6e9f9dac", "metadata": { "papermill": { - "duration": 0.003291, - "end_time": "2026-08-31T16:26:02.409633", + "duration": 0.005599, + "end_time": "2026-09-18T00:07:10.881569+00:00", "exception": false, - "start_time": "2026-08-31T16:26:02.406342", + "start_time": "2026-09-18T00:07:10.875970+00:00", "status": "completed" }, "tags": [] @@ -952,36 +1068,36 @@ "source": [ "### Interpretation : [INTERP-TIKA] l'extracteur dedie lit le PDF, tord le PNG\n", "\n", - "Les attendus sont confirmés par la mesure : le **PDF** sort integralement (le service\n", + "Les attendus sont confirmes par la mesure : le **PDF** sort integralement (le service\n", "OSS avait raison de l'ingerer), le **PNG** passe par l'OCR Tesseract et rend un texte\n", "**partiellement restitue**. Mais **le defaut n'est pas dans le vocabulaire** : la\n", - "mesure comparative du corps de l'issue #14417 (deux bras, meme PNG envoye a tika,\n", - "un seul redimensionne par interpolation Lanczos x3 sans reecriture de glyphes)\n", - "montre que le delta est dans la **taille de rendu** (police bitmap ~11 px de la\n", - "fixture Pillow d'origine), pas dans la nature des termes.\n", + "mesure a deux bras executee dans la cellule [4b] ci-dessus -- meme PNG envoye deux\n", + "fois au meme moteur Tesseract, un seul agrandi par interpolation Lanczos x3 sans\n", + "reecriture de glyphes -- tranche la cause : le delta est dans la **taille de rendu**\n", + "(police bitmap ~11 px de la fixture Pillow d'origine), pas dans la nature des termes.\n", "\n", - "Le **tableau** ci-dessous est le resultat de cette mesure -- reporte ici comme\n", - "**reference de l'exterieur du notebook** (la cellule de mesure 2-bras elle-meme\n", - "est differee a une PR de suivi, car le service Tika heberge sur ai-01 est\n", - "RECOVERABLE-MACHINE pour cette lane, voir le body de l'issue) :\n", + "Recapitulatif de la mesure executee :\n", "\n", "| Variante fixture | Tokens exacts / 5 | Note |\n", "|---|---:|---|\n", - "| A -- fixture Pillow d'origine (font bitmap par defaut ~11 px) | 2/5 | controle positif : meme sortie que le notebook |\n", - "| B -- meme PNG agrandi x3 (LANCZOS, sans reecriture de glyphes) | **5/5** | recuperation complete |\n", - "\n", - "Les deux variantes utilisent le meme moteur Tesseract avec les memes parametres par\n", - "defaut ; le delta est dans l'image envoyee, pas dans le service. La variante A\n", - "reproduit la sortie committee du notebook *a l'octet pres* -- l'instrument mesure\n", - "donc bien la meme chose que ce notebook, et le delta B n'est pas un artefact de\n", - "l'investigation exterieure.\n", + "| A -- fixture d'origine (font bitmap ~11 px) | 2/5 | controle positif : memes substitutions que la cellule d'extraction (`B25`, `RAF`) |\n", + "| A + `X-Tika-OCRpageSegMode: 6` | 2/5 | controle : reglage OCR sans effet |\n", + "| A + `X-Tika-OCRdensity: 300` | 2/5 | controle : reglage OCR sans effet |\n", + "| B -- meme image x3 (LANCZOS, sans reecriture de glyphes) | **5/5** | recuperation complete |\n", + "\n", + "Les quatre lignes sont la sortie commitée de [4b], pas un report exterieur au\n", + "notebook. Les deux reglages Tika laissent le resultat **strictement inchange** --\n", + "la piste d'un defaut de parametrage du moteur s'ecarte en meme temps que celle du\n", + "vocabulaire. Seuls les pixels different entre A et B : le bras A reproduit les\n", + "substitutions de la cellule d'extraction (`Qdrant` -> `(drant`, `BM25` -> `B25`,\n", + "`RRF` -> `RAF`), le bras B les efface toutes.\n", "\n", "Le pont vision du [5] reste necessaire, et la justification se **renforce** : il\n", - "ne comble plus un defaut de l'OCR sur le vocabulaire technique (defaut inexistant\n", - "dans tika, c'est la mesure 2-bras qui le tranche), mais une **capacite absente**\n", - "-- restituer la **semantique du schema** (relations, disposition, lecture du\n", - "graphe), pas la fidelite lexicale. C'est exactement ce que le modele de vision\n", - "sait faire qu'un OCR ne fait pas." + "ne comble pas un defaut de l'OCR sur le vocabulaire technique (defaut inexistant\n", + "dans tika, c'est la mesure a deux bras qui le tranche), mais une **capacite\n", + "absente** -- restituer la **semantique du schema** (relations, disposition,\n", + "lecture du graphe), pas la fidelite lexicale. C'est exactement ce que le modele\n", + "de vision sait faire qu'un OCR ne fait pas." ] }, { @@ -989,10 +1105,10 @@ "id": "md015", "metadata": { "papermill": { - "duration": 0.003845, - "end_time": "2026-08-31T16:26:02.416620", + "duration": 0.005918, + "end_time": "2026-09-18T00:07:10.893278+00:00", "exception": false, - "start_time": "2026-08-31T16:26:02.412775", + "start_time": "2026-09-18T00:07:10.887360+00:00", "status": "completed" }, "tags": [] @@ -1015,26 +1131,26 @@ "Le prompt demande une description **en citant les termes techniques visibles** — un\n", "modèle de vision digne de ce nom lit le texte dans l'image ; un modèle texte pur\n", "n'aurait aucun accès au pixels. Détail d'ingénierie qui a son importance :\n", - "`max_tokens = 1200` — les modèles à raisonnement consomment des jetons de réflexion\n", + "`max_tokens = 1500` — les modèles à raisonnement consomment des jetons de réflexion\n", "*avant* la réponse, et un budget trop petit tronque la description.\n" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "cd016", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:02.424014Z", - "iopub.status.busy": "2026-08-31T16:26:02.423811Z", - "iopub.status.idle": "2026-08-31T16:26:04.543271Z", - "shell.execute_reply": "2026-08-31T16:26:04.542881Z" + "iopub.execute_input": "2026-09-18T00:07:10.907714Z", + "iopub.status.busy": "2026-09-18T00:07:10.907260Z", + "iopub.status.idle": "2026-09-18T00:07:14.103331Z", + "shell.execute_reply": "2026-09-18T00:07:14.102237Z" }, "papermill": { - "duration": 2.124312, - "end_time": "2026-08-31T16:26:04.544180", + "duration": 3.205116, + "end_time": "2026-09-18T00:07:14.104315+00:00", "exception": false, - "start_time": "2026-08-31T16:26:02.419868", + "start_time": "2026-09-18T00:07:10.899199+00:00", "status": "completed" }, "tags": [] @@ -1044,10 +1160,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "Fournisseur : vllm-local\n", - "Usage : {\"prompt_tokens\": 158, \"total_tokens\": 316, \"completion_tokens\": 158, \"prompt_tokens_details\": null}\n", + "Fournisseur : openrouter\n", + "Usage : {\"prompt_tokens\": 1087, \"completion_tokens\": 544, \"total_tokens\": 1631, \"cost\": 0, \"is_byok\": true, \"prompt_tokens_details\": {\"cached_tokens\": 0, \"cache_write_tokens\": 0, \"audio_tokens\": 0, \"video_tokens\": 0}, \"cost_details\": {\"upstream_inference_cost\": 0.0057105, \"upstream_inference_prompt_cost\": 0.0016305, \"upstream_inference_completions_cost\": 0.00408}, \"completion_tokens_details\": {\"reasoning_tokens\": 384, \"image_tokens\": 0, \"audio_tokens\": 0}}\n", "Description generee :\n", - "Ce schéma technique décrit un système de détection hybride basé sur l’algorithme **BM25 dense fusion RRF**, combinant des approches lexicales et vectorielles pour améliorer la pertinence des résultats. Il intègre un **capteur impair** conçu pour identifier les **faux négatifs** dans le processus de détection, permettant ainsi une correction ou un ajustement dynamique des erreurs de classification. Le terme **detection** est utilisé comme fonction globale du système, soulignant son rôle central dans l’identification d’éléments pertinents ou anormaux. L’ensemble repose sur une architecture modulaire où chaque composant — BM25, RRF, capteur impair — contribue à affiner la précision globale du modèle.\n" + "Cette image présente deux lignes de texte énumérant des concepts techniques relatifs à la recherche d'information et à l'analyse de signaux. La première ligne mentionne « **Qdrant hybride : BM25 dense fusion RRF** », faisant référence à un système de recherche vectorielle combinant l'algorithme lexical BM25, des représentations denses et une méthode de fusion par reclassement (RRF). La seconde ligne indique « **capteur impairfaux faux negatifs detection** », se rapportant à l'évaluation et à la détection d'anomalies ou d'erreurs de mesure issues de capteurs. L'ensemble associe ainsi des problématiques d'indexation hybride de données à des enjeux de fiabilité de détection.\n" ] } ], @@ -1120,10 +1236,10 @@ "id": "md017", "metadata": { "papermill": { - "duration": 0.004469, - "end_time": "2026-08-31T16:26:04.552250", + "duration": 0.005954, + "end_time": "2026-09-18T00:07:14.116246+00:00", "exception": false, - "start_time": "2026-08-31T16:26:04.547781", + "start_time": "2026-09-18T00:07:14.110292+00:00", "status": "completed" }, "tags": [] @@ -1138,9 +1254,9 @@ "les pixels de l'image. C'est exactement ce que le pont exige — la description est un\n", "**témoin fidèle**, pas une paraphrase approximative.\n", "\n", - "Ligne `usage` : ~1100 jetons de prompt (l'image + la consigne) et ~660 de complétion\n", - "dont **~540 jetons de raisonnement** — le modèle « pense » avant d'écrire, et ces jetons\n", - "comptent dans le budget. C'est la raison du `max_tokens = 1200` : avec 200, la\n", + "Ligne `usage` : ~1090 jetons de prompt (l'image + la consigne) et ~540 de complétion\n", + "dont **~380 jetons de raisonnement** — le modèle « pense » avant d'écrire, et ces jetons\n", + "comptent dans le budget. C'est la raison du `max_tokens = 1500` : avec 200, la\n", "réponse serait tronquée avant le premier mot utile. Le `temperature = 0` n'est pas\n", "cosmétique : la mesure de la section 5 dépend du contenu de cette description, sa\n", "stabilité d'une exécution à l'autre est un prérequis expérimental.\n" @@ -1148,20 +1264,20 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "cd018", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:04.560479Z", - "iopub.status.busy": "2026-08-31T16:26:04.560237Z", - "iopub.status.idle": "2026-08-31T16:26:08.600328Z", - "shell.execute_reply": "2026-08-31T16:26:08.599776Z" + "iopub.execute_input": "2026-09-18T00:07:14.129271Z", + "iopub.status.busy": "2026-09-18T00:07:14.128826Z", + "iopub.status.idle": "2026-09-18T00:07:18.177952Z", + "shell.execute_reply": "2026-09-18T00:07:18.176871Z" }, "papermill": { - "duration": 4.045059, - "end_time": "2026-08-31T16:26:08.601047", + "duration": 4.05735, + "end_time": "2026-09-18T00:07:18.179125+00:00", "exception": false, - "start_time": "2026-08-31T16:26:04.555988", + "start_time": "2026-09-18T00:07:14.121775+00:00", "status": "completed" }, "tags": [] @@ -1189,9 +1305,10 @@ "bridge_done = False\n", "if INFRA_OK and DESCRIPTION:\n", " bridge_path = corpus_dir / (BRIDGE_ID + \".txt\")\n", + " vision_used = VISION_MODEL if VISION_PROVIDER == \"vllm-local\" else VISION_FALLBACK_MODEL\n", " bridge_path.write_text(\n", " \"Schema technique 'schema-capteur.png' (description generee par le modele de vision \"\n", - " f\"{VISION_MODEL}, pont vision du notebook 09) :\\n\\n{DESCRIPTION}\\n\",\n", + " f\"{vision_used} via {VISION_PROVIDER}, pont vision du notebook 09) :\\n\\n{DESCRIPTION}\\n\",\n", " encoding=\"utf-8\")\n", " with open(bridge_path, \"rb\") as fh:\n", " r = requests.post(f\"{KM_URL}/upload\",\n", @@ -1219,10 +1336,10 @@ "id": "md019", "metadata": { "papermill": { - "duration": 0.003457, - "end_time": "2026-08-31T16:26:08.608115", + "duration": 0.006061, + "end_time": "2026-09-18T00:07:18.191441+00:00", "exception": false, - "start_time": "2026-08-31T16:26:08.604658", + "start_time": "2026-09-18T00:07:18.185380+00:00", "status": "completed" }, "tags": [] @@ -1251,20 +1368,20 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "cd020", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:08.615754Z", - "iopub.status.busy": "2026-08-31T16:26:08.615436Z", - "iopub.status.idle": "2026-08-31T16:26:09.947423Z", - "shell.execute_reply": "2026-08-31T16:26:09.946268Z" + "iopub.execute_input": "2026-09-18T00:07:18.205071Z", + "iopub.status.busy": "2026-09-18T00:07:18.204627Z", + "iopub.status.idle": "2026-09-18T00:07:19.313405Z", + "shell.execute_reply": "2026-09-18T00:07:19.312334Z" }, "papermill": { - "duration": 1.337074, - "end_time": "2026-08-31T16:26:09.948557", + "duration": 1.117269, + "end_time": "2026-09-18T00:07:19.314548+00:00", "exception": false, - "start_time": "2026-08-31T16:26:08.611483", + "start_time": "2026-09-18T00:07:18.197279+00:00", "status": "completed" }, "tags": [] @@ -1278,20 +1395,10 @@ "q1 pdf-cours pont-vision-schema conforme\n", "q2 s4-distracteur pont-vision-schema conforme\n", "q3 s1-partition s1-partition conforme\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "q1 \"capteur impairfaux\"\n", - " [1] pont-vision-schema score=0.499 \"Schema technique 'schema-capteur.png' (description generee par le modele de vision qwen3.6-35b-a3b, \"\n", + " [1] pont-vision-schema score=0.474 \"Schema technique 'schema-capteur.png' (description generee par le modele de vision google/gemini-3.7\"\n", " [2] pdf-cours score=0.356 \"isation de la mesure de performance  A partir de la suite de percepts et de l’état de connaissance\"\n", - "\n", - "q2 \"comment limiter les faux negatifs de detection\"\n", - " [1] pont-vision-schema score=0.463 \"Schema technique 'schema-capteur.png' (description generee par le modele de vision qwen3.6-35b-a3b, \"\n", - " [2] s4-distracteur score=0.323 \"L'interface de recherche accepte des requetes en langue naturelle et affiche les citations avec leur\"\n", "\n" ] }, @@ -1299,6 +1406,10 @@ "name": "stdout", "output_type": "stream", "text": [ + "q2 \"comment limiter les faux negatifs de detection\"\n", + " [1] pont-vision-schema score=0.433 \"Schema technique 'schema-capteur.png' (description generee par le modele de vision google/gemini-3.7\"\n", + " [2] s4-distracteur score=0.323 \"L'interface de recherche accepte des requetes en langue naturelle et affiche les citations avec leur\"\n", + "\n", "q3 \"fenetre glissante recouvrement\"\n", " [1] s1-partition score=0.568 \"La partition en fenetre glissante conserve un recouvrement entre morceaux consecutifs : une phrase c\"\n", " [2] s3-pont-vision score=0.310 \"Un modele de vision peut produire une description textuelle d'une image. Ingeree comme document ordi\"\n", @@ -1345,10 +1456,10 @@ "id": "md021", "metadata": { "papermill": { - "duration": 0.006225, - "end_time": "2026-08-31T16:26:09.961778", + "duration": 0.005734, + "end_time": "2026-09-18T00:07:19.326485+00:00", "exception": false, - "start_time": "2026-08-31T16:26:09.955553", + "start_time": "2026-09-18T00:07:19.320751+00:00", "status": "completed" }, "tags": [] @@ -1383,10 +1494,10 @@ "id": "md022", "metadata": { "papermill": { - "duration": 0.008005, - "end_time": "2026-08-31T16:26:09.975076", + "duration": 0.006009, + "end_time": "2026-09-18T00:07:19.338327+00:00", "exception": false, - "start_time": "2026-08-31T16:26:09.967071", + "start_time": "2026-09-18T00:07:19.332318+00:00", "status": "completed" }, "tags": [] @@ -1419,10 +1530,10 @@ "id": "md023", "metadata": { "papermill": { - "duration": 0.006163, - "end_time": "2026-08-31T16:26:09.987211", + "duration": 0.006372, + "end_time": "2026-09-18T00:07:19.350729+00:00", "exception": false, - "start_time": "2026-08-31T16:26:09.981048", + "start_time": "2026-09-18T00:07:19.344357+00:00", "status": "completed" }, "tags": [] @@ -1440,20 +1551,20 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "cd024", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:10.002902Z", - "iopub.status.busy": "2026-08-31T16:26:10.002568Z", - "iopub.status.idle": "2026-08-31T16:26:10.007220Z", - "shell.execute_reply": "2026-08-31T16:26:10.006330Z" + "iopub.execute_input": "2026-09-18T00:07:19.365926Z", + "iopub.status.busy": "2026-09-18T00:07:19.365671Z", + "iopub.status.idle": "2026-09-18T00:07:19.371711Z", + "shell.execute_reply": "2026-09-18T00:07:19.370403Z" }, "papermill": { - "duration": 0.014952, - "end_time": "2026-08-31T16:26:10.009172", + "duration": 0.014377, + "end_time": "2026-09-18T00:07:19.372765+00:00", "exception": false, - "start_time": "2026-08-31T16:26:09.994220", + "start_time": "2026-09-18T00:07:19.358388+00:00", "status": "completed" }, "tags": [] @@ -1477,10 +1588,10 @@ "id": "md025", "metadata": { "papermill": { - "duration": 0.005577, - "end_time": "2026-08-31T16:26:10.019429", + "duration": 0.006427, + "end_time": "2026-09-18T00:07:19.384978+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.013852", + "start_time": "2026-09-18T00:07:19.378551+00:00", "status": "completed" }, "tags": [] @@ -1499,20 +1610,20 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "cd026", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:10.033586Z", - "iopub.status.busy": "2026-08-31T16:26:10.033150Z", - "iopub.status.idle": "2026-08-31T16:26:10.038253Z", - "shell.execute_reply": "2026-08-31T16:26:10.037409Z" + "iopub.execute_input": "2026-09-18T00:07:19.398813Z", + "iopub.status.busy": "2026-09-18T00:07:19.398528Z", + "iopub.status.idle": "2026-09-18T00:07:19.403971Z", + "shell.execute_reply": "2026-09-18T00:07:19.402791Z" }, "papermill": { - "duration": 0.014931, - "end_time": "2026-08-31T16:26:10.039839", + "duration": 0.01362, + "end_time": "2026-09-18T00:07:19.404926+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.024908", + "start_time": "2026-09-18T00:07:19.391306+00:00", "status": "completed" }, "tags": [] @@ -1536,10 +1647,10 @@ "id": "md027", "metadata": { "papermill": { - "duration": 0.007453, - "end_time": "2026-08-31T16:26:10.053364", + "duration": 0.006077, + "end_time": "2026-09-18T00:07:19.417509+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.045911", + "start_time": "2026-09-18T00:07:19.411432+00:00", "status": "completed" }, "tags": [] @@ -1557,20 +1668,20 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "cd028", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:10.070212Z", - "iopub.status.busy": "2026-08-31T16:26:10.069578Z", - "iopub.status.idle": "2026-08-31T16:26:10.074795Z", - "shell.execute_reply": "2026-08-31T16:26:10.073747Z" + "iopub.execute_input": "2026-09-18T00:07:19.431241Z", + "iopub.status.busy": "2026-09-18T00:07:19.430816Z", + "iopub.status.idle": "2026-09-18T00:07:19.436053Z", + "shell.execute_reply": "2026-09-18T00:07:19.434949Z" }, "papermill": { - "duration": 0.015885, - "end_time": "2026-08-31T16:26:10.076395", + "duration": 0.013428, + "end_time": "2026-09-18T00:07:19.436991+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.060510", + "start_time": "2026-09-18T00:07:19.423563+00:00", "status": "completed" }, "tags": [] @@ -1594,10 +1705,10 @@ "id": "md029", "metadata": { "papermill": { - "duration": 0.00776, - "end_time": "2026-08-31T16:26:10.093187", + "duration": 0.006361, + "end_time": "2026-09-18T00:07:19.449479+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.085427", + "start_time": "2026-09-18T00:07:19.443118+00:00", "status": "completed" }, "tags": [] @@ -1613,20 +1724,20 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "cd030", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:10.107584Z", - "iopub.status.busy": "2026-08-31T16:26:10.107110Z", - "iopub.status.idle": "2026-08-31T16:26:10.976534Z", - "shell.execute_reply": "2026-08-31T16:26:10.975577Z" + "iopub.execute_input": "2026-09-18T00:07:19.463572Z", + "iopub.status.busy": "2026-09-18T00:07:19.463184Z", + "iopub.status.idle": "2026-09-18T00:07:20.371075Z", + "shell.execute_reply": "2026-09-18T00:07:20.369773Z" }, "papermill": { - "duration": 0.878941, - "end_time": "2026-08-31T16:26:10.978179", + "duration": 0.916941, + "end_time": "2026-09-18T00:07:20.372236+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.099238", + "start_time": "2026-09-18T00:07:19.455295+00:00", "status": "completed" }, "tags": [] @@ -1644,7 +1755,7 @@ "output_type": "stream", "text": [ "Conteneurs et volumes retires\n", - "Corpus provisoire km09_corpus_38z37am3/ efface\n" + "Corpus provisoire km09_corpus_jmcjkgov/ efface\n" ] } ], @@ -1668,10 +1779,10 @@ "id": "md031", "metadata": { "papermill": { - "duration": 0.005177, - "end_time": "2026-08-31T16:26:10.988807", + "duration": 0.00651, + "end_time": "2026-09-18T00:07:20.385548+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.983630", + "start_time": "2026-09-18T00:07:20.379038+00:00", "status": "completed" }, "tags": [] @@ -1695,8 +1806,8 @@ "2. **Le pont vision est un motif d'architecture, pas un contournement** : le modèle de\n", " vision lit l'image (verbatim, faute d'orthographe comprise), sa description entre\n", " dans le pipeline standard, et la recherche fonctionne dessus comme sur tout texte.\n", - "3. **Le prix est borné et visible** : un appel vision par image (~1 750 jetons ici,\n", - " dont ~540 de raisonnement), une compression avec perte (ce que la description ne\n", + "3. **Le prix est borné et visible** : un appel vision par image (~1 630 jetons ici,\n", + " dont ~380 de raisonnement), une compression avec perte (ce que la description ne\n", " mentionne pas est perdu pour la recherche — la topologie fine du schéma n'y est pas\n", " sauf à la demander explicitement dans le prompt), et une latence d'ingestion du\n", " même ordre. Pour un corpus mixte modéré, c'est le bon rapport coût/effet ; à\n", @@ -1710,20 +1821,20 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "cd032", "metadata": { "execution": { - "iopub.execute_input": "2026-08-31T16:26:11.001095Z", - "iopub.status.busy": "2026-08-31T16:26:11.000763Z", - "iopub.status.idle": "2026-08-31T16:26:11.007024Z", - "shell.execute_reply": "2026-08-31T16:26:11.006017Z" + "iopub.execute_input": "2026-09-18T00:07:20.399928Z", + "iopub.status.busy": "2026-09-18T00:07:20.399478Z", + "iopub.status.idle": "2026-09-18T00:07:20.406804Z", + "shell.execute_reply": "2026-09-18T00:07:20.405526Z" }, "papermill": { - "duration": 0.014, - "end_time": "2026-08-31T16:26:11.008316", + "duration": 0.015997, + "end_time": "2026-09-18T00:07:20.407855+00:00", "exception": false, - "start_time": "2026-08-31T16:26:10.994316", + "start_time": "2026-09-18T00:07:20.391858+00:00", "status": "completed" }, "tags": [] @@ -1774,19 +1885,19 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.3" + "version": "3.13.14" }, "papermill": { "default_parameters": {}, - "duration": 172.044319, - "end_time": "2026-08-31T16:26:11.356340", + "duration": 190.739315, + "end_time": "2026-09-18T00:07:20.756794+00:00", "environment_variables": {}, "exception": null, - "input_path": "MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/09-KernelMemory-Multimodal.ipynb", - "output_path": "09-KernelMemory-Multimodal.ipynb", + "input_path": "09-KernelMemory-Multimodal.ipynb", + "output_path": "09_output.ipynb", "parameters": {}, - "start_time": "2026-08-31T16:23:19.312021", - "version": "2.6.0" + "start_time": "2026-09-18T00:04:10.017479+00:00", + "version": "2.7.0" } }, "nbformat": 4,