Manuel Porras

Alle Projekte / Private Anrufanalyse

Fallstudie · Lokale KI-Pipeline

266 Kundenanrufe ausgewertet, ohne dass die Audiodaten den Rechner verließen

Ein HVAC-Betrieb glaubte, sein Anrufservice verliere Anrufe. Eine lokale Pipeline auf meiner eigenen GPU hat jede Aufnahme geprüft – und das Gegenteil gezeigt.

Kurz gesagt: Nach einer kleinen, von Hand geprüften Stichprobe glaubte ein HVAC-Betrieb, dass ein Telefondienst die meisten Anrufe annimmt — und die Aufnahmen sollten den Rechner nicht verlassen. Ich habe eine lokale Pipeline auf meiner eigenen GPU gebaut, mit faster-whisper large-v3, einer nachvollziehbaren Regelschicht und einem lokalen LLM, mit Schwärzung als Build-Schritt und ohne Netzwerkzugriff. Alle 266 Anrufe (20,7 Stunden) wurden fehlerfrei transkribiert; etwa 77 % nahmen zwei Mitarbeiterinnen an, und davon wurden etwa 67 % gebucht — das Gegenteil der Annahme.

266/266Anrufe fehlerfrei transkribiert
20,7 hAudio auf eigener GPU verarbeitet
rund 77 %der Anrufe nahmen zwei Mitarbeiterinnen an
rund 67 %davon wurden gebucht

Die Ausgangslage

Ein HVAC-Betrieb hatte 20,7 Stunden eingehender Anrufe – 266 Aufnahmen in seiner Außendienst-Software, die nie jemand ausgewertet hatte. Aus einer kleinen, von Hand angehörten Stichprobe schlossen die Inhaber, dass die meisten Anrufe bei einem Anrufservice landeten statt bei Mitarbeitern, die tatsächlich einen Auftrag buchen können. Stimmte das, ging mit jeder verpassten Buchung Umsatz verloren.

Zwei Bedingungen schlossen den naheliegenden Weg aus. In den Aufnahmen stecken Namen, Telefonnummern und Wohnadressen – sie durften an keinen gehosteten Transkriptions- oder LLM-Dienst gehen. Und das Ergebnis musste belastbar sein: Eine Zahl, die sich nicht auf konkrete Anrufe zurückführen lässt, taugt nicht als Grundlage für eine Personalentscheidung.

Die Pipeline

Drei Stufen, alle auf eigener Hardware. Keine Stufe baut eine Netzwerkverbindung auf.

266 Aufnahmen20,7 h AudioEIGENE GPU · KEIN NETZWERKTranskriptionfaster-whisper large-v3Regelschichtprüfbar, nachvollziehbarLokales LLMsubjektive FelderSchwärzungfester Build-SchrittVollständigbleibt lokalGeschwärztweitergabefähig
Drei lokale Stufen. Entscheidend ist die gestrichelte Linie: Nur der geschwärzte Datensatz überschreitet sie.
  1. Transkription. faster-whisper large-v3 auf einer RTX 3090, float16 mit Sprachaktivitätserkennung.
  2. Auswertung. Feste Regeln für alles, wovon eine Entscheidung abhängt; ein lokales LLM nur für die subjektiven Felder.
  3. Schwärzung. Personenbezogene Daten werden in der Pipeline entfernt – es entstehen eine vollständige und eine weitergabefähige Fassung.

Die wichtigen Entscheidungen

Bewusst das große Modell. Die Aufnahmen hatten Telefonqualität, mit Durcheinanderreden und Warteschleifenmusik – genau dort werden kleinere Modelle schlechter, und eine falsch verstandene Gerätenummer oder Straße verfälscht unbemerkt jede Zahl danach. Trotzdem lief die Transkription 8- bis 14-mal schneller als Echtzeit. Der Lauf setzt nach einer Unterbrechung fort, statt neu zu beginnen: Er überspringt Erledigtes und bricht bei einer defekten Datei nicht den ganzen Stapel ab. Ergebnis: 266 von 266 Aufnahmen transkribiert, ohne einen Fehler.

Zwei Auswertungsschichten, strikt getrennt. Wer hat abgenommen, wurde ein Auftrag gebucht, endete der Anruf nur mit einer Nachricht – das entscheiden Regeln. Jede dieser Zahlen lässt sich auf ein benanntes Muster und eine Liste von Anruf-IDs zurückführen und von jedem nachrechnen. Wer Regeln und Modellausgaben vermischt, bekommt einen Bericht, bei dem niemand mehr weiß, welche Zahl prüfbar ist und welche nur die Einschätzung eines Modells. Durch die Trennung stützte sich die Personalfrage allein auf den prüfbaren Teil.

Schwärzung: ein Fehler, den ich gefunden habe

Telefonnummern, Adressen, E-Mail-Adressen und Kartennummern ließen sich über Muster erkennen. Personennamen nicht. Mein erster Ansatz erkannte Leute, die sich selbst vorstellten – übersah aber einen Anrufer, der von jemand anderem vorgestellt wurde. So landete ein Name in der Datei, die eigentlich weitergegeben werden sollte.

Die Lösung: Das lokale Modell listet für jedes Transkript alle genannten Personen auf, die Schwärzung entfernt alles auf dieser Liste, und der gesamte Bestand lief noch einmal durch. Seitdem ist die Schwärzung ein fester Build-Schritt und kein letzter Durchgang.

Wer erst am Ende schwärzt, schwärzt falsch.

Das Ergebnis

Die Annahme war falsch – und die Pipeline konnte es belegen. In der von Hand angehörten Stichprobe waren viele verschiedene Namen am Telefon aufgetaucht; das sah nach einem Anrufservice aus. Über alle 266 Anrufe ergab sich fast das Gegenteil:

Von zwei Mitarbeiterinnen angenommen~77 %Davon gebucht~67 %Richtwerte aus der Regelschicht, alle 266 Anrufe.
Stichprobe und Gesamtbestand erzählten Gegensätzliches. Gemessen wurde nur eines davon.

Rund 77 % aller Anrufe gingen an eine von zwei Mitarbeiterinnen, und von diesen Anrufen wurden rund 67 % gebucht. Die vielen einzelnen Namen, die die Stichprobe so chaotisch wirken ließen, gehörten überwiegend zur Überlauf-Annahme außerhalb der Geschäftszeiten.

Die eigentliche Lücke war also kein strukturelles Problem, sondern eine überschaubare Gruppe von Anrufen bei Leuten, die nicht buchen konnten – konkret, begrenzt und behebbar. Und deutlich günstiger zu lösen als die Umstrukturierung, die die ursprüngliche Vermutung nahegelegt hätte.

Die Zahlen sind Richtwerte. Die Mitarbeiterinnen werden nicht namentlich genannt.

Warum das zählt

  • Keine Kosten pro Aufnahme. Inferenz auf eigener Hardware: Über eine gehostete API wäre derselbe Bestand eine laufende Rechnung, hier war es Strom. Das verändert die Rechnung für alles, was dauerhaft laufen soll.
  • Datenschutz durch Architektur. In diesem Projekt haben die Audiodaten meine GPU nie verlassen – kein Versprechen in einem Auftragsverarbeitungsvertrag, sondern eine Pipeline ohne ausgehende Verbindung.
  • Der Auftrag wurde auf den Kopf gestellt. Ich sollte einen Verdacht bestätigen. Die ehrliche Antwort war: Er stimmt nicht. Genau darin lag der Wert.

Das Muster passt überall dort, wo Sprach- oder Dokumentdaten liegen, die nie ausgewertet wurden und nicht an Dritte gehen dürfen: Support- und Vertriebsgespräche, Aufnahmegespräche, Diktate, Schadenbearbeitung, Einsatzplanung im Außendienst. Die Pipeline ist branchenunabhängig; nur die Regelschicht wird je Branche geschrieben – und sie ist der kleine Teil.

Technik

faster-whisper large-v3CUDA / float16RTX 3090PythonLokales LLM (ollama)SQLiteSchwärzung personenbezogener Daten