# Einführung
Wenn man normalerweise nach einem LLM fragt – Abkürzung für „Großes Sprachmodell„ — für ein ordentliches, strukturierte Ausgabe Wie zum Beispiel bei JSON-Objekten ist eine Mischung aus sorgfältiger, schneller Erstellung und einer „Prise“ Glück erforderlich. Andernfalls kann es schwierig sein, das Modell dazu zu bringen, die erwartete perfekt strukturierte Ausgabe zu erhalten. Zumindest struggle es so, bis ein Roman erschien Open-Supply-Bibliothek kam auf den Plan: Umrisse.
Diese Bibliothek soll typische Probleme verhindern, die bei LLMs in diesen spezifischen ausgabeorientierten Anwendungsfällen auftreten, wie z. B. Halluzinationen. Genauer gesagt führt es ein gewisses Maß an deterministischer Sicherheit in den Ausgabegenerierungsprozess ein.
Lassen Sie uns herausfinden, was outlines Dies ermöglicht uns dieser anschauliche Artikel, in dem wir einige praktische Beispiele in Python zeigen!
# Anwendungsfall 1: A number of-Alternative-Klassifizierung für die Stimmungsanalyse
Bevor Sie sich vollständig mit dem ersten Anwendungsfall befassen, fragen Sie sich vielleicht. Wie funktioniert outlines funktioniert und wie garantiert es die Korrektheit in strukturierten Modellausgaben? Auf der Inferenzebene maskiert es „syntaktisch illegale“ Token während der Generierung, anstatt zu versuchen, fehlerhaften Textual content nach der Generierung zu korrigieren. Dies macht es praktisch unmöglich, die Regeln zu brechen, die dem spezifischen gewünschten Ausgabeformat zugrunde liegen.
Sehen wir uns ein erstes Beispiel an, in dem wir eine Analysepipeline für Kundensupporttickets aufbauen, und wir wollen genau eine Possibility aus einer begrenzten, genehmigten Liste möglicher Optionen. Das ist so ziemlich ein Klassifizierungsproblem, und generate.selection() ist die Funktion, die uns dabei hilft, es nachzuahmen, indem sie das vorliegende Modell dazu zwingt, eines der vordefinierten Literale oder Klassen auszuwählen.
Aber zuerst installieren wir es neben dem transformers So laden Sie vorab trainierte LLMs:
pip set up outlines(transformers)
Der folgende Code verwendet outlines.from_transformers() um ein vorab trainiertes Modell zu laden, das von den automatischen Klassen von Hugging Face für ein Modell und den zugehörigen Tokenizer unterstützt wird. Aber das Tüpfelchen auf dem i ist: Beide sind in einem verpackt outlines Objekt, das später dabei hilft, dem Modell mitzuteilen, was genau es erhalten soll. In der Inferenzphase übergeben wir nicht nur die Benutzeraufforderung, eine Bewertung zu klassifizieren, sondern auch eine Literal Objekt, das die Ausgabebeschränkungen enthält, auf die das Modell beschränken soll:
import outlines
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import Literal
# 1. Loading the backend utilizing commonplace Transformer-based fashions
model_name = "microsoft/Phi-3-mini-4k-instruct"
# We use outlines to load the mannequin with its from_transformers() perform
mannequin = outlines.from_transformers(
AutoModelForCausalLM.from_pretrained(model_name),
AutoTokenizer.from_pretrained(model_name)
)
# 2. Calling the mannequin straight, passing our authorised strings as sort constraints
sentiment = mannequin(
"Classify the sentiment of this buyer evaluate: 'I have been ready two weeks for my supply and it is nonetheless lacking.'",
Literal("Optimistic", "Adverse", "Impartial")
)
print(sentiment)
Ausgabe:
Ein Wort der Warnung an dieser Stelle: Obwohl das von uns definierte Literal Teil des integrierten Typisierungsmoduls von Python ist und nicht outlinesübernimmt unsere sofort einsatzbereite Bibliothek hier immer noch die Modellsteuerung: Sowohl das Modell als auch der Tokenizer werden in ein Objekt eingebunden, das Normal-Python-Typen erzwingt, wodurch unter der Haube eine Finite-State-Maschine entsteht, die die Ausgabe nur auf die bereitgestellten Optionen beschränkt.
# Anwendungsfall 2: JSON-Objektgenerierung
In diesem Beispiel wird zunächst ein Pydantic-Objekt definiert, das die gewünschte Struktur für ein JSON-Objekt definiert, das eine fiktive Figur mit Namen, Beschreibung und Alter beschreibt. Es verwendet dann unsere zuvor verpackte outlines Modell, das das Zeichenobjekt übergibt, um sicherzustellen, dass die generierte Ausgabe strikt dieser Struktur für das angeforderte JSON-Objekt folgt:
from pydantic import BaseModel
# 1. Outline a Pydantic mannequin for the specified JSON construction
class Character(BaseModel):
title: str
description: str
age: int
# 2. Utilizing the outlines-wrapped mannequin to generate a JSON output conforming to the Pydantic mannequin
json_output = mannequin(
"Generate a JSON object describing a fictional character named 'Anya'.",
Character,
max_new_tokens=200
)
print(json_output)
Ausgabe:
{ "title": "Anya", "description": "Anya is a younger, adventurous girl with a ardour for exploring new locations and assembly new folks. She has lengthy, curly hair and shiny inexperienced eyes that sparkle with curiosity. Anya is at all times desperate to be taught and likes to share her data with others. She is kind-hearted and at all times prepared to lend a serving to hand to these in want. Anya's favourite hobbies embody mountaineering, studying, and taking part in the guitar. She is a free spirit who values freedom and independence above all else." ,"age": 25 }
# Anwendungsfall 3: Reine JSON-Generierung für REST-APIs
Dieses dritte Beispiel, ebenfalls JSON-bezogen, ähnelt dem vorherigen, steht jedoch in einem etwas anderen Kontext. Stellen Sie sich vor, Sie erstellen eine API, die eine genau definierte JSON-Nutzlast zum Aktualisieren einer Datenbank erfordert. Die Aufforderung an einen Normal-LLM, diese Ausgabe zu erhalten, führt häufig zu lästigen, nachgestellten Zeichen wie Kommas, die einen JSON-Parser wahrscheinlich zum Absturz bringen.
Mit Umrissen definieren wir unser JSON-Nutzlastschema noch einmal mit einem Pydantic-basierten benutzerdefinierten Klassenobjekt.
from pydantic import BaseModel
from typing import Literal
import json
class ServerHealth(BaseModel):
service_name: str
uptime_seconds: int
standing: Literal("OK", "DEGRADED", "DOWN")
# 1. Outlines ought to produce a uncooked string assured to be legitimate JSON
raw_json_string = mannequin(
"Report the present standing of the primary Auth database.",
ServerHealth,
max_new_tokens=50
)
print(sort(raw_json_string)) # It will simply print:
# 2. Fairly-printing
parsed_json = json.hundreds(raw_json_string)
print(json.dumps(parsed_json, indent=2))
Ausgabe:
{
"service_name": "auth_db_status",
"uptime_seconds": 1623456789,
"standing": "OK"
}
# Schlussbemerkungen
Da LLMs darauf trainiert sind, Chat-Liebhaber zu sein, die in der Lage sind, die Syntax zu brechen oder zu halluzinieren, um in ihren Gesprächen mit uns „wie Menschen zu klingen“, kann es ein wenig mühsam sein, sie dazu zu bringen, zuverlässige, strukturierte Ausgaben wie saubere JSON-Objekte zu erzeugen. Beschreibt eine neue Open-Supply-Bibliothek, die deterministische Sicherheit in den Ausgabegenerierungsprozess von LLMs einführt, um eine bessere und zuverlässigere Generierung strukturierter Ausgaben zu ermöglichen. Dieser Artikel zeigte drei einfache, aber nützliche Anwendungsfälle für Anfänger mit diesem interessanten Device.
Iván Palomares Carrascosa ist ein führender Autor, Redner und Berater in den Bereichen KI, maschinelles Lernen, Deep Studying und LLMs. Er schult und leitet andere darin, KI in der realen Welt zu nutzen.
