Alignment für Finanzfragen mit SFT, RLAIF und DPO
- Zeitraum
- März bis August 2026
- Zielrollen
- AI Research Scientist · ML Engineer · Applied Scientist
Ich habe einem Modell mit 8 Milliarden Parametern beigebracht, bei Finanzfragen seinen Rechenweg zu zeigen, und dabei einen Messfehler gefunden, der meine eigenen Ergebnisse viel schlechter aussehen ließ, als sie waren.
Kurz gefasst
- Das Problem. Auf 100 FinQA-Testfragen lieferte das Basismodell Llama-3-8B das prüfbare Format „erst Rechenweg, dann Antwort“ in 0 % der Fälle.
- Was ich getan habe. Auf einer einzelnen RTX 4090 habe ich überwachtes Fine-Tuning (SFT) mit LoRA durchgeführt, mit Zephyr-7B-β KI-gelabelte Präferenzpaare erzeugt (RLAIF) und darauf Direct Preference Optimization (DPO) trainiert.
- Das Ergebnis. SFT hob die Formattreue auf 100 % und erreichte 58 % offizielle FinQA-Ausführungsgenauigkeit. DPO kam auf 59 %, ein Abstand, der im Rauschen liegt (McNemar p = 1,0). Ich habe dieses Nullergebnis auf 3 Ursachen zurückgeführt und einen Stopptoken-Fehler gefunden, der eine frühere Halluzinationsrate aufgebläht hatte.
Die Aufgabenstellung
Warum das zählt. Wer von einem KI-Modell eine Zahl bekommt, muss entscheiden, ob diese Zahl Vertrauen verdient. Zeigt das Modell auch, welche Tabellenzeilen es genutzt und welche Rechnung es ausgeführt hat, lässt sich die Zahl in Sekunden prüfen. Bei freier Prosa heißt Prüfen, die Arbeit neu zu machen.
Technische Formulierung. FinQA (Chen u. a., 2021) verbindet Fragen mit Texten und Tabellen aus Geschäftsberichten, dazu ein Muster-Rechenprogramm und eine ausführbare Antwort. Ich habe die Aufgabe als bedingte Generierung gefasst: Aus Kontext und Frage schreibt das Modell einen <thought>-Block mit den stützenden Fakten und dem Rechenprogramm, danach einen <answer>-Block mit der Endzahl.
Umfang. Enthalten: Formatlernen per SFT, Präferenz-Tuning per RLAIF und DPO sowie eine deterministische Evaluation auf zurückgehaltenen Testfragen. Nicht enthalten: Retrieval (das Modell erhält den Kontext seiner Frage) und unbeantwortbare Fragen (dafür wurde kein Testteil ausgewertet).
Erfolgskriterien. Zwei messbare Fragen. Liefert das Modell das prüfbare Format? Berechnet es die richtige Zahl, gemessen mit der offiziellen FinQA-Ausführungsgenauigkeit?
Die Daten
Quelle. Der öffentliche FinQA-Trainingsteil mit 6 251 Beispielen (Chen u. a., 2021, CC BY 4.0). 5 % habe ich zurückgehalten, um Überanpassung zu erkennen, denn ein überangepasstes SFT-Modell ist ein schlechter Ausgangspunkt für DPO.
Formatierung. Jedes Beispiel wurde zu einer Konversation, deren Assistenzzug die Indizes der stützenden Fakten und das Rechenprogramm in <thought> enthält, gefolgt von <answer>.
Präferenzdaten (RLAIF). Für jeden Trainingsprompt schrieb das SFT-Modell 2 Antworten, bei den Temperaturen 0,3 und 0,9. Zephyr-7B-β wählte die bessere nach einem schriftlichen Raster für Paarvergleiche. Paare mit einer Kosinusähnlichkeit über 0,85 habe ich verworfen, weil fast gleiche Antworten dem Präferenz-Loss wenig zum Trennen geben. Übrig blieben 1 647 Paare.
Was mein Audit dieser Daten ergab.
- In 49 % der Paare waren beide Antworten falsch, in 30 % beide richtig. Nur 20 % hatten genau eine richtige Antwort (13 % richtig-falsch, 7 % falsch-richtig), und dort wählte Zephyr in 65,3 % der Fälle die richtige.
- Kein Paar lehrte Verweigerung: Der Datensatz enthält 0 Verweigerungspaare.
- 91,6 % der Sequenzen aus Prompt und gewählter Antwort sind länger als 1 024 Token, und
max_lengthwar nicht gesetzt. Viele wurden also vermutlich abgeschnitten.
Die Architektur
Basislinie. Das Basismodell Llama-3-8B mit demselben Kontext und derselben Frage.
Stufe 1: SFT. LoRA (r = 16, alpha = 32) auf allen Attention- und MLP-Projektionen, Kosinus-Lernratenplan mit 5 % Warmup, paged AdamW, Gradient Checkpointing, effektive Batchgröße 48, 2 Epochen auf einer einzelnen RTX 4090. Die Skripte unterstützen auch DDP über mehrere GPUs. Der Trainingsloss fiel von etwa 2,7 auf 0,785, die Token-Genauigkeit erreichte 80,8 %. Beides sind Trainingswerte. Die Testergebnisse folgen im nächsten Abschnitt.
Stufe 2: RLAIF-Labels. Oben beschrieben. Den Annotator (Zephyr-7B-β) habe ich aus der Evaluation herausgehalten, damit das Modell, das Präferenzen labelt, nicht das Ergebnis bewertet.
Stufe 3: DPO. Der DPO-Trainer von TRL auf einer 4-Bit-NF4-Basis mit LoRA-Adapter, Lernrate 5e-6, 1 Epoche, beta 0,3 im eingecheckten Lauf.
Warum DPO keinen messbaren Gewinn brachte. Ich habe 3 Ursachen gefunden:
- Schwaches Labelsignal. Den meisten Paaren fehlte der Kontrast zwischen richtig und falsch. Wo er bestand, lag der Annotator in 65,3 % der Fälle richtig.
- Abschneiden. Die meisten Sequenzen wurden vermutlich vor der Antwort gekappt.
- Adapter passt nicht. Der eingecheckte DPO-Adapter stammt aus einem älteren Trainingsaufbau, und die aktuelle Evaluationskonfiguration lädt ihn auf das SFT-gemergte Modell. Damit würde das SFT-Update doppelt angewendet.
Was ich für den neuen Lauf im Code geändert habe. Ich merge den SFT-Adapter jetzt in die Basis und trainiere einen frischen LoRA-Adapter. So ist die Referenz-Policy genau das SFT-Modell, wie es die DPO-Herleitung verlangt (Rafailov u. a., 2023, Abschnitt 4). Zephyr bewertet außerdem jedes Paar zweimal mit vertauschter Reihenfolge und behält nur übereinstimmende Urteile, die Korrektur des Positionsbias nach Zheng u. a. (2023, Abschnitt 3.4). Beide Änderungen stehen im Code und sind noch nicht gelaufen.
Evaluation und Ergebnisse
Aufbau. Die ersten 100 FinQA-Testfragen, 1 Stichprobe pro Modell bei Temperatur 0,1. Die Endzahl habe ich mit der offiziellen FinQA-Ausführungsgenauigkeit bewertet, mit 95-%-Konfidenzintervallen.
| Modell | Antwortformat | FinQA-Ausführungsgenauigkeit (95-%-Intervall) |
|---|---|---|
| Basismodell Llama-3-8B | 0 % | Nicht bewertet |
| SFT | 100 % | 58 % (48,2 bis 67,2) |
| SFT + DPO | 100 % | 59 % (49,2 bis 68,1) |
Das Basismodell hat das Antwortformat nie gesehen, seine 0 % sind also konstruktionsbedingt. Fair ist der Vergleich mit einem 3-Shot-Basismodell und einem Instruct-Modell. Beide stehen im Plan für den nächsten Lauf.
Die Zahlen gelesen. SFT und SFT+DPO unterscheiden sich nur bei 6 Fragen, 3 in jede Richtung (McNemar p = 1,0). DPO brachte also keinen messbaren Gewinn. Bei 100 Fragen umfasst jedes Intervall etwa 19 Punkte. Zum Vergleich: FinQANet erreichte 61,24 % Ausführungsgenauigkeit auf FinQA (Chen u. a., 2021, Tabelle 2). Mein SFT-Ergebnis liegt im selben Bereich. Einen direkten Vergleich beanspruche ich nicht: FinQANet nutzt einen Retriever und den vollen Testteil, ich nutzte keins von beiden.
Fehleranalyse: der Stopptoken-Fehler. Mein Chat-Template beendet jeden Assistenzzug mit <|eot_id|> (Token 128009). Das End-Token des Basis-Tokenizers ist <|end_of_text|> (128001), deshalb stoppte die Generierung nie am ersten. Mindestens 99 von 100 SFT-Antworten liefen nach der Antwort weiter und erfanden neue Gesprächszüge. Ein LLM-Richter bewertete den ganzen überlaufenden Text, daraus entstand die Halluzinationsrate von 87 %. Jetzt stoppe ich an <|eot_id|> und schneide beim ersten </answer> ab.
Status. Forschungsprototyp, offline evaluiert.
Links
- FinQA-Alignment-Repository auf GitHub
- DPO-Adapter auf Hugging Face (aus dem eingecheckten Lauf, siehe Grenzen oben)