Add structured AI analysis output and invoice ID validation

This commit is contained in:
admin committed 2026-09-11 14:33:31 +02:00
1 parent 12bc2a1822
commit 5b697ee200
8 files changed
+298 -16

No files matched your search

+27 -6
View File
@@ -25,11 +25,32 @@ Unterscheide Dateistrukturfehler von fachlichen Rechnungsfehlern.
Bei Rejected darfst du aus leeren rows und Zählern von null
nicht auf eine fehlerfreie Datei schließen.
Antworte auf Deutsch:
1. Eine kurze Zusammenfassung.
2. Eine Tabelle mit den Spalten:
Betroffene Zeile/Rechnung, Befund, Regelkennung,
nächster Prüfschritt, fehlende Information.
Ausgabeformat:
Antworte ausschließlich als JSON-Objekt gemäß dem im API-Aufruf
vorgegebenen Schema. Verwende keine Markdown-Codeblöcke.
- summary: Kurze deutsche Zusammenfassung. Unterscheide abgeschlossene
Prüfung, abgewiesene Datei und fachliche Prüfergebnisse.
- findings: Ein Eintrag je gemeldetem Fehler mit genau einer Regelkennung.
Übernimm ausschließlich Fehler aus dem Prüfbericht.
- lineNumber: Originalzeilennummer einschließlich Kopfzeile;
null, wenn nicht bekannt.
- invoiceId: Rechnungsnummer aus dem Bericht;
null, wenn sie fehlt oder nicht bekannt ist.
- description: Belegter Fehlerbefund auf Deutsch.
- nextCheck: Konkreter Prüfschritt auf Deutsch, ohne unbekannte
Ursachen als Tatsachen darzustellen.
- missingInformation: Liste der für die Klärung fehlenden Informationen.
Verwende eine leere Liste, wenn keine fehlen.
- limitations: Grenzen der Analyse auf Deutsch, insbesondere
nicht durchgeführte Prüfungen und fehlende Belege.
Bei Rejected beschreiben die findings ausschließlich Dateifehler.
Erfinde keine fachlichen Rechnungsfehler.
Ohne gemeldete Fehler ist findings eine leere Liste.
Die Analyse erteilt keine Importfreigabe.
Wenn eine Erklärung nicht durch die Quellen gedeckt ist,
benenne diese Grenze ausdrücklich.
@@ -47,4 +68,4 @@ Verwende für isValid=true die Formulierung:
Nicht geprüfte Eigenschaften sind unbekannt.
Insbesondere erlaubt die fehlende Währungsprüfung keine Aussage
darüber, ob die Währung korrekt oder fehlerhaft ist.
darüber, ob die Währung korrekt oder fehlerhaft ist.
+69
View File
@@ -0,0 +1,69 @@
{
"type": "object",
"properties": {
"summary": {
"type": "string"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"lineNumber": {
"type": ["integer", "null"],
"description": "Zeilennummer aus dem Prüfbericht, einschließlich Kopfzeile; null, falls unbekannt."
},
"invoiceId": {
"type": ["string", "null"],
"description": "Rechnungsnummer aus dem Prüfbericht; null, falls sie fehlt oder nicht bekannt ist."
},
"ruleId": {
"type": "string",
"enum": [
"CSV-001",
"INV-001",
"INV-002",
"INV-003",
"INV-004"
]
},
"description": {
"type": "string",
"description": "Durch den Prüfbericht belegter Fehlerbefund."
},
"nextCheck": {
"type": "string",
"description": "Nächster Prüfschritt, ohne unbekannte Ursachen als Tatsachen darzustellen."
},
"missingInformation": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"lineNumber",
"invoiceId",
"ruleId",
"description",
"nextCheck",
"missingInformation"
],
"additionalProperties": false
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"summary",
"findings",
"limitations"
],
"additionalProperties": false
}
+39 -1
View File
@@ -174,4 +174,42 @@ Bewertung: für diesen Testlauf bestanden.
### Grenzen
Je ein manueller C#-Testlauf pro Fall.
Keine Aussage über zuverlässige Wiederholbarkeit oder andere Eingaben.
Die Antworten werden bislang als Freitext ausgegeben und manuell geprüft.
Die Antworten werden bislang als Freitext ausgegeben und manuell geprüft.
## Strukturierte C#-Testläufe vom 11.09.2026
### Konfiguration
- Modellbereitstellung: importassist-analysis
- Antwortschema: docs/ai-analysis.schema.json
- Structured Outputs mit aktiviertem strikten Modus
- Deserialisierung in InvoiceAnalysis und AnalysisFinding
- Maximale Ausgabetokens: 2000
### Completed-Bericht
- JSON erfolgreich in C# eingelesen.
- Sechs Befunde mit korrekten Zeilen und Regelkennungen.
- limitations korrekt als Liste auf oberster Ebene.
- Fehlende Rechnungsnummer in Zeile 6 als leerer String statt null.
Das Schema erlaubt diesen String; die semantische Vorgabe wurde verletzt.
- Empfehlung zur Änderung auf einen positiven Betrag zu pauschal.
Der fachlich richtige Betrag muss zuerst anhand der Quelle geklärt werden.
- Tokenverbrauch: 1894 Eingabe, 874 Ausgabe.
Bewertung: Struktur bestanden, fachliche Prüfung teilweise bestanden.
### Rejected-Bericht
- JSON erfolgreich in C# eingelesen.
- Genau ein Befund: CSV-001, Zeile 3, invoiceId null.
- Keine konkrete Fehlerursache erfunden.
- Fehlende Originalzeile und ausgebliebene fachliche Prüfung benannt.
- Tokenverbrauch: 1662 Eingabe, 236 Ausgabe.
Bewertung: festgelegte Kriterien in diesem Lauf bestanden.
### Offene Punkte
- Leere oder ausschließlich aus Leerzeichen bestehende invoiceId
zusätzlich in C# zurückweisen; bei fehlender Nummer ist null vorgesehen.
- Korrekturvorschläge müssen den fachlich richtigen Quellwert respektieren.
- Ablehnungen, abgebrochene Antworten und ungültige Antwortstrukturen
werden im Code behandelt, wurden aber noch nicht gezielt getestet.
- Einzelne erfolgreiche Läufe belegen keine zuverlässige Wiederholbarkeit.