Seit einigen Jahren nutze ich Beancount, um unsere Familienfinanzen im Blick zu behalten. Beancount ist ein doppelte Buchführungssystem, das auch eine benutzerfreundliche Oberfläche (fava) bietet, mit der man Einblicke in die Finanzströme gewinnen kann. Dies ist besonders hilfreich, um reale Daten über die Preisentwicklung zu haben und zu überprüfen, ob es falsche Buchungen gab oder ob retournierte Artikel tatsächlich zurückgegeben wurden.
Unser Prozess beinhaltet normalerweise das Abrufen von CSV-Dateien mit den Buchungen der Banken/Kreditkarten und die Konsolidierung in einer Datenbank über eine JavaScript-Anwendung. Aus der Datenbank wird dann ein zweiter Prozess mit Python/ML angestoßen, der Kategorien für jede Buchung vorschlägt und die Buchungen im von Beancount erwarteten Format erstellt. Soweit, so gut. Wir hatten immer ein Problem mit Buchungen von amazon.de, da man nicht direkt erkennen kann, um welche Art von Buchung es sich handelt (war es etwas für das Haus, Kleidung, etc.?). Da wir intensive Amazon-Nutzer sind, haben wir viele Buchungen im Monat.
Also brauchten wir eine Lösung, die uns zumindest eine konsolidierte Ansicht der Bestellungen in unseren amazon.de-Konten bietet. Noch besser wäre es, wenn wir die Daten als Input nutzen könnten, um Kontovorschläge per KI zu erhalten. Aber es ist nicht einfach, als normaler Verbraucher die Bestellungen in einem maschinenlesbaren Format wie JSON oder CSV zu bekommen. In den USA gibt es sogar kostenpflichtige Dienste, die dies anbieten, aber sie funktionieren nicht in Europa. Nach einiger Recherche (denn wahrscheinlich bin ich nicht der Einzige mit diesem Problem) und dem Fehlen einer praktischen Lösung (es gibt Chrome-Erweiterungen, die versuchen, eine CSV-Datei zu generieren, aber das lief nicht so reibungslos wie erwartet) kam ich zu der Erkenntnis, dass ich eine andere Art von Lösung benötigte.
Dann kam mir der Gedanke, dass ich meine Daten vielleicht auf eine andere Weise erhalten könnte: Amazon sendet nach jeder Bestellung eine Zusammenfassung der Bestellung über bestellbestaetigung@amazon.de. Das Parsen dieser E-Mails könnte das gewünschte Ergebnis bringen.
Als Gmail-Nutzer kann ich die leistungsstarke API von Gmail nutzen, um den Text dieser E-Mails abzurufen, was ich mit einem weiteren Python-Skript getan habe.
Mit Hilfe eines LLM-Modells konnte ich dann eine JSON-Datei mit folgendem Prompt erstellen: „Sie sind ein Parser-Experte. Ich werde Ihnen einen Text übermitteln, der den Inhalt von E-Mails enthält, die Amazon nach jeder Bestellung sendet. Extrahieren Sie die Bestellnummer, das Bestelldatum, die bestellten Artikel und deren Preis sowie den Gesamtpreis dieser Bestellung. Geben Sie dies als JSON zurück. Der Text wird zwischen Dollar-Zeichen ($) bereitgestellt. Hier beginnt er $<text>$“.
{
"order_number": "302-3116391-0993119",
"order_date": "Donnerstag, 29 August",
"articles": [
{
"name": "Fahrradgabel Sternmutter Setter Steuersätze Star Nut Einbau Mutter Einstellwerkzeug für 22.2 25.4 28.6mm",
"price": "EUR 13,99"
},
{
"name": "Geschmackspulver MIX PACK mit 8x30g Proben, 8 unglaublich leckere Flavours, nur 8-14 kcal pro Portion, Aroma & angenehme Süße, vielseitig einsetzbar für Lebensmittel & Getränke, FLAVOUR UP",
"price": "EUR 18,65"
},
{
"name": "Gakago Rohrschneider Set 3-50mm mit Entgrater - Vielseitiger Rohrabschneider für alle gängigen Metalle wie Edelstahl, Kupfer, Aluminium, Stahl oder Kunststoff (bspw. PVC & PE) auch als Verbundrohr",
"price": "EUR 24,95"
},
{
"name": "Gakago Rorschneider Ersatzklingen für 5-50mm und 6-70mm (2er Pack) - Für alle gängigen Metalle wie Edelstahl, Kupfer, Aluminium, Stahl oder Kunststoff (bspw. PVC & PE) aus langlebigem Werkzeugstahl",
"price": "EUR 9,95"
}
],
"total_price": "EUR 67,54"
}
Dies lieferte ein JSON für diese E-Mail, das so aussieht:
Bereits alle diese Bestellungen in diesem Format zu haben, war eine Verbesserung im Vergleich dazu, die Bestellhistorie auf der Amazon-Seite durchzugehen. Vielleicht werde ich es als Input für einen weiteren Prozess verwenden, der eine Kategorisierung für jeden Artikel im Beancount-Format zurückgibt.
Für mich ein weiteres großartiges Beispiel dafür, wie man LLMs im Alltag nutzen kann.
Vielleicht, wenn Interesse besteht, werde ich den Code ein wenig aufräumen und öffentlich machen – lassen Sie es mich in diesem Fall wissen.
Dieser Artikel wurde auf English in Medium und LinkedIN veröffentlicht.