Produktklassifizierung und Textoptimierung mit Python und LLMs

Automatische Produktklassifizierung und Textoptimierung mit Python und LLMs

Ich habe ein kleines, aber nützliches Python-Skript entwickelt, das Produktdaten aus einer CSV-Datei einliest, automatisch einer passenden Kategorie zuordnet und die Beschreibung optimiert. Die Idee dahinter war es, zu testen, wie gut sich Large Language Models (LLMs) wie „gemma3:4b“ für solche Aufgaben eignen. Dabei kombiniere ich Pandas für die Datenverarbeitung mit einer einfachen API-Anbindung, um die Produktinformationen zu erweitern. Das Skript ist zwar kein komplexes KI-System, aber es zeigt, wie sich mit wenigen Zeilen Code manuelle Arbeitsschritte automatisieren lassen – besonders im Bereich E-Commerce oder für größere Produktkataloge.

In meinem Ansatz beginnt alles mit der Funktion, die CSV-Daten einliest. Mithilfe von Pandas und StringIO verwandle ich einen einfachen CSV-String in ein DataFrame. Dieser Schritt ist essenziell, da er mir erlaubt, die Produktdaten in einer strukturierten Form weiterzuverarbeiten. 

Der nächste Teil des Projekts dreht sich um die LLM-basierte Produktklassifizierung. Hier habe ich das Paket „ollama“ verwendet, um das Modell „gemma3:4b“ anzusteuern. In der Funktion, die ich „classify_product_llm“ nenne, definiere ich zunächst einen Systemprompt, der dem Modell klare Anweisungen gibt: Es soll den Produktnamen und die Beschreibung entgegennehmen und diese einem vorgegebenen Kategorien-Schema (wie Elektronik, Haushaltswaren, Kleidung oder Gartenartikel) zuordnen. Mir war dabei wichtig, dass das Modell ausschließlich den Kategorienamen zurückgibt, um Missverständnisse zu vermeiden.

Parallel dazu habe ich eine weitere Funktion hinzugefügt, „rewrite_description“, die sich auf die Optimierung der Produktbeschreibung konzentriert. Mit einem anderen Systemprompt sorge ich dafür, dass die bestehende Beschreibung SEO-optimiert und zugleich ansprechender formuliert wird. Hier war es mir besonders wichtig, die Balance zu finden zwischen technischer Präzision und einer natürlichen, verkaufsfördernden Sprache. Ich wollte vermeiden, dass neue Details hinzugefügt werden – der Text sollte lediglich verbessert und leserfreundlicher gestaltet werden.

Um den Mehrwert der generierten Daten sichtbar zu machen, habe ich eine Funktion geschrieben, die über alle Produkte im DataFrame iteriert und sowohl die Klassifizierung als auch die Textoptimierung anwendet. In „enrich_data_with_classification“ sammle ich die Ergebnisse und erweitere den Datensatz um die neuen Spalten „PredictedCategory“ und „new_descriptions“. Beim Debugging und Testen des Codes habe ich an dieser Stelle viele Male Ausgaben in der Konsole verwendet, um sicherzustellen, dass jedes Produkt korrekt verarbeitet wird.

Im Hauptteil des Programms habe ich Beispiel-CSV-Daten definiert, diese eingelesen und dann die gesamte Verarbeitungskette durchlaufen lassen. Der finale Schritt, das Speichern des erweiterten DataFrames in einer CSV-Datei, rundet das Projekt ab. Diese Ausgabe in eine Datei ermöglicht es, die Ergebnisse auch extern weiterzuverwenden oder in andere Systeme zu importieren.

import pandas as pd
from io import StringIO
from ollama import chat

def load_data(csv_data: str) -> pd.DataFrame:
    „““
    Liest CSV-Daten aus einem String ein.
    „““
    df = pd.read_csv(StringIO(csv_data))
    return df

def classify_product_llm(name: str, description: str) -> str:
    „““
    Verwendet das ollama-Paket, um das Modell „gemma3:4b“ anzusteuern und
    mithilfe eines Systemprompts sowie des Produkts (Name und Beschreibung)
    eine Kategorie zu bestimmen.
    „““
    system_prompt = (
        „““
        Du bist ein Experte für Produktklassifizierung. Ordne das Produkt in eine der folgenden Kategorien ein:
        Elektronik: Computer, Smartphones, Fernseher, Audio-Geräte, Kameras, Wearables.
        Haushaltswaren: Küchengeräte, Staubsauger, Bügeleisen, Waschmaschinen, Toaster, Lampen.
        Kleidung: Schuhe, Jacken, T-Shirts, Hosen, Pullover.
        Gartenartikel: Gartengeräte, Pflanzenzubehör, Rasenmäher, Heckenscheren.
        Antworte ausschließlich mit dem Kategorienamen.
        „““
    )
   
    user_prompt = f“Produktname: {name}\nBeschreibung: {description}“
   
    # Sende die Nachrichten an das Modell
    response = chat(
        model=“gemma3:4b“,  # gemma3 referenziert standardmäßig gemma3:4b
        messages=[
            {„role“: „system“, „content“: system_prompt},
            {„role“: „user“, „content“: user_prompt},
        ],
    )
   
    # Extrahiere und bereinige die Antwort
    category = response.message.content.strip()
    return category if category else „Unbekannt“



def rewrite_description(name: str, description: str) -> str:
    „““
    Verwendet das ollama-Paket, um das Modell „gemma3:4b“ anzusteuern und
    mithilfe eines Systemprompts sowie des Produkts (Name und Beschreibung)
    eine Kategorie zu bestimmen.
    „““
    system_prompt = (
        „““
        Du bist ein Experte für E-Commerce und SEO-optimierte Produktbeschreibungen.
        Deine Aufgabe ist es, die gegebene Produktbeschreibung zu verbessern, indem du sie:
        Leserfreundlich formulierst.
        Relevante Keywords einbaust (ohne Keyword-Stuffin.g)
        Eine emotionale und verkaufsstarke Sprache nutzt.
        Erfinde keine Produktdetails – Es dürfen nur die vorhandenen Artikelinformationen angegeben werden, um zu verhindern, dass ausgedachte Details hinzugefügt werden.
        Die Beschreibung leicht verständlich und ansprechend hälst.
        Verwende eine natürliche, aber verkaufsstarke Tonalität, als würde ein professioneller Online-Shop sie schreiben.
        Schreibe in kurzen Sätzen, verwende Bulletpoints bei vielen Vorteilen und formuliere den Text so, dass er die Kaufentscheidung positiv beeinflusst.
        Gib nur die optimierte Beschreibung zurück, ohne weitere Erklärungen.
        „““
    )
   
    user_prompt = f“Produktname: {name}\nBeschreibung: {description}“
   
    # Sende die Nachrichten an das Modell
    response = chat(
        model=“gemma3:4b“,  # gemma3 referenziert standardmäßig gemma3:4b
        messages=[
            {„role“: „system“, „content“: system_prompt},
            {„role“: „user“, „content“: user_prompt},
        ],
    )
   
    # Extrahiere und bereinige die Antwort
    new_description = response.message.content.strip()
    return new_description if new_description else „Unbekannt“

def enrich_data_with_classification(df: pd.DataFrame) -> pd.DataFrame:
    „““
    Durchläuft die Produktliste und ruft für jeden Artikel die LLM-basierte Klassifizierung ab.
    Das Ergebnis wird in der neuen Spalte ‚PredictedCategory‘ gespeichert.
    „““
    predicted_categories_list = []
    new_descriptions_list = []
    for idx, row in df.iterrows():
        name = row.get(„Name“, „“)
        description = row.get(„Description“, „“)
        category = classify_product_llm(name, description)
        new_description = rewrite_description(name, description)
        print(„xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx“)
        print(f“Produkt ‚{name}‘ -> Vorhergesagte Kategorie: {category}“)
        print(f“Produkt ‚{name}‘ -> new_descriptions: {new_description}“)
        predicted_categories_list.append(category)
        new_descriptions_list.append(new_description)

    df[„PredictedCategory“] = predicted_categories_list
    df[„new_descriptions“] = new_descriptions_list
    return df

def main():
    # Beispiel CSV-Daten als String
    csv_data = „““
        ArticleID,Name,Description,Manufacturer,Price,Stock
        1,Smartphone,“Modernes Smartphone mit 6.5 Zoll Display und 128GB Speicher“,TechCorp,699.99,50
        2,T-Shirt,“Bequemes Baumwoll-T-Shirt in verschiedenen Farben“,FashionCo,19.99,200
        3,Kaffeemaschine,“Automatische Kaffeemaschine mit 12 Tassen Kapazität“,HomeBrew,129.99,80
        4,Gartenschere,“Hochwertige Gartenschere für präzises Schneiden“,GardenPro,24.99,150
        5,LED-Fernseher,“50 Zoll LED-Fernseher mit 4K Auflösung und Smart TV Funktionen“,ElectroMax,499.99,30
        6,Notebook,“Leistungsstarkes Notebook mit Intel i7 und 16GB RAM“,CompuWorld,1299.99,20
        7,Lederjacke,“Hochwertige Lederjacke aus echtem Leder“,FashionCo,199.99,35
        8,Toaster,“2-Schlitz-Toaster mit einstellbarer Bräunung“,HomeBrew,34.99,100
        9,Rasenmäher,“Elektrischer Rasenmäher mit 40cm Schnittbreite“,GardenPro,299.99,40
        10,Smartwatch,“Wasserdichte Smartwatch mit Fitness-Tracking“,TechCorp,199.99,60
        11,Hoodie,“Kapuzenpullover aus weichem Fleece-Material“,FashionCo,39.99,120
        12,Mikrowelle,“800W Mikrowelle mit Auftaufunktion“,HomeBrew,89.99,75
        13,Heckenschere,“Akku-Heckenschere für präzises Schneiden“,GardenPro,179.99,50
        14,Kopfhörer,“Kabellose Over-Ear-Kopfhörer mit Noise Cancelling“,TechCorp,149.99,90
        15,Winterjacke,“Gefütterte Winterjacke mit wasserabweisendem Material“,FashionCo,129.99,45
        16,Staubsauger,“Leistungsstarker Staubsauger mit HEPA-Filter“,HomeBrew,199.99,55
        17,Gartenlampe,“Solarbetriebene Gartenlampe mit Bewegungssensor“,GardenPro,39.99,100
        18,Bluetooth-Lautsprecher,“Wasserdichter Bluetooth-Lautsprecher mit 360° Sound“,ElectroMax,79.99,85
        19,Sneaker,“Bequeme Laufschuhe mit atmungsaktivem Material“,FashionCo,89.99,150
        20,Espressomaschine,“Hochwertige Espressomaschine mit Milchaufschäumer“,HomeBrew,249.99,30
    „““
    # Daten laden
    df = load_data(csv_data)
    print(„Originale Daten:“)
    print(df, „\n“)
   
    # LLM-basierte Klassifizierung durchführen
    df = enrich_data_with_classification(df)
   
    print(„\nDaten mit vorhergesagten Kategorien:“)
    print(df)
   
    # Ergebnis optional in CSV speichern
    output_file = „classified_products.csv“
    df.to_csv(output_file, index=False)
    print(f“\nErgebnis wurde in ‚{output_file}‘ gespeichert.“)

if __name__ == „__main__“:
    main()