Zum Hauptinhalt springen

Instruct-Formate

Instruct-Formate definieren, wie das saubere Nachrichtenarray in eine Prompt-Zeichenkette gerendert wird, unter Verwendung sandboxed Handlebars-Vorlagen ohne Zugriff auf das Dateisystem oder auf Codeausführung.

Der Format-Manager​

Ein integrierter Format-Manager verwaltet Instruct-Formate. Formate sind Handlebars-Vorlagen, die in einer isolierten Umgebung gerendert werden: Vorlagen erhalten nur content, role und name, und nur dokumentierte Helfer sind verfügbar. Vorlagen erhalten keinen Node.js-Zugriff, keinen Dateisystemzugriff und keine Möglichkeit, beliebigen Code auszuführen.

Ein Format beschreibt:

  • System-, Benutzer-, Assistenten- und Tool-Vorlagen;
  • BOS- und EOS-Tokens;
  • Nachrichtentrenner;
  • spezielle Tokens.

Integrierte Formate​

NeoTavern wird mit diesen Formaten ausgeliefert:

  • ChatML — <|im_start|> / <|im_end|>-Rollenblöcke.
  • Llama 3 — <|begin_of_text|> mit Rollen-Tags.
  • Alpaca — Anweisungs- und Antwortblöcke.
  • Mistral — [INST] / [/INST]-Blöcke.
  • Command-R — <|START_OF_TURN_TOKEN|>-Blöcke.
  • Eigene Formate — benutzerdefinierte Vorlagen, wählbar als aktives Format.

Sauberes Nachrichtenarray bis zum Rendern​

Bis zur Rendering-Stufe arbeitet die Pipeline ausschließlich mit einem strukturierten Array von Nachrichten mit Rollen (system, user, assistant, tool). Makros werden aufgelöst, Lorebook und Gedächtnis werden eingefügt, Kontext-Shifting entfernt Überschuss, und Plugin-Interceptor ändern dieses Array. Das Rendern erfolgt genau einmal, in der Rendering-Stufe, sodass kein Adapter den Prompt ein zweites Mal umformatiert.

Endergebnis​

Die Rendering-Stufe erzeugt eine von zwei Formen:

  • Eine Zeichenkette — der gerenderte Prompt, gesendet an Text-Completion-Anbieter und für Diagnosen verwendet.
  • Strukturiertes JSON — das GenerationMessage[]-Array, gesendet an Chat-Anbieter, die Rollen-getaggte Nachrichten akzeptieren.

Der Modus wird durch serializeAsText gewählt: Text-Adapter (text-completion, novelai, ai-horde, koboldai) erhalten immer den gerenderten Instruct-Prompt als einzelne user-Nachricht; Chat-Adapter (openai-compatible, anthropic) erhalten das strukturierte Array.

Makros​

{{user}}, {{char}} und eigene Variablen werden vor dem finalen Rendern aufgelöst. Makros werden nie innerhalb der Template-Engine selbst expandiert, sodass Vorlagendateien reine Auszeichnung bleiben.

Eigene Formate und Presets​

Das aktive eigene Format wird in AppSettings.instructFormat gespeichert. Ist es gesetzt, wird das saubere Nachrichtenarray in eine einzelne Zeichenkette gerendert und die Stopp-Zeichenketten des Formats werden zu den Stopp-Sequenzen der Anfrage. Bei null wird die native strukturierte Serialisierung verwendet.

Formate werden als versionierte JSON-Presets importiert und exportiert:

  • importInstructFormat() validiert das Preset, bevor es aktiv wird;
  • exportInstructFormat() erzeugt JSON-sichere, getrennte Werte;
  • Presets tragen eine Version, sodass ältere Exporte beim Import migriert werden können.

Siehe auch​

  • Pipeline-Stufen, wo das Rendern in der Stufenreihenfolge sitzt.
  • Tokenisierung, wie der gerenderte Kontext gezählt wird.
  • Anbieter, wie Adapter die serialisierte Ausgabe konsumieren.