Αν η εφαρμογή σου εξακολουθεί να τραβά JSON από την πεζογραφία του μοντέλου με ένα regex και ένα retry loop, λύνεις ένα πρόβλημα που το Amazon Bedrock πλέον λύνει στο επίπεδο της αποκωδικοποίησης. Το structured output, γενικά διαθέσιμο στο Bedrock από τον Φεβρουάριο του 2026, περιορίζει το μοντέλο σε ένα JSON Schema καθώς παράγει tokens, οπότε η απάντηση συμμορφώνεται με το σχήμα σου εξ ορισμού και όχι από ελπίδα. Το regex ποτέ δεν ήταν η λύση. Ήταν το σύμπτωμα του να ζητάς από ένα μοντέλο «παρακαλώ επίστρεψε JSON» και μετά να καθαρίζεις όταν δεν το έκανε.

Η προσέγγιση parsing αποτυγχάνει με τρόπους που είναι ενοχλητικοί ακριβώς επειδή είναι σπάνιοι. Κάπου στο ενενήντα τοις εκατό των απαντήσεων γίνεται parse. Οι υπόλοιπες τυλίγουν το JSON σε markdown fence, προσθέτουν μια φιλική πρόταση πριν από αυτό, αφήνουν ένα κόμμα στο τέλος, ή παραισθάνονται ένα πεδίο. Ο parser σου τότε πετάει σφάλμα σε production, στο input που δεν είχες δοκιμάσει, τη χειρότερη στιγμή. Το constrained decoding αφαιρεί ολόκληρη αυτή την κατηγορία αποτυχίας γιατί το μη έγκυρο token δεν εκπέμπεται ποτέ εξαρχής.

Τρεις τρόποι να πάρεις δομή, με σειρά ισχύος

Prompt-and-pray

Ζητάς JSON στο system prompt, ίσως δίνεις ένα παράδειγμα, και κάνεις parse το κείμενο. Αυτό δουλεύει μέχρι που δεν δουλεύει. Δεν έχει καμία εγγύηση, καμία επιβολή, και το ποσοστό αποτυχίας του είναι ακριβώς η ουρά που ποτέ δεν εμφανίζεται σε ένα demo. Κάθε ώρα που ξοδεύεται στην ενίσχυση του parser είναι μια ώρα που ξοδεύεται σε ένα πρόβλημα που η πλατφόρμα μπορεί να εξαλείψει.

Χρήση εργαλείου ως σχήμα

Πολύ πριν το εγγενές structured output, το αξιόπιστο κόλπο ήταν να ορίσεις ένα εργαλείο του οποίου το input schema είναι το σχήμα που θέλεις, και μετά να διαβάσεις τα ορίσματα της κλήσης εργαλείου αντί για το κείμενο του μηνύματος. Το μοντέλο συμπληρώνει τα inputs του εργαλείου, και εσύ παίρνεις ένα δομημένο αντικείμενο. Αυτό παραμένει καλό pattern όταν η ίδια κλήση πρέπει επίσης να καλέσει πραγματικά εργαλεία. Στο Bedrock μπορείς πλέον να προσθέσεις strict: true σε έναν ορισμό εργαλείου ώστε το όνομα του εργαλείου και τα inputs να επικυρώνονται έναντι του schema αντί απλώς να προτείνονται από αυτό.

Εγγενές structured output

Η άμεση διαδρομή είναι να δηλώσεις το σχήμα της απάντησης ως JSON Schema και να αφήσεις το Bedrock να το επιβάλει κατά τη γένεση. Χρησιμοποιεί JSON Schema Draft 2020-12 και constrained decoding, οπότε το μοντέλο φυσικά δεν μπορεί να εκπέμψει ένα token που θα έσπαγε το schema. Στο Converse API το πεδίο είναι outputConfig.textFormat, και το schema χρειάζεται ένα name. Είναι διαθέσιμο στα Converse, ConverseStream, InvokeModel, και InvokeModelWithResponseStream για το Anthropic Claude 4.5 και ένα σύνολο μοντέλων ανοιχτών βαρών.

