martialroberge
commited on
Commit
·
7a7f712
1
Parent(s):
cbae9ff
Simplification de l'interface et forçage des Q/R en français
Browse files
app.py
CHANGED
@@ -239,79 +239,44 @@ def process_images(api_key, hf_token, images, dataset_name, progress=gr.Progress
|
|
239 |
nb_questions = random.randint(1, 5)
|
240 |
print(f"❓ Génération de {nb_questions} questions...")
|
241 |
|
242 |
-
prompt = f"""Tu es un expert en analyse financière
|
243 |
|
244 |
-
ÉTAPE 1 - IDENTIFICATION DE LA LANGUE :
|
245 |
-
- Analyse
|
246 |
-
- Identifie la langue principale (fr
|
247 |
-
-
|
248 |
-
|
|
|
249 |
|
250 |
Format de réponse requis (JSON) :
|
251 |
[
|
252 |
{{
|
253 |
-
"query": "Question financière
|
254 |
-
"answer": "Réponse
|
255 |
-
"
|
256 |
"is_negative": false
|
257 |
}}
|
258 |
]
|
259 |
|
260 |
-
Instructions
|
261 |
-
|
262 |
-
1. TYPES DE QUESTIONS FINANCIÈRES (sois créatif et précis) :
|
263 |
-
- Analyse quantitative :
|
264 |
-
* Montants exacts et variations
|
265 |
-
* Pourcentages et ratios financiers
|
266 |
-
* Évolutions temporelles
|
267 |
-
* Comparaisons chiffrées
|
268 |
-
|
269 |
-
- Analyse qualitative :
|
270 |
-
* Stratégies et objectifs
|
271 |
-
* Risques et opportunités
|
272 |
-
* Contexte réglementaire
|
273 |
-
* Implications business
|
274 |
-
|
275 |
-
- Dates et échéances :
|
276 |
-
* Périodes de reporting
|
277 |
-
* Dates clés
|
278 |
-
* Échéances importantes
|
279 |
-
* Historique des événements
|
280 |
-
|
281 |
-
2. QUESTIONS NÉGATIVES (TRÈS IMPORTANT) :
|
282 |
-
- Tu DOIS générer au moins 1 question sur {nb_questions} où l'information n'est PAS dans le document
|
283 |
-
- Pour ces questions, tu DOIS mettre "is_negative": true
|
284 |
-
- La réponse DOIT commencer par une phrase indiquant l'absence d'information dans la langue du document :
|
285 |
-
* FR: "Cette information ne figure pas dans le document"
|
286 |
-
* EN: "This information is not present in the document"
|
287 |
-
* DE: "Diese Information ist im Dokument nicht enthalten"
|
288 |
-
- Les questions négatives doivent être plausibles et pertinentes pour un document financier
|
289 |
|
290 |
-
|
291 |
-
-
|
292 |
-
-
|
293 |
-
-
|
294 |
-
-
|
295 |
-
- Profondeur : questions qui nécessitent une analyse approfondie
|
296 |
|
297 |
-
|
298 |
-
-
|
299 |
-
|
300 |
-
|
301 |
-
* Clarté : formulation professionnelle et précise
|
302 |
-
* Contexte : inclure les éléments de contexte pertinents
|
303 |
-
- Pour les questions négatives (is_negative: true) :
|
304 |
-
* TOUJOURS commencer par la phrase d'absence d'information dans la bonne langue
|
305 |
-
* Expliquer brièvement pourquoi cette information serait pertinente
|
306 |
|
307 |
-
|
308 |
-
- Questions et réponses
|
309 |
-
-
|
310 |
-
- Pas de
|
311 |
-
-
|
312 |
-
-
|
313 |
-
- Au moins 1 question négative (is_negative: true) par image
|
314 |
-
- Code langue ISO correct (fr, en, de, etc.)
|
315 |
|
316 |
La réponse doit être uniquement le JSON, sans texte supplémentaire."""
|
317 |
|
@@ -350,12 +315,12 @@ La réponse doit être uniquement le JSON, sans texte supplémentaire."""
|
|
350 |
|
351 |
# Vérifier que chaque élément a les bons champs
|
352 |
for qa in qa_pairs:
|
353 |
-
if not all(key in qa for key in ["query", "answer", "
|
354 |
raise ValueError("Un élément ne contient pas tous les champs requis")
|
355 |
|
356 |
# Vérifier que la langue est fr
|
357 |
-
if qa["
|
358 |
-
qa["
|
359 |
|
360 |
# Générer un ID unique
|
361 |
qa["id"] = generate_unique_id()
|
@@ -383,7 +348,7 @@ La réponse doit être uniquement le JSON, sans texte supplémentaire."""
|
|
383 |
"image": qa["image"],
|
384 |
"query": qa["query"],
|
385 |
"answer": qa["answer"],
|
386 |
-
"
|
387 |
"file_name": qa["file_name"],
|
388 |
"is_negative": qa["is_negative"]
|
389 |
}
|
@@ -435,36 +400,21 @@ limitations under the License.
|
|
435 |
with gr.Blocks() as demo:
|
436 |
gr.Markdown("""
|
437 |
# 🎯 Mini-VLM Dataset Builder
|
438 |
-
### Créez des datasets de haute qualité pour l'entraînement de modèles Vision-Langage (VLM)
|
439 |
|
440 |
-
##
|
441 |
|
442 |
-
Cette application permet de créer des datasets de questions/réponses
|
443 |
-
|
444 |
-
tout en conservant des performances proches des grands modèles comme GPT-4V ou Gemini.
|
445 |
|
446 |
-
### 🔄
|
447 |
-
1.
|
448 |
-
2.
|
449 |
-
|
450 |
-
|
451 |
-
- Mélange aléatoire pour une meilleure distribution
|
452 |
-
3. **Analyse par Gemini** :
|
453 |
-
- Détection automatique de la langue (FR, EN, DE, etc.)
|
454 |
-
- Génération de 1 à 5 questions/réponses par image
|
455 |
-
- Inclusion de questions négatives pour l'entraînement
|
456 |
-
4. **Structuration du dataset** :
|
457 |
-
- Split automatique (80% train, 10% validation, 10% test)
|
458 |
-
- Format standardisé avec IDs uniques
|
459 |
-
- Métadonnées complètes (langue, type de question, etc.)
|
460 |
-
5. **Publication sur Hugging Face** :
|
461 |
-
- Création automatique du repository
|
462 |
-
- Upload des images et métadonnées
|
463 |
-
- Structure optimisée pour l'entraînement
|
464 |
|
465 |
-
### ⚠️ Prérequis
|
466 |
-
|
467 |
-
|
468 |
""")
|
469 |
|
470 |
with gr.Row():
|
@@ -484,23 +434,21 @@ with gr.Blocks() as demo:
|
|
484 |
dataset_name = gr.Textbox(
|
485 |
label="📁 Nom du dataset",
|
486 |
placeholder="votre-username/nom-du-dataset",
|
487 |
-
info="Format
|
488 |
)
|
489 |
|
490 |
with gr.Column(scale=1):
|
491 |
files = gr.File(
|
492 |
-
label="📄 Documents (PDF, PNG, JPG, JPEG)",
|
493 |
file_count="multiple",
|
494 |
height=200
|
495 |
)
|
496 |
gr.Markdown("""
|
497 |
-
### 📊
|
498 |
-
-
|
499 |
-
-
|
500 |
-
-
|
501 |
-
-
|
502 |
-
- Au moins 1 question négative par image
|
503 |
-
- Détection automatique de la langue
|
504 |
""")
|
505 |
|
506 |
submit_btn = gr.Button("🚀 Créer le dataset", variant="primary", scale=2)
|
|
|
239 |
nb_questions = random.randint(1, 5)
|
240 |
print(f"❓ Génération de {nb_questions} questions...")
|
241 |
|
242 |
+
prompt = f"""Tu es un expert en analyse financière et en création de datasets. Examine attentivement ce document financier et génère exactement {nb_questions} questions/réponses en français, quelle que soit la langue du document.
|
243 |
|
244 |
+
ÉTAPE 1 - IDENTIFICATION DE LA LANGUE DU DOCUMENT :
|
245 |
+
- Analyse le texte dans l'image
|
246 |
+
- Identifie la langue principale (fr, en, de, etc.)
|
247 |
+
- Cette information servira uniquement de métadonnée
|
248 |
+
|
249 |
+
IMPORTANT : Toutes les questions et réponses DOIVENT être en français, même si le document est dans une autre langue !
|
250 |
|
251 |
Format de réponse requis (JSON) :
|
252 |
[
|
253 |
{{
|
254 |
+
"query": "Question financière en français",
|
255 |
+
"answer": "Réponse en français",
|
256 |
+
"langue_document": "code ISO de la langue source (fr, en, de, etc.)",
|
257 |
"is_negative": false
|
258 |
}}
|
259 |
]
|
260 |
|
261 |
+
Instructions pour la création du dataset :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
262 |
|
263 |
+
1. QUESTIONS FINANCIÈRES :
|
264 |
+
- Analyse des montants, ratios et variations
|
265 |
+
- Stratégies et objectifs financiers
|
266 |
+
- Risques et opportunités
|
267 |
+
- Dates et échéances importantes
|
|
|
268 |
|
269 |
+
2. QUESTIONS NÉGATIVES :
|
270 |
+
- Au moins 1 question sur {nb_questions} où l'information n'est PAS dans le document
|
271 |
+
- Pour ces questions, mettre "is_negative": true
|
272 |
+
- La réponse DOIT commencer par "Cette information ne figure pas dans le document"
|
|
|
|
|
|
|
|
|
|
|
273 |
|
274 |
+
3. RÈGLES STRICTES :
|
275 |
+
- Questions et réponses TOUJOURS en français
|
276 |
+
- Questions précises et non ambiguës
|
277 |
+
- Pas de répétitions
|
278 |
+
- Format JSON strict
|
279 |
+
- Au moins 1 question négative par image
|
|
|
|
|
280 |
|
281 |
La réponse doit être uniquement le JSON, sans texte supplémentaire."""
|
282 |
|
|
|
315 |
|
316 |
# Vérifier que chaque élément a les bons champs
|
317 |
for qa in qa_pairs:
|
318 |
+
if not all(key in qa for key in ["query", "answer", "langue_document", "is_negative"]):
|
319 |
raise ValueError("Un élément ne contient pas tous les champs requis")
|
320 |
|
321 |
# Vérifier que la langue est fr
|
322 |
+
if qa["langue_document"] != "fr":
|
323 |
+
qa["langue_document"] = "fr"
|
324 |
|
325 |
# Générer un ID unique
|
326 |
qa["id"] = generate_unique_id()
|
|
|
348 |
"image": qa["image"],
|
349 |
"query": qa["query"],
|
350 |
"answer": qa["answer"],
|
351 |
+
"langue_document": qa["langue_document"],
|
352 |
"file_name": qa["file_name"],
|
353 |
"is_negative": qa["is_negative"]
|
354 |
}
|
|
|
400 |
with gr.Blocks() as demo:
|
401 |
gr.Markdown("""
|
402 |
# 🎯 Mini-VLM Dataset Builder
|
|
|
403 |
|
404 |
+
## Créateur de datasets financiers en français pour mini-modèles VLM
|
405 |
|
406 |
+
Cette application permet de créer des datasets de questions/réponses en français à partir de documents financiers
|
407 |
+
(en français ou autres langues) pour entraîner des modèles Vision-Langage (VLM) légers et performants.
|
|
|
408 |
|
409 |
+
### 🔄 Processus :
|
410 |
+
1. Upload de documents (PDF, images)
|
411 |
+
2. Analyse automatique par Gemini
|
412 |
+
3. Génération de Q/R en français
|
413 |
+
4. Création du dataset sur Hugging Face
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
414 |
|
415 |
+
### ⚠️ Prérequis :
|
416 |
+
- [Clé API Gemini](https://makersuite.google.com/app/apikey)
|
417 |
+
- [Token Hugging Face](https://huggingface.co/settings/tokens)
|
418 |
""")
|
419 |
|
420 |
with gr.Row():
|
|
|
434 |
dataset_name = gr.Textbox(
|
435 |
label="📁 Nom du dataset",
|
436 |
placeholder="votre-username/nom-du-dataset",
|
437 |
+
info="Format : username/nom-du-dataset (ex: marsouuu/finance-dataset-fr)"
|
438 |
)
|
439 |
|
440 |
with gr.Column(scale=1):
|
441 |
files = gr.File(
|
442 |
+
label="📄 Documents financiers (PDF, PNG, JPG, JPEG)",
|
443 |
file_count="multiple",
|
444 |
height=200
|
445 |
)
|
446 |
gr.Markdown("""
|
447 |
+
### 📊 Caractéristiques :
|
448 |
+
- Questions et réponses en français
|
449 |
+
- 1 à 5 Q/R par document
|
450 |
+
- Questions négatives incluses
|
451 |
+
- Split train/val/test automatique
|
|
|
|
|
452 |
""")
|
453 |
|
454 |
submit_btn = gr.Button("🚀 Créer le dataset", variant="primary", scale=2)
|