Wenn die Eingabe kein Text ist
Multimodale Eingabe heißt: Eine Anfrage enthält neben Wörtern auch Bilder oder Dokumente. Das Modell liest sie, aber Ihr Dienst trägt nun große Dateien, prüft ihren Typ und zahlt pro Bild oder Seite. Das ist wichtig, weil aus einer Anfrage von einigen hundert Bytes viele Megabyte werden können.
Eine Nutzerin fotografiert einen Kassenbon und lädt einen Vertrag mit zehn Seiten hoch. Eine einzige Anfrage hat nun drei Teile und drei Wege, abgelehnt zu werden.
Am Ende dieser Lektion
Notiz
Ich kann sagen, was sich ändert, wenn die Eingabe ein Bild oder ein Dokument ist.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Teil | ein Stück der Anfrage: Text, Bild oder Dokument | |
| Medientyp | die Bezeichnung für das Format einer Datei | image/png |
| Nutzlastgröße | die Bytes, die eine Anfrage trägt | |
| Seitenlimit | die höchste Seitenzahl eines Dokuments | |
| Stückpreis | die Kosten für ein Bild oder eine Seite |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Das Labor nimmt nur Text
Warnung
Der Modell-Zugangspunkt des Labors akzeptiert Text. Ein Run kann ihm kein Bild und kein Dokument schicken. Diese Lektion geht von einer aufgezeichneten Anfrageform aus, die für die Lektion erfunden wurde, und prüft sie mit Code.
Eine Anfrage wird zu einer Liste von Teilen
Eine Texteingabe ist eine einzige Zeichenkette. Eine multimodale Eingabe ist eine Liste von Teilen, jeder mit Typ und Daten. Die Daten einer Datei reisen als Bytes, oft als Text kodiert, was sie etwa ein Drittel größer macht.
Unten steht eine aufgezeichnete Form, erfunden für diese Lektion. Jeder echte Anbieter hat eigene Feldnamen: Lesen Sie immer seine Dokumentation.
Eine aufgezeichnete Anfrageform
{ "messages": [{ "role": "user", "content": [
{ "type": "text", "text": "Was steht auf diesem Kassenbon?" },
{ "type": "image", "media": "image/png", "data": "<base64, 412000 Bytes>" },
{ "type": "document", "media": "application/pdf", "data": "<base64, 880000 Bytes>" }
] }] }Jeden Teil vor dem Senden prüfen
Prüfen Sie jeden Teil gegen eine Regel, die Sie festlegen: den Medientyp, die Größe in Bytes und die Seitenzahl. Prüfen Sie auch die Summen: wie viele Bilder, wie viele Bytes insgesamt.
Lehnen Sie früh ab, mit einem klaren Grund. Eine Anfrage, die beim Anbieter scheitert, hat Sie schon den Upload und vielleicht Geld gekostet.
Beispiel: Limits und ein Preis
| Teil | Was es ist | Prüfung | Kosten in Einheiten |
|---|---|---|---|
| 1 | Text, 1800 Zeichen | hier kein Limit | 2 |
| 2 | Bild, png, 412000 Bytes | erlaubt, unter 5 MB | 4 |
| 3 | Bild, gif, 90000 Bytes | gif steht nicht auf der Liste | 4 |
| 4 | Dokument, 24 Seiten | über dem Limit von 20 Seiten | 48 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Kosten entstehen pro Bild und pro Seite
Text wird pro Token bezahlt. Ein Bild oder eine Seite wird meist mit einem festen Betrag oder einer Tokenzahl nach Größe bezahlt. Addieren Sie die Teile vor dem Aufruf, damit eine Budgetregel eine teure Anfrage ablehnen kann.
Senden Sie wenn möglich weniger: Verkleinern Sie das Bild oder senden Sie nur die wichtigen Seiten.
Ein häufiger Fehler
Warnung
Viele vertrauen dem Dateinamen oder der Endung. Ein Name kann png sagen bei einer Datei, die keines ist. Prüfen Sie den Typ an den Bytes, auf dem Server, und behalten Sie auch die Größenlimits. Die Endung ist ein Hinweis, keine Tatsache.
Das Modell-Hilfsskript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' return (await res.json()).choices[0].message.content;' > model.js"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 Modell-Hilfsskript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' const liste = [].concat(probe);' ' const runde = nachrichten.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return liste[Math.min(runde, liste.length - 1)];' ' }' '}' 'module.exports = { fragen };' >> model.js"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 Formprüfer schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '// Eine aufgezeichnete, erfundene Anfrage: Jeder Anbieter hat seine eigene Form.' 'const anfrage = { teile: [' ' { typ: \"text\", zeichen: 1800 },' ' { typ: \"bild\", art: \"png\", bytes: 412000 },' ' { typ: \"bild\", art: \"gif\", bytes: 90000 },' ' { typ: \"dokument\", seiten: 24, bytes: 880000 },' '] };' 'const LIMITS = { bilder: 3, bytesBild: 5000000, seiten: 20, arten: [\"png\", \"jpeg\"] };' 'const PREIS = { bild: 4, seite: 2, tausendZeichen: 1 }; // erfundene Einheiten' > shapes.js"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 Formprüfer schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function pruefen(anf) {' ' const probleme = [];' ' let bilder = 0;' ' let kosten = 0;' ' anf.teile.forEach(function (t, i) {' ' const n = i + 1;' ' if (t.typ === \"text\") kosten += Math.ceil(t.zeichen / 1000) * PREIS.tausendZeichen;' ' if (t.typ === \"bild\") {' ' bilder++;' ' kosten += PREIS.bild;' ' if (LIMITS.arten.indexOf(t.art) < 0) probleme.push(\"Teil \" + n + \": Format \" + t.art + \" nicht erlaubt\");' ' if (t.bytes > LIMITS.bytesBild) probleme.push(\"Teil \" + n + \": Bild zu groß\");' ' }' >> shapes.js"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 Formprüfer schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' if (t.typ === \"dokument\") {' ' kosten += t.seiten * PREIS.seite;' ' if (t.seiten > LIMITS.seiten) probleme.push(\"Teil \" + n + \": zu viele Seiten\");' ' }' ' });' ' if (bilder > LIMITS.bilder) probleme.push(\"zu viele Bilder\");' ' return { probleme: probleme, kosten: kosten };' '}' >> shapes.js"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 Formprüfer schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const ergebnis = pruefen(anfrage);' 'ergebnis.probleme.forEach(function (p) { console.log(\"Problem:\", p); });' 'console.log(\"Kosten:\", ergebnis.kosten, \"Einheiten (ein erfundener Preis)\");' 'async function main() {' ' const text = \"Belegtext: Brot 2,10, Milch 1,05, Summe 3,15. Wie hoch ist die Summe?\";' ' const probe = \"Die Summe beträgt 3,15.\";' ' console.log(\"Nur Text, echter Aufruf:\", await fragen([{ role: \"user\", content: text }], probe, 30));' '}' 'main();' >> shapes.js"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 aufgezeichnete Anfrage prüfen
docker exec -w /home/node/project agent node shapes.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| Problem: Teil 3: Format gif nicht erlaubt | Der Medientyp steht nicht auf der Liste |
| Problem: Teil 4: zu viele Seiten | 24 Seiten übersteigen das Limit von 20 |
| Kosten: 58 Einheiten | Text 2, zwei Bilder 8 und ein Dokument 48 |
| Nur Text, echter Aufruf | Eine kurze Antwort auf eine Textfrage oder eine gekennzeichnete aufgezeichnete Probe |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.