Files
prompts.chat/src/content/book/el/14a-loop-engineering.mdx
T
Fatih Kadir Akın f9bfb652f5 loop engineering
2026-07-17 12:30:58 +03:00

406 lines
36 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Το context engineering αποφασίζει **τι μπορεί να δει το μοντέλο**. Η μηχανική βρόχων αποφασίζει **τι θα κάνει το σύστημα στη συνέχεια**.
Αντί ένας άνθρωπος να διαβάζει ξανά και ξανά μια απάντηση και να γράφει το επόμενο prompt, ένας βρόχος μετατρέπει αυτή τη συνεχή παρακολούθηση σε σχεδιασμένο σύστημα. Δίνει στο AI έναν στόχο, το αφήνει να δράσει, παρατηρεί πραγματική ανατροφοδότηση, αξιολογεί το αποτέλεσμα και είτε προσαρμόζεται είτε σταματά.
<Callout type="info" title="Ο Σύντομος Ορισμός">
Μηχανική βρόχων είναι η πρακτική του σχεδιασμού του κύκλου ανατροφοδότησης γύρω από ένα σύστημα AI: ο στόχος, οι ενέργειες, οι παρατηρήσεις, η αξιολόγηση, η κατάσταση, οι δικλείδες ασφαλείας και οι κανόνες διακοπής που οδηγούν τη δουλειά σε ένα επαληθεύσιμο αποτέλεσμα.
</Callout>
## Από ένα Καλό Prompt σε έναν Καλό Βρόχο
Ένα prompt μπορεί να δώσει μια δυνατή πρώτη προσπάθεια. Ένας βρόχος είναι χρήσιμος όταν ο αριθμός των βημάτων δεν μπορεί να είναι γνωστός εκ των προτέρων, όταν το περιβάλλον μπορεί να αλλάξει ή όταν η πρώτη προσπάθεια πρέπει να ελεγχθεί με βάση αποδείξεις.
<Compare
before={{
label: "Μεμονωμένο Prompt",
content: "Ερώτηση → Παραγωγή → Επιστροφή\n\nΤο μοντέλο παράγει μια απάντηση. Ένας άνθρωπος αποφασίζει αν δούλεψε και γράφει το επόμενο prompt."
}}
after={{
label: "Σχεδιασμένος Βρόχος",
content: "Πλαισίωση → Δράση → Παρατήρηση → Αξιολόγηση → Προσαρμογή\n ↑______________________↓\n\nΤο σύστημα συγκεντρώνει αποδείξεις, καταγράφει την κατάσταση και συνεχίζει μόνο όσο ένα ακόμη πέρασμα είναι χρήσιμο."
}}
/>
Η ιδέα αυτή χτίζει πάνω σε προγενέστερα μοτίβα agents. Η [εργασία ReAct](https://arxiv.org/abs/2210.03629) έδειξε την αξία της εναλλαγής ενεργειών με παρατηρήσεις από ένα εξωτερικό περιβάλλον. Το [μοτίβο evaluator-optimizer](https://www.anthropic.com/engineering/building-effective-agents) της Anthropic προσθέτει ένα διακριτό βήμα ανατροφοδότησης, ενώ ο [πρακτικός οδηγός για agents](https://openai.com/business/guides-and-resources/a-practical-guide-to-building-ai-agents/) της OpenAI περιγράφει τις εκτελέσεις των agents ως βρόχους που διέπονται από συνθήκες εξόδου. Ο νεότερος όρος **μηχανική βρόχων** στρέφει την προσοχή στον συνειδητό σχεδιασμό ολόκληρου αυτού του κύκλου.
## Οι Πέντε Κινήσεις
<InfoGrid items={[
{ label: "1. Πλαισίωση", description: "Μετάτρεψε την πρόθεση σε στόχο, περιορισμούς, κριτήρια επιτυχίας και προϋπολογισμό.", color: "blue" },
{ label: "2. Δράση", description: "Διάλεξε μία οριοθετημένη ενέργεια: αναζήτηση, επεξεργασία, υπολογισμό, κλήση εργαλείου ή ερώτηση σε άνθρωπο.", color: "amber" },
{ label: "3. Παρατήρηση", description: "Συγκέντρωσε ό,τι πραγματικά συνέβη: έξοδο τεστ, αποτελέσματα API, παραπομπές ή σχόλια χρηστών.", color: "cyan" },
{ label: "4. Αξιολόγηση", description: "Σύγκρινε τις αποδείξεις με ρητά κριτήρια—όχι με την αυτοπεποίθηση του μοντέλου.", color: "purple" },
{ label: "5. Προσαρμογή", description: "Ενημέρωσε την κατάσταση, άλλαξε το σχέδιο, ξαναδοκίμασε με ασφάλεια, κλιμάκωσε ή σταμάτα.", color: "green" },
]} />
Ο βρόχος δεν είναι τα βέλη. Η μηχανική βρίσκεται στα **συμβόλαια ανάμεσα στα βέλη**: τι μετράει ως ενέργεια, ποιες παρατηρήσεις είναι αξιόπιστες, ποιος τις αξιολογεί, ποια κατάσταση διατηρείται και πότε ακριβώς τερματίζεται η εκτέλεση.
<LoopEngineeringLab content={{
eyebrow: "Έλεγχος βρόχου / διαδραστικός προσομοιωτής",
title: "Προχώρησε βήμα-βήμα μέσα από έναν λειτουργικό βρόχο ανατροφοδότησης",
description: "Διάλεξε μια εργασία και μετά προχώρα ένα σήμα τη φορά. Πρόσεξε πώς η πρόοδος προκύπτει από αποδείξεις του περιβάλλοντος και ρητή αξιολόγηση—όχι από το να ρωτάς το μοντέλο αν νιώθει ότι τελείωσε.",
chooseScenarioLabel: "Διάλεξε έναν βρόχο",
goalLabel: "Στόχος",
stopRuleLabel: "Κανόνας διακοπής",
evidenceLabel: "Αξιόπιστες αποδείξεις",
iterationLabel: "Επανάληψη",
progressLabel: "Επαληθευμένη πρόοδος",
openIssuesLabel: "Ανοιχτά ζητήματα",
currentSignalLabel: "Τρέχον σήμα",
advanceLabel: "Προχώρησε ένα βήμα",
nextIterationLabel: "Ξεκίνα την επόμενη επανάληψη",
resetLabel: "Επαναφορά βρόχου",
completeLabel: "Ο στόχος επαληθεύτηκε",
completeDescription: "Τα κριτήρια επιτυχίας ικανοποιούνται, οι αποδείξεις έχουν καταγραφεί και ο βρόχος σταματά αντί να ξοδέψει έναν ακόμη κύκλο.",
stages: [
{ id: "frame", label: "Πλαισίωση", verb: "Ξαναδιάβασε το συμβόλαιο" },
{ id: "act", label: "Δράση", verb: "Κάνε μία οριοθετημένη κίνηση" },
{ id: "observe", label: "Παρατήρηση", verb: "Διάβασε την εξωτερική ανατροφοδότηση" },
{ id: "evaluate", label: "Αξιολόγηση", verb: "Εφάρμοσε τη ρουμπρίκα" },
{ id: "adapt", label: "Προσαρμογή", verb: "Ενημέρωσε την επόμενη κίνηση" },
],
scenarios: [
{
id: "code",
label: "Διόρθωσε ένα bug στο checkout",
goal: "Διόρθωσε τα σύνολα του checkout χωρίς να αλλάξεις την έγκυρη συμπεριφορά των εκπτώσεων.",
stopRule: "Το στοχευμένο regression test περνάει, ολόκληρη η σουίτα του checkout περνάει και το lint είναι καθαρό—ή εξαντλούνται τρεις προσπάθειες και ο βρόχος κλιμακώνει σε άνθρωπο.",
evidence: "Βήματα αναπαραγωγής, έξοδος των τεστ, το diff του κώδικα και η τελική σουίτα regression.",
cycles: [
{
action: "Αναπαράγαγε το αναφερόμενο σύνολο και πρόσθεσε ένα τεστ που αποτυγχάνει για φόρο συν ποσοστιαία έκπτωση.",
observation: "Το τεστ αποτυγχάνει κατά ένα σεντ μόνο όταν ο φόρος στρογγυλοποιείται πριν εφαρμοστεί η έκπτωση.",
evaluation: "Το bug αναπαράγεται με ντετερμινιστικό σήμα, αλλά η αιτία του δεν έχει διορθωθεί ακόμη.",
adaptation: "Εξέτασε το όριο της στρογγυλοποίησης και άλλαξε μόνο τη διαδρομή υπολογισμού του συνόλου της παραγγελίας.",
progress: 34,
openIssues: 2,
},
{
action: "Μετακίνησε τη στρογγυλοποίηση στο τελικό νομισματικό όριο και τρέξε στοχευμένα τεστ του checkout.",
observation: "Το regression περνάει, αλλά ένα τεστ ενσωμάτωσης κουπονιών αποτυγχάνει τώρα σε έκπτωση σταθερού ποσού.",
evaluation: "Το πρώτο σύμπτωμα διορθώθηκε, αλλά η αλλαγή είναι υπερβολικά ευρεία. Ο κανόνας διακοπής δεν ικανοποιείται.",
adaptation: "Στένεψε τη διόρθωση και πρόσθεσε μια περίπτωση που διαχωρίζει τη στρογγυλοποίηση φόρου από τη στρογγυλοποίηση κουπονιών.",
progress: 71,
openIssues: 1,
},
{
action: "Εφάρμοσε τη στενή διόρθωση του υπολογισμού και μετά τρέξε το regression, ολόκληρη τη σουίτα του checkout και το lint.",
observation: "Όλοι οι έλεγχοι περνούν. Το diff αγγίζει μία συνάρτηση υπολογισμού και το νέο regression test.",
evaluation: "Κάθε κριτήριο επιτυχίας έχει ανεξάρτητες αποδείξεις και δεν ξεπεράστηκε κανένα όριο του προϋπολογισμού.",
adaptation: "Σταμάτα, κράτησε την έξοδο των τεστ και παράδωσε το μικρό diff σε άνθρωπο για ανασκόπηση.",
progress: 100,
openIssues: 0,
},
],
},
{
id: "research",
label: "Επαλήθευσε έναν ερευνητικό ισχυρισμό",
goal: "Αξιολόγησε τον ισχυρισμό ότι η εξ αποστάσεως εργασία αυξάνει πάντα την παραγωγικότητα της ομάδας.",
stopRule: "Ένα σταθμισμένο συμπέρασμα υποστηρίζεται από τουλάχιστον τρεις αξιόπιστες πηγές, με τις διαφωνίες και τους περιορισμούς να αναφέρονται ρητά.",
evidence: "Άμεσοι σύνδεσμοι προς τις πηγές, ημερομηνίες δημοσίευσης, μέθοδοι των μελετών, μεγέθη δειγμάτων και οι μετρικές που παρατίθενται.",
cycles: [
{
action: "Αναζήτησε πρόσφατα στοιχεία και ανίχνευσε το πιο συχνά επαναλαμβανόμενο στατιστικό παραγωγικότητας μέχρι την πηγή του.",
observation: "Τα περισσότερα άρθρα αναπαράγουν μια έρευνα προμηθευτή χωρίς σύνδεσμο προς το ερωτηματολόγιο ή το πρωτογενές δείγμα της.",
evaluation: "Τα στοιχεία είναι δημοφιλή, αλλά όχι αρκετά ισχυρά για να στηρίξουν έναν απόλυτο ισχυρισμό.",
adaptation: "Δώσε προτεραιότητα σε μελέτες με αξιολόγηση από ομοτίμους και δημόσια σύνολα δεδομένων· αναζήτησε και αντίθετα ευρήματα.",
progress: 28,
openIssues: 3,
},
{
action: "Σύγκρινε δύο μελέτες με αξιολόγηση από ομοτίμους με ένα εθνικό σύνολο δεδομένων για την αγορά εργασίας.",
observation: "Τα αποτελέσματα ποικίλλουν ανάλογα με τον τύπο της εργασίας, τη μέθοδο μέτρησης και το αν η εργασία είναι πλήρως απομακρυσμένη ή υβριδική.",
evaluation: "Τα στοιχεία αντικρούουν τη λέξη «πάντα». Ένα συμπέρασμα υπό όρους αρχίζει να γίνεται υποστηρίξιμο.",
adaptation: "Έλεγξε αν οι μελέτες διακρίνουν το παραγόμενο έργο, τις ώρες εργασίας και την αντιλαμβανόμενη παραγωγικότητα.",
progress: 68,
openIssues: 1,
},
{
action: "Φτιάξε έναν πίνακα αποδείξεων και επαλήθευσε κάθε ισχυρισμό με βάση την αρχική πηγή.",
observation: "Οι πηγές υποστηρίζουν μικτές επιδράσεις και αναδεικνύουν την αυτονομία, τον συντονισμό και τον τύπο της εργασίας ως βασικές μεταβλητές.",
evaluation: "Το συμπέρασμα τεκμηριώνεται, η αβεβαιότητα είναι ορατή και το κατώφλι των πηγών έχει καλυφθεί.",
adaptation: "Σταμάτα με μια απάντηση με επιφυλάξεις και κράτησε τον πίνακα αποδείξεων για ανασκόπηση.",
progress: 100,
openIssues: 0,
},
],
},
{
id: "writing",
label: "Τελειοποίησε ένα email λανσαρίσματος",
goal: "Φτιάξε ένα συνοπτικό email λανσαρίσματος που εξηγεί το όφελος και κερδίζει ποιοτικά κλικ για demo.",
stopRule: "Το email περνάει τη ρουμπρίκα ύφους, μένει κάτω από 140 λέξεις, περιέχει ένα σαφές κάλεσμα σε δράση και αντέχει σε έλεγχο γεγονότων.",
evidence: "Αριθμός λέξεων, βαθμολογίες ρουμπρίκας, επικύρωση συνδέσμων, τα στοιχεία του προϊόντος από την πηγή και σημειώσεις του αναθεωρητή.",
cycles: [
{
action: "Γράψε ένα προσχέδιο από το brief του προϊόντος και βαθμολόγησε το αποτέλεσμα με τη ρουμπρίκα κοινού και ύφους.",
observation: "Το προσχέδιο έχει 204 λέξεις, ανοίγει με χαρακτηριστικά και περιέχει δύο ανταγωνιστικά καλέσματα σε δράση.",
evaluation: "Τα γεγονότα είναι ακριβή, αλλά τα κριτήρια ιεράρχησης και μήκους αποτυγχάνουν.",
adaptation: "Ξεκίνα με το όφελος για τον πελάτη, αφαίρεσε τη δευτερεύουσα ενέργεια και κόψε τις λεπτομέρειες υλοποίησης.",
progress: 41,
openIssues: 3,
},
{
action: "Ξαναγράψε την εισαγωγή και συμπύκνωσε το κείμενο σε μία αλληλουχία πρόβλημα-όφελος-απόδειξη.",
observation: "Το email έχει 126 λέξεις και ένα CTA, αλλά η πρόταση της απόδειξης υπερβάλλει για ένα αποτέλεσμα της beta.",
evaluation: "Η δομή περνάει. Η ακρίβεια των γεγονότων εξακολουθεί να αποτυγχάνει στη ρουμπρίκα.",
adaptation: "Αντικατάστησε τον γενικόλογο ισχυρισμό με το μετρημένο αποτέλεσμα της beta και ζήτησε έναν τελικό έλεγχο γεγονότων.",
progress: 79,
openIssues: 1,
},
{
action: "Βάλε την επαληθευμένη μετρική, επικύρωσε τον σύνδεσμο και τρέξε άλλη μία φορά ολόκληρη τη ρουμπρίκα.",
observation: "Το email έχει 132 λέξεις, ο σύνδεσμος ανοίγει, τα γεγονότα συμφωνούν με το brief και κάθε στοιχείο της ρουμπρίκας περνάει.",
evaluation: "Το παραδοτέο ικανοποιεί τον ορισμένο πήχη ποιότητας με αποδείξεις που μπορούν να ελεγχθούν.",
adaptation: "Σταμάτα και στείλε την εγκεκριμένη έκδοση στον υπεύθυνο της καμπάνιας.",
progress: 100,
openIssues: 0,
},
],
},
],
}} />
## Γράψε Πρώτα το Συμβόλαιο του Βρόχου
Πριν διαλέξεις μοντέλο ή framework, γράψε ένα μικρό συμβόλαιο. Αν αυτά τα πεδία είναι ασαφή, ο βρόχος θα μετατρέψει την ασάφεια σε επαναλαμβανόμενο κόστος.
```yaml
goal: "Ποια παρατηρήσιμη κατάσταση πρέπει να γίνει αληθής;"
inputs: "Τι ξεκινά τον βρόχο;"
state: "Ποια γεγονότα και προσπάθειες διατηρούνται μεταξύ των επαναλήψεων;"
actions: "Ποια εργαλεία επιτρέπεται να χρησιμοποιεί το σύστημα και με ποια δικαιώματα;"
observations: "Ποια εξωτερικά σήματα επιστρέφουν από αυτές τις ενέργειες;"
evaluator: "Ποια ρουμπρίκα ή ποιοι ντετερμινιστικοί έλεγχοι κρίνουν το αποτέλεσμα;"
success: "Ποιες αποδείξεις τεκμηριώνουν ότι ο στόχος ολοκληρώθηκε;"
failure: "Ποιες συνθήκες απαιτούν ανάκαμψη ή ανθρώπινη βοήθεια;"
budget: "Μέγιστοι γύροι, χρόνος, tokens, χρήματα ή παρενέργειες"
```
<Callout type="warning" title="Βρόχος Χωρίς Έξοδο Είναι Μορφή Αποτυχίας">
Όρισε πάντα τρεις εξόδους: **επιτυχία** όταν οι αποδείξεις ικανοποιούν τον στόχο, **αποτυχία** όταν η ανάκαμψη δεν είναι πια χρήσιμη, και **εξάντληση προϋπολογισμού** όταν ο βρόχος φτάσει στο επιτρεπόμενο όριο κόστους ή ρίσκου.
</Callout>
## Οι Παρατηρήσεις Πρέπει να Έρχονται από τον Κόσμο
Το να λέει το μοντέλο «αυτό φαίνεται σωστό» δεν είναι ισχυρή απόδειξη. Μια χρήσιμη παρατήρηση παράγεται από κάτι έξω από την απάντηση που κρίνεται.
<table>
<thead>
<tr>
<th>Εργασία</th>
<th>Αδύναμη παρατήρηση</th>
<th>Ισχυρή παρατήρηση</th>
</tr>
</thead>
<tbody>
<tr>
<td>Διόρθωση κώδικα</td>
<td>«Η διόρθωση θα πρέπει να δουλεύει.»</td>
<td>Η αρχική αποτυχία αναπαράγεται και μετά το regression και ολόκληρη η σουίτα περνούν.</td>
</tr>
<tr>
<td>Έρευνα</td>
<td>«Αρκετές πηγές συμφωνούν.»</td>
<td>Οι ισχυρισμοί παραπέμπουν σε πρωτότυπες πηγές, με καταγεγραμμένες ημερομηνίες, μεθόδους και διαφωνίες.</td>
</tr>
<tr>
<td>Εξαγωγή δεδομένων</td>
<td>«Το JSON μοιάζει έγκυρο.»</td>
<td>Η επικύρωση του schema περνάει και δειγματοληπτικές εγγραφές συμφωνούν με την πηγή.</td>
</tr>
<tr>
<td>Περιεχόμενο</td>
<td>«Το κείμενο μοιάζει σαφές.»</td>
<td>Περνάει μια συγκεκριμένη ρουμπρίκα, έλεγχο γεγονότων, ελέγχους συνδέσμων και δοκιμή στο κοινό.</td>
</tr>
<tr>
<td>Λειτουργίες</td>
<td>«Το αίτημα πέτυχε.»</td>
<td>Το εξωτερικό σύστημα επιστρέφει την αναμενόμενη κατάσταση και υπάρχει εγγραφή ελέγχου (audit).</td>
</tr>
</tbody>
</table>
Γι' αυτό έχουν σημασία τα εργαλεία: τα τεστ, οι browsers, οι βάσεις δεδομένων, οι validators και η ανθρώπινη ανασκόπηση μετατρέπουν μια εσωτερική εικασία σε παρατηρήσιμο αποτέλεσμα.
## Διαχώρισε τον Δημιουργό από τον Ελεγκτή
Για δουλειά χαμηλού ρίσκου, ένα μοντέλο μπορεί να συντάσσει και να αυτοελέγχεται. Για σημαντική δουλειά, χρησιμοποίησε έναν ελεγκτή με διαφορετικό ρόλο και περιορισμένη εξουσία.
<InfoGrid columns={2} items={[
{ label: "Δημιουργός (maker)", description: "Προτείνει την αλλαγή, καλεί τα εργαλεία δράσης και εξηγεί ποιες αποδείξεις πρέπει να συλλεχθούν.", color: "amber" },
{ label: "Ελεγκτής (checker)", description: "Λαμβάνει τον στόχο, το παραδοτέο και τις αποδείξεις· εφαρμόζει τη ρουμπρίκα· δεν μπορεί να ξαναγράψει σιωπηλά τη δουλειά που βαθμολογεί.", color: "green" },
]} />
Ο ελεγκτής δεν χρειάζεται να είναι ένα ακόμη AI. Προτίμησε τον πιο ντετερμινιστικό αξιολογητή που είναι διαθέσιμος:
1. **Ακριβείς έλεγχοι** — τύποι, schemas, περιορισμοί, δικαιώματα, hashes
2. **Εκτελέσιμοι έλεγχοι** — τεστ, linters, προσομοιώσεις, επικύρωση συνδέσμων
3. **Έλεγχοι με ρουμπρίκα** — ένα ανεξάρτητο μοντέλο ή ένας άνθρωπος που χρησιμοποιεί συγκεκριμένα κριτήρια
4. **Έλεγχοι αποτελέσματος** — πραγματική συμπεριφορά χρηστών ή μετρικές παραγωγής σε βάθος χρόνου
<Callout type="tip" title="Η Αυτοπεποίθηση Δεν Είναι Απόδειξη">
Ένα σκορ βεβαιότητας που παράγεται από το ίδιο μοντέλο που έφτιαξε το παραδοτέο παραμένει έξοδος του μοντέλου. Αντιμετώπισέ το ως ένδειξη για δρομολόγηση, όχι ως απόδειξη.
</Callout>
## Η Κατάσταση Είναι η Ραχοκοκαλιά του Βρόχου
Το context είναι αυτό που βλέπει το μοντέλο **σε αυτόν τον γύρο**. Η κατάσταση (state) είναι η συμπαγής καταγραφή που επιτρέπει στον επόμενο γύρο να συνεχίσει χωρίς να επαναλάβει ή να ξεχάσει δουλειά.
<Checklist title="Χρήσιμη Κατάσταση Βρόχου" items={[
{ text: "Ο τρέχων στόχος και τα κριτήρια αποδοχής" },
{ text: "Ενέργειες που έχουν ήδη δοκιμαστεί και τα παρατηρήσιμα αποτελέσματά τους" },
{ text: "Παραδοτέα που παράχθηκαν, με εκδόσεις ή σταθερές αναφορές" },
{ text: "Ετυμηγορίες του αξιολογητή και ανεπίλυτα ζητήματα" },
{ text: "Ο προϋπολογισμός που καταναλώθηκε και τα δικαιώματα που παραμένουν διαθέσιμα" },
{ text: "Ο λόγος για συνέχιση, διακοπή ή κλιμάκωση" },
]} />
Αποθήκευσε συνοπτικές αποφάσεις και αποδείξεις—όχι την εσωτερική αλυσίδα σκέψης ενός μοντέλου. Η καλή κατάσταση είναι μικρή, επιθεωρήσιμη και ασφαλής για συνέχιση.
## Συνηθισμένα Σχήματα Βρόχων
### Ο Βρόχος Επιδιόρθωσης
`αναπαραγωγή → αλλαγή ενός πράγματος → εκτέλεση ελέγχων → διάγνωση → επανάληψη ή διακοπή`
Ιδανικός για κώδικα, ρυθμίσεις, καθαρισμό δεδομένων και κάθε εργασία με εκτελέσιμη ανατροφοδότηση.
### Ο Βρόχος Evaluator-Optimizer
`παραγωγή → βαθμολόγηση με ρουμπρίκα → επιστροφή στοχευμένης ανατροφοδότησης → αναθεώρηση`
Ιδανικός για γράψιμο, μετάφραση, κριτική σχεδιασμού και αποτελέσματα των οποίων η ποιότητα βελτιώνεται μέσα από διατυπωμένη ανατροφοδότηση.
### Ο Βρόχος Έρευνας
`αναζήτηση → εξέταση πηγών → εντοπισμός κενών ή αντιφάσεων → νέα αναζήτηση → σύνθεση`
Ιδανικός όταν η πληρότητα δεν είναι γνωστή εκ των προτέρων. Ο κανόνας διακοπής πρέπει να μετρά την κάλυψη των αποδείξεων, όχι τον αριθμό των αποτελεσμάτων αναζήτησης.
### Ο Βρόχος με Ανθρώπινη Έγκριση
`προετοιμασία → αυτόματη επαλήθευση → παύση πριν από ενέργεια υψηλού ρίσκου → ο άνθρωπος εγκρίνει ή ανακατευθύνει`
Ιδανικός για πληρωμές, δημοσιεύσεις, διαγραφές, αλλαγές πρόσβασης, ιατρικές ή νομικές αποφάσεις και άλλες ενέργειες με σοβαρές συνέπειες.
## Μορφές Αποτυχίας που Πρέπει να Εξαλείψεις με τον Σχεδιασμό
<table>
<thead>
<tr>
<th>Αποτυχία</th>
<th>Τι συνέβη</th>
<th>Μηχανική απάντηση</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ατέρμονη επανάληψη</td>
<td>Ο βρόχος δεν έχει μετρήσιμη έξοδο επιτυχίας ή προϋπολογισμού.</td>
<td>Πρόσθεσε ρητές τερματικές καταστάσεις και ένα αυστηρό όριο επαναλήψεων.</td>
</tr>
<tr>
<td>Αυτοεπιβράβευση</td>
<td>Ο δημιουργός αποδέχεται τη δική του εύλογη απάντηση χωρίς αποδείξεις.</td>
<td>Χρησιμοποίησε ντετερμινιστικούς ελέγχους ή έναν ανεξάρτητο ελεγκτή.</td>
</tr>
<tr>
<td>Χιονοστιβάδα context</td>
<td>Κάθε επανάληψη προσθέτει τα πάντα, μέχρι το μοντέλο να χάσει το σήμα.</td>
<td>Διατήρησε δομημένη κατάσταση και ανασυγκρότησε μόνο το σχετικό context.</td>
</tr>
<tr>
<td>Αμφιταλάντευση (thrashing)</td>
<td>Ο βρόχος εναλλάσσεται άσκοπα ανάμεσα σε δύο διορθώσεις.</td>
<td>Εντόπισε επαναλαμβανόμενες καταστάσεις και απαίτησε διαφορετική στρατηγική ή κλιμάκωση.</td>
</tr>
<tr>
<td>Απόκλιση από τον στόχο</td>
<td>Τοπικές βελτιώσεις αντικαθιστούν τον αρχικό σκοπό.</td>
<td>Ξαναδιάβασε τον αμετάβλητο στόχο και τα κριτήρια αποδοχής σε κάθε κύκλο.</td>
</tr>
<tr>
<td>Μη ασφαλής επανάληψη</td>
<td>Ένα αναστρέψιμο λάθος γίνεται επιζήμιο όταν επαναλαμβάνεται.</td>
<td>Περιόρισε δικαιώματα, παρενέργειες, ρυθμό, δαπάνη και εμβέλεια της ζημιάς.</td>
</tr>
</tbody>
</table>
## Μια Ελάχιστη Υλοποίηση
```typescript
let state = initialize(goal, acceptanceCriteria, budget);
while (state.budget.remaining > 0) {
const context = assembleRelevantContext(state);
const proposedAction = await maker.chooseAction(context);
const observation = await tools.executeWithinPolicy(proposedAction);
const verdict = await evaluator.check({ goal, observation, state });
state = recordIteration(state, { proposedAction, observation, verdict });
if (verdict.status === "passed") return complete(state);
if (verdict.status === "unsafe" || verdict.status === "blocked") {
return escalateToHuman(state);
}
state = adaptPlan(state, verdict.feedback);
}
return stopWithBudgetReport(state);
```
Ο κώδικας είναι το εύκολο κομμάτι. Οι δύσκολες ερωτήσεις είναι ερωτήσεις του εκάστοτε πεδίου: Ποιο τεστ αποδεικνύει ότι το bug εξαφανίστηκε; Ποια πηγή είναι έγκυρη; Ποια ενέργεια είναι αναστρέψιμη; Ποιος μπορεί να εγκρίνει το τελικό βήμα; Αυτές οι αποφάσεις είναι η πραγματική δουλειά της μηχανικής βρόχων.
## Εξάσκηση: Σχεδίασε έναν Βρόχο
<TryIt
title="Σύνταξε ένα Συμβόλαιο Βρόχου"
description="Αντικατάστησε τις μεταβλητές με μια επαναλαμβανόμενη εργασία από τη δική σου δουλειά. Ζήτησε από το AI να αμφισβητήσει τις αδύναμες αποδείξεις και τους ασαφείς κανόνες διακοπής."
prompt={`Σχεδίασε έναν οριοθετημένο βρόχο εργασίας AI για αυτή την εργασία:
ΕΡΓΑΣΙΑ: \${task:διαλογή των νέων αιτημάτων υποστήριξης πελατών κάθε πρωί}
Όρισε:
1. Τον παρατηρήσιμο στόχο
2. Το έναυσμα και τις απαιτούμενες εισόδους
3. Τις επιτρεπόμενες ενέργειες και τα δικαιώματα των εργαλείων
4. Τις αξιόπιστες παρατηρήσεις από το εξωτερικό περιβάλλον
5. Τον αξιολογητή και τη ρουμπρίκα του
6. Την κατάσταση που διατηρείται μεταξύ των επαναλήψεων
7. Τις εξόδους επιτυχίας, αποτυχίας και εξάντλησης προϋπολογισμού
8. Τα σημεία ανθρώπινης έγκρισης για επικίνδυνες ενέργειες
9. Μια μορφή καταγραφής (trace) που κάνει κάθε επανάληψη ελέγξιμη
Στη συνέχεια, εντόπισε τις τρεις πιο πιθανές μορφές αποτυχίας στον σχεδιασμό σου και αναθεώρησε τον βρόχο για να τις αποτρέψεις.`}
/>
<Quiz
question="Ένας agent επεξεργάζεται κώδικα, ξαναδιαβάζει το diff και λέει ότι το bug διορθώθηκε. Ποιο είναι το πιο σημαντικό κομμάτι του βρόχου που λείπει;"
options={[
"Ένα μεγαλύτερο system prompt",
"Μια εξωτερική παρατήρηση που αξιολογείται με βάση έναν κανόνα διακοπής",
"Ένα δεύτερο πέρασμα επεξεργασίας",
"Ένα μεγαλύτερο παράθυρο context"
]}
correctIndex={1}
explanation="Ο agent έχει παραγάγει και επιθεωρήσει ένα παραδοτέο, αλλά δεν έχει συγκεντρώσει ανεξάρτητες αποδείξεις. Η αναπαραγωγή της αποτυχίας και η εκτέλεση των σχετικών τεστ θα δημιουργούσαν ένα παρατηρήσιμο σήμα που μπορεί να αξιολογηθεί από έναν κανόνα διακοπής."
/>
## Περαιτέρω Ανάγνωση
- [Loop Engineering — Addy Osmani](https://addyosmani.com/blog/loop-engineering/) — η πρόσφατη διατύπωση της αντικατάστασης των χειροκίνητων επόμενων prompts με ένα σχεδιασμένο σύστημα, μαζί με πρακτικές επιφυλάξεις για την επαλήθευση και την ανθρώπινη ευθύνη
- [Building Effective Agents — Anthropic](https://www.anthropic.com/engineering/building-effective-agents) — ροές εργασίας evaluator-optimizer, ανατροφοδότηση από το περιβάλλον, συνθήκες διακοπής και καθοδήγηση για το πότε δικαιολογείται η πολυπλοκότητα των agents
- [A Practical Guide to Building Agents — OpenAI](https://openai.com/business/guides-and-resources/a-practical-guide-to-building-ai-agents/) — εκτελέσεις agents, συνθήκες εξόδου, εργαλεία, δικλείδες ασφαλείας και ανθρώπινη παρέμβαση
- [ReAct: Synergizing Reasoning and Acting in Language Models](https://arxiv.org/abs/2210.03629) — θεμελιώδης έρευνα για την εναλλαγή ενεργειών με παρατηρήσεις από ένα εξωτερικό περιβάλλον
## Σύνοψη
<Callout type="tip" title="Χτίσε την Ανατροφοδότηση, Όχι Μόνο το Prompt">
Ένας αξιόπιστος βρόχος έχει μετρήσιμο στόχο, οριοθετημένες ενέργειες, αξιόπιστες παρατηρήσεις, ρητό αξιολογητή, συμπαγή κατάσταση, ασφαλείς εξόδους και ανθρώπινη κρίση εκεί όπου οι συνέπειες το απαιτούν. Το μοντέλο βρίσκεται μέσα στον βρόχο· ο μηχανικός παραμένει υπεύθυνος για τον βρόχο.
</Callout>