Ein Laden-Helfer, der Fragen beantwortet
Ein Fahrradverleih baut einen Helfer. Ein Kunde tippt eine Frage. Die App sucht den besten Absatz in den Antworten des Ladens und gibt ihn einem Sprachmodell, das die Antwort formuliert.
Findet die App den falschen Absatz, formuliert das Modell sehr höflich eine falsche Antwort. Diese Lektion testet das Finden. Es ist einfacher Code, Sie können ihn bewerten, ohne ein Modell aufzurufen.
Am Ende dieser Lektion
Notiz
Ich kann eine App, die Fragen beantwortet, mit wenigen Fragen testen, jede mit dem Fakt, den die Antwort enthalten muss.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Suche | den Text finden, der bei der Antwort helfen soll | |
| Erwarteter Fakt | ein kurzes Textstück, das eine gute Antwort enthalten muss | zwölf Euro |
| Trefferquote | der Anteil der Fragen, bei denen der richtige Text gefunden wurde | |
| Stoppwort | ein häufiges Wort wie „der“, das wenig verrät | |
| Falsche Antwort | ein Text wurde gefunden, enthält den Fakt aber nicht | |
| Keine Antwort | nichts passte, die App sagt also, dass sie es nicht weiß |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zwei Schritte, nur einer ist leicht zu testen
Viele Apps antworten in zwei Schritten. Zuerst die Suche: den Absatz wählen, der zur Frage passt. Dann formuliert ein Sprachmodell die Antwort aus diesem Absatz.
Die Antwort eines Modells ändert sich von Lauf zu Lauf, sie lässt sich schlecht bewerten. Die Suche liefert jedes Mal dasselbe, sie lässt sich gut bewerten. Ist die Suche falsch, kann nichts danach richtig sein.
Gemeinsame Wörter zählen
Hier ist das Zuordnen so einfach wie möglich. Zerlegen Sie die Frage in Wörter. Zählen Sie für jeden Absatz, wie viele dieser Wörter auch darin stehen. Der Absatz mit der höchsten Zahl gewinnt.
Es vergleicht ganze Wörter: „öffnet“ passt nicht zu „öffnen“. Starten Sie den Code und lesen Sie die Zahlen.
Gemeinsame Wörter für eine Frage zählen
def woerter(text):
for zeichen in ".,?":
text = text.replace(zeichen, "")
return text.lower().split()
texte = [
"Der Laden öffnet um neun Uhr und schließt um achtzehn Uhr, von Montag bis Samstag.",
"Ein Rad kostet zwölf Euro für einen Tag und fünf Euro für eine Stunde.",
"Sie können ein Rad an jeder der drei Stationen in der Stadt zurückgeben.",
"Wenn ein Rad kaputtgeht, rufen Sie die Nummer am Rahmen an, dann reparieren wir es.",
"Helme sind bei jeder Ausleihe kostenlos, Sie müssen sie nur am Schalter verlangen.",
]
frage = "Was ist der Preis an einem Tag?"
for text in texte:
gemeinsam = []
for wort in woerter(frage):
if wort in woerter(text):
gemeinsam.append(wort)
print(len(gemeinsam), gemeinsam, "<-", text[:28])
# Ändern Sie die Frage in "Bekomme ich einen Helm?" und starten Sie erneut.
Ein Testsatz: Fragen und Fakten
Um die App zu bewerten, brauchen Sie einen kleinen Testsatz. Er enthält Fragen, die ein Kunde stellen könnte. Jede hat den erwarteten Fakt, den der richtige Absatz enthält.
Eine Frage ist ein Treffer, wenn der gefundene Absatz ihren Fakt enthält. Sie ist falsch, wenn ein Absatz ohne ihn gefunden wurde. Sie hat keine Antwort, wenn gar nichts passte.
Die fünf Antworten des Ladens schreiben
docker exec jupyter sh -c "printf '%s\n' 'd1|Der Laden öffnet um neun Uhr und schließt um achtzehn Uhr, von Montag bis Samstag.' 'd2|Ein Rad kostet zwölf Euro für einen Tag und fünf Euro für eine Stunde.' 'd3|Sie können ein Rad an jeder der drei Stationen in der Stadt zurückgeben.' 'd4|Wenn ein Rad kaputtgeht, rufen Sie die Nummer am Rahmen an, dann reparieren wir es.' 'd5|Helme sind bei jeder Ausleihe kostenlos, Sie müssen sie nur am Schalter verlangen.' > faq.txt"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die sechs Testfragen schreiben
docker exec jupyter sh -c "printf '%s\n' 'Wann öffnet der Laden?|neun Uhr' 'Was ist der Preis an einem Tag?|zwölf Euro' 'Wo kann ich ein Rad zurückgeben?|drei Stationen' 'Was tun, wenn mein Rad kaputtgeht?|rufen Sie die Nummer' 'Bekomme ich einen Helm?|kostenlos' 'Wann ist geschlossen?|achtzehn Uhr' > fragen.txt"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Bewertungsskript schreiben
docker exec jupyter sh -c "printf '%s\n' 'import sys' '' 'IGNORIEREN = [\"der\", \"die\", \"das\", \"ein\", \"einen\", \"einem\", \"eine\", \"ist\", \"was\", \"an\", \"in\", \"wie\", \"wann\", \"wo\", \"ich\", \"kann\", \"wenn\", \"mein\", \"sie\"]' '' '' 'def woerter(text):' ' for zeichen in \".,?\":' ' text = text.replace(zeichen, \"\")' ' return text.lower().split()' '' '' 'texte = []' 'for zeile in open(\"faq.txt\", encoding=\"utf-8\"):' ' texte.append(zeile.strip().split(\"|\")[1])' 'ignorieren = []' 'if sys.argv[1] == \"stopp\":' ' ignorieren = IGNORIEREN' 'treffer = 0' 'falsch = 0' 'nichts = 0' 'for zeile in open(\"fragen.txt\", encoding=\"utf-8\"):' ' frage, fakt = zeile.strip().split(\"|\")' ' gesucht = []' ' for wort in woerter(frage):' ' if wort not in ignorieren:' > steps/beantworten.py"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Rest des Bewertungsskripts schreiben
docker exec jupyter sh -c "printf '%s\n' ' gesucht.append(wort)' ' bester = \"\"' ' beste_gemeinsam = 0' ' for text in texte:' ' gemeinsam = 0' ' for wort in gesucht:' ' if wort in woerter(text):' ' gemeinsam = gemeinsam + 1' ' if gemeinsam > beste_gemeinsam:' ' bester = text' ' beste_gemeinsam = gemeinsam' ' if bester == \"\":' ' nichts = nichts + 1' ' print(\"Nichts:\", frage)' ' elif fakt.lower() in bester.lower():' ' treffer = treffer + 1' ' print(\"Treffer:\", frage)' ' else:' ' falsch = falsch + 1' ' print(\"Falsch:\", frage)' 'print(\"Treffer\", treffer, \"falsch\", falsch, \"nichts\", nichts, \"Quote\", round(treffer / (treffer + falsch + nichts), 2))' >> steps/beantworten.py"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das einfache Zuordnen bewerten
docker exec jupyter python3 steps/beantworten.py rohHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eines ändern und erneut bewerten
Zwei Fragen gingen wegen kleiner Wörter wie „der“ und „an“ zum falschen Absatz. Nehmen Sie solche Stoppwörter vor dem Zählen aus der Frage und bewerten Sie erneut.
Man ändert immer nur eine Sache. Würden Sie drei auf einmal ändern, wüssten Sie nicht, welche geholfen hat.
Erneut bewerten, Stoppwörter überspringen
docker exec jupyter python3 steps/beantworten.py stoppHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, die App sei besser geworden, weil die Quote von 0.5 auf 0.67 stieg. Sehen Sie auf die anderen Zahlen. Beide falschen Antworten wurden zu Treffern oder zu keiner Antwort, das ist besser, doch zwei Fragen finden weiter nichts. Ein so kleiner Testsatz zeigt, wo man hinsehen muss, nicht wie gut die App ist.
Beispiel: die zwei Läufe nebeneinander
| Lauf | Treffer | Falsch | Keine Antwort | Quote |
|---|---|---|---|---|
| Ganze Wörter, nichts übersprungen | 3 | 2 | 1 | 0.5 |
| Stoppwörter übersprungen | 4 | 0 | 2 | 0.67 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Weiter: eigene Fragen hinzufügen
Fügen Sie der Testdatei vier Fragen hinzu, jede mit einem Fakt. Nehmen Sie eine dazu, die die fünf Antworten des Ladens gar nicht beantworten können.
Bewerten Sie beide Läufe erneut. Welcher Ausgang wäre bei der Frage ohne Antwort im Text des Ladens richtig? Trifft die App ihn?