Die Frage, die kein einzelner Chunk beantwortet
Fragen Sie unser System nach dem Anzugsmoment auf Seite zweihundertelf, und die Antwort ist exakt. Fragen Sie, was die Wartungsphilosophie der Maschine ist, und es liefert drei zusammenhanglose Absätze, selbstsicher. Der Abstand zwischen diesen beiden Fehlern ist kein Qualitätsproblem beim Abruf.
Zwei Fehler, die gleich aussehen
Ein Support-System, das wir betreiben, sitzt auf technischen Handbüchern, manche mehrere hundert Seiten stark. Bei konkreten Fragen funktioniert es gut: eine Teilenummer, eine Toleranz, ein Schritt in einer Prozedur. Diese Antworten stehen in einer Passage, und die richtige Passage zu finden ist genau das, wofür die Pipeline gebaut ist.
Bei einer zweiten Art von Fragen scheiterte es auf eine Weise, die von außen identisch aussah und eine völlig andere Ursache hat. Auf die Frage, worum ein Dokument geht oder wie zwei Prozeduren über Kapitel hinweg zusammenhängen, kamen plausible Passagen, die einzeln nichts Falsches sagten und zusammen nichts beantworteten.
Warum besseres Ranking das nicht behebt
Wir haben länger als nötig versucht, das als Ranking-Problem zu behandeln. Bessere Embeddings, ein stärkerer Reranker, mehr Kandidaten: Jedes half den konkreten Fragen ein wenig und den globalen überhaupt nicht — im Rückblick genau das, was passieren musste.
Die Antwort auf die Frage, worum ein Dokument geht, steht nirgends im Dokument. Sie ist eine Eigenschaft des Ganzen, und ein Retriever, der Passagen zurückgibt, kann immer nur Teile zurückgeben. Keine Anordnung von Teilen erzeugt etwas, das in keinem davon steht.
Was wir gebaut haben
Wir haben eine Schicht über den Chunks ergänzt. Abschnitte werden zusammengefasst, die Zusammenfassungen gruppiert und erneut zusammengefasst, und diese Zusammenfassungen werden neben den Originalpassagen indexiert. Eine globale Frage holt eine Zusammenfassung, eine konkrete weiterhin die Passage. Beides wird durchsucht, und der Reranker sieht die Mischung.
Die Struktur folgt dem Dokument statt einer festen Verzweigung. Handbücher haben bereits Kapitel und Abschnitte, und diese vorhandene Hierarchie zu nutzen hieß, keine Gruppierung erfinden zu müssen und bei jeder Prüfung auf die Quelle einer Zusammenfassung zeigen zu können.
Die Arbeit, die der Sache einen Namen gab
Sarthi und Kollegen veröffentlichten in jener Woche RAPTOR und beschreiben darin rekursives Clustern und Zusammenfassen eines Bestands zu einem Baum, der auf mehreren Ebenen abgefragt wird. Die Lektüre machte klar, worum wir gekreist waren: Die Ebenen sind keine Optimierung des Abrufs, sie sind zusätzlicher Inhalt, den es vorher nicht gab.
Die Arbeit baut ihren Baum durch Clustern statt entlang der Dokumentstruktur — der allgemeinere Weg und der richtige, wenn ein Bestand keine brauchbare Hierarchie hat. Unserer hat eine, also nutzen wir sie, und wir hätten diese Wahl ohne eine Beschreibung der Alternative nicht bewusst getroffen.
| Art der Frage | Was sie beantwortet |
|---|---|
| Eine Toleranz, eine Teilenummer, ein Schritt | Die Originalpassage |
| Worum es in diesem Kapitel geht | Eine Abschnittszusammenfassung |
| Wie zwei Prozeduren zusammenhängen | Eine Zusammenfassung über beide |
| Was sich zwischen Revisionen geändert hat | Keines von beidem. Das braucht einen Vergleich, keinen Abruf |
Was die Schicht kostet
Der Aufbau kostet Modellaufrufe proportional zum Bestand — eine einmalige Ausgabe, die bei großen Dokumentmengen leicht unterschätzt wird, aber wirklich einmalig ist. Die laufenden Kosten sind schlimmer und weniger sichtbar: Zusammenfassungen sind abgeleiteter Inhalt, der veraltet, sobald sich die Quelle ändert.
Wir behandeln eine Zusammenfassung deshalb als Cache mit dem Hash des darunterliegenden Textes als Schlüssel. Ändert sich ein Abschnitt, werden seine Zusammenfassung und jede darüber verworfen und neu gebaut. Ohne das entwickelt das System einen sehr unangenehmen Fehlermodus: Es beantwortet globale Fragen aus einer Handbuchversion, die es nicht mehr gibt.
Der Prüfschritt, auf dem wir bestanden haben
Zusammenfassungen sind erzeugter Text, der Nutzern gezeigt wird, als sei er belegt. Das ist ein bedeutsamer Unterschied zur Rückgabe einer Passage, und wir wollten das nicht stillschweigend ausliefern. Jede Zusammenfassung trägt einen Verweis auf den Bereich, den sie abdeckt, und die Oberfläche kennzeichnet sie als Zusammenfassung statt als Zitat.
Beim ersten Bestand hat außerdem ein Fachexperte die oberste Ebene des Baums gelesen, bevor er live ging. Elf von rund sechzig Zusammenfassungen mussten korrigiert werden, meist weil eine Bedingung zu einer absoluten Aussage geglättet worden war — der Fehler, auf den wir seitdem gezielt achten.
Wo wir sie nicht bauen
Die meisten Bestände brauchen das nicht. Eine Wissensbasis aus kurzen Artikeln, eine Vertragssammlung, die nach Klauseln abgefragt wird, ein Produktkatalog: Das sind Sammlungen, in denen die nützlichen Fragen von einem Datensatz beantwortet werden, und eine Zusammenfassungsschicht wäre Kosten und Veralterung für nichts.
Unser Test ist, ob Nutzer Fragen stellen, deren Antwort sich über ein Dokument erstreckt. Tun sie es nicht, ist die Schicht eine Lösung auf der Suche nach ihrem Problem — und die ehrliche Antwort ist, das zu sagen, statt das anspruchsvollere System zu bauen.
Was wir nicht behaupten
Wir behaupten nicht, Zusammenfassungen seien so vertrauenswürdig wie Passagen. Sie sind ein verlustbehaftetes Derivat, sie können Nuancen glätten, und wer eine liest, liest unser System statt der Quelle. Das ist der Handel, den wir für eine zuvor unbeantwortbare Frage eingegangen sind, und deshalb ist der Herkunftsverweis nicht optional.
Wir behaupten auch nicht, unser strukturfolgender Ansatz schlage das Clustern. Er ist auf Dokumenten mit vorhandener Hierarchie leichter zu erklären und zu prüfen, und wir haben ihn auf einem Bestand, auf dem beides möglich wäre, nicht dagegen gemessen.