// Converse: enforce the shape instead of parsing for it
outputConfig: {
  textFormat: {
    jsonSchema: {
      name: "extraction",
      schema: {
        type: "object",
        properties: {
          invoice_id: { type: "string" },
          total_cents: { type: "integer" },
          currency: { type: "string", enum: ["USD", "EUR", "GBP"] }
        },
        required: ["invoice_id", "total_cents", "currency"],
        additionalProperties: false
      }
    }
  }
}

Τι σου αγοράζει η επιβολή

Το προφανές κέρδος είναι ότι το output γίνεται parse. Το μεγαλύτερο κέρδος είναι αυτό που μπορείς να διαγράψεις: το retry-on-invalid loop, τη βιβλιοθήκη επιδιόρθωσης JSON, το αμυντικό re-prompt που λέει «επέστρεψες μη έγκυρο JSON, δοκίμασε ξανά», και την ειδοποίηση που πυροδοτείται όταν όλα αυτά αποτύχουν ξανά. Καθένα από αυτά αντιστάθμιζε ένα πιθανοκρατικό output. Μόλις το schema επιβληθεί κατά την αποκωδικοποίηση, η αντιστάθμιση είναι νεκρός κώδικας. Λιγότερα retries σημαίνει επίσης λιγότερα tokens και χαμηλότερη καθυστέρηση, γιατί δεν πληρώνεις για μια δεύτερη κλήση για να διορθώσεις την πρώτη.

Όρισε additionalProperties: false και σημείωσε πεδία ως required ώστε το schema να είναι σφιχτό. Ένα χαλαρό schema που επιτρέπει επιπλέον κλειδιά επιστρέφει μέρος της εγγύησης που μόλις αγόρασες, γιατί το μοντέλο μπορεί ακόμα να επισυνάψει πεδία που ο κώδικάς σου δεν περιμένει.

Πού δεν εφαρμόζεται

Το structured output είναι για απαντήσεις αναγνώσιμες από μηχανή: εξαγωγή, ταξινόμηση, δρομολόγηση, ορίσματα συναρτήσεων, οτιδήποτε καταναλώνει ένα κατάντη σύστημα. Είναι το λάθος εργαλείο για πεζογραφία που διαβάζει άνθρωπος, όπου ένα άκαμπτο schema αντιστρατεύεται τον σκοπό. Και περιορίζει το σχήμα, όχι την αλήθεια. Ένα schema εγγυάται ότι το total_cents είναι ακέραιος, όχι ότι είναι ο σωστός ακέραιος. Η επικύρωση τιμών, εύρων, και επιχειρηματικών κανόνων παραμένει δική σου δουλειά. Το schema αφαιρεί το failure mode του parsing. Δεν αφαιρεί την ανάγκη να ελέγξεις ότι το μοντέλο βρήκε τη σωστή απάντηση.

Το συμπέρασμα

Το έξυπνο parsing είναι προσπάθεια που ξοδεύεται για να παρακάμψεις μια εγγύηση που το μοντέλο ποτέ δεν σου έδωσε. Το structured output του Bedrock μεταφέρει την εγγύηση μέσα στον decoder: δήλωσε ένα JSON Schema, και η απάντηση είναι έγκυρη εξ ορισμού. Χρησιμοποίησε εγγενές structured output για καθαρά δεδομένα, schemas χρήσης εργαλείων όταν η ίδια κλήση επίσης ενεργεί, και κράτα την επικύρωση σε επίπεδο τιμής ανεξάρτητα. Μετά διάγραψε το regex, το repair loop, και το retry. Ήταν σκαλωσιά για ένα πρόβλημα που πλέον δεν έχεις.

Διάβασε επίσης

Για την πλευρά πλατφόρμας και παράδοσης της αξιόπιστης παράδοσης αυτού, οι σημειώσεις πεδίου για το cloud βρίσκονται στο ercan.cloud, και ο κόμβος είναι στο ercanermis.com.