9 Punkte von GN⁺ 2024-10-24 | 1 Kommentare | Auf WhatsApp teilen
  • Bei der Unterstützung der Entwicklung von AI-Apps für E-Commerce-Daten wurde ein Problem entdeckt: Retrieval-augmented generation (RAG) funktionierte bei einigen Abfragen gut, bei anderen jedoch nicht
  • Bei der Behebung solcher Probleme ist es wichtig, die Eingabedaten zu untersuchen (den indexierten Originaltext und die für die Suche verwendeten Nutzeranfragen)
  • Vor allem in Bezug auf Chunking und Tokenisierung schien Optimierung nötig zu sein

[Tokenisierung]

  • Tokenisierung ist der Prozess, bei dem Text durch einen Tokenizer in kleinere Einheiten, sogenannte Tokens, zerlegt wird
  • Diese Tokens werden auf Token-IDs abgebildet, also Integer-Werte, die ein Token innerhalb des Vokabulars des Tokenizers eindeutig identifizieren
  • Das Vokabular des Tokenizers ist die Menge aller möglichen Tokens, die beim Training des Tokenizers verwendet werden
  • Probleme können auftreten, wenn Tokens eines Textes nicht im Vokabular des Tokenizers des LLM vorhanden sind
  • Die meisten LLMs haben ein großes Vokabular mit einer Größe von 30k bis 300k
  • Die meisten weit verbreiteten LLMs setzen auf Subword-Tokenizer (BPE, WordPiece usw.)
  • Arten von Tokenizern
    • word: Aufteilung anhand von Leerzeichen, Satzzeichen usw.
    • character: Aufteilung in einzelne Zeichen (manchmal einschließlich Satzzeichen)
    • subword: Aufteilung von Tokens in scheinbar bedeutungslose Unterwörter
    • Die meisten LLMs verwenden Subword-Tokenizer
      • BPE (Byte-Pair Encoder): OpenAIs Bibliothek tiktoken
      • WordPiece: Cohere, MiniLM-L6-v2 usw.

Vergleich von MiniLM-L6-v2 und tiktoken

  • Das Tokenizer-Vokabular des Modells MiniLM-L6-v2 hat eine Größe von 30522 und ist damit deutlich kleiner als das von tiktoken (200019)
  • Wenn man den Satz "tokenizer tokenizes text into tokens" tokenisiert
    • MiniLM-L6-v2: [CLS] token ##izer token ##izes text into token ##s [SEP]
    • tiktoken: token, izer, token, izes, text, into, tokens
  • OpenAIs Bibliothek tiktoken implementiert einen BPE-Tokenizer und wird in ChatGPT-LLM-Modellen verwendet
  • Das Vokabular von MiniLM-L6-v2 enthält auch deutsche und japanische Schriftzeichen

Tokenisierung von Emojis, Tippfehlern und domänenspezifischen Begriffen

  • MiniLM-L6-v2 tokenisiert Emojis als [UNK]-Token
  • tiktoken wurde zwar mit einigen Unicode-Zeichen-Tokens trainiert, kann aber für RAG trotzdem Probleme verursachen
  • Auch domänenspezifische Produktnamen wie "Gucci Savoy Leathertrimmed Printed Coatedcanvas Suitcase" werden nicht sauber tokenisiert
  • Bei einem Satz mit Tippfehlern ("I hve received wrong pckage")
    • MiniLM-L6-v2: i, h, ##ve, received, wrong, pc, ##ka, ##ge
    • tiktoken: I, h, ve, received, wrong, p, ck, age

[Embeddings]

  • Der Tokenizer allein ist nicht besonders nützlich. Er wurde hauptsächlich entwickelt, um komplexe numerische Analysen auf Basis der Häufigkeit einzelner Tokens durchzuführen
  • Um die kontextuelle Bedeutung von Text zu bewahren, braucht es eine Methode, die Beziehungen zwischen Tokens erfassen kann
  • Embeddings sind Vektoren, die Tokens repräsentieren und die Bedeutung von Wörtern sowie ihre Beziehungen im Text gut erfassen
  • Embeddings sind ein Nebenprodukt des Transformer-Trainings und werden tatsächlich auf Dummys tokenisierter Texte trainiert
  • Wenn man Texterzeugung anfordert, sind es genau diese Embeddings, die dem LLM als Eingabe gegeben werden
  • Ein LLM besteht aus zwei Hauptkomponenten: Encoder und Decoder
    • Sowohl Encoder als auch Decoder erhalten Embeddings als Eingabe
    • Die Ausgabe des Encoders besteht ebenfalls aus Embeddings, die an die Cross-Attention-Heads des Decoders weitergegeben werden und eine wichtige Rolle bei der Token-Erzeugung (Vorhersage) der Decoder-Ausgabe spielen
  • In einer RAG-Pipeline wird Text zuerst tokenisiert, dann eingebettet und anschließend dem Transformer zugeführt
    • Token-IDs dienen als Index in das Vokabular des Tokenizers und werden auch verwendet, um Embeddings aus der Embedding-Matrix abzurufen
    • Die abgerufenen Embeddings werden zu einem Tensor zusammengesetzt und als Transformer-Eingabe verwendet
  • Encoder-Ablauf: Text tokenisieren -> Embeddings für jedes Token abrufen -> Embedding-Tensor zusammensetzen -> in den Transformer einspeisen -> encodieren -> Encoder-Ausgabe an die Cross-Attention des Decoders weitergeben -> Decoder-Ausgabe erzeugen

Embedding-Beispiele

  • "You can break it 😞" und "You can not break it 😊" haben entgegengesetzte Emotionen, liegen in MiniLM-L6-v2 aber im Embedding-Abstand sehr nah beieinander
  • OpenAI zeigt bessere Leistung, weil das Token-Vokabular mit Emojis besser umgehen kann
  • Auch bei Tippfehlern verarbeitet OpenAI dies besser
  • Aber selbst bei OpenAI vergrößert ein zusätzliches Leerzeichen am Satzende den Abstand zwischen Embeddings unerwartet stark
  • Auch beim Umgang mit Datumsformaten haben Entwickler Schwierigkeiten. Relative Zeitangaben ("gestern versendet") können ein besonders großes Problem sein
  • Unterschiede in der Schreibweise von Währungen (£40, $50, 40£, 50¢ usw.) können ebenfalls seltsame Probleme verursachen
  • Bei domänenspezifischen Daten wie im Fall der Gucci-Tasche wird das Problem üblicherweise mit Fine-Tuning gelöst, aber Daten und Bewertungsmetriken sollten immer überprüft werden

Fazit

  • Dieser Artikel hilft dabei, besser zu verstehen, wie Tokenizer RAG-Apps beeinflussen können und warum man ihnen Aufmerksamkeit schenken sollte
  • Bei Agent-Anwendungen wird garbage-in garbage-out nicht immer die erwartete Leistung liefern
  • Schon eine leichte Bereinigung des Eingabetexts kann sehr hilfreich sein
    • Datumsformate konsistent standardisieren
    • Nachgestellte Leerzeichen nach Möglichkeit entfernen (der Einfluss auf Embeddings wurde bestätigt)
    • Dasselbe gilt auch für andere numerische Daten wie Preise in unterschiedlichen Währungen
  • Hoffentlich kommt irgendwann der Tag, an dem man über Tokenizer überhaupt nicht mehr nachdenken muss. Vielleicht kann man sie dann ganz loswerden
  • Dann müsste man sich nicht mehr mit Tippfehlern, beliebigen Leerzeichen oder auf Wort-Perplexity basierenden adversarialen Angriffen beschäftigen. Eine ganze Sorte von Kummer könnte über Nacht verschwinden
  • Bis dahin sollte man verantwortungsvoll tokenisieren

Meinung von GN⁺

  • Dieser Artikel zeigt gut, wie sich Tokenizer und Embeddings auf die Leistung von RAG-basierten AI-Apps auswirken können. Besonders bei Emojis, Tippfehlern und domänenspezifischen Begriffen erklärt er anhand konkreter Beispiele, worauf man achten sollte, und dürfte für Entwickler sehr hilfreich sein
  • Allerdings sind sowohl MiniLM-L6-v2 als auch OpenAIs tiktoken, die in diesem Artikel vorgestellt werden, auf Englisch optimiert. Beim Umgang mit anderen Sprachen wie Koreanisch kann es zusätzliche Überlegungen geben. Im Koreanischen wird häufig Tokenisierung mit Hilfe morphologischer Analyse verwendet, weshalb es sinnvoll erscheint, auch deren Vor- und Nachteile sowie Grenzen zu betrachten
  • Außerdem konzentriert sich der Artikel zwar auf die Rolle von Tokenizern und Embeddings in der RAG-Pipeline, in realen Produktionsumgebungen gibt es aber noch weit mehr zu beachten, etwa Datenvorverarbeitung, Hyperparameter-Tuning und Modellkomprimierung. Daher sollte man den Inhalt dieses Artikels als Ausgangspunkt sehen und im tatsächlichen Entwicklungsprozess durch vielfältige Experimente und Evaluationen die optimale Methode finden
  • Andererseits gibt es auch die Ansicht, dass die Bedeutung von Tokenizern mit dem Aufkommen großer Sprachmodelle wie GPT-4 abnimmt. Der Grund ist, dass diese Modelle nicht nur auf Token-Ebene, sondern auf Satz- oder Absatzebene arbeiten, sodass die Qualität einzelner Tokens die Leistung relativ weniger stark beeinflussen könnte. Allerdings gibt es dazu noch nicht genügend Forschung, um dies eindeutig zu behaupten
  • Schließlich kann, wie im Artikel erwähnt, schon die vorherige Bereinigung und Standardisierung von Eingabedaten die Modellleistung erheblich verbessern. Bei der Entwicklung realer Dienste ist es sehr wichtig, unter Berücksichtigung der Vielfalt und des Rauschens von Nutzereingaben eine robuste Pipeline zur Datenvorverarbeitung aufzubauen. Darüber hinaus scheint es notwendig, auch in Datenlabeling und Annotation ausreichend Ressourcen zu investieren, um hochwertige Trainingsdaten zu sichern

1 Kommentare

 
GN⁺ 2024-10-24
Hacker-News-Kommentar
  • Tokenizer gelten nicht als der „sexy“ Teil von LLMs, aber manche sehen darin eine Chance. Arbeiten wie xVal schlagen Spezialisierungsstrategien für die Tokenisierung vor. Rechtschreibung und Aufgaben auf Zeichenebene sind ein weiteres Problem, das von Innovationen bei der Tokenisierung profitieren könnte

    • LLMs sind schwach darin, die Anzahl der Buchstaben in Wörtern zu zählen oder Buchstaben auszulassen. Zum Beispiel schreibt und führt GPT-4o ein kleines Python-Programm aus, um Vorkommen von Zeichen zu zählen. Die Tokenisierung löscht das Wissen über die Zeichen im Prompt effektiv aus und wirkt sich direkt negativ auf die Leistung bei solchen Aufgaben aus
  • Man muss die Daten verstehen, um sinnvolle Arbeit zu leisten. Viele Menschen nutzen automatisierte Werkzeuge zur Datenverarbeitung vor allem deshalb, weil sie die Daten nicht selbst ansehen wollen. Sie wünschen sich, dass der Computer die Daten ansehen und um zusätzliche Informationen bitten kann

  • Den Teil über Tippfehler im Blogbeitrag fand ich besonders hilfreich. Ich helfe bei einem RAG-ähnlichen Projekt und mache mir Sorgen darüber, wie sich kleine Tippfehler oder Formatunterschiede in Benutzeranfragen auf die Berechnung der Embedding-Distanz auswirken

    • Ich überlege, ob wir den Trainingsdaten absichtliche Tippfehler/Ersetzungen/Großschreibung hinzufügen sollten, damit gelernt wird, dass „wrk“ und „work“ vermutlich Synonyme sind
  • Ich habe an einer App gearbeitet, die mit Elasticsearch die Ähnlichkeit zwischen Eingaben von 1–2 Sätzen und Dokumenten von Absatzlänge oder mehr mit fortgeschrittenen Textabfragen verarbeitet. Es war interessant zu sehen, wie stark sich die Tokenisierungsstrategie auf bestimmte Abfragen auswirken kann

    • Zum Beispiel kann bei „W-4“ oder „W4“ die Standard-Tokenisierung am „-“ oder an der Grenze zwischen Buchstaben und Zahlen trennen. Dadurch kann diese Eingabe im Index vollständig unkenntlich werden
  • Ich habe das Gefühl, dass im Artikel zu wenig darüber gesprochen wurde, wie die einzelnen Probleme gelöst werden können. Vorgeschlagen wird, die Rechtschreibprüfung vor der Tokenisierung auszuführen oder falsch geschriebene Wörter und mögliche Korrekturen nebeneinander zu tokenisieren

    • Beim Problem mit Markennamen weiß ich nicht, wie es sich lösen lässt. Dieses Problem könnte in weniger verbreiteten Sprachen oder in Sprachen mit vielen Komposita schwerwiegender sein
  • Viele Entwickler sind daran gewöhnt, im traditionellen (deterministischen) Raum zu entwickeln, schaffen es aber nicht, ihre Denkweise auf Probleme im statistischen Raum umzustellen. LLM-Apps bewegen sich letztlich im statistischen Raum

    • Als Entwickler fällt es mir schwer, dieses Problem den Nutzern zu erklären
  • Die meisten Menschen, die RAG implementieren, denken nicht über Tokenisierung nach, sondern über Embeddings

    • Sie teilen den Datenkorpus in Chunks auf und berechnen für jeden Chunk ein Embedding. Sie erzeugen Abfragen und berechnen für jede Abfrage ein Embedding. Sie ordnen die Korpus-Chunks nach der Distanz zur Abfrage. Sie stellen den Rückgabewert zusammen
    • Dieser Artikel hebt hervor, wie wichtig versteckte, relativ unspektakuläre Arbeit ist, die sich stark auf die Systemleistung auswirken kann
  • Ich kann einige Zahlen aus dem Blogbeitrag nicht reproduzieren. Zum Beispiel weicht beim Code mit SentenceTransformer das Ergebnis für die Berechnung der Kosinus-Ähnlichkeit zweier Sätze von dem Erwarteten ab

  • Ich habe bei mehreren RAG-Implementierungen das Problem gesehen, dass angenommen wird, das Zieldokument sei ein guter Suchschlüssel für eingehende Abfragen. In einem aktuellen Projekt hat sich die Relevanz der Suche stark verbessert, indem der Suchschlüssel vom Rückgabewert (dem in Chunks aufgeteilten Dokument) getrennt und mit einem LM ein passender Schlüssel erzeugt und eingebettet wurde

  • Viele große LLM-Vokabulare gelten als ziemlich groß, aber allein das Englische hat mehr als 1 Million Wörter. 30k–300k Token wirken klein