From 4f99763b3e9835fb9911b252503a973cf598cf16 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Guillaume?=
 <62661249+leoguillaume@users.noreply.github.com>
Date: Mon, 9 Dec 2024 13:54:48 +0100
Subject: [PATCH] feat: update rag notebook (#105)

Co-authored-by: leoguillaume <leo.guillaume@modernisation.gouv.fr>
---
 .../retrieval_augmented_generation.ipynb      | 138 ++++++++++++++++--
 1 file changed, 123 insertions(+), 15 deletions(-)

diff --git a/docs/tutorials/retrieval_augmented_generation.ipynb b/docs/tutorials/retrieval_augmented_generation.ipynb
index 333cda4..b831189 100644
--- a/docs/tutorials/retrieval_augmented_generation.ipynb
+++ b/docs/tutorials/retrieval_augmented_generation.ipynb
@@ -81,7 +81,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 17,
    "id": "e80daa99-3416-4b81-a8aa-4fb7427bbe6c",
    "metadata": {
     "colab": {
@@ -114,7 +114,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 10,
    "id": "Q_5YNzmR_JcK",
    "metadata": {
     "colab": {
@@ -147,7 +147,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 14,
    "id": "a0f0adf2",
    "metadata": {},
    "outputs": [
@@ -155,7 +155,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Collection ID: 6c6dd988-bd3d-4449-bfdd-106cda5d22ad\n"
+      "Collection ID: 39a36180-aab5-4a5a-8e07-4da01a8b8193\n"
      ]
     }
    ],
@@ -180,7 +180,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 18,
    "id": "6852fc7a-0b09-451b-bbc2-939fa96a4d28",
    "metadata": {
     "colab": {
@@ -189,15 +189,7 @@
     "id": "6852fc7a-0b09-451b-bbc2-939fa96a4d28",
     "outputId": "8555033d-d20f-4b0b-8bfa-7fa5c83a299b"
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "<Response [201]>\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "files = {\"file\": (os.path.basename(file_path), open(file_path, \"rb\"), \"application/pdf\")}\n",
     "data = {\"request\": '{\"collection\": \"%s\"}' % collection_id}\n",
@@ -267,6 +259,16 @@
     "La méthode lexicale est la plus simple. Elle ne fait pas de recherche vectorielle mais se base uniquement sur la similarité lexicale entre la question et le contenu des documents à l'aide de l'algorithme [BM25](https://en.wikipedia.org/wiki/Okapi_BM25).\n"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "2668210f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "prompt = \"Qui est Ulrich Tan ?\""
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 14,
@@ -282,7 +284,6 @@
     }
    ],
    "source": [
-    "prompt = \"Qui est Ulrich Tan ?\"\n",
     "data = {\"collections\": [collection_id], \"k\": 6, \"prompt\": prompt, \"method\": \"lexical\"}\n",
     "response = session.post(url=f\"{base_url}/search\", json=data, headers={\"Authorization\": f\"Bearer {api_key}\"})\n",
     "\n",
@@ -460,6 +461,113 @@
     "for source in sources:\n",
     "    print(source)"
    ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2f00610e",
+   "metadata": {},
+   "source": [
+    "## Recherche par `/chat/completions`\n",
+    "\n",
+    "Il est possible de faire une recherche RAG avec l'endpoint `/chat/completions`. Pour ce faire, il faut spécifier le paramètre `search=True` et `search_args` avec les arguments de la recherche que vous souhaitez faire (idem que pour l'endpoint `/search`)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "id": "e2e1368a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "- Réponse du model: Selon les documents, Ulrich Tan est le chef du pôle Datamin du département \"Eatalab\".\n",
+      "\n",
+      "- Sources utilisées pour la génération:\n",
+      "\n",
+      "–  M. Gilles Corbi, agent contractuel, chef du pôle Production du département « ISO » ; \n",
+      "–  M. Yann Brûlé, grade, chef du pôle « SI RIE » du département « ISO » ; \n",
+      "–  M. Ulrich Tan, chef du pôle Datamin du département « Etalab » ; \n",
+      "–  Mme Marie-Christie Ritz, cheffe du pôle « RH et attractivité » ; \n",
+      "–  Mme Fadila Leturcq, cheffe du pôle « Campus du numérique ». \n",
+      "\n",
+      "\f21  juin 2023 \n",
+      "\n",
+      "JOURNAL  OFFICIEL  DE  LA  RÉPUBLIQUE  FRANÇAISE \n",
+      "\n",
+      "Texte 5 sur 95\n",
+      "–  Mme Elsa Le Duigou, agent contractuel ; \n",
+      "–  M. Valentin Brel, agent contractuel ; \n",
+      "–  Mme Margot Sanchez, agent contractuel ; \n",
+      "–  M. Paul Burgun, agent contractuel ; \n",
+      "–  Mme Emma Ghariani, agent contractuel. \n",
+      "Art.  5.  –  Délégation est donnée à Mme Géraldine Taurand, attachée d’administration hors classe, cheffe de la \n",
+      "mission « Budget et achats », pour signer tous actes de gestion et procéder aux validations électronique dans l’outil\n",
+      "–  M. Perica Sucevic, agent contractuel, préfigurateur de la mission « Droit et international » ; \n",
+      "–  Mme Floriane Beaudron, agente contractuelle, cheffe de la mission « Communication ». \n",
+      "Art.  3.  –  Délégation est donnée à l’effet de signer au nom du ministre de la transformation et de la fonction \n",
+      "publiques ainsi qu’au nom de la Première ministre, tous actes relevant des attributions de leurs pôles, et notamment\n",
+      "–  M. Ishan Bhojwani, agent contractuel, chef du département « Incubateur de services numériques » (ISN) ; \n",
+      "–  Mme Marielle Chrisment, lieutenante-colonelle de gendarmerie, cheffe du département « Etalab » ; \n",
+      "–  M.  Guy Duplaquet,  ingénieur général  des mines,  chef du  département « Infrastructures et services  opérés » \n",
+      "\n",
+      "(ISO) ; \n",
+      "\n",
+      "–  M.  Florian  Delezenne,  agent  contractuel,  chef  du  département  « Opérateur  de  produits  interministériels » \n",
+      "\n",
+      "(OPI).\n",
+      "–  M.  Louis  di  Benedetto,  inspecteur  en  chef  de  la  santé  publique  vétérinaire,  chef  du  pôle  « Pilotage  de  la \n",
+      "\n",
+      "qualité et des partenariats » du département « ISO » ; \n",
+      "\n",
+      "–  M.  Philippe  Levillain,  agent  contractuel,  chef  du  pôle  « Réseau  interministériel  de  l’Etat  /  SOI »  du \n",
+      "\n",
+      "département « ISO » ;\n",
+      "–  Mme Virginie Rozière, ingénieure en chef de l’armement, cheffe du pole « Expertise, contrôle et maitrise des \n",
+      "\n",
+      "risques » du département « ACE » ; \n",
+      "\n",
+      "–  Mme Marine Boudeau, agente contractuelle, préfiguratrice du pôle « Brigade d’intervention numérique », du \n",
+      "\n",
+      "département « ACE » ; \n",
+      "\n",
+      "–  M. Mohsen Souissi, agent contractuel, préfigurateur du pôle « Référentiels, capitalisation et observatoires » du \n",
+      "\n",
+      "département « ACE » ;\n"
+     ]
+    }
+   ],
+   "source": [
+    "response = session.post(\n",
+    "    url=f\"{base_url}/chat/completions\",\n",
+    "    json={\n",
+    "        \"messages\": [{\"role\": \"user\", \"content\": prompt}],\n",
+    "        \"model\": language_model,\n",
+    "        \"stream\": False,\n",
+    "        \"n\": 1,\n",
+    "        \"search\": True,\n",
+    "        \"search_args\": {\"collections\": [collection_id], \"k\": 6, \"method\": \"semantic\"}\n",
+    "    }\n",
+    ")\n",
+    "response = response.json()\n",
+    "\n",
+    "sources = [result[\"chunk\"][\"content\"] for result in response['search_results']]\n",
+    "\n",
+    "print(f\"\"\"- Réponse du model: {response['choices'][0]['message']['content']}\n",
+    "\n",
+    "- Sources utilisées pour la génération:\n",
+    "\n",
+    "{'\\n'.join(sources)}\"\"\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "545a2396",
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {