Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Eine Frage-Antwort-App testen

Nach dieser Lektion: Ich kann eine App, die Fragen beantwortet, mit wenigen Fragen testen, jede mit dem Fakt, den die Antwort enthalten muss.

Lektion, 60 Min.6 BefehleJupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

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

BegriffWas er bedeutetBeispiel
Sucheden Text finden, der bei der Antwort helfen soll
Erwarteter Faktein kurzes Textstück, das eine gute Antwort enthalten musszwölf Euro
Trefferquoteder Anteil der Fragen, bei denen der richtige Text gefunden wurde
Stoppwortein häufiges Wort wie „der“, das wenig verrät
Falsche Antwortein Text wurde gefunden, enthält den Fakt aber nicht
Keine Antwortnichts 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

Code: python
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
docker exec jupyter python3 steps/beantworten.py roh

Hier 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

Befehl
docker exec jupyter python3 steps/beantworten.py stopp

Hier 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

LaufTrefferFalschKeine AntwortQuote
Ganze Wörter, nichts übersprungen3210.5
Stoppwörter übersprungen4020.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?

Über dieses Lab und seinen Quellcode: JupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.