Aufgabe
Lieferanten schicken Verträge zu ihren eigenen Bedingungen, Rechnungen kommen mit falschen Summen, Preisen über den vereinbarten und manchmal mit einem ausgetauschten Bankkonto. Jurist und Buchhaltung prüfen alles von Hand. Gebraucht wurde eine Prüfung, die den Vertrag mit dem Muster und die Rechnung mit Vertrag, Preisliste und Bestellung vergleicht, jeden Befund erklärt und die Änderungen in Word und Excel liefert. Die Demo sollte ohne Registrierung öffnen und nichts kosten.
Lösung
Die Entscheidungen trifft der Code, nicht ein Modell. Die Zuordnung findet nur, womit verglichen wird: eine Musterklausel, eine Position der Preisliste, eine Bestellzeile. Ein Paar zählt, wenn die Texte sich in Buchstabenfolgen und gemeinsamen Wörtern ähneln, eine gleiche Klauselnummer gibt zusätzliche Sicherheit, so findet eine umnummerierte Klausel ihr Muster und eine neue bleibt neu. Danach arbeiten die Regeln des Juristen, Prüfziffern und Arithmetik, jeder Befund hat Grund und richtige Fassung. In Word werden die Änderungen Wort für Wort eingetragen, wie ein Jurist es tun würde, und der Lieferant nimmt jede an oder lehnt sie ab.
Umgesetzte Aufgaben
- Zuordnung ohne neuronales Modell gebaut: Buchstabenfolgen, gemeinsame Wörter und die Klauselnummer ordnen einer Vertragsklausel ihr Muster und einer Rechnungszeile Preisliste und Bestellung zu
- Die Regeln des Juristen als eigene Datei: regulärer Ausdruck, Prüfung und Begründung in Worten
- Die ganze Rechnung geprüft: Zeilen, Summe, MwSt-Satz und -Betrag, Betrag in Worten, Grundlage
- Bankdaten über die Prüfziffern von ИНН, ОГРН und Konto mit der БИК der Bank geprüft und mit dem Vertrag verglichen
- Scans lesbar gemacht: Tesseract auf dem Server, Tabellenlinien werden vor der Erkennung entfernt
- Berichte in Excel und Word gebaut: der Vertrag mit Änderungsverfolgung und Kommentaren, ein Brief an den Lieferanten zur Rechnung
- GigaChat und OpenAI-kompatible Modelle hinter einer Schnittstelle: das Modell liest nur Rechnungszeilen, die die Regeln nicht gefunden haben
- Die Demo begrenzt: 10 eigene Dateien am Tag, jede Prüfung in einem eigenen Prozess, Dateien leben eine Stunde, der Container bleibt bei etwa 40 MB
Ergebnis
Der Abnahmetest: in drei Beispielen, einem Vertrag, einer Rechnung und einer gescannten Rechnung, werden alle 25 eingebauten Fehler gefunden, und das Muster gegen sich selbst sowie eine saubere Rechnung bekommen keinen Befund. Ein Rechnungsscan wird in etwa 5 Sekunden gelesen, jede Prüfung läuft in einem eigenen Prozess, und im Leerlauf braucht der Container etwa 40 MB Speicher. Die Demo auf dieser Website ist derselbe Container: Dateien werden nicht gespeichert, Berichte sind eine Stunde lang abrufbar.
Anmerkung des Entwicklers
Was schwierig war
Am schwierigsten waren Scans: Tesseract las die Tabellenlinien als „|“ und „[“ und verlor Zeilennummern und Ziffern daneben. Lange Linien vor der Erkennung zu entfernen half: Buchstaben haben keine so langen Striche, also verschwindet nur das Raster. Das Zweite waren Packungsgrößen: als Text sind „Sack 25 kg“ und „Sack 50 kg“ fast gleich, deshalb werden Gewicht und Fettgehalt getrennt verglichen.
Was leicht fiel
Die Rechnungsarithmetik ging leicht: Zeilen, Summe, MwSt und Betrag in Worten werden exakt geprüft, ohne Schwellen.
Technologien
PythonFastAPITesseract OCRpypdfpython-docxopenpyxlGigaChatDocker