Commit d46f3e20 authored by Delvallez Delvallez's avatar Delvallez Delvallez

élements complémentaires et traces de raisonnement

parent 69859c8a
# Main V1
Dataset issu des données du Challenge RAG de EvalLLM2026.
## Construction
- Extraction du texte des pdf à l'aide de `pymupdf4llm`
- Découpe avec `MarkdownTextSplitter` de `langchain_text_splitter` (chunk_size=500, chunk_overlap=150)
- Documents extraits automatiquement à l'aide E5 et ChromaDB
- Selection des questions et documents à la main à partir des extraction automatiques
## Format
3 fichiers:
- paires_mainV1.csv
- docs_mainV1.csv
- queries_mainV1.csv
### paires_mainV1.csv
- q_id (int) : identifiant de question
- question (str) : texte de la question
- doc_id (int) : identifiant de ducument
- doc_name (str) : nom du fichier pdf d'origine
- page_number (int) : numéro (absolu) de la page d'origine
- chunk_id (int) : identifiant de l'extrait
- text (str) : texte de l'extrait
- pertinent (bool) : pertinent du document pour la question
Infos:
- 52 entrées
- Autant de documents pertinents que non pertinents
- 1 document pertinent/ non-pertinent par question
- 52 extraits
- 26 questions
### docs_mainV1.csv
- doc_id (int) : identifiant de ducument
- doc_name (str) : nom du fichier pdf d'origine
- page_number (int) : numéro (absolu) de la page d'origine
- chunk_id (int) : identifiant de l'extrait
- text (str) : texte de l'extrait
### queries_mainV1.csv
- q_id (int) : identifiant de question
- question (str) : texte de la question
# Main V2
Dataset issu des données du Challenge RAG de EvalLLM2026.
## Construction
- Extraction du texte des pdf à l'aide de `pymupdf4llm`
- Découpe avec `MarkdownTextSplitter` de `langchain_text_splitter` (chunk_size=500, chunk_overlap=150)
- Documents extraits automatiquement à l'aide E5 et ChromaDB
- Selection des questions et documents à la main à partir des extraction automatiques
## Format
3 fichiers:
- paires_mainV2.csv
- docs_mainV2.csv
- queries_mainV2.csv
### paires_mainV2.csv
- q_id (int) : identifiant de question
- question (str) : texte de la question
- doc_id (int) : identifiant de document
- doc_name (str) : nom du fichier pdf d'origine
- page_number (int) : numéro (absolu) de la page d'origine
- chunk_id (int) : identifiant de l'extrait
- text (str) : texte de l'extrait
- pertinent (bool) : pertinent du document pour la question
Infos:
- 27 entrées
- Autant de documents pertinents que non pertinents
- Textes issus de 3 pdfs
- 28 extraits
- 1 question
### docs_mainV2.csv
- doc_id (int) : identifiant de ducument
- doc_name (str) : nom du fichier pdf d'origine
- page_number (int) : numéro (absolu) de la page d'origine
- chunk_id (int) : identifiant de l'extrait
- text (str) : texte de l'extrait
### queries_mainV2.csv
- q_id (int) : identifiant de question
- question (str) : texte de la question
## Contenu/ Stats
Construction des données:
- 1 question, 3 pdf (limitations matérielles du drone, code de la défense - matériel de guerre, fausses infos pdt les JO/JP)
- 50% de textes pertinents
- 28 paires
Question :
> Quelles sont les trois principales catégories de limitations techniques affectant les systèmes de drones, et comment chacune influence-t-elle l'efficacité opérationnelle de ces vecteurs ?
|word | freq | TF-IDF |
|----------|---|------------------|
|**matériel** |16 |0.0627430130086598|
|**système** |11 |0.0542242908052481|
|**limitation**|6 |0.0495565089630139|
|**drone** |10 |0.0441649020535004|
|défense |10 |0.0440955901918619|
|prendre |6 |0.0425658179515979|
|compte |5 |0.0404563824330286|
|action |8 |0.0401684995180441|
|article |9 |0.0400092952253956|
|ministre |8 |0.03913497111578 |
|aérien |7 |0.0366033210120314|
|acteur |6 |0.0337084867312698|
|guerre |8 |0.0336043799517422|
# Main V3
Dataset issu des données du Challenge RAG de EvalLLM2026.
## Construction
- Extraction du texte des pdf à l'aide de `pymupdf4llm`
- Découpe avec `MarkdownTextSplitter` de `langchain_text_splitter` (chunk_size=500, chunk_overlap=150)
- Documents extraits automatiquement à l'aide E5 et ChromaDB
- Selection des questions et documents à la main à partir des extraction automatiques
## Format
3 fichiers:
- paires_mainV3.csv
- docs_mainV3.csv
- queries_mainV3.csv
### paires_mainV3.csv
- q_id (int) : identifiant de question
- question (str) : texte de la question
- doc_id (int) : identifiant de ducument
- doc_name (str) : nom du fichier pdf d'origine
- page_number (int) : numéro (absolu) de la page d'origine
- chunk_id (int) : identifiant de l'extrait
- text (str) : texte de l'extrait
- pertinent (bool) : pertinent du document pour la question
Infos:
- 20 entrées
- Autant de documents pertinents que non pertinents
- Textes issus de 3 pdfs
- 20 extraits
- 1 question
### docs_mainV3.csv
- doc_id (int) : identifiant de ducument
- doc_name (str) : nom du fichier pdf d'origine
- page_number (int) : numéro (absolu) de la page d'origine
- chunk_id (int) : identifiant de l'extrait
- text (str) : texte de l'extrait
### queries_mainV3.csv
- q_id (int) : identifiant de question
- question (str) : texte de la question
## Analyse
### Question
1 question :
> Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?
### Thématique
Sujet pas spécifique à la défense mais appliqué à la défense : Intelligence Artificielle appliquée aux outils et pratiques de la défense et notamment à la guerre.
Thèmatique des 3 pdf:
- IA pour la défense : enjeux
- Aviation civile
- usage des ballons (aérostats et dirigeables) dans l'histoire et rebond de l'usage
### Statistique
| Mot | Fréquence| TF-IDF |
|------------|---|--------------------|
|système |13 |0.06480086088326986 |
|transport |9 |0.05957370634266266 |
|militaire |9 |0.0488148141908528 |
|force |8 |0.048789708865220195|
|aérien |8 |0.05223144426877953 |
|automatiser |7 |0.04028923862758367 |
|artificiel |6 |0.04046189336007796 |
|intelligence|6 |0.04046189336007796 |
|emploi |6 |0.03775763430881781 |
|domaine |6 |0.03862181838643274 |
_Système_ est essentielement issu de l'expression _système autonome_ dans les documents positofs (issus du numéro sur l'emploi des Ia et systèmes automatisés du Centre interarmées de concepts, de doctrines et d’expérimentations). La seule exception est pour _système High Altitude pseudo-satellite (HAPS)_ issu du document sur les ballons.
L'entièreté des occurences de _transport_ sont issues du document sur l'aviation civile.
Les occurences de _militaire_ sont issues des documents sur les sytèmes autonomes et les ballons.
\ No newline at end of file
#!/usr/bin/env python
# coding: utf-8
# # Construction à la main d'un petit dataset maitrisé issu de challenge
import pandas as pd
docsV2 = pd.read_csv("../docsV2.csv")
# ## Creation DB
db = pd.DataFrame(columns=["q_id", "question", "doc_id", "doc_name", "page_number", "chunk_id", "text", "pertinent"])
db = pd.concat([db,
pd.DataFrame({
"q_id" : [0],
"question" : ["Quelles sont les trois catégories principales d’espaces couverts par la notion d'« installations militaires » selon le cadre juridique en vigueur?"],
"doc_id" : [docsV2.iloc[49181].doc_id],
"doc_name" : [docsV2.iloc[49181].doc_name],
"page_number" :[docsV2.iloc[49181].page_number],
"chunk_id" : [docsV2.iloc[49181].chunk_number],
"text" : [docsV2.iloc[49181].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [0],
"question" : ["Quelles sont les trois catégories principales d’espaces couverts par la notion d'« installations militaires » selon le cadre juridique en vigueur?"],
"doc_id" : [docsV2.iloc[28106].doc_id],
"doc_name" : [docsV2.iloc[28106].doc_name],
"page_number" :[docsV2.iloc[28106].page_number],
"chunk_id" : [docsV2.iloc[28106].chunk_number],
"text" : [docsV2.iloc[28106].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [1],
"question" : ["Qu'encourt une personne qui exporte des explosifs sans autorisation?"],
"doc_id" : [docsV2.iloc[34421].doc_id],
"doc_name" : [docsV2.iloc[34421].doc_name],
"page_number" :[docsV2.iloc[34421].page_number],
"chunk_id" : [docsV2.iloc[34421].chunk_number],
"text" : [docsV2.iloc[34421].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [1],
"question" : ["Qu'encourt une personne qui exporte des explosifs sans autorisation?"],
"doc_id" : [docsV2.iloc[70843].doc_id],
"doc_name" : [docsV2.iloc[70843].doc_name],
"page_number" :[docsV2.iloc[70843].page_number],
"chunk_id" : [docsV2.iloc[70843].chunk_number],
"text" : [docsV2.iloc[70843].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [2],
"question" : ["Quelles sont les caractéristiques de l'UAV SAENA?"],
"doc_id" : [docsV2.iloc[76254].doc_id],
"doc_name" : [docsV2.iloc[76254].doc_name],
"page_number" :[docsV2.iloc[76254].page_number],
"chunk_id" : [docsV2.iloc[76254].chunk_number],
"text" : [docsV2.iloc[76254].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [2],
"question" : ["Quelles sont les caractéristiques de l'UAV SAENA?"],
"doc_id" : [docsV2.iloc[76549].doc_id],
"doc_name" : [docsV2.iloc[76549].doc_name],
"page_number" :[docsV2.iloc[76549].page_number],
"chunk_id" : [docsV2.iloc[76549].chunk_number],
"text" : [docsV2.iloc[76549].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [3],
"question" : ["Quels publics est-il important de former à l'IA et pourquoi?"],
"doc_id" : [docsV2.iloc[44635].doc_id],
"doc_name" : [docsV2.iloc[44635].doc_name],
"page_number" :[docsV2.iloc[44635].page_number],
"chunk_id" : [docsV2.iloc[44635].chunk_number],
"text" : [docsV2.iloc[44635].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [3],
"question" : ["Quels publics est-il important de former à l'IA et pourquoi?"],
"doc_id" : [docsV2.iloc[44649].doc_id],
"doc_name" : [docsV2.iloc[44649].doc_name],
"page_number" :[docsV2.iloc[44649].page_number],
"chunk_id" : [docsV2.iloc[44649].chunk_number],
"text" : [docsV2.iloc[44649].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [4],
"question" : ["Quels sont les deux type de drones MALE et HALE actuellement exploité par l'USAF, et quelles différences majeures (envergure, masse, propulsion, durée de mission et armement) permettent de distinguer le MQ-9 Reaper du RQ-4 Global Hawk ?"],
"doc_id" : [docsV2.iloc[45377].doc_id],
"doc_name" : [docsV2.iloc[45377].doc_name],
"page_number" :[docsV2.iloc[45377].page_number],
"chunk_id" : [docsV2.iloc[45377].chunk_number],
"text" : [docsV2.iloc[45377].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [4],
"question" : ["Quels sont les deux type de drones MALE et HALE actuellement exploité par l'USAF, et quelles différences majeures (envergure, masse, propulsion, durée de mission et armement) permettent de distinguer le MQ-9 Reaper du RQ-4 Global Hawk ?"],
"doc_id" : [docsV2.iloc[20274].doc_id],
"doc_name" : [docsV2.iloc[20274].doc_name],
"page_number" :[docsV2.iloc[20274].page_number],
"chunk_id" : [docsV2.iloc[20274].chunk_number],
"text" : [docsV2.iloc[20274].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [5],
"question" : ["Quelles sont les deux prérogatives spécifiques que possède la Commission nationale consultative des droits de l'homme dans ses relations avec les organisations internationales, et en quoi ces prérogatives diffèrent-elles de celles des États ou des ONG ?"],
"doc_id" : [docsV2.iloc[52757].doc_id],
"doc_name" : [docsV2.iloc[52757].doc_name],
"page_number" :[docsV2.iloc[52757].page_number],
"chunk_id" : [docsV2.iloc[52757].chunk_number],
"text" : [docsV2.iloc[52757].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [5],
"question" : ["Quelles sont les deux prérogatives spécifiques que possède la Commission nationale consultative des droits de l'homme dans ses relations avec les organisations internationales, et en quoi ces prérogatives diffèrent-elles de celles des États ou des ONG ?"],
"doc_id" : [docsV2.iloc[58398].doc_id],
"doc_name" : [docsV2.iloc[58398].doc_name],
"page_number" :[docsV2.iloc[58398].page_number],
"chunk_id" : [docsV2.iloc[58398].chunk_number],
"text" : [docsV2.iloc[58398].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [6],
"question" : ["Quelles sont les deux conditions cumulatif qu’un ordre donné à un militaire français doit respecter pour être considéré comme légal selon le code de la défense, et quelles en sont les conséquences pour le subordonné et pour le supérior en cas de non-respect de ces conditions ?"],
"doc_id" : [docsV2.iloc[39809].doc_id],
"doc_name" : [docsV2.iloc[39809].doc_name],
"page_number" :[docsV2.iloc[39809].page_number],
"chunk_id" : [docsV2.iloc[39809].chunk_number],
"text" : [docsV2.iloc[39809].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [6],
"question" : ["Quelles sont les deux conditions cumulatif qu’un ordre donné à un militaire français doit respecter pour être considéré comme légal selon le code de la défense, et quelles en sont les conséquences pour le subordonné et pour le supérior en cas de non-respect de ces conditions ?"],
"doc_id" : [docsV2.iloc[40252].doc_id],
"doc_name" : [docsV2.iloc[40252].doc_name],
"page_number" :[docsV2.iloc[40252].page_number],
"chunk_id" : [docsV2.iloc[40252].chunk_number],
"text" : [docsV2.iloc[40252].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [7],
"question" : ["Quelles sont les deux missions principales du musée national de la Marine en lien avec ses collections, et quel type d’établissement public représente-t-il sur le plan juridique et administratif ?"],
"doc_id" : [docsV2.iloc[39223].doc_id],
"doc_name" : [docsV2.iloc[39223].doc_name],
"page_number" :[docsV2.iloc[39223].page_number],
"chunk_id" : [docsV2.iloc[39223].chunk_number],
"text" : [docsV2.iloc[39223].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [7],
"question" : ["Quelles sont les deux missions principales du musée national de la Marine en lien avec ses collections, et quel type d’établissement public représente-t-il sur le plan juridique et administratif ?"],
"doc_id" : [docsV2.iloc[76691].doc_id],
"doc_name" : [docsV2.iloc[76691].doc_name],
"page_number" :[docsV2.iloc[76691].page_number],
"chunk_id" : [docsV2.iloc[76691].chunk_number],
"text" : [docsV2.iloc[76691].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [8],
"question" : ["Quelles sont les deux fonctions principales remplies par les drones dans le domaine du *support au combat*?"],
"doc_id" : [docsV2.iloc[45272].doc_id],
"doc_name" : [docsV2.iloc[45272].doc_name],
"page_number" :[docsV2.iloc[45272].page_number],
"chunk_id" : [docsV2.iloc[45272].chunk_number],
"text" : [docsV2.iloc[45272].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [8],
"question" : ["Quelles sont les deux fonctions principales remplies par les drones dans le domaine du *support au combat*?"],
"doc_id" : [docsV2.iloc[45548].doc_id],
"doc_name" : [docsV2.iloc[45548].doc_name],
"page_number" :[docsV2.iloc[45548].page_number],
"chunk_id" : [docsV2.iloc[45548].chunk_number],
"text" : [docsV2.iloc[45548].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [9],
"question" : ["Quelles sont les deux conditions précises qui permettent à un militaire de bénéficier *de droit* d’une prorogation de son congé pour création ou reprise d’entreprise, sans que l’avis de la commission compétente ne soit requis ?"],
"doc_id" : [docsV2.iloc[40854].doc_id],
"doc_name" : [docsV2.iloc[40854].doc_name],
"page_number" :[docsV2.iloc[40854].page_number],
"chunk_id" : [docsV2.iloc[40854].chunk_number],
"text" : [docsV2.iloc[40854].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [9],
"question" : ["Quelles sont les deux conditions précises qui permettent à un militaire de bénéficier *de droit* d’une prorogation de son congé pour création ou reprise d’entreprise, sans que l’avis de la commission compétente ne soit requis ?"],
"doc_id" : [docsV2.iloc[1183].doc_id],
"doc_name" : [docsV2.iloc[1183].doc_name],
"page_number" :[docsV2.iloc[1183].page_number],
"chunk_id" : [docsV2.iloc[1183].chunk_number],
"text" : [docsV2.iloc[1183].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [10],
"question" : ["Quelles sont les conditions pour obtenir un congé pour convenances personelles en tant que militaire?"],
"doc_id" : [docsV2.iloc[40993].doc_id],
"doc_name" : [docsV2.iloc[40993].doc_name],
"page_number" :[docsV2.iloc[40993].page_number],
"chunk_id" : [docsV2.iloc[40993].chunk_number],
"text" : [docsV2.iloc[40993].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [10],
"question" : ["Quelles sont les conditions pour obtenir un congé pour convenances personelles en tant que militaire?"],
"doc_id" : [docsV2.iloc[34792].doc_id],
"doc_name" : [docsV2.iloc[34792].doc_name],
"page_number" :[docsV2.iloc[34792].page_number],
"chunk_id" : [docsV2.iloc[34792].chunk_number],
"text" : [docsV2.iloc[34792].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [11],
"question" : ["Quelles sont les trois types de charges utiles que peuvent employer les essaims de vecteurs compacts pour neutraliser des cibles navales ou aéronavales, et en quoi l’une d’entre elles présente-t-elle un risque particulier dans un contexte portuaire ou de base militaire ?"],
"doc_id" : [docsV2.iloc[55603].doc_id],
"doc_name" : [docsV2.iloc[55603].doc_name],
"page_number" :[docsV2.iloc[55603].page_number],
"chunk_id" : [docsV2.iloc[55603].chunk_number],
"text" : [docsV2.iloc[55603].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [11],
"question" : ["Quelles sont les trois types de charges utiles que peuvent employer les essaims de vecteurs compacts pour neutraliser des cibles navales ou aéronavales, et en quoi l’une d’entre elles présente-t-elle un risque particulier dans un contexte portuaire ou de base militaire ?"],
"doc_id" : [docsV2.iloc[43524].doc_id],
"doc_name" : [docsV2.iloc[43524].doc_name],
"page_number" :[docsV2.iloc[43524].page_number],
"chunk_id" : [docsV2.iloc[43524].chunk_number],
"text" : [docsV2.iloc[43524].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [12],
"question" : ["Comment le drone tactique SDTI, conçu pour les opérations militaires conventionnelles (type Afghanistan), se compare-t-il aux mini-drones utilisés dans les guerres asymétriques (type Mossoul) en termes de contraintes logistiques et de souplesse d'emploi ?"],
"doc_id" : [docsV2.iloc[45297].doc_id],
"doc_name" : [docsV2.iloc[45297].doc_name],
"page_number" :[docsV2.iloc[45297].page_number],
"chunk_id" : [docsV2.iloc[45297].chunk_number],
"text" : [docsV2.iloc[45297].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [12],
"question" : ["Comment le drone tactique SDTI, conçu pour les opérations militaires conventionnelles (type Afghanistan), se compare-t-il aux mini-drones utilisés dans les guerres asymétriques (type Mossoul) en termes de contraintes logistiques et de souplesse d'emploi ?"],
"doc_id" : [docsV2.iloc[70689].doc_id],
"doc_name" : [docsV2.iloc[70689].doc_name],
"page_number" :[docsV2.iloc[70689].page_number],
"chunk_id" : [docsV2.iloc[70689].chunk_number],
"text" : [docsV2.iloc[70689].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [13],
"question" : ["Quels sont les deux objectifs principaux de l’exercice REPMUS 2024 au Portugal, et en quoi cet événement représente-t-il également une opportunité stratégique pour les industriels participants ?"],
"doc_id" : [docsV2.iloc[71317].doc_id],
"doc_name" : [docsV2.iloc[71317].doc_name],
"page_number" :[docsV2.iloc[71317].page_number],
"chunk_id" : [docsV2.iloc[71317].chunk_number],
"text" : [docsV2.iloc[71317].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [13],
"question" : ["Quels sont les deux objectifs principaux de l’exercice REPMUS 2024 au Portugal, et en quoi cet événement représente-t-il également une opportunité stratégique pour les industriels participants ?"],
"doc_id" : [docsV2.iloc[64891].doc_id],
"doc_name" : [docsV2.iloc[64891].doc_name],
"page_number" :[docsV2.iloc[64891].page_number],
"chunk_id" : [docsV2.iloc[64891].chunk_number],
"text" : [docsV2.iloc[64891].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [14],
"question" : ["Quelles sont les deux couleurs utilisées dans le tableau des amendements pour distinguer respectivement ceux qui ont été validés par le CICDE et ceux qui ont été intégrés dans la nouvelle version du document, et que symbolisent chacune de ces couleurs ?"],
"doc_id" : [docsV2.iloc[1642].doc_id],
"doc_name" : [docsV2.iloc[1642].doc_name],
"page_number" :[docsV2.iloc[1642].page_number],
"chunk_id" : [docsV2.iloc[1642].chunk_number],
"text" : [docsV2.iloc[1642].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [14],
"question" : ["Quelles sont les deux couleurs utilisées dans le tableau des amendements pour distinguer respectivement ceux qui ont été validés par le CICDE et ceux qui ont été intégrés dans la nouvelle version du document, et que symbolisent chacune de ces couleurs ?"],
"doc_id" : [docsV2.iloc[1645].doc_id],
"doc_name" : [docsV2.iloc[1645].doc_name],
"page_number" :[docsV2.iloc[1645].page_number],
"chunk_id" : [docsV2.iloc[1645].chunk_number],
"text" : [docsV2.iloc[1645].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [15],
"question" : ["Quelles sont les deux obligations financières distinctes qu’un assujetti doit remplir s’il ne restitue pas suffisamment de quotas d’émission pour couvrir ses émissions annuelles de CO₂, et en quoi ces obligations diffèrent-elles en termes de finalité et de persistance ?"],
"doc_id" : [docsV2.iloc[70527].doc_id],
"doc_name" : [docsV2.iloc[70527].doc_name],
"page_number" :[docsV2.iloc[70527].page_number],
"chunk_id" : [docsV2.iloc[70527].chunk_number],
"text" : [docsV2.iloc[70527].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [15],
"question" : ["Quelles sont les deux obligations financières distinctes qu’un assujetti doit remplir s’il ne restitue pas suffisamment de quotas d’émission pour couvrir ses émissions annuelles de CO₂, et en quoi ces obligations diffèrent-elles en termes de finalité et de persistance ?"],
"doc_id" : [docsV2.iloc[68751].doc_id],
"doc_name" : [docsV2.iloc[68751].doc_name],
"page_number" :[docsV2.iloc[68751].page_number],
"chunk_id" : [docsV2.iloc[68751].chunk_number],
"text" : [docsV2.iloc[68751].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [16],
"question" : ["cyberattaque agression armée droit international critères seuil gravité attribution effets comparables attaque conventionnelle coordination opérations physiques accumulation effets article 2(4) Charte ONU doctrine Tallin"],
"doc_id" : [docsV2.iloc[52517].doc_id],
"doc_name" : [docsV2.iloc[52517].doc_name],
"page_number" :[docsV2.iloc[52517].page_number],
"chunk_id" : [docsV2.iloc[52517].chunk_number],
"text" : [docsV2.iloc[52517].text],
"pertinent" : [True]
})
], axis=0)
db = pd.concat([db,
pd.DataFrame({
"q_id" : [16],
"question" : ["cyberattaque agression armée droit international critères seuil gravité attribution effets comparables attaque conventionnelle coordination opérations physiques accumulation effets article 2(4) Charte ONU doctrine Tallin"],
"doc_id" : [docsV2.iloc[10274].doc_id],
"doc_name" : [docsV2.iloc[10274].doc_name],
"page_number" :[docsV2.iloc[10274].page_number],
"chunk_id" : [docsV2.iloc[10274].chunk_number],
"text" : [docsV2.iloc[10274].text],
"pertinent" : [False]
})
], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [17],
"question" : ["Quels sont les deux moteurs d’avions de combat pour lesquels Safran, MTU Aero Engines et Rolls-Royce collaborent ensemble, et quel programme européen futur est associé à ces mêmes partenaires ?"],
"doc_id" : [docsV2.iloc[72375].doc_id],
"doc_name" : [docsV2.iloc[72375].doc_name],
"page_number" :[docsV2.iloc[72375].page_number],
"chunk_id" : [docsV2.iloc[72375].chunk_number],
"text" : [docsV2.iloc[72375].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [17],
"question" : ["Quels sont les deux moteurs d’avions de combat pour lesquels Safran, MTU Aero Engines et Rolls-Royce collaborent ensemble, et quel programme européen futur est associé à ces mêmes partenaires ?"],
"doc_id" : [docsV2.iloc[44459].doc_id],
"doc_name" : [docsV2.iloc[44459].doc_name],
"page_number" :[docsV2.iloc[44459].page_number],
"chunk_id" : [docsV2.iloc[44459].chunk_number],
"text" : [docsV2.iloc[44459].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [18],
"question" : ["Quels sont les deux défis contradictoires auxquels les États-Unis sont confrontés dans la mise en œuvre de leur architecture C4ISR face à la stratégie anti-A2/AD de l’Armée de libération populaire chinoise, et en quoi ces défis remettent-ils en cause les principes mêmes de l’intégration multidomaine (JADC2) ?"],
"doc_id" : [docsV2.iloc[30048].doc_id],
"doc_name" : [docsV2.iloc[30048].doc_name],
"page_number" :[docsV2.iloc[30048].page_number],
"chunk_id" : [docsV2.iloc[30048].chunk_number],
"text" : [docsV2.iloc[30048].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [18],
"question" : ["Quels sont les deux défis contradictoires auxquels les États-Unis sont confrontés dans la mise en œuvre de leur architecture C4ISR face à la stratégie anti-A2/AD de l’Armée de libération populaire chinoise, et en quoi ces défis remettent-ils en cause les principes mêmes de l’intégration multidomaine (JADC2) ?"],
"doc_id" : [docsV2.iloc[71580].doc_id],
"doc_name" : [docsV2.iloc[71580].doc_name],
"page_number" :[docsV2.iloc[71580].page_number],
"chunk_id" : [docsV2.iloc[71580].chunk_number],
"text" : [docsV2.iloc[71580].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [19],
"question" : ["Quels sont les deux effets concrets de l’article D4154-1 du code du travail sur la production industrielle des drones, en particulier dans le domaine de la soudure, et comment ces effets menacent-ils la stabilité des PME du secteur ?"],
"doc_id" : [docsV2.iloc[20494].doc_id],
"doc_name" : [docsV2.iloc[20494].doc_name],
"page_number" :[docsV2.iloc[20494].page_number],
"chunk_id" : [docsV2.iloc[20494].chunk_number],
"text" : [docsV2.iloc[20494].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [19],
"question" : ["Quels sont les deux effets concrets de l’article D4154-1 du code du travail sur la production industrielle des drones, en particulier dans le domaine de la soudure, et comment ces effets menacent-ils la stabilité des PME du secteur ?"],
"doc_id" : [docsV2.iloc[17469].doc_id],
"doc_name" : [docsV2.iloc[17469].doc_name],
"page_number" :[docsV2.iloc[17469].page_number],
"chunk_id" : [docsV2.iloc[17469].chunk_number],
"text" : [docsV2.iloc[17469].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [20],
"question" : ["Quelles sont les deux conditions précises dans lesquelles un militaire peut engager une médiation, malgré l’existence d’un recours administratif préalable déjà formé devant la commission des recours des militaires ?"],
"doc_id" : [docsV2.iloc[40258].doc_id],
"doc_name" : [docsV2.iloc[40258].doc_name],
"page_number" :[docsV2.iloc[40258].page_number],
"chunk_id" : [docsV2.iloc[40258].chunk_number],
"text" : [docsV2.iloc[40258].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [20],
"question" : ["Quelles sont les deux conditions précises dans lesquelles un militaire peut engager une médiation, malgré l’existence d’un recours administratif préalable déjà formé devant la commission des recours des militaires ?"],
"doc_id" : [docsV2.iloc[75135].doc_id],
"doc_name" : [docsV2.iloc[75135].doc_name],
"page_number" :[docsV2.iloc[75135].page_number],
"chunk_id" : [docsV2.iloc[75135].chunk_number],
"text" : [docsV2.iloc[75135].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [21],
"question" : ["Quels étaient les quatre rôles concrets remplis par le ballon captif déployé lors de l'opération Barkhane à Kidal en 2018, et comment son efficacité se manifestait-elle aussi bien de jour que de nuit ?"],
"doc_id" : [docsV2.iloc[1668].doc_id],
"doc_name" : [docsV2.iloc[1668].doc_name],
"page_number" :[docsV2.iloc[1668].page_number],
"chunk_id" : [docsV2.iloc[1668].chunk_number],
"text" : [docsV2.iloc[1668].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db, pd.DataFrame({
"q_id" : [21],
"question" : ["Quels étaient les quatre rôles concrets remplis par le ballon captif déployé lors de l'opération Barkhane à Kidal en 2018, et comment son efficacité se manifestait-elle aussi bien de jour que de nuit ?"],
"doc_id" : [docsV2.iloc[2].doc_id],
"doc_name" : [docsV2.iloc[2].doc_name],
"page_number" :[docsV2.iloc[2].page_number],
"chunk_id" : [docsV2.iloc[2].chunk_number],
"text" : [docsV2.iloc[2].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [22],
"question" : ["What are the two concrete types of ties linking the BIG to the Azerbaijani state, and how does each manifest verifiably in administrative practices or public statements?"],
"doc_id" : [docsV2.iloc[63552].doc_id],
"doc_name" : [docsV2.iloc[63552].doc_name],
"page_number" :[docsV2.iloc[63552].page_number],
"chunk_id" : [docsV2.iloc[63552].chunk_number],
"text" : [docsV2.iloc[63552].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [22],
"question" : ["What are the two concrete types of ties linking the BIG to the Azerbaijani state, and how does each manifest verifiably in administrative practices or public statements?"],
"doc_id" : [docsV2.iloc[59584].doc_id],
"doc_name" : [docsV2.iloc[59584].doc_name],
"page_number" :[docsV2.iloc[59584].page_number],
"chunk_id" : [docsV2.iloc[59584].chunk_number],
"text" : [docsV2.iloc[59584].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [23],
"question" : ["Quelles sont les trois principales catégories de limitations techniques affectant les systèmes de drones, et comment chacune influence-t-elle l'efficacité opérationnelle de ces vecteurs ?"],
"doc_id" : [docsV2.iloc[27666].doc_id],
"doc_name" : [docsV2.iloc[27666].doc_name],
"page_number" :[docsV2.iloc[27666].page_number],
"chunk_id" : [docsV2.iloc[27666].chunk_number],
"text" : [docsV2.iloc[27666].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [23],
"question" : ["Quelles sont les trois principales catégories de limitations techniques affectant les systèmes de drones, et comment chacune influence-t-elle l'efficacité opérationnelle de ces vecteurs ?"],
"doc_id" : [docsV2.iloc[43549].doc_id],
"doc_name" : [docsV2.iloc[43549].doc_name],
"page_number" :[docsV2.iloc[43549].page_number],
"chunk_id" : [docsV2.iloc[43549].chunk_number],
"text" : [docsV2.iloc[43549].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [24],
"question" : ["Quelles sont les deux méthodes alternatives utilisées pour évaluer les actifs de l'État dont le coût historique est indéterminable, et dans quel cas chacune d’elles est-elle appliquée ?"],
"doc_id" : [docsV2.iloc[69420].doc_id],
"doc_name" : [docsV2.iloc[69420].doc_name],
"page_number" :[docsV2.iloc[69420].page_number],
"chunk_id" : [docsV2.iloc[69420].chunk_number],
"text" : [docsV2.iloc[69420].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [24],
"question" : ["Quelles sont les deux méthodes alternatives utilisées pour évaluer les actifs de l'État dont le coût historique est indéterminable, et dans quel cas chacune d’elles est-elle appliquée ?"],
"doc_id" : [docsV2.iloc[9200].doc_id],
"doc_name" : [docsV2.iloc[9200].doc_name],
"page_number" :[docsV2.iloc[9200].page_number],
"chunk_id" : [docsV2.iloc[9200].chunk_number],
"text" : [docsV2.iloc[9200].text],
"pertinent" : [False]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [25],
"question" : ["Quelles sont les trois règles fondamentales qu’un drone ou un agent au sein d’un essaim autonome doit appliquer pour reproduire un comportement collectif coordonné, et en quoi chacune de ces règles contribue-t-elle à la fluidité et à la résilience du déplacement du groupe ?"],
"doc_id" : [docsV2.iloc[55999].doc_id],
"doc_name" : [docsV2.iloc[55999].doc_name],
"page_number" :[docsV2.iloc[55999].page_number],
"chunk_id" : [docsV2.iloc[55999].chunk_number],
"text" : [docsV2.iloc[55999].text],
"pertinent" : [True]
})], axis=0)
db = pd.concat([db,pd.DataFrame({
"q_id" : [25],
"question" : ["Quelles sont les trois règles fondamentales qu’un drone ou un agent au sein d’un essaim autonome doit appliquer pour reproduire un comportement collectif coordonné, et en quoi chacune de ces règles contribue-t-elle à la fluidité et à la résilience du déplacement du groupe ?"],
"doc_id" : [docsV2.iloc[14321].doc_id],
"doc_name" : [docsV2.iloc[14321].doc_name],
"page_number" :[docsV2.iloc[14321].page_number],
"chunk_id" : [docsV2.iloc[14321].chunk_number],
"text" : [docsV2.iloc[14321].text],
"pertinent" : [False]
})], axis=0)
db.reset_index(drop=True, inplace=True)
db.to_csv("paires_mainV1.csv", index=True)
docs = db[["doc_id", "doc_name", "page_number", "chunk_id", "text"]]
docs.to_csv("docs_mainV1.csv", index=True)
queries = db[["q_id", "question"]]
queries.drop_duplicates(inplace=True, ignore_index=True)
queries.to_csv("queries_mainV1.csv", index=False)
\ No newline at end of file
#!/usr/bin/env python
# coding: utf-8
# # Construction à la min d'un petit dataset maitrisé issu de challenge
# In[48]:
import pandas as pd
# In[49]:
docsV2 = pd.read_csv("../docsV2.csv")
# In[30]:
tmp = docsV2[ docsV2.doc_name.str.contains("Guide_sensi")]
tmp #[tmp.page_number==3]
#docsV2.iloc[9200].text
# ## Creation DB
# In[64]:
db = pd.DataFrame(columns=["q_id", "question", "doc_id", "doc_name", "page_number", "chunk_id", "text", "pertinent"])
# In[65]:
tmp = pd.DataFrame({
"q_id" : [100]*(27679 - 27665),
"question" : ["Quelles sont les trois principales catégories de limitations techniques affectant les systèmes de drones, et comment chacune influence-t-elle l'efficacité opérationnelle de ces vecteurs ?"]*(27679 - 27665),
"doc_id" : list(docsV2.iloc[27665:27679].doc_id),
"doc_name" : list(docsV2.iloc[27665:27679].doc_name),
"page_number" :list(docsV2.iloc[27665:27679].page_number),
"chunk_id" :list(docsV2.iloc[27665:27679].chunk_number),
"text" : list(docsV2.iloc[27665:27679].text),
"pertinent" : [True]*(27679 - 27665)
})
db = pd.concat([db,tmp], axis=0)
db
# In[66]:
tmp = pd.DataFrame({
"q_id" : [100]*(37065 - 37059),
"question" : ["Quelles sont les trois principales catégories de limitations techniques affectant les systèmes de drones, et comment chacune influence-t-elle l'efficacité opérationnelle de ces vecteurs ?"]*(37065 - 37059),
"doc_id" : list(docsV2.iloc[37059:37065].doc_id),
"doc_name" : list(docsV2.iloc[37059:37065].doc_name),
"page_number" :list(docsV2.iloc[37059:37065].page_number),
"chunk_id" :list(docsV2.iloc[37059:37065].chunk_number),
"text" : list(docsV2.iloc[37059:37065].text),
"pertinent" : [False]*(37065 - 37059)
})
db = pd.concat([db,tmp], axis=0)
db
# In[67]:
tmp = pd.DataFrame({
"q_id" : [100]*(3606 - 3598),
"question" : ["Quelles sont les trois principales catégories de limitations techniques affectant les systèmes de drones, et comment chacune influence-t-elle l'efficacité opérationnelle de ces vecteurs ?"]*(3606 - 3598),
"doc_id" : list(docsV2.iloc[3598:3606].doc_id),
"doc_name" : list(docsV2.iloc[3598:3606].doc_name),
"page_number" :list(docsV2.iloc[3598:3606].page_number),
"chunk_id" :list(docsV2.iloc[3598:3606].chunk_number),
"text" : list(docsV2.iloc[3598:3606].text),
"pertinent" : [False]*(3606 - 3598)
})
db = pd.concat([db,tmp], axis=0)
db
# In[70]:
db.reset_index(drop=True, inplace=True)
# In[71]:
db.to_csv("paires_mainV2.csv", index=True)
# ## Generation docs et queries
# In[73]:
new_paires = pd.read_csv("paires_mainV2.csv", index_col=0)
new_paires
# In[74]:
docs = new_paires[["doc_id", "doc_name", "page_number", "chunk_id", "text"]]
docs.head()
# In[75]:
queries = new_paires[["q_id", "question"]]
queries.drop_duplicates(inplace=True, ignore_index=True)
queries.head()
# In[76]:
docs.to_csv("docs_mainV2.csv", index=True)
queries.to_csv("queries_mainV2.csv", index=True)
#!/usr/bin/env python
# coding: utf-8
# # Construction à la min d'un petit dataset maitrisé issu de challenge
# In[1]:
import pandas as pd
# In[2]:
docsV2 = pd.read_csv("../docsV2.csv")
# In[18]:
tmp = docsV2[ docsV2.doc_name.str.contains("20180719")]
tmp[tmp.page_number==19]
docsV2.iloc[13620].text
# ## Creation DB
# In[8]:
db = pd.DataFrame(columns=["q_id", "question", "doc_id", "doc_name", "page_number", "chunk_id", "text", "pertinent"])
# In[ ]:
tmp = pd.DataFrame({
"q_id" : [200]*(2),
"question" : ["Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?"]*2,
"doc_id" : list(docsV2.iloc[13591:13593].doc_id),
"doc_name" : list(docsV2.iloc[13591:13593].doc_name),
"page_number" :list(docsV2.iloc[13591:13593].page_number),
"chunk_id" :list(docsV2.iloc[13591:13593].chunk_number),
"text" : list(docsV2.iloc[13591:13593].text),
"pertinent" : [True]*(2)
})
db = pd.concat([db,tmp], axis=0)
db
# In[12]:
tmp = pd.DataFrame({
"q_id" : [200]*(2),
"question" : ["Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?"]*2,
"doc_id" : list(docsV2.iloc[13593:13595].doc_id),
"doc_name" : list(docsV2.iloc[13593:13595].doc_name),
"page_number" :list(docsV2.iloc[13593:13595].page_number),
"chunk_id" :list(docsV2.iloc[13593:13595].chunk_number),
"text" : list(docsV2.iloc[13593:13595].text),
"pertinent" : [True]*(2)
})
db = pd.concat([db,tmp], axis=0)
db
# In[14]:
tmp = pd.DataFrame({
"q_id" : [200]*4,
"question" : ["Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?"]*4,
"doc_id" : list(docsV2.iloc[13609:13613].doc_id),
"doc_name" : list(docsV2.iloc[13609:13613].doc_name),
"page_number" :list(docsV2.iloc[13609:13613].page_number),
"chunk_id" :list(docsV2.iloc[13609:13613].chunk_number),
"text" : list(docsV2.iloc[13609:13613].text),
"pertinent" : [True]*4
})
db = pd.concat([db,tmp], axis=0)
db
# In[16]:
tmp = pd.DataFrame({
"q_id" : [200],
"question" : ["Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?"],
"doc_id" : [docsV2.iloc[13616].doc_id],
"doc_name" : [docsV2.iloc[13616].doc_name],
"page_number" :[docsV2.iloc[13616].page_number],
"chunk_id" :[docsV2.iloc[13616].chunk_number],
"text" : [docsV2.iloc[13616].text],
"pertinent" : [True]
})
db = pd.concat([db,tmp], axis=0)
db
# In[19]:
tmp = pd.DataFrame({
"q_id" : [200],
"question" : ["Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?"],
"doc_id" : [docsV2.iloc[13620].doc_id],
"doc_name" : [docsV2.iloc[13620].doc_name],
"page_number" :[docsV2.iloc[13620].page_number],
"chunk_id" :[docsV2.iloc[13620].chunk_number],
"text" : [docsV2.iloc[13620].text],
"pertinent" : [True]
})
db = pd.concat([db,tmp], axis=0)
db
# In[ ]:
tmp = pd.DataFrame({
"q_id" : [200]*(2),
"question" : ["Quels sont les défis majeurs liés à l’utilisation d’une intelligence artificielle auto-apprenante dans les systèmes d’armes, et en quoi ces défis remettent-ils en cause les méthodes traditionnelles de développement et de validation des technologies militaires ?"]*2,
"doc_id" : list(docsV2.iloc[13591:13593].doc_id),
"doc_name" : list(docsV2.iloc[13591:13593].doc_name),
"page_number" :list(docsV2.iloc[13591:13593].page_number),
"chunk_id" :list(docsV2.iloc[13591:13593].chunk_number),
"text" : list(docsV2.iloc[13591:13593].text),
"pertinent" : [False]*(2)
})
db = pd.concat([db,tmp], axis=0)
db
# In[70]:
db.reset_index(drop=True, inplace=True)
# In[71]:
db.to_csv("paires_mainV2.csv", index=True)
# ## Generation docs et queries
# In[73]:
new_paires = pd.read_csv("paires_mainV2.csv", index_col=0)
new_paires
# In[74]:
docs = new_paires[["doc_id", "doc_name", "page_number", "chunk_id", "text"]]
docs.head()
# In[75]:
queries = new_paires[["q_id", "question"]]
queries.drop_duplicates(inplace=True, ignore_index=True)
queries.head()
# In[76]:
docs.to_csv("docs_mainV2.csv", index=True)
queries.to_csv("queries_mainV2.csv", index=True)
# Récupération et mise en forme des données pour le challenge RAG @ evalLLM¶
import pymupdf4llm
import pandas as pd
from langchain_text_splitters import MarkdownTextSplitter
from os import listdir
from os.path import isfile, join
from tqdm import tqdm
md_splitter = MarkdownTextSplitter(chunk_size=500, chunk_overlap=150) # le choix de la taille et de l'overlap est justifié par les contraintes de E5 (entrée de 512 token) affiner ces hyperparamètres pourrait parfaire le modèle
doc_df = pd.DataFrame( columns=["doc_id","doc_name", "page_number", "chunk_number", "text"])
mypath = "./data_challenge/Corpus_raw"
onlyfiles = [f for f in listdir(mypath) if (isfile(join(mypath, f)) and ".pdf" in f)]
doc_id = 0
for file in tqdm(onlyfiles):
chunk_number = 0
doc = pymupdf4llm.to_markdown(
join(mypath,file),
page_chunks = True, # "output will be a list of Document.page_count dictionaries (one per page)"
# header = False, # ne traite pas le header
# footer = False, # ne traite pas le footer
#pages = range(1)
)
for page in doc:
textes = md_splitter.split_text(text=page["text"])
n = len(textes)
doc_df = pd.concat([doc_df,
pd.DataFrame({
"doc_id" : [int(doc_id)]*n,
"doc_name" : [page["metadata"]["file_path"]]*n,
"page_number" : [int(page["metadata"]["page"])]*n,
"chunk_number" : [int(i+chunk_number) for i in range(n)],
"text" : textes
})], ignore_index=True)
chunk_number += len(textes)
doc_id+=1
doc_id_str = [str(doc_id) for doc_id in doc_df["doc_id"]]
page_nb_str = [str(page_nb) for page_nb in doc_df["page_number"]]
chunk_nb_str = [str(chunk_nb) for chunk_nb in doc_df["chunk_number"]]
ids = ["#".join([doc_id_str[i], page_nb_str[i], chunk_nb_str[i]]) for i in range(len(doc_id_str))]
doc_id_str = [str(doc_id) for doc_id in doc_df["doc_id"]]
page_nb_str = [str(page_nb) for page_nb in doc_df["page_number"]]
chunk_nb_str = [str(chunk_nb) for chunk_nb in doc_df["chunk_number"]]
ids = ["#".join([doc_id_str[i], page_nb_str[i], chunk_nb_str[i]]) for i in range(len(doc_id_str))]
doc_df.insert(0,"id",pd.Series(ids))
doc_df.to_csv("data_challenge/docs.csv")
\ No newline at end of file
# Overview du projet pour le Challenge RAG@EvalLLM
## Biblio
### Dataset
Pas de dataset générique en français pour IR et/ou QA
Dataset multilingue avec une partie en français:
- mC4 (dataset d'entraînement de mT5) : textes notamment en français (/!\ pas IR)
- **MIRACL** (IR)
- page web : https://project-miracl.github.io/
- github : https://github.com/project-miracl/miracl
- papier : https://arxiv.org/abs/2210.09984
- huggingface : https://huggingface.co/datasets/miracl/miracl
- un split par langue :-)
- MKQA : QA dataset /!\ pas de documents fournis /!\
- papier : https://direct.mit.edu/tacl/article/doi/10.1162/tacl_a_00433/108607/MKQA-A-Linguistically-Diverse-Benchmark-for
- 10 000 requêtes dans 25 langues chacune,
- HF : https://huggingface.co/datasets/apple/mkqa
- github : https://github.com/apple/ml-mkqa/tree/main
- BERGEN : Rag Bench focus on QA
- papier : https://arxiv.org/abs/2407.01102
- github : https://github.com/naver/bergen
- ensemble de datasets préexistants dont deux multilingues : MKQA et XOR-TyDi QA
-
- XOR-QA : Cross-lingual Open-Retrieval QA
- multilingual
- papier : https://aclanthology.org/2021.naacl-main.46/
- code & data : https://nlp.cs.washington.edu/xorqa/
- /!\ *"This work extends open-retrieval question answering to a cross-lingual setting enabling questions from one language to be answered via answer content from another language."*
- Extension de TyDi QA en ne restreignant pas la recherche dans une langue en particulier (les corrections ont été adaptées en conséquence)
- [Clark et al., 2020] TyDi QA: A Benchmark for Information-Seeking Question Answering in Typologically Diverse Languages
- papier : https://arxiv.org/abs/2003.05002
- La question doit être répondue à l'aide des documents de la langue cible. L'objectif est de ne pas reposer sur des capacités de traduction.
- github : https://github.com/google-research-datasets/tydiqa
- [Welbl et al., 2017] SCIQ : Crowdsourcing Multiple Choice Science Questions
- Question (Physique, Chimie Biologie) niveau collège-début fac
- Anglais
- HF : https://huggingface.co/datasets/allenai/sciq
- les explications rédigées pourraient servir de documents, on peut alors se passer des 4 réponses possibles (dont la bonne réponse) (c'est un QCM à l'origine)
Travaux de RAG en français de spécialité (introduisant un dataset):
- [Mnassri et al., 2025] RAG and Recall: Multilingual Hate Speech Detection with Semantic Memory
- Multilingual hate speech detection (Fr, Arabic, En) ~> classification !!
- deux modèles : HS-RAG et HS-MemRAG (pour réduire les retrievals redondants)
- LLaMA-3-8B + Langchain&Chroma
- training free
- papier : https://aclanthology.org/2025.woah-1.20/
- pas de code/ modèle accessible
- dataset utilisé : https://huggingface.co/datasets/manueltonneau/french-hate-speech-superset ~> assez loin de ce qu'on cherche...
### IR/ ID
À partir du survey [Fan et al. 2024]:
- [Lewis et al 2020] DPR+BART
- DPR pas compatible avec MechIR
- facebook/dpr-question_encoder-single-nq-base, facebook/rag-token-nq
- [Khandelwal et al. 2019] Generalization through Memorization: Nearest Neighbor Language Models
- https://arxiv.org/abs/1911.00172
- code : https://github.com/urvashik/knnlm (/!\ entraînement à refaire!!!)
- [Borgeaud et al., 2022] Improving Language Models by Retrieving from Trillions of Tokens
- papier https://proceedings.mlr.press/v162/borgeaud22a/borgeaud22a.pdf
- RETRO
- Modèle InstructRETRO basé sur RETRO : https://huggingface.co/nvidia/retro-8b-instruct-4k
- [Glass et al. 2022]
- modele : https://huggingface.co/ibm-research/re2g-reranker-triviaqa
- ibm-research/re2g-reranker-nq
- code? https://github.com/IBM/kgi-slot-filling
- l'extraction est elle compatible avec notre projet??
- [Shi et al., 2024] RePlug (pour les concpets mis pas compatible MechIR car Contriver)
- papier : https://aclanthology.org/2024.naacl-long.463/
### RAG
- [Bellart & Deleruyelle 2025] TalanSeeker : Application de l'architecture RAG pour la sélection de profils en conseil
- FR
- papier : https://editions-rnti.fr/?inprocid=1003045
- Outil RAG complet pour selection de CV étant donné une requête
- Archi partiellement dispo sur Github (https://github.com/TalanRecherche/Talanseeker-Backend) **pour utilisation** (pas appropriation)
- dataset : base de CV synthétiques ~> pas ce qu'on cherche
- [Tran et al., 2025] Génération augmentée de récupération pour les journaux historiques
- FR
- papier : https://inrap.hal.science/INSA-CVL/hal-04796088v1
- résumé : https://talnarchives.atala.org/ateliers/2025/CORIA/37.html
- Embeddings par mE5-small, stockés avec Chroma, cosine-similarity. Première extraction sur les titres puis 2e extraction sur les documents (si on a obtenu des titres avec pertinence suffisante, sinon, recherche web). Reranking des résultats obtenus. Le tout est envoyé dans LLaMA3 ~> Beaucoup d'outils !!! Archi assez élaborée!!
- GitHub : https://github.com/trungv28/Retrieval-Augmented-Generation-for-historical-newspapers/tree/main
- **Compatible MechIR**
- [Xiao et al., 2022] RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder
- **EN ?**
- github : https://github.com/staoxiao/RetroMAE
- papier /!\ À LIRE /!\ : https://arxiv.org/abs/2205.12035
- [Nouali et al., 2025] Exploration du RAG pour la génération de réponses à des questions en contexte éducatif: étude sur les données SCIQ
- Opposer LLM seul à LLLM+IR sur les données SciQ
- LLM seuls : Llama 3 8b, Mistral 7b
- Archi RAG : Moteur ElasticSearch avec BM25 + les mêmes LLMs, prompt engineering pour l'augmentation, extraction des k=10 meilleurs passages,
- **/!\ anglais**
- /!\ pas de code accessible
- RESSOURCE TRÈS INTERESSANTE
- /!\ vigilance sur les droit
- /!\ compatible MechIR???
- https://github.com/OpenClassrooms-Student-Center/8532116-mettez-en-place-un-rag-pour-un-llm/tree/main
- [Izacard & Grave 2020] DPR&BM25 + T5 pour OpenDomain QA
- papier : https://aclanthology.org/2021.eacl-main.74.pdf
- code : https://github.com/facebookresearch/fid
- /!\ pas de modèle pré-entrainé!!
### LLM
Multilingue:
- E5 multilingue (encodeur)
- HF : https://huggingface.co/intfloat/multilingual-e5-small
- papier mE5 : https://arxiv.org/abs/2402.05672
- papier E5 (archi) : https://arxiv.org/abs/2212.03533
- github : https://github.com/microsoft/unilm/tree/master/e5
- [Xue et al., 2021] mT5 multilingue text2text (basé T5)
- papier : https://aclanthology.org/2021.naacl-main.41/
- entraînement de l'archi T5 avec une extension du dataset d’entraînement de T5 (C4 devient mC4)
- github : https://github.com/google-research/multilingual-t5
- doc HF : https://huggingface.co/docs/transformers/model_doc/mt5
- model HF : https://huggingface.co/google/mt5-base
- [Le Scao et al., 2022] BLOOM: A 176B-Parameter Open-Access Multilingual Language Model
- décoduer only
- multilingue
- modèle : https://huggingface.co/bigscience/bloom
- papier : https://arxiv.org/abs/2211.05100
Français:
- Mistral7B 2023
- [Zhang et al. 2025] Vers une optimisation de RAG en français : conception d'un reranker open source, fine-tuning et évaluation (https://hal.science/hal-05133472v1)
- juste rerank
- impem et entraînement d'un reranker à la sortie d'un distillRoBERTa
- code limité mais disponible et plutôt commenté
- [Segonne et al. 2024] Jargon: A Suite of Language Models and Evaluation Tasks for French Specialized Domains
- https://hal.science/hal-04535557
- code : https://github.com/PantagrueLLM/Jargon/
- modèle : https://huggingface.co/PantagrueLLM
- Français et spécialisation (law, health, speech detection)
- classifictaion (juste utilisable pour IR)
### Évaluation
- [Zhou & Mulhem & Schwab 2026] TempPerturb-Eval: On the Joint Effects of Internal Temperature and External Perturbations in RAG Robustness
- évaluer l'impact de la température et des perturbations sur la qualité d'un modèle RAG et les interactions entre les variations de ces deux paramètres
- RAGs étudiés : gpt-3.5-turbo, gpt-4o, Llama-3.1-8B-Instruct, Llama-3.2-1B-Instruct, deepseek-reasoner
- papier : https://arxiv.org/abs/2512.01183
- [Park & Lee 2025] Investigating Language Preference of Multilingual RAG Systems
- multilingual
- papier : https://aclanthology.org/2025.findings-acl.295/
- Retriever analysés:
- BGE-m3 [Chen et al., 2024]
- paraphrase-multilingual-MiniLM-L12-v2
- paraphrase-multilingual-mpnet-base-v2
- Générateurs analysés
- aya-expanse-8b [Dang et al., 2024]
- qwen 2.5-7B Instruct [Team 2024]
- Phi-4 14B [Abdin et al., 2024]
- Llama-3.1-8B-Instruct [Dubey et al., 2024]
- github : https://github.com/jeonghyunpark2002/LanguagePreference
- [Bouchiba 2025] Vers des RAGs intégrant véracité, subjectivité et explicabilité
- papier : https://talnarchives.atala.org/ateliers/2025/IAEDU/208.html
- projet de thèse "Explainable Retrieval Augmented Generation that supports Veracity and Subjectivity : X-RAG-VS". Pas de code ni de détail disponible pour l'instant
### Explicabilité
- [Zhou & Mulhem & Schwab 2025] Explicabilité par Perturbations pour les Systèmes RAG
- Overview des méthodes d'explication générales puis pour le RAG
-> *Gradient Guided Prompt Perturbation [Hu et al., 2024] pourrai être intéressant à exploiter avec MechIR*
- Catégorisation des perturbations pour l'IR -> *apporter des idées de perturbations pour MechIR*
- papier : https://talnarchives.atala.org/ateliers/2025/DIAGLLM/193.html
- [Vast et al., 2025] Comprendre la Nature des Signaux de Correspondance dans les Modèles Neuronaux pour la RI
- Étude de la façon dont les modèles de RI construisent et traitent les signaux. Par masking des matrices d'attention
- modèle utilisé/ analysé : MonoBERT (entraîné sur le RI avec MS-MARCO)
- papier : https://talnarchives.atala.org/ateliers/2025/CORIA/1.html
## Structure
### Dataset
À construire à partir de la biblio : MIRACL et TyDi-QA
### Architecture
Objectif : faire simple (IR + LLM sans augmentation pour l'instant)
#### Extraction d'information / de document
#### Génération de réponse
### Audit avec MechIR
### Corrections issues de l'audit avec MechIR
### Comparaison du modèle avant et après
### Évaluation dans le cadre du Challenge RAG@EvalLLM
\ No newline at end of file
# Spécification du CLI associé à GenericAutomatedPerturbation.py
## Action 1 : Calcul des valeurs (`values`)
Arguments obligatoires :
- modele (str) : nom du modèle (chemin ou adresse HuggingFace)
- dataset (str) : nom du dataset dans irdataset ou chemin dans l'arborescence
- dataset_origin (choices = ["irdatasets", "file"]) : Origine du dataset. indique comment obtenir le dataset
- perturbation (str) : chemin vers le fichier descriptif des perturbations
Arguments optionnels :
- query_field (str, default="question") : champ du fichier des paires correspondant aux questions
- docs_field (str, default="text") : champ du fichier des paires correspondant aux documents
- subdataset_condition (str, default=None) : critère de sélection d'une sous-partie du dataset
- gen_mean (bool, action = "store_true") : déclenche le calcul des matrices de moyennes de sensibilité
- gen_std (bool, action = "store_true") : déclenche le calcul des matrices d'écarts-types de sensibilité
- output (str, default=None) : spécifie le nom du fichier de sauvegarde des valeurs (Par défaut, le dossier des perturbations est utilisé et le fichier est nommé perts_values.json)
## Action 2 : Génération des graphiques (`graphs`)
Arguments obligatoires :
- input (str) : Fichier contenant les données à mettre sous graphe
Arguments optionnels:
- output (str, default=None) : spécifie le nom du dossier de sauvegarde des graphiques (Par défaut, le dossier de l'input)
\ No newline at end of file
...@@ -2,12 +2,10 @@ ...@@ -2,12 +2,10 @@
import json import json
import numpy as np import numpy as np
import sys
import seaborn as sns import seaborn as sns
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import argparse import argparse
from pathlib import Path from pathlib import Path
from itertools import combinations
def compter_noeuds_sensibles(json_path, pert_type): def compter_noeuds_sensibles(json_path, pert_type):
...@@ -32,33 +30,33 @@ def compter_noeuds_sensibles(json_path, pert_type): ...@@ -32,33 +30,33 @@ def compter_noeuds_sensibles(json_path, pert_type):
with open(json_path, "r", encoding="utf-8") as f: with open(json_path, "r", encoding="utf-8") as f:
data = json.load(f) data = json.load(f)
premiere_perturbation = next(iter(data.values())) premiere_perturbation = data[0]
shape = np.array(premiere_perturbation["patching_mean"]).shape shape = np.array(premiere_perturbation["results"]["patching_mean"]).shape
compteurs = np.zeros(shape, dtype=int) compteurs = np.zeros(shape, dtype=int)
compteur_pert = {} compteur_pert = {}
for perturbation, valeurs in data.items(): for perturbation in data:
if pert_type == "all" or pert_type == perturbation_type(perturbation): if pert_type == "all" or pert_type == perturbation["type"]:
mean = np.array(valeurs["patching_mean"]) mean = np.array(perturbation["results"]["patching_mean"])
std = np.array(valeurs["patching_std"]) std = np.array(perturbation["results"]["patching_std"])
resc_mean = (np.sign(mean) / np.absolute(mean).max()) * np.absolute(mean) resc_mean = (np.sign(mean) / np.absolute(mean).max()) * np.absolute(mean)
resc_std = (np.sign(std) / np.absolute(std).max()) * np.absolute(std) resc_std = (np.sign(std) / np.absolute(std).max()) * np.absolute(std)
compteur_pert[perturbation] ={} compteur_pert[perturbation["pert"]["name"]] ={}
compteur_pert[perturbation]["carte"] = ((np.abs(mean) > 0.1) & (np.abs(resc_mean) > 0.5)) | ((np.abs(std) > 0.1) & (np.abs(resc_std) > 0.5)) compteur_pert[perturbation["pert"]["name"]]["carte"] = ((np.abs(mean) > 0.1) & (np.abs(resc_mean) > 0.5)) | ((np.abs(std) > 0.1) & (np.abs(resc_std) > 0.5))
compteur_pert[perturbation]["noeuds_sensibles"] = [] compteur_pert[perturbation["pert"]["name"]]["noeuds_sensibles"] = []
for i in range(mean.shape[0]): for i in range(mean.shape[0]):
for j in range(mean.shape[1]): for j in range(mean.shape[1]):
if compteur_pert[perturbation]["carte"][i,j]: if compteur_pert[perturbation["pert"]["name"]]["carte"][i,j]:
compteur_pert[perturbation]["noeuds_sensibles"].append((i,j,mean[i,j], std[i,j], resc_mean[i,j], resc_std[i,j])) compteur_pert[perturbation["pert"]["name"]]["noeuds_sensibles"].append((i,j,mean[i,j], std[i,j], resc_mean[i,j], resc_std[i,j]))
compteur_pert[perturbation]["total"] = np.sum(compteur_pert[perturbation]["carte"]) compteur_pert[perturbation["pert"]["name"]]["total"] = np.sum(compteur_pert[perturbation["pert"]["name"]]["carte"])
compteurs += compteur_pert[perturbation]["carte"] compteurs += compteur_pert[perturbation["pert"]["name"]]["carte"]
return compteurs, compteur_pert return compteurs, compteur_pert
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment