Testsuite für Sprachsteuerung

Begonnen von Prof. Dr. Peter Henning, 20 März 2022, 12:02:48

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

In verschiedenen Threads haben sich Diskussionen zum Thema einer Testsuite / eines Benchmarks für sprachgesteuerte Systeme ergeben.

FEST - FHEM Spracherkennungstest

Ich hänge eine Datei an, die ca. 170 Sätze enthält, die bei mir reibungslos erkannt werden. Teilweise handelt es sich dabei um komplette Dialoge, bei denen eine Rückfrage gestellt wird und die nächste Antwort in den Dialog einfließt. Dafür muss ich mir noch ein Annotationsformat ausdenken.

Als weiteres Beispiel hänge ich eine Datei aus dem CoLA-Datenbestand an, die wir in unseren Forschungsarbeiten zum Trainieren unserer Rasa-KI verwenden. Wie man sieht, sind das viel mehr Sätze, aber eben nicht in der eingeschränkten Domain der Hausautomatisierung.

Desweiteren nachstehend die Beiträge von Beta-User, die er im entsprechenden Thread gepostet hat
Zitatmach alle jalousien im esszimmer zu
  mach alle jalousien im wohnzimmer halb auf
  fahr die jalousie in der mitte halb zu

  wie warm ist es draussen

  färbe die stehlampe links rot
  stelle die stehlampe rechts auf blau

  mach überall die rollläden auf fünfzig
  mach alle lichter im wohnzimmer heller
  mach alle leuchten im wohnzimmer dunkler

  mach lauter
  mach die musik leiser

  halte die wiedergabe an
  halte die musikwiedergabe an

  wie wird das wetter heute
  was kostet diesel in Karlsruhe

Alle Interessenten zum Thema Sprachsteuerung sind aufgerufen, ihre Beispielsätze beizutragen. Ziel ist, am Ende eine größere Standarddatei von sagen wir 1000 Sätzen zu haben, die man bei allen möglichen Spacherkennungssystemen als Benchmark verwenden kann. Dabei müssen natürlich gewisse Anpassungen vorgenommen werden - etwa die Bezeichungen für "Orte". Nicht jeder hat seine Stehlampe am Ort "links" stehen.

Für diese Anpassungen werde ich ein Transformationssformat vorschlagen und auch die Software dafür liefern. Das soll im Endeffekt also so aussehen:

- Man hat eine eigene lokale Datei, in der stehen die verwendeten Raumnamen (Ein Wohnzimmer hat vermutlich fast jeder, aber nur wenige eine Bibliothek) und ggf. vorhandene Geräte (nicht jeder hat Leuchten, die sich in der Farbe verändern lassen)
- Man holt sich die ca. 1000 Sätze umfassende Benchmarkdatei
- Man klickt auf einen Button und erzeugt eine angepasste Version, die eventuell ein paar Sätze weniger enthält
- Man bekommt nicht nur eine Liste der erkannten bzw. nicht erkannten Sätze, sondern auch eine klare Performance-Analyse, z.B. "80% der relevanten Sätze (Zahl = xxx) wurden richtig erkannt".

LG

pah



Beta-User

Zitat von: Prof. Dr. Peter Henning am 20 März 2022, 12:02:48
Teilweise handelt es sich dabei um komplette Dialoge, bei denen eine Rückfrage gestellt wird und die nächste Antwort in den Dialog einfließt. Dafür muss ich mir noch ein Annotationsformat ausdenken.
Minimalst müßten  Dialoge mit je einer Zeile "oben und unten" gekennzeichnet werden und ein Name dafür vergeben, Antworten müßte man als solche kennzeichnen. Allerdings habe ich im Moment noch keine Vision, wie sich ggf. eine Art Ablaufsteuerung in die jeweilige Sprachsteuerungslösung zu Testzwecken einbauen lassen könnte.

Bei RHASSPY wird im Moment einfach jegliche Beschränkung der möglichen/zugelassenen "Intents" aufgehoben, und da man (derzeit!) nicht so einfach zwischendurch "trainieren" kann, paßt das auch halbwegs. (Für uneingeweihte Mitleser: dadurch wird der Bestand an "bekannten Sätzen" (= einer "Absicht" (=Intent) zuordenbar) verändert.)

ZitatAls weiteres Beispiel hänge ich eine Datei aus dem CoLA-Datenbestand an
Vielleicht eine DAU-Frage, aber jedenfalls mit einem Text-Editor sah der Inhalt (runtergeladen aus dem Parallelthread) "komisch" aus. Welche Anwendung würde helfen?

ZitatDabei müssen natürlich gewisse Anpassungen vorgenommen werden - etwa die Bezeichungen für "Orte". Nicht jeder hat seine Stehlampe am Ort "links" stehen.
Na ja, das mit "Orten" ist so eine Sache... Im Moment steckt diese "Zusatzinfo" schlicht in einem (weiteren) Namen für die jeweilige Lampe. Bin noch unschlüssig, ob es den Aufwand lohnen würde, in RHASSPY weitere "beschreibende Eigenschaften") optional zuzulassen.
Das mit der "Individualisierung" ist auch so eine Sache. Letztendlich spielen da viele Faktoren mit rein, die teils individuell sind, teils regional oder gruppenspezifisch. (Der eine sagt "Arbeitszimmer", der andere lieber "Büro" - gemeint ist uU. halt der lokale "Papierkram-Raum" -oder eben was anderes...
Nicht jeder hat Rollos oder Rollläden oder Jalousien in der Abstellkammer usw. usf..
Speziell bei RHASSPY (?) kommt noch dazu, dass das sehr "raumbezogen" tickt - verlegt man die siteId in einen anderen Raum, kommt uU. in den nicht (mehr) eindeutigen Fällen was ganz anderes raus...

Ich fand die Übung mit relativ vielen "fails" eigentlich gar nicht schlecht, weil diese gewisse Lücken und Verbesserungspotentiale aufgezeigt wurden - sowohl bei dem, was die "Belabelung" der Dinge an sich angeht (zusätzliche Raumbezeichnungen), wie auch, was das "was könnte man umsetzen" angeht.

Zitat(nicht jeder hat Leuchten, die sich in der Farbe verändern lassen)
Stimmt zwar, ist aber nur dann ein Problem, wenn man nicht will, dass man z.B. die Rückmeldung bekommt, dass eine Leuchte das halt nicht kann...

Überhaupt: Im Moment bekommt man bei RHASSPY jeweils eine Rückmeldung, wenn ein "Treffer" vorliegt. Das sagt aber noch relativ wenig über die "Qualtität" dessen aus, was am Ende passiert. Z.B. habe ich keinen Sauger mit dem entsprechenden Namen, so dass die "starte"- und "stoppe"-Anweisungen alle entweder an einen Musik-Player gehen oder (vielleicht und bezogen auf "stop") an einen Rollladen (oder eine Jalousie...), abhängig vom Raum, in dem die siteId grade ist ;) .

Von daher würde ich auf jeden Fall vorschlagen, (auch!) sowas wie einen "allgemeinen Standardtest" ohne Variabilität bereitzustellen, bei dem man erwarten würde, dass ca. 450%+ der Tests bei einem 2+-Personen-Haushalt und mehreren Zimmern "positiv" ausgehen. Wobei "positiv" auch bedeuten kann, dass eine weitere Rückfrage erfolgt, welche Tankstelle/Leuchte/Jalousie es denn nun sein soll...

Insgesamt jedenfalls eine sehr coole Sache mit dem "Testen"!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Prof. Dr. Peter Henning


Beta-User

Ups, gemeint war "mehr als 45%"...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Hier die gewünschten weiteren "Sätze". Einmal separat, und im Anhang die etwas modifizierte FEST.txt:
mach alle jalousien im esszimmer zu
  fahre alle jalousien im wohnzimmer halb auf
  fahr die jalousie in der mitte halb zu

  wie warm ist es draussen

  färbe die stehlampe links rot
  stelle die stehlampe rechts auf blau
  dimme das licht
  mache etwas heller
  mache etwas dunkler

  mache etwas wärmer
  stelle etwas kälter

  mach überall die rollläden auf fünfzig
  mach alle lichter im wohnzimmer heller
  mach alle leuchten im wohnzimmer dunkler

  mach lauter
  mach die musik leiser

  halte die wiedergabe an
  halte die musikwiedergabe an

  wie wird das wetter heute
  was kostet diesel in Karlsruhe
  stelle den wecker auf 17 uhr
  wecken um 13 Uhr 12
  erinnern in 2 stunden
  erinnern um 2 30

  schalt das licht am esstisch und das radio an
  mache das licht am esstisch und das radio im garten aus

  schalt das licht am esstisch und das radio im garten und im esszimmer an
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Prof. Dr. Peter Henning

OK, ich übernehme das.

Derzeit favorisiere ich folgende Rückgaben nach jeder Testzeile:

1. Input: Was ist der Text, den das NLP-System bekommen hat?
2. Ergebnis: Was hat es daraus gemacht, i.e., was sind die Eckpunkte des Intents (Ort? Gerät? Zeit? Aufgabe?)
3. Wenn "nur" eine Antwort erfolgte, wie lautete diese?
4. Wenn eine echte Aktion durchgeführt wurde, welches FHEM-Kommando wurde abgesetzt?

In der Regel werden entweder 3 _oder_ 4 auftauchen.

LG

pah

Prof. Dr. Peter Henning

#6
OK, hier mal die aktuelle Version meiner Testdatei

LG

pah

Prof. Dr. Peter Henning

#7
Nur einen Tag nach meinem letzten Post hat Amazon einen Knüller gelandet und mit dem MASSIVE Dataset eine solche Testsuite für 51 Sprachen veröffentlicht. drhirn hat hier bei FHEM zuerst darauf hingewiesen, eine Mitarbeiterin von mir hatte es auch schon gesehen:

https://www.amazon.science/blog/amazon-releases-51-language-dataset-for-language-understanding


Die Daten selbst sind auf github zu finden, ebenso eine Anleitung für den Download. Aus Lizenzgründen werde ich das hier nicht kopieren.
https://github.com/alexa/massive

In deutscher Sprache sind 16521 Sätze zu finden, die aus unterschiedlichen Domänen (Wissensgebieten) stammen. Allerdings ist die Qualität sehr gemischt - beispielsweise gehört dazu

Zitatdie lichter in der küche anzünden
Zitatalles fit im schritt
Zitatempfehle mir einige geschäfte zum einkaufen in aubing
Zitaterinnere mich bei der arbeit daran mich am freitag mit david zu treffen

Wichtig wäre für das Testen in FHEM, die inzwischen zum Quasi-Standard avancierte SLURP-Notation für den Input und Output zu verwenden, ein Beispiel aus den Amazon-Daten:
{
    "id": "15",
    "locale": "de-DE",
    "partition": "train",
    "scenario": "iot",
    "intent": "iot_hue_lightoff",
    "utt": "ausmachen der lichter im badezimmer",
    "annot_utt": "ausmachen der lichter im [house_place : badezimmer]",
    "worker_id": "18",
    "slot_method": [
        {
            "slot": "house_place",
            "method": "translation"
        }
    ],
    "judgments": [
        {
            "worker_id": "28",
            "intent_score": 1,
            "slots_score": 1,
            "grammar_score": 4,
            "spelling_score": 2,
            "language_identification": "target"
        },
        {
            "worker_id": "18",
            "intent_score": 1,
            "slots_score": 1,
            "grammar_score": 3,
            "spelling_score": 2,
            "language_identification": "target"
        },
        {
            "worker_id": "32",
            "intent_score": 1,
            "slots_score": 1,
            "grammar_score": 3,
            "spelling_score": 2,
            "language_identification": "target"
        }
    ]
}


LG

pah


Beta-User

Mit Formatfragen habe ich mich noch nicht beschäftig, aber hier hätte ich noch ein paar Sätze anzubieten:

Zitatstell im esszimmer deutlich wärmer
mach die musik sehr viel leiser
öffne alle Jalousien im wohnzimmer ein stück
fahr sämtliche Rollläden im wohnzimmer ein großes stück zu

Die "verstärkten" Befehle sollten  mit der aktuellen RHASSPY-Version funktionieren (passende sentences vorausgesetzt) und etwas andere Ergebnisse liefern wie die ohne.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Prof. Dr. Peter Henning

#9
"alle" und "sämtliche" sind überflüssig - das ist nämlich der korrekte Default, wenn keine Einzelgeräte oder Gruppen genannt werden. Diese Begriffe würde ich daher in einer Vor-Substitution herauswerfen.

Die anderen Satzbestandteile finde ich interessanter, denn die Bezeichnung "ein Stück" ist äquivavalent zu "etwas" - also eine nur vage (oder, um das Wort gleich zu nennen, "fuzzy") bestimmte Größe. Nennen wir sie "fuzzyVal"

Hier könnte man in den Eigenschaften der genericDeviceTypes festlegen, dass z.B. "fuzzyVal" 5 Prozent des Maximalwertes sind (5max), oder 10 Prozent des gegenwärtigen Wertes (10rel).

"deutlich", oder ein "großes Stück" wären dann z.B. 2xfuzzyVal

Das habe ich derzeit weder in Babble, noch in der Testsuite realisiert, mal sehen, ab Anfang Juniu habe ich etwas mehr Zeit. In der Testsuite habe ich jetzt noch eingeführt, dass in jeder Zeile auch nach dem Satz noch ein Kommentar stehen kann, der mit "#" beginnt. Wie man an der angehängten Datei sieht, habe ich für einen Teil der Fragen das Äquivalent in der oben genannten Testsuite von Amazon als
Zitat# aid <Nummerierung>
bezeichnet.

LG

pah



Beta-User

Zitat von: Prof. Dr. Peter Henning am 21 Mai 2022, 19:37:45
"alle" und "sämtliche" sind überflüssig - das ist nämlich der korrekte Default, wenn keine Einzelgeräte oder Gruppen genannt werden. Diese Begriffe würde ich daher in einer Vor-Substitution herauswerfen.
Na ja, "im Prinzip" stimmt das schon mit dem überflüssig, und in meiner jetzigen Rhasspy-Konfiguration (also in den sentences.ini) dienen die auch "nur" dazu sicherzustellen, dass tatsächlich der Gruppenintent ausgewählt wird. Ist (auch gefühlt) ein Überbleibsel aus der Zeit der Einführung der Gruppenfunktionalität an sich - nichts hält halt länger wie ein Provisorium ;D .

Hat man eindeutige Begrifflichkeiten (also keine Doppelungen in der Benennung von Gruppen und Einzelgeräten), dann braucht man das schon heute  auch bei Rhasspy nicht.
Also z.B.: "Beleuchtung" ist immer Gruppe, "Licht" immer das Haupt-Einzelgerät in einem Raum.
Ob bzw. wie man das ggf. im Zusammenhang mit RHASSPY eliminieren kann, ist eine separate Frage, dazu bei Gelegenheit mehr im Deveopment-Thread. Mein momentaner Ansatz dazu wäre, bei der "welche Devices passen?"-Anfrage dann nicht nur Arrays mit "im Raum" und "außerhalb Raum" zu liefern, sondern zusätzlich "Devices in so benannten Gruppen im Raum" und "Devices in so benannten Gruppen außerhalb Raum" zu liefern. Dann müßte man relativ zwanglos von Device zu Gruppe im Raum wechseln können, allerdings wäre m.E. zu klären, welche Wechsel "zulässig" sind, und wo eine Rückfrage erfolgen soll (hat man "nur" eine Gruppe außerhalb des aktuellen Raums, _kann_ das - je nach Größe (Raum effektiv dann "global"?) - "lustig" sein).

Zitat
Die anderen Satzbestandteile finde ich interessanter, denn die Bezeichnung "ein Stück" ist äquivavalent zu "etwas" - also eine nur vage (oder, um das Wort gleich zu nennen, "fuzzy") bestimmte Größe. Nennen wir sie "fuzzyVal"
Ich fand den Gedanken auch charmant, deswegen ist  das direkt eingebaut 8) ...

Zitat
Hier könnte man in den Eigenschaften der genericDeviceTypes festlegen, dass z.B. "fuzzyVal" 5 Prozent des Maximalwertes sind (5max), oder 10 Prozent des gegenwärtigen Wertes (10rel).
"fuzzyVal" kennt RHASSPY unter der Bezeichnung "step" (immer als Absolutwert) bei den Geräten, die SetNumeric unterstützen. Konkret müßte ich mal nachsehen, wie es im Detail aussieht, aber dieser Wert müßte sehr stark vom gDT abhängig sein - 0.5 bei thermostat, 2 (oder 3?) bei "media", 11 bei blind.

Diese Werte wurden "schon immer" (ggf. in der SNIPS-Version noch anders bzw.  notfalls berechnet?) berücksichtigt, wenn man "heller" etc. angesagt hat, und bisher hat sich keiner über diese ggf. etwas willkürliche Festlegung beschwert....
Diese Betrachtung per gDT kommt mir aber auch praxistauglich vor.

Zitat
"deutlich", oder ein "großes Stück" wären dann z.B. 2xfuzzyVal
Genau so eine Multiplikation (mit "merklich" = 1.5) steckt  jetzt in der RHASSPY-Lösung, wobei man eben auf der Rhasspy-Seite (vermutlich) neben dem "Factor" sogar die Schrittweite manipulieren kann, indem man zusätzlich {Value} (ggf. "versteckt") mit in die sentences schreibt.
In der Variable "etwas" stecken jetzt zwar defaults drin, aber man kann das auch für einzelne Geräte(-klassen) anders machen - völlig flexibel also (wenn man es braucht).

ZitatIn der Testsuite habe ich jetzt noch eingeführt, dass in jeder Zeile auch nach dem Satz noch ein Kommentar stehen kann, der mit "#" beginnt.
Dann werde ich bei Gelegenheit diese Info noch "umschnippeln", damit man das auch in der Ausgabe irgendwo hat. Wird vermutlich auch etwas dauern...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Prof. Dr. Peter Henning

Anbei die aktuelle Version der Testsuite.

Ein # in einer Zeile besagt nunmehr, dass der Rest als Kommentar zu betrachten ist. Die Hinweise "aid xyz" beziehen sich auf die laufende Nummer in der von Amazon veröffentlichten Testsuite.

LG

pah