Alignement pour les questions-réponses financières par SFT, RLAIF et DPO
- Période
- De mars à août 2026
- Postes visés
- AI Research Scientist · ML Engineer · Applied Scientist
J'ai appris à un modèle de 8 milliards de paramètres à montrer son raisonnement sur des questions financières, et j'ai trouvé un défaut de mesure qui faisait paraître mes propres résultats bien pires qu'ils ne l'étaient.
En bref
- Le problème. Sur 100 questions de test FinQA, le modèle Llama-3-8B de base a produit le format vérifiable « raisonnement puis réponse » dans 0 % des cas.
- Ce que j'ai fait. Sur une seule RTX 4090, j'ai mené un affinage supervisé (SFT) avec LoRA, construit avec Zephyr-7B-β des paires de préférence étiquetées par une IA (RLAIF, apprentissage par renforcement à partir de retours d'IA), puis entraîné une optimisation directe par préférence (DPO) sur ces paires.
- Le résultat. Le SFT a porté le respect du format à 100 % et atteint 58 % d'exactitude d'exécution FinQA officielle. Le DPO obtient 59 %, un écart qui se confond avec le bruit (test de McNemar, p = 1,0). J'ai remonté ce résultat nul à trois causes, et trouvé un défaut de jeton d'arrêt qui avait gonflé un ancien taux d'hallucination.
L'énoncé du problème
Pourquoi c'est important. Un analyste qui reçoit un chiffre d'un modèle d'IA doit décider s'il lui fait confiance. Si le modèle montre aussi les lignes du tableau utilisées et le calcul effectué, l'analyste vérifie le chiffre en quelques secondes. S'il répond en prose libre, vérifier revient à refaire le travail.
Formulation technique. FinQA (Chen et coll., 2021) associe des questions à des textes et des tableaux issus de rapports financiers d'entreprises, avec un programme de raisonnement de référence et une réponse exécutable. J'ai posé la tâche comme une génération conditionnelle : à partir du contexte et de la question, le modèle écrit un bloc <thought> avec les faits d'appui et le programme de raisonnement, puis un bloc <answer> avec le chiffre final.
Périmètre. Inclus : l'apprentissage du format par SFT, l'ajustement par préférence par RLAIF et DPO, et une évaluation déterministe sur des questions de test mises de côté. Exclus : la recherche documentaire (le modèle reçoit le contexte de sa question) et les questions sans réponse (aucun jeu de questions sans réponse n'a été évalué).
Critères de réussite. Deux questions mesurables. Le modèle produit-il le format vérifiable ? Calcule-t-il le bon chiffre, mesuré par l'exactitude d'exécution officielle de FinQA ?
Les données
Source. L'ensemble d'entraînement public de FinQA : 6 251 exemples (Chen et coll., 2021, licence CC BY 4.0). J'en ai mis 5 % de côté pour surveiller le surapprentissage, car un modèle SFT surappris constitue un mauvais point de départ pour le DPO.
Mise en forme. Chaque exemple devient une conversation dont le tour de l'assistant contient les indices des faits d'appui et le programme de raisonnement dans <thought>, suivis de <answer>.
Données de préférence (RLAIF). Pour chaque question d'entraînement, le modèle SFT a écrit deux réponses, aux températures 0,3 et 0,9. Zephyr-7B-β a choisi la meilleure selon une grille écrite de comparaison par paires. J'ai écarté les paires dont la similarité cosinus dépasse 0,85, car deux réponses presque identiques laissent peu à départager pour la perte de préférence. Il est resté 1 647 paires.
Ce que mon audit de ces données a révélé.
- Les deux réponses étaient fausses dans 49 % des paires et justes dans 30 %. Seules 20 % comptaient une seule réponse juste (13 % juste-fausse, 7 % fausse-juste), et dans ces paires Zephyr a choisi la bonne dans 65,3 % des cas.
- Le jeu compte 0 paire de refus : rien n'y enseigne au modèle à refuser.
- 91,6 % des séquences « instruction plus réponse retenue » dépassent 1 024 jetons, alors que
max_lengthn'était pas fixé. Beaucoup ont donc probablement été tronquées.
L'architecture
Référence. Le modèle Llama-3-8B de base, avec le même contexte et la même question.
Étape 1 : SFT. LoRA (r = 16, alpha = 32) sur toutes les projections d'attention et MLP, calendrier en cosinus avec 5 % de préchauffage, AdamW paginé, point de reprise de gradient, lot effectif de 48, deux époques sur une seule RTX 4090. Les scripts acceptent aussi plusieurs GPU en DDP. La perte d'entraînement est passée d'environ 2,7 à 0,785 et l'exactitude par jeton a atteint 80,8 %. Ce sont deux mesures d'entraînement. Les résultats de test figurent plus bas.
Étape 2 : étiquettes RLAIF. Décrite plus haut. J'ai tenu l'annotateur (Zephyr-7B-β) à l'écart de l'évaluation : le modèle qui étiquette les préférences ne note pas le résultat.
Étape 3 : DPO. L'entraîneur DPO de TRL sur une base quantifiée en NF4 sur 4 bits, avec un adaptateur LoRA, un taux d'apprentissage de 5e-6, une époque et beta 0,3 dans l'exécution versionnée.
Pourquoi le DPO n'a apporté aucun gain mesurable. J'ai trouvé trois causes :
- Signal d'étiquetage faible. La plupart des paires n'opposaient pas une réponse juste à une fausse. Quand c'était le cas, l'annotateur avait raison dans 65,3 % des cas.
- Troncature. La plupart des séquences étaient probablement coupées avant la réponse.
- Adaptateur incohérent. L'adaptateur DPO versionné vient d'une ancienne conception de l'entraînement, et la configuration d'évaluation actuelle le charge sur le modèle SFT fusionné. La mise à jour SFT serait alors appliquée deux fois.
Ce que j'ai changé dans le code pour la nouvelle exécution. Je fusionne désormais l'adaptateur SFT dans la base et j'entraîne un LoRA neuf, pour que la politique de référence soit exactement le modèle SFT, comme l'exige la dérivation du DPO (Rafailov et coll., 2023, section 4). Zephyr juge aussi chaque paire deux fois en inversant l'ordre des réponses et garde uniquement les verdicts cohérents, la correction du biais de position décrite par Zheng et coll. (2023, section 3.4). Les deux changements sont dans le code et n'ont pas encore tourné.
L'évaluation et les résultats
Protocole. Les 100 premières questions de test FinQA, un échantillon par modèle à la température 0,1. J'ai noté le chiffre final avec l'exactitude d'exécution officielle de FinQA, accompagnée d'intervalles de confiance à 95 %.
| Modèle | Format de réponse | Exactitude d'exécution FinQA (intervalle à 95 %) |
|---|---|---|
| Llama-3-8B de base | 0 % | Non mesurée |
| SFT | 100 % | 58 % (48,2 à 67,2) |
| SFT + DPO | 100 % | 59 % (49,2 à 68,1) |
Le modèle de base n'a jamais vu le format de réponse, donc ses 0 % sont garantis par construction. La comparaison équitable passe par un modèle de base avec trois exemples (3-shot) et par un modèle Instruct, tous deux prévus dans la prochaine exécution.
Lecture des chiffres. SFT et SFT+DPO diffèrent sur 6 questions seulement, 3 dans chaque sens (test de McNemar, p = 1,0) : le DPO n'apporte aucun gain mesurable. Avec 100 questions, chaque intervalle couvre environ 19 points. À titre de repère, FinQANet atteint 61,24 % d'exactitude d'exécution sur FinQA (Chen et coll., 2021, tableau 2). Mon résultat SFT se situe dans la même zone. Je ne revendique aucune comparaison directe : FinQANet utilise un module de recherche et le jeu de test complet, et je n'ai utilisé ni l'un ni l'autre.
Analyse d'erreur : le défaut du jeton d'arrêt. Mon gabarit de conversation termine chaque tour de l'assistant par <|eot_id|> (jeton 128009). Le jeton de fin du tokeniseur de base est <|end_of_text|> (128001), donc la génération ne s'arrêtait jamais sur le premier. Au moins 99 réponses SFT sur 100 continuaient après la réponse et inventaient de nouveaux tours. Un modèle juge notait tout ce texte, d'où le taux d'hallucination de 87 %. J'arrête désormais la génération sur <|eot_id|> et je coupe au premier </answer>.
Statut. Prototype de recherche, évalué hors ligne.
Les liens
- Dépôt d'alignement FinQA sur GitHub
- Adaptateur DPO sur Hugging Face (issu de l'exécution versionnée, voir les limites ci-dessus)