corrective-rag-data-assistant / scripts /generate_eval_questions.py
nvikou's picture
Upgrade CRAG: embeddings, SQL SQLite, pro UI, 60-eval, local data
98aa813 verified
Raw History Blame Contribute Delete
11.5 kB
"""Génère eval/eval_questions.json (60 questions annotées)."""
from __future__ import annotations
import json
from pathlib import Path
OUT = Path(__file__).resolve().parents[1] / "eval" / "eval_questions.json"
BASE = [
{
"id": "q01",
"question": (
"Quel est le délai de remboursement pour un client "
"professionnel ?"
),
"expected_relevant_doc_ids": [
"refund_policy",
"client_segmentation",
],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q02",
"question": "Quel est le délai de remboursement standard ?",
"expected_relevant_doc_ids": ["refund_policy", "internal_faq"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q03",
"question": (
"Quelle est la politique de retour pour les clients "
"entreprise ?"
),
"expected_relevant_doc_ids": [
"client_segmentation",
"refund_policy",
],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q04",
"question": (
"Quels sont les frais de port à partir de quel montant "
"sont-ils gratuits ?"
),
"expected_relevant_doc_ids": ["shipping_policy"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q05",
"question": (
"Que se passe-t-il en cas de retard de livraison de plus "
"de 5 jours ?"
),
"expected_relevant_doc_ids": ["shipping_policy"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q06",
"question": "Comment escalader une réclamation client en interne ?",
"expected_relevant_doc_ids": ["internal_faq"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q07",
"question": (
"Quels KPI dois-je surveiller pour détecter une baisse "
"de rentabilité ?"
),
"expected_relevant_doc_ids": ["profitability_report"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q08",
"question": "Pourquoi les ventes de la région Sud ont-elles baissé ?",
"expected_relevant_doc_ids": ["profitability_report"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q09",
"question": (
"Quel client a le meilleur chiffre d'affaires en juin ?"
),
"expected_relevant_doc_ids": ["sales_q2_2026"],
"should_answer": True,
"expects_structured": True,
"expected_structured": {
"group_by": "client",
"top_client": "Client F",
"value": 18200,
},
},
{
"id": "q10",
"question": "Quelle est la marge totale du Produit X en janvier ?",
"expected_relevant_doc_ids": ["sales_q1_2026"],
"should_answer": True,
"expects_structured": True,
"expected_structured": {"metric": "marge", "value": 5800},
},
{
"id": "q11",
"question": (
"Quel est le chiffre d'affaires total du Produit X en avril ?"
),
"expected_relevant_doc_ids": ["sales_q2_2026"],
"should_answer": True,
"expects_structured": True,
"expected_structured": {
"metric": "chiffre_affaires",
"value": 25200,
},
},
{
"id": "q12",
"question": "Quel sera le chiffre d'affaires le mois prochain ?",
"expected_relevant_doc_ids": [],
"should_answer": False,
"expects_structured": False,
},
{
"id": "q13",
"question": (
"Quel est le taux d'intérêt appliqué aux emprunts "
"bancaires de l'entreprise ?"
),
"expected_relevant_doc_ids": [],
"should_answer": False,
"expects_structured": False,
},
{
"id": "q14",
"question": (
"Quelle est la politique de retour applicable dans un "
"pays non couvert par nos contrats ?"
),
"expected_relevant_doc_ids": [],
"should_answer": False,
"expects_structured": False,
},
{
"id": "q15",
"question": (
"Combien de jours ouvrés pour valider une demande de "
"remboursement avant émission ?"
),
"expected_relevant_doc_ids": ["refund_policy"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q16",
"question": (
"Quelles sont les conditions de paiement pour un compte "
"Grand Compte ?"
),
"expected_relevant_doc_ids": ["client_segmentation"],
"should_answer": True,
"expects_structured": False,
},
{
"id": "q17",
"question": (
"Quel est le futur cours de l'action de l'entreprise "
"en bourse ?"
),
"expected_relevant_doc_ids": [],
"should_answer": False,
"expects_structured": False,
},
{
"id": "q18",
"question": "Un produit soldé à plus de 50% est-il remboursable ?",
"expected_relevant_doc_ids": ["refund_policy"],
"should_answer": True,
"expects_structured": False,
},
]
EXTRA = [
(
"Quel délai pour un remboursement carte bancaire ?",
["refund_policy"],
True,
False,
),
(
"Les produits personnalisés sont-ils remboursables ?",
["refund_policy"],
True,
False,
),
(
"Comment ouvrir un ticket de remboursement ?",
["refund_policy"],
True,
False,
),
(
"Que faire en cas de livraison non conforme ?",
["refund_policy"],
True,
False,
),
(
"Quel est le délai de livraison en France métropolitaine ?",
["shipping_policy"],
True,
False,
),
(
"Quel délai de livraison à l'international ?",
["shipping_policy"],
True,
False,
),
(
"Comment suivre une commande expédiée ?",
["shipping_policy"],
True,
False,
),
(
"Les frais de port professionnels dépendent de quoi ?",
["shipping_policy"],
True,
False,
),
(
"Quelle est la différence entre Professionnel et Grand compte ?",
["client_segmentation"],
True,
False,
),
(
"Quel délai de paiement pour un client Professionnel ?",
["client_segmentation"],
True,
False,
),
(
"Un client B2B a-t-il 30 jours de retour ?",
["client_segmentation"],
True,
False,
),
(
"Où trouver les conditions de retour B2B spécifiques ?",
["client_segmentation"],
True,
False,
),
(
"Un client pro a-t-il un délai de remboursement différent ?",
["internal_faq", "refund_policy"],
True,
False,
),
(
"Où trouver les chiffres de vente exacts ?",
["internal_faq"],
True,
False,
),
(
"Quel est le taux de retour client à surveiller ?",
["profitability_report"],
True,
False,
),
(
"Quel produit est le moins rentable selon le rapport ?",
["profitability_report"],
True,
False,
),
(
"Quelle action corrective est prévue pour la région Sud ?",
["profitability_report"],
True,
False,
),
(
"Quel est le délai moyen de paiement Grand Compte à alerter ?",
["profitability_report"],
True,
False,
),
(
"Quel client a le meilleur CA en mai ?",
["sales_q2_2026"],
True,
True,
),
(
"Quelle est la marge totale du Produit Y en février ?",
["sales_q1_2026"],
True,
True,
),
(
"Quel est le CA total en mars pour le Produit X ?",
["sales_q1_2026"],
True,
True,
),
(
"Quel est le chiffre d'affaires du Produit Z en juin ?",
["sales_q2_2026"],
True,
True,
),
(
"Quelle est la marge du Client F en juin ?",
["sales_q2_2026"],
True,
True,
),
(
"Quel est le meilleur client en chiffre d'affaires en avril ?",
["sales_q2_2026"],
True,
True,
),
(
"Quel est le CA total de la région Nord en janvier ?",
["sales_q1_2026"],
True,
True,
),
(
"Quelle est la marge totale en mai ?",
["sales_q2_2026"],
True,
True,
),
("Quel sera le bénéfice net dans 3 ans ?", [], False, False),
("Quel est le salaire du PDG ?", [], False, False),
(
"Donne-moi le code source du moteur de pricing ?",
[],
False,
False,
),
(
"Quelle est la politique RH des congés parentaux ?",
[],
False,
False,
),
(
"Peux-tu prédire les ventes de décembre 2027 ?",
[],
False,
False,
),
(
"Quel est le stock exact en entrepôt ce soir ?",
[],
False,
False,
),
(
"Les abonnements déjà activés sont-ils remboursés intégralement ?",
["refund_policy"],
True,
False,
),
(
"Un avoir peut-il être imputé sur la prochaine facture B2B ?",
["refund_policy"],
True,
False,
),
(
"Sous quel délai un agent valide une demande de remboursement ?",
["refund_policy"],
True,
False,
),
(
"Que se passe-t-il si le produit est défectueux ?",
["refund_policy"],
True,
False,
),
(
"Les délais de livraison changent-ils pendant les soldes ?",
["shipping_policy"],
True,
False,
),
(
"Un particulier a-t-il un support dédié ?",
["client_segmentation"],
True,
False,
),
(
"Quelle remise volume pour un Grand compte ?",
["client_segmentation"],
True,
False,
),
(
"Comment escalader une réclamation niveau 2 ?",
["internal_faq"],
True,
False,
),
(
"Pourquoi le Produit X a-t-il une meilleure marge ?",
["profitability_report"],
True,
False,
),
(
"Quel seuil d'alerte pour le coût logistique ?",
["profitability_report"],
True,
False,
),
]
def main() -> None:
out = list(BASE)
n = len(out)
for question, docs, should, structured in EXTRA:
n += 1
out.append(
{
"id": f"q{n:02d}",
"question": question,
"expected_relevant_doc_ids": docs,
"should_answer": should,
"expects_structured": structured,
}
)
OUT.write_text(
json.dumps(out, indent=2, ensure_ascii=False),
encoding="utf-8",
)
print(f"Écrit {len(out)} questions -> {OUT}")
if __name__ == "__main__":
main()