Context Engineering: Γιατί ο agent σας γίνεται πιο χαζός στο turn 40
Μία πληροφορία τρεις γραμμές πιο κάτω σε prompt με 2,6 % του παραθύρου ρίχνει το retrieval από 84 % σε 19 %. Το παράθυρο δεν έφταιγε.
Σε αυτή τη σελίδα
Ακολουθεί ένα prompt που στάλθηκε 288 φορές στο ίδιο μοντέλο με greedy decoding. Έχει μήκος 853 tokens. Περιέχει ένα μητρώο είκοσι πέντε ticket υποστήριξης — πόλη, ουρά, προτεραιότητα, owner, εσωτερικό — και μία ερώτηση: Η Marta Ferreira χρειάζεται να την καλέσουν για το ticket της. Ποιο είναι το απευθείας εσωτερικό για αυτό το ticket;
Το μητρώο είναι πανομοιότυπο κάθε φορά. Το μοντέλο είναι πανομοιότυπο κάθε φορά. Το μόνο που αλλάζει είναι ποια από τις είκοσι πέντε γραμμές περιέχει την απάντηση.
| θέση της απάντησης | επιτυχίες | ποσοστό retrieval | διάστημα 95 % |
|---|---|---|---|
| 1 από 25 | 27/32 | 84 % | 68–93 % |
| 4 από 25 | 6/32 | 19 % | 9–35 % |
| 7 από 25 | 6/32 | 19 % | 9–35 % |
| 10 από 25 | 9/32 | 28 % | 16–45 % |
| 13 από 25 | 8/32 | 25 % | 13–42 % |
| 16 από 25 | 6/32 | 19 % | 9–35 % |
| 19 από 25 | 6/32 | 19 % | 9–35 % |
| 22 από 25 | 3/32 | 9 % | 3–24 % |
| 25 από 25 | 7/32 | 22 % | 11–39 % |
Τριάντα δύο δοκιμές ανά σειρά, διαφορετικό ticket σε κάθε δοκιμή, διαστήματα Wilson από το Κεφάλαιο 4, επειδή τα δεκαεπτά στα είκοσι δεν ξεχωρίζουν τίποτα από τίποτα.
Η πρώτη θέση απαντιέται 84 % των φορών. Κάθε άλλη θέση βρίσκεται ανάμεσα στο 9 % και στο 28 % και τα οκτώ αυτά διαστήματα επικαλύπτονται, άρα η τίμια ανάγνωση είναι πρώτα, και μετά όλα τα υπόλοιπα. Οι Liu et al. βρήκαν ένα U — ψηλά και στα δύο άκρα, χαμηλά στη μέση — και ο βραχίονας recency δεν είναι καθαρά παρών εδώ: το 22 % στην τελευταία θέση βρίσκεται μέσα στη διασπορά των μεσαίων. Αυτό που δεν βρίσκεται μέσα σε τίποτα είναι η πτώση από τη θέση 1 στη θέση 4. Τρεις γραμμές.
Το context window αυτού του μοντέλου είναι 32.768 tokens. Το prompt χρησιμοποιεί 853 από αυτά, 2,6 %. Τίποτα δεν ξεχείλισε, τίποτα δεν κόπηκε, κανένα όριο δεν έφτασε, καμία προειδοποίηση δεν εμφανίστηκε. Το μοντέλο σταμάτησε να βρίσκει μια γραμμή που του είχε δοθεί, επειδή η γραμμή μετακινήθηκε τρεις θέσεις πιο κάτω σε μια λίστα είκοσι πέντε στοιχείων.
Το Κεφάλαιο 16 κοστολόγησε το context window και έκλεισε προειδοποιώντας ότι το να έχετε ένα εκατομμύριο tokens δεν είναι το ίδιο με το να τα χρησιμοποιείτε, και έδειξε προς τα εδώ. Αυτό είναι το εδώ.
Εμφάνιση λεπτομερειών
Τι χρειάζεται αυτό το κεφάλαιο από τα προηγούμενα.
- Κεφάλαιο 9 παρήγαγε το self-attention και το κόστος του . Κάθε token attends σε κάθε άλλο, άρα ο αριθμός των ζευγαρωτών σχέσεων μεγαλώνει με το τετράγωνο του μήκους. Αυτό το γεγονός χρησιμοποιείται παρακάτω, δεν ξαναπαράγεται.
- Κεφάλαιο 16 μέτρησε τα πέντε χρεώσιμα bucket token και έδειξε ότι ο λογαριασμός μιας συνομιλίας μεγαλώνει τετραγωνικά. Αυτό το κεφάλαιο αφορά το τι κάνετε γι’ αυτό χωρίς να σπάσετε τον agent.
- Κεφάλαιο 18 έφτιαξε τον κατάλογο εργαλείων και μέτρησε ότι είκοσι εργαλεία δεν έβλαψαν την επιλογή αλλά πολλαπλασίασαν το prompt επί έξι. Εδώ είναι ο λογαριασμός τους.
- Κεφάλαιο 19 έφτιαξε το retrieval. Το just-in-time retrieval παρακάτω είναι εκείνο το κεφάλαιο εφαρμοσμένο στο ίδιο το ιστορικό ενός agent· το chunking δεν εξηγείται ξανά.
- Κεφάλαιο 23 έφτιαξε το harness. Όλα σε αυτό το κεφάλαιο είναι μια πολιτική που τρέχει μέσα στο loop του, γι’ αυτό είναι TypeScript: το artifact είναι μια μακρόβια υπηρεσία που κρατά state, όχι ένα notebook που κρατά tensors.
Δύο δουλειές με παρόμοια ονόματα
Σύνδεσμος στην ενότητα: Δύο δουλειές με παρόμοια ονόματαΗ Anthropic τράβηξε τη γραμμή τον Σεπτέμβριο του 2025 και οι δύο προτάσεις πρέπει να στέκονται δίπλα δίπλα. Prompt engineering είναι «μέθοδοι για τη συγγραφή και την οργάνωση οδηγιών LLM για βέλτιστα αποτελέσματα». Context engineering είναι «το σύνολο στρατηγικών για την επιμέλεια και τη διατήρηση του βέλτιστου συνόλου tokens (πληροφορίας) κατά το LLM inference, συμπεριλαμβανομένης όλης της άλλης πληροφορίας που μπορεί να καταλήξει εκεί εκτός των prompts».1
Η λειτουργική διαφορά είναι πότε, και από ποιον. Ένα prompt γράφεται μία φορά, από άνθρωπο, και ελέγχεται. Ένα context συναρμολογείται σε κάθε κλήση, από κώδικα που δεν κοιτάζει κανείς, από υλικό που κανείς δεν έγραψε με το χέρι: σαράντα turns ιστορικού, έξι αποτελέσματα εργαλείων, τέσσερα retrieved αποσπάσματα, ένα προφίλ χρήστη, δώδεκα JSON schemas. Το Κεφάλαιο 15 μέτρησε τι αγοράζουν οι καλύτερες οδηγίες. Αυτό το κεφάλαιο αφορά το άλλο ενενήντα τοις εκατό των tokens, που φτάνει μόνο του.
Το ίδιο έγγραφο ονομάζει τον πόρο που ξοδεύουν όλα αυτά: τα μοντέλα «έχουν ένα 'attention budget' από το οποίο αντλούν όταν αναλύουν μεγάλους όγκους context. Κάθε νέο token που εισάγεται εξαντλεί αυτό το budget κατά κάποιο ποσό». Και ονομάζει το σύμπτωμα: «καθώς ο αριθμός των tokens στο context window αυξάνεται, η ικανότητα του μοντέλου να ανακαλεί με ακρίβεια πληροφορίες από αυτό το context μειώνεται» — context rot.1
Η τελευταία αυτή πρόταση είναι ισχυρισμός για συμπεριφορά, που σημαίνει ότι μπορεί να ελεγχθεί, και ο πίνακας στην κορυφή αυτής της σελίδας είναι ο έλεγχος.
Πώς φτιάχτηκε αυτός ο πίνακας
Σύνδεσμος στην ενότητα: Πώς φτιάχτηκε αυτός ο πίνακαςΣαράντα γραμμές προς το τοπικό endpoint από το Κεφάλαιο 22 — ένας μικρός Python server που κρατά το Qwen2.5-0.5B-Instruct στη CPU και μιλά στο σχήμα chat-completions, ώστε το loop να μένει TypeScript και τα tensors να μένουν στην άλλη πλευρά του port.
const DEPTHS = [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1];
for (const d of DEPTHS) {
const slot = Math.round(d * (N - 1));
let hits = 0, other = 0;
for (let t = 0; t < TRIALS; t++) {
const recs = buildRecords(N, 1000 + t); // 25 unique tickets
const gold = recs[Math.floor(rng(7 + t)() * N)]; // a different one each trial
const rest = recs.filter((x) => x.ticket !== gold.ticket).slice(0, N - 1);
const lines = [...rest.slice(0, slot).map((x) => x.line),
gold.line,
...rest.slice(slot).map((x) => x.line)];
const r = await complete(prompt(lines, ask(gold.owner)), { maxTokens: 12 });
const said = /\d{4}/.exec(r.text)?.[0];
if (said === String(gold.ext)) hits++;
else if (said && recs.some((x) => String(x.ext) === said)) other++;
}
}Ο μετρητής other είναι αυτό που μετατρέπει ένα απογοητευτικό αποτέλεσμα σε χρήσιμο: όταν το μοντέλο κάνει λάθος, είναι χαμένο ή είναι σίγουρο;
Η απάντηση είναι σίγουρο. Στις οκτώ μη πρώτες θέσεις, 136 από τις 205 λανθασμένες απαντήσεις ήταν το εσωτερικό κάποιου άλλου ticket — ένας πραγματικός τετραψήφιος αριθμός, σωστά μορφοποιημένος, διαβασμένος από τη λάθος γραμμή. Στη θέση 1 μόνο μία από τις πέντε αστοχίες ήταν τέτοια· στη θέση 7, είκοσι μία από τις είκοσι έξι ήταν.
Αυτή η διάκριση είναι που έχει σημασία στην παραγωγή. Ένα μοντέλο που λέει δεν μπορώ να το βρω είναι bug που θα παρατηρήσετε· ένα μοντέλο που επιστρέφει τον αριθμό της γειτονικής γραμμής είναι bug που θα κάνετε ship, επειδή στην οθόνη τα δύο μοιάζουν ίδια. Είναι η αστοχία απέναντι στην οποία το Κεφάλαιο 19 έφτιαξε επαληθεύσιμες παραπομπές, μόνο που τώρα έρχεται μέσα από το prompt αντί από το index.
Δεν είναι μόνο το πού. Είναι και το πόσο.
Σύνδεσμος στην ενότητα: Δεν είναι μόνο το πού. Είναι και το πόσο.Η θέση είναι ένας άξονας. Το μήκος είναι ο άλλος, και πιο εύκολος να ελεγχθεί: κρατήστε την απάντηση στη μέση και μεγαλώστε τη λίστα.
| εγγραφές | prompt tokens | επιτυχίες | ποσοστό | διάστημα 95 % | λάθος γραμμή | ούτε το ένα ούτε το άλλο |
|---|---|---|---|---|---|---|
| 1 | 97 | 18/20 | 90 % | 70–97 % | 0 | 2 |
| 3 | 159 | 11/20 | 55 % | 34–74 % | 9 | 0 |
| 8 | 315 | 3/20 | 15 % | 5–36 % | 17 | 0 |
| 20 | 695 | 2/20 | 10 % | 3–30 % | 16 | 2 |
| 40 | 1.324 | 3/20 | 15 % | 5–36 % | 15 | 2 |
| 80 | 2.587 | 1/20 | 5 % | 1–24 % | 18 | 1 |
| 140 | 4.477 | 2/20 | 10 % | 3–30 % | 18 | 0 |
Μία εγγραφή και 97 tokens: 90 %. Τρεις εγγραφές και 159 tokens: 55 %. Οκτώ εγγραφές και 315 tokens: 15 %, και από εκεί επίπεδα και χαμηλά μέχρι τις 140 εγγραφές και τα 4.477 tokens. Ολόκληρη η κατάρρευση συμβαίνει ανάμεσα στην πρώτη και την όγδοη γραμμή μιας λίστας.
Η τελευταία στήλη είναι ό,τι δεν είναι ούτε το σωστό εσωτερικό ούτε το εσωτερικό άλλης εγγραφής, που με μία μόνο εγγραφή στη σελίδα είναι το μόνο μέρος όπου μπορεί να προσγειωθεί μια λάθος απάντηση. Οι δύο αστοχίες στη μία εγγραφή αξίζει να αναφερθούν αντί να στρογγυλοποιηθούν μακριά, επειδή καμία δεν ήταν άρνηση: η μία απάντησε 5806 σε μητρώο του οποίου η μόνη γραμμή λέει 5805. Στα 97 tokens με έναν μόνο υποψήφιο, αυτό το μοντέλο εξακολουθεί να αντιγράφει λάθος ένα ψηφίο δύο φορές στις είκοσι, και αυτό είναι το πάτωμα πάνω στο οποίο μετριούνται όλα τα υπόλοιπα.
Ακολουθούν δύο πράγματα. Ένα μεγαλύτερο context αγοράζει το δικαίωμα να στείλετε περισσότερα, όχι τη βεβαιότητα ότι θα διαβαστούν: αυτό το μοντέλο έχει παράθυρο 32.768-token και working range, σε αυτή την εργασία, λίγων εκατοντάδων tokens. Και δεν υπάρχει threshold, δεν υπάρχει γκρεμός, δεν υπάρχει κατάσταση «context full» — η υποβάθμιση έχει ξεκινήσει στην τρίτη εγγραφή και ολοκληρώνεται στην όγδοη, στο ένα τοις εκατό του παραθύρου. Ό,τι κι αν είναι ένα όριο context, δεν είναι αυτό που το κυβερνά.
Συνήθως προσφέρονται δύο μηχανισμοί. Ο πρώτος είναι η αριθμητική από το Κεφάλαιο 9, που η Anthropic διατυπώνει με τους ίδιους όρους που χρησιμοποιεί αυτό το μάθημα: τα μοντέλα «βασίζονται στην transformer architecture, η οποία επιτρέπει σε κάθε token να attend σε κάθε άλλο token σε ολόκληρο το context. Αυτό έχει ως αποτέλεσμα n² ζευγαρωτές σχέσεις για n tokens».1 Το attention σε μεγαλύτερη ακολουθία δεν είναι η ίδια πράξη εφαρμοσμένη σε περισσότερο υλικό· είναι ένα σταθερό budget probability mass απλωμένο σε περισσότερους ανταγωνιστές. Ο δεύτερος είναι η εκπαίδευση: τα μοντέλα βλέπουν πολύ περισσότερες σύντομες ακολουθίες από ό,τι μακρές, άρα τα μακρινής εμβέλειας positional patterns είναι το λιγότερο εξασκημένο μέρος του δικτύου. Αυτό είναι επιχείρημα, όχι μέτρηση, και αυτό το κεφάλαιο δεν μπορεί να το λύσει.
Αυτό που έχει λυθεί είναι το σχήμα, και έχει λυθεί από το 2023. Οι Liu et al. εξέτασαν multi-document question answering και key-value retrieval σε οικογένειες και μεγέθη μοντέλων και βρήκαν ότι «η απόδοση είναι συχνά υψηλότερη όταν η σχετική πληροφορία εμφανίζεται στην αρχή ή στο τέλος του input context, και υποβαθμίζεται σημαντικά όταν τα μοντέλα πρέπει να προσπελάσουν σχετική πληροφορία στη μέση μακρών contexts, ακόμη και για ρητά long-context μοντέλα».2 Το Κεφάλαιο 15 πήρε τον κανόνα θέσης του από αυτό το paper· το Κεφάλαιο 19 πήρε από αυτό τον λόγο που είκοσι retrieved chunks μπορούν να σκοράρουν χειρότερα από τέσσερα. Η πρακτική μορφή του γεγονότος είναι η μόνη πρόταση εδώ πάνω στην οποία πρέπει να δράσετε: χρειάζονται πέντε λεπτά για να το μετρήσετε στο δικό σας μοντέλο με τα δικά σας δεδομένα, και καμία δημοσιευμένη καμπύλη δεν υποκαθιστά τη δική σας.
Κανείς δεν ξέρει τι υπάρχει στο παράθυρό του
Σύνδεσμος στην ενότητα: Κανείς δεν ξέρει τι υπάρχει στο παράθυρό τουΡωτήστε μια ομάδα τι γεμίζει το context του agent της και θα πάρετε μια εκτίμηση, επειδή κανένα API δεν επιστρέφει την απάντηση: η απόκριση σάς δίνει prompt_tokens, έναν αριθμό για όλα μαζί.
Μπορείτε να ανακτήσετε την ανάλυση με τέσσερις μετρήσεις και τρεις αφαιρέσεις — το ολόκληρο rendered prompt, το ίδιο χωρίς ορισμούς εργαλείων, μόνο το system message με και χωρίς αυτούς, και τα πάντα με τα αποτελέσματα εργαλείων αφαιρεμένα:
async function buckets(messages: Msg[]) {
const sys = messages.slice(0, 1);
const withoutResults = messages.filter((m) => m.role !== "tool");
const [total, sysWithTools, sysNoTools, noResults] = await Promise.all([
countPrompt(messages, CATALOGUE), // everything
countPrompt(sys, CATALOGUE), // system + scaffolding + schemas
countPrompt(sys), // system + scaffolding
countPrompt(withoutResults, CATALOGUE), // everything but tool output
]);
return {
system: sysNoTools,
tools: sysWithTools - sysNoTools,
toolResults: total - noResults,
conversation: total - sysWithTools - (total - noResults),
total,
};
}Το countPrompt εφαρμόζει το ίδιο chat template του μοντέλου πριν το tokenizing, πράγμα που έχει μεγαλύτερη σημασία από όσο ακούγεται: το κείμενό σας δεν είναι αυτό που μετριέται. Role markers, το tool-calling preamble και το schema rendering είναι όλα tokens που πληρώνετε και δεν πληκτρολογήσατε ποτέ. Το Κεφάλαιο 7 έφτιαξε έναν tokenizer και το Κεφάλαιο 16 μέτρησε με το js-tiktoken· εδώ η μέτρηση έρχεται από το ίδιο μοντέλο που θα διαβάσει το prompt, που είναι η μόνη μέτρηση που είναι ακριβώς σωστή.
Τώρα περάστε έναν πραγματικό agent μέσα από αυτό: σαράντα turns μιας διερεύνησης incident, δώδεκα εργαλεία, ένα ψεύτικο περιβάλλον operations που επιστρέφει ρεαλιστικά log dumps και σειρές metrics.
| turn | system | ορισμοί εργαλείων | συνομιλία | αποτελέσματα εργαλείων | συνολικό prompt | input που χρεώθηκε σε αυτό το turn |
|---|---|---|---|---|---|---|
| 1 | 85 | 1.817 | 155 | 490 | 2.547 | 4.370 |
| 2 | 85 | 1.817 | 282 | 529 | 2.713 | 5.275 |
| 5 | 85 | 1.817 | 647 | 1.870 | 4.419 | 8.093 |
| 10 | 85 | 1.817 | 946 | 2.141 | 4.989 | 4.951 |
| 20 | 85 | 1.817 | 1.500 | 2.943 | 6.345 | 6.316 |
| 30 | 85 | 1.817 | 2.187 | 4.000 | 8.089 | 8.059 |
| 40 | 85 | 1.817 | 3.053 | 5.677 | 10.632 | 21.090 |
Διαβάστε την πρώτη σειρά απέναντι στην τελευταία.
Στο turn 1 το prompt είναι 2.547 tokens και το 71 % του είναι ορισμοί εργαλείων. Το system prompt είναι 3 %. Αυτό που πληκτρολόγησε ο χρήστης είναι 6 %. Ο agent δεν έχει κάνει ακόμα τίποτα και ήδη κουβαλά 1.817 tokens JSON schema.
Μέχρι το turn 40 το prompt είναι 10.632 tokens και τα μερίδια έχουν αντιστραφεί: ορισμοί 17 %, συνομιλία 29 %, αποτελέσματα εργαλείων 53 %. Το output εργαλείων ξεπέρασε τους ορισμούς στο turn 5· η συνομιλία δεν τους ξεπέρασε μέχρι το turn 25, άρα για το πρώτο εξήντα τοις εκατό της συνεδρίας ο κατάλογος εργαλείων ήταν μεγαλύτερος από όλα όσα είχαν ειπωθεί.
Μετά το σύνολο. Σε 57 κλήσεις μοντέλου, το run χρέωσε 370.291 input tokens για τελικό context 10.632 — το τελευταίο prompt πληρώθηκε περίπου τριάντα πέντε φορές, δηλαδή το τετραγωνικό του Κεφαλαίου 16 με τον πολλαπλασιαστή ενός agent από πάνω. Από αυτά τα 370.291, 103.569, ή 28 % όλων όσων χρεώθηκαν, ήταν οι δώδεκα ορισμοί εργαλείων, που ξαναστάλθηκαν byte-identical σε κάθε κλήση.
Τι κοστίζει ένας ορισμός εργαλείου
Σύνδεσμος στην ενότητα: Τι κοστίζει ένας ορισμός εργαλείουΟ κατάλογος εργαλείων είναι το μεγαλύτερο σταθερό κόστος σε έναν agent και είναι αόρατος, επειδή δεν τον βλέπετε ποτέ: περνάτε ένα array αντικειμένων και ο provider το αποδίδει στο prompt για εσάς. Μετρημένο, στα ίδια δώδεκα εργαλεία:
system prompt + chat scaffolding, no tools: 85 tokens
all twelve definitions: 1,817 tokens
of which fixed tool-calling scaffolding: 126 tokens
three tools instead of twelve: 605 tokens
same twelve, one-sentence descriptions,
no parameter prose: 1,291 tokens (-29 %)Ανά εργαλείο, το marginal κόστος τρέχει από 80 tokens για το get_current_time, που παίρνει ένα string, έως 263 για το search_tickets, που παίρνει τέσσερις παραμέτρους με enum και μία πρόταση καθοδήγησης η καθεμία. Αυτή είναι η ισοτιμία πίσω από την κεντρική συμβουλή του Κεφαλαίου 18 ότι η περιγραφή είναι το API: μια καλή περιγραφή κοστίζει περίπου εκατό tokens σε κάθε request για το υπόλοιπο της ζωής του agent. Τρεις συνέπειες.
Ένα εργαλείο που δεν χρησιμοποιείτε εξακολουθεί να χρεώνεται. Ο agent κάλεσε επτά από τα δώδεκα. Τα άλλα πέντε κόστισαν 697 tokens σε καθεμία από τις 57 requests — 39.729 συνολικά, πάνω από το ένα δέκατο όλων όσων χρεώθηκε το run, για δυνατότητες που δεν άγγιξε ποτέ. Ένα από τα πέντε κουβαλά την πιο αιχμηρή λεπτομέρεια στο trace: το μοντέλο προσπάθησε τρεις φορές να καλέσει το read_log, που δεν υπάρχει. Το εργαλείο που ήθελε ήταν το search_logs, ο δεύτερος ακριβότερος ορισμός στον κατάλογο στα 237 tokens. Πλήρωσε για αυτόν τον ορισμό 57 φορές, δεν τον χρησιμοποίησε ποτέ και δεν βρήκε ποτέ το όνομά του.
Το κόψιμο της πρόζας είναι η φθηνότερη βελτιστοποίηση διαθέσιμη, και είναι trade. Το να κοπούν οι περιγραφές σε μία πρόταση και να αφαιρεθεί η τεκμηρίωση παραμέτρων εξοικονόμησε 526 tokens ανά κλήση, 29 τοις εκατό, χωρίς να αγγιχτεί ούτε γραμμή λογικής — και έκανε το μοντέλο να καλεί τα εργαλεία χειρότερα, όπως μέτρησε το Κεφάλαιο 18. Το νόημα είναι ότι και οι δύο πλευρές αυτού του trade είναι τώρα στην ίδια μονάδα.
Σε κάποια κλίμακα, το να στέλνετε ορισμούς καθόλου παύει να έχει νόημα. Η Anthropic έβαλε αριθμό σε αυτό τον Νοέμβριο του 2025: ένα μεγάλο σύνολο συνδεδεμένων servers σημαίνει επεξεργασία «εκατοντάδων χιλιάδων tokens» ορισμών πριν διαβαστεί το request, και η αντικατάστασή του με code execution — ο agent να ανακαλύπτει και να φορτώνει μόνο τους ορισμούς που χρειάζεται — «μειώνει τη χρήση token από 150.000 tokens σε 2.000 tokens, εξοικονόμηση χρόνου και κόστους 98,7%».3 Ίδια ιδέα με το υπόλοιπο αυτού του κεφαλαίου, εφαρμοσμένη σε schemas αντί για ιστορικό: κρατήστε το index, επιλύστε την εγγραφή on demand.
Σπάζοντάς το επίτηδες
Σύνδεσμος στην ενότητα: Σπάζοντάς το επίτηδεςΔύο πράγματα φυτεύτηκαν σε εκείνο το transcript σαράντα turns. Στο turn 2, πριν από οποιαδήποτε πραγματική δουλειά, ο χρήστης δηλώνει έναν standing rule: κάθε ticket που ανοίγεις πρέπει να καταχωρείται κάτω από τον αριθμό υπαλλήλου μου, 4417. Στο turn 19, στη μέση του incident, ένα γεγονός: το affected shard είναι pay-shard-7, επιβεβαιωμένο από την ομάδα payments. Στο turn 40 ο χρήστης ζητά από τον agent να ανοίξει το incident ticket, που χρειάζεται και τα δύο. Κάθε probe τίθεται σε έξι διαφορετικές διατυπώσεις και βαθμολογείται στα έξι — το greedy decoding είναι ντετερμινιστικό, άρα μία κλήση δίνει ένα μη επαναλήψιμο ναι ή όχι και έξι δίνουν ποσοστό.
Το transcript αναπαράγεται έπειτα κάτω από επτά πολιτικές context. Αναπαράγεται αντί να ξανατρέξει, σκόπιμα: τα μηνύματα, οι tool calls και τα αποτελέσματα εργαλείων είναι byte-identical και στα επτά, άρα η μόνη μεταβλητή είναι τι επέλεξε να κρατήσει κάθε πολιτική. Το Κεφάλαιο 16 έδειξε γιατί ένα sliding window είναι κακή οικονομική κίνηση, επειδή καταστρέφει το cacheable prefix. Να τι κάνει στη συμπεριφορά:
| πολιτική context | input tokens στα 40 turns | prompt στο turn 40 | κανόνας turn 2 | γεγονός turn 19 |
|---|---|---|---|---|
| πλήρες ιστορικό | 370.291 | 10.632 | 6/6 | 5/6 |
| sliding window, τελευταία 12 μηνύματα | 157.578 | 2.922 | 5/6 | 0/6 |
| elide αποτελέσματα εργαλείων παλαιότερα από 4 turns | 243.445 | 6.311 | 6/6 | 3/6 |
| compaction κάθε 6 turns | 195.515 | 3.220 | 6/6 | 0/6 |
| compaction συν model-written notes | 200.849 | 3.286 | 6/6 | 0/6 |
| pin τα ίδια τα turns του χρήστη, μπροστά | 168.550 | 3.559 | 6/6 | 5/6 |
| pin τα ίδια τα turns του χρήστη, πίσω | 168.835 | 3.564 | 6/6 | 6/6 |
| control: τα δύο turns και τίποτε άλλο | — | 1.981 | 6/6 | 6/6 |
Οι σειρές compaction περιλαμβάνουν το κόστος του compacting: 18.581 input tokens για επτά summaries και 3.392 ακόμη για τον note-taker. Η σειρά control υπάρχει ώστε ένα μηδέν να μπορεί να διαβαστεί ως μηδέν — με τα δύο μηνύματα μόνα τους σε prompt 1.981-token, αυτό το μοντέλο απαντά και στα δύο probes τέλεια, άρα καμία σειρά δεν είναι η εργασία που είναι υπερβολικά δύσκολη.
Το πλήρες ιστορικό θυμάται, και είναι το ακριβότερο πράγμα στον πίνακα: 370.291 input tokens για μια συνεδρία της οποίας το durable content είναι δύο προτάσεις.
Αυτό απαντά σε μια ερώτηση που άφησε ανοιχτή η αρχή. Γιατί ένα transcript 10.632-token κρατά ένα γεγονός που ένα μητρώο 853-token χάνει; Επειδή το μήκος είναι η λάθος μεταβλητή. Το μητρώο κρατά είκοσι πέντε τετραψήφια εσωτερικά σε είκοσι πέντε πανομοιότυπες προτάσεις — είκοσι τέσσερα σχεδόν τέλεια decoys για το ένα που θέλετε. Το transcript κρατά ακριβώς έναν αριθμό υπαλλήλου και ένα όνομα shard. Το context rot είναι interference πριν γίνει όγκος, γι’ αυτό 136 από τις 205 λανθασμένες απαντήσεις εκεί πάνω ήταν η τιμή ενός γείτονα. Η χρήσιμη ερώτηση για ένα παράθυρο δεν είναι πόσο μακρύ είναι· είναι πόσα πράγματα μέσα του μοιάζουν με την απάντηση.
Το sliding window είναι 57 % φθηνότερο και έχει χάσει το incident. Ο αριθμός υπαλλήλου επιβιώνει μόνο επειδή ο agent τον είχε επαναλάβει στα πρόσφατα turns. Το shard, δηλωμένο μία φορά στο turn 19, δεν βρίσκεται στα τελευταία δώδεκα μηνύματα — και το μοντέλο δεν το λέει. Όταν ρωτήθηκε έξι φορές απάντησε «το affected payment shard είναι shard 4417», πιάνοντας τον αριθμό υπαλλήλου, το μόνο άλλο identifier που είχε μείνει στο παράθυρό του, και δύο φορές «pool», σηκωμένο από το string pool_exhausted σε μια γραμμή log.
Το compaction είναι φθηνό και έχασε το ίδιο γεγονός. Επτά summaries, γραμμένα από το μοντέλο με ρητή οδηγία να κρατήσει identifiers, αριθμούς, standing instructions και ανοιχτές ερωτήσεις, και το pay-shard-7 δεν βρίσκεται σε κανένα από τα summaries που είχαν σημασία· οι έξι μαντεψιές ήταν shard 1, pay_shard_1 και pool. Το compaction δεν αποτυγχάνει θορυβωδώς. Παράγει μια ρέουσα, εύλογη, πολύ συντομότερη συνεδρία που έχει αθόρυβα ρίξει μία γραμμή.
Τρεις σειρές σκόραραν 0/6 στο γεγονός του turn 19 — το sliding window, το compaction και το compaction με notes. Δεκαοκτώ λάθος απαντήσεις ανάμεσά τους, και ούτε μία δεν ήταν «δεν ξέρω».
Μετά η σειρά που θα έπρεπε να είναι ντροπιαστική. Το να κρατήσετε verbatim τα σαράντα μηνύματα του χρήστη, συν τα τελευταία τέσσερα turns πλήρως και τίποτε άλλο, κοστίζει 168.550 tokens — 54 % λιγότερο από το πλήρες ιστορικό — και απαντά και στα δύο probes εξίσου καλά με το πλήρες ιστορικό ή καλύτερα. Κανένας summariser, κανένας note-taker, κανένα δεύτερο μοντέλο: ένα filter στο role === "user". Τα λόγια του χρήστη είναι τα φθηνότερα tokens υψηλής αξίας στο παράθυρο ενός agent, και οι περισσότερες σχεδιάσεις τα πετούν μαζί με όλα τα άλλα.
Οι τελευταίες δύο σειρές είναι ξανά ο αρχικός πίνακας, μέσα στον agent. Το ίδιο pinned block, μετακινημένο από το system message στο τέλος του prompt: το 5/6 γίνεται 6/6. Σε έξι δοκιμές αυτό δεν είναι σημαντική διαφορά και δεν προσφέρεται ως τέτοια — προσφέρεται ως υπενθύμιση ότι το πού είναι παράμετρος που ρυθμίζετε είτε το ξέρετε είτε όχι.
Τέσσερις τρόποι να ξοδεύετε λιγότερο παράθυρο
Σύνδεσμος στην ενότητα: Τέσσερις τρόποι να ξοδεύετε λιγότερο παράθυροΟι τέσσερις στρατηγικές παρακάτω είναι της Anthropic, με τη σειρά της, αν και μόνο οι τελευταίες τρεις είναι η long-horizon λίστα της.1 Και οι τέσσερις είναι παραλλαγές μίας οδηγίας: μην κουβαλάτε ό,τι μπορείτε να φέρετε όταν χρειαστεί, και μην κουβαλάτε raw ό,τι μπορείτε να κουβαλήσετε συμπιεσμένο.
Just-in-time retrieval
Σύνδεσμος στην ενότητα: Just-in-time retrievalΜην προφορτώνετε περιεχόμενο. Κρατήστε identifiers — ένα file path, ένα query, έναν αριθμό ticket, ένα όνομα εργαλείου και τα arguments του — και επιλύστε τα όταν χρειάζεται. Το μεγαλύτερο bucket στον agent παραπάνω είναι output εργαλείων που διαβάστηκε μία φορά, χρησιμοποιήθηκε μία φορά και μετά κουβαλήθηκε για τριάντα ακόμη turns. Η αντικατάσταση κάθε αποτελέσματος παλαιότερου από τέσσερα turns με ένα stub που λέει τι ήταν και πώς να το πάρετε πίσω είναι έξι γραμμές:
const elide: Policy = (h) => [SYSTEM, ...h.flatMap((turn, ti) =>
turn.map((m) => (ti < h.length - 4 && m.role === "tool"
? { role: "tool", name: m.name,
content: `[${m.name} result from turn ${ti + 1}, ${m.content.length} chars, ` +
`elided; call ${m.name} again with the same arguments to re-read it]` }
: m)))];Αυτό είναι το Κεφάλαιο 19 με το corpus αντικατεστημένο από το ίδιο το παρελθόν του agent. Το retrieval machinery υπάρχει ήδη — είναι ο κατάλογος εργαλείων.
Compaction
Σύνδεσμος στην ενότητα: CompactionΌταν το transcript περάσει ένα threshold, αντικαταστήστε το παλαιότερο μέρος του με model-written summary και συνεχίστε. Το prompt που γράφει το summary είναι ολόκληρη η σχεδίαση, και εκεί κερδίζεται ή χάνεται το compaction: κρατήστε identifiers, αριθμούς, standing instructions και ανοιχτές ερωτήσεις· πετάξτε ευγένειες και output εργαλείων που μπορείτε να ξαναφέρετε.
Το compaction είναι lossy by construction, αυτό που χάνει επιλέγεται από ένα μοντέλο για λογαριασμό σας, και τίποτα δεν βγάζει error όταν επιλέξει λάθος. Δεν είναι δωρεάν ούτε αυτό: κάθε compaction είναι μια επιπλέον κλήση της οποίας το input είναι το πράγμα που γίνεται compacted.
Structured note-taking
Σύνδεσμος στην ενότητα: Structured note-takingΔιατηρήστε ένα μικρό store έξω από το context και επανεισάγετέ το ολόκληρο σε κάθε turn. Σε αντίθεση με ένα summary είναι append-only και addressable: ένας κανόνας γραμμένος στο turn 2 είναι ακόμη εκεί verbatim στο turn 400. Η έκδοση που μετρήθηκε εδώ ζητά από το μοντέλο, μετά από κάθε μήνυμα χρήστη, αν περιέχει κάτι durable:
const r = await complete([
{ role: "system", content:
"You keep a durable note file for a support session. Given one user message, " +
"output one short note ONLY if it states a standing rule, an identifier or a fact " +
"that must survive the rest of the session. Otherwise output exactly NONE." },
{ role: "user", content: `Turn ${i + 1}: ${user}` },
], { maxTokens: 40 });
if (!/^none\b/i.test(r.text.trim())) notes.push(`turn ${i + 1}: ${r.text.trim()}`);Αυτή είναι η στρατηγική με το υψηλότερο ταβάνι εδώ, και είναι εκείνη που απέτυχε στη μέτρηση. Σε σαράντα μηνύματα χρήστη ο note-taker κράτησε τρία notes και κανένα από τα δύο που είχαν σημασία: μια γραμμή συμβουλής runbook, μια ανακοίνωση ότι η συνεδρία τελείωνε, και Europe/Madrid is currently 13:45 — μια ώρα που επινόησε, αφού το εργαλείο που παραφράζε επέστρεψε 09:52 UTC. Ο note-taker είναι μοντέλο, και όλα σε αυτό το κεφάλαιο ισχύουν και για αυτόν.
Sub-agents
Σύνδεσμος στην ενότητα: Sub-agentsΔώστε σε μια εστιασμένη εργασία το δικό της παράθυρο — το δικό της system prompt, τον δικό της μικρό κατάλογο, κανένα από το ιστορικό του γονέα — και επιστρέψτε μια σύντομη απάντηση αντί για transcript. Το Κεφάλαιο 23 έβαλε έναν πίσω από ένα tool schema και άφησε τον λογαριασμό εδώ· ο λογαριασμός είναι ότι η απάντηση του παιδιού είναι το μόνο μέρος του παραθύρου του παιδιού που πληρώνει ποτέ ο γονέας.
Ο sub-agent δεν βρίσκεται στον παραπάνω πίνακα επειδή δεν τρέχει για σαράντα turns: τρέχει μία φορά, σε ένα παράθυρο που κάποιος scoped για αυτόν. Με δεδομένο το system prompt, τα turns 17 έως 19 και τίποτε άλλο — 2.737 tokens — απάντησε στο shard probe 6/6, καλύτερα από κάθε πολιτική στον πίνακα, και στο employee probe 0/6, επειδή αυτός ο αριθμός δεν βρίσκεται στα τρία turns που του δόθηκαν.
Αυτό είναι οι sub-agents σε δύο αριθμούς: ένα καθαρό παράθυρο δεν είναι ευφυΐα, είναι scope, και το scoping γίνεται εκ των προτέρων από κώδικα που ήδη πρέπει να ξέρει ποια turns έχουν σημασία. Αξίζει να κρατήσουμε ακόμη ένα πράγμα σε αυτές τις απαντήσεις. Αυτή ήταν η μόνη πολιτική που απάντησε «None available» αντί να επινοήσει κάτι. Ένα μοντέλο με μικρό, coherent context ξέρει τι του λείπει· ένα μοντέλο με μεγάλο, θορυβώδες context δεν το ξέρει.
Οι τρεις μνήμες
Σύνδεσμος στην ενότητα: Οι τρεις μνήμεςΣχεδόν κάθε μπερδεμένη συζήτηση για agent memory είναι τρεις μηχανισμοί που φορούν την ίδια λέξη. Έχουν διαφορετικές διάρκειες ζωής, owners και failure modes, και ένα σύστημα που τα κρατά στο ίδιο μέρος έχει ένα πρόβλημα που δεν έχει ακόμη παρατηρήσει.
| ιστορικό συνομιλίας | retrieval | επίμονη μνήμη χρήστη | |
|---|---|---|---|
| κρατά | τι ειπώθηκε σε αυτή τη συνεδρία | έγγραφα που σας ανήκουν | γεγονότα για έναν άνθρωπο |
| ζει | μία συνεδρία | μέχρι να γίνει re-indexed | σε όλες τις συνεδρίες, για πάντα |
| γράφεται από | το loop, αυτόματα | ένα ingestion pipeline | το μοντέλο, επίτηδες |
| μπαίνει στο prompt | πλήρως, σε κάθε κλήση | τέσσερα passages, όταν ταιριάζει query | πλήρως, σε κάθε κλήση |
| αποτυγχάνει με | το να μεγαλώνει μέχρι να σαπίσει | retrieval του λάθος chunk | το να θυμάται κάτι λάθος για εσάς |
| φτιάχτηκε στο | Κεφάλαιο 23 | Κεφάλαιο 19 | αυτό το κεφάλαιο |
Το ακαδημαϊκό πλαίσιο είναι του CoALA, που οργανώνει language agents γύρω από «modular memory components» και διαχωρίζει τη working memory από episodic, semantic και procedural stores.4 Το MemGPT παίρνει την ίδια ιδέα κυριολεκτικά, δανειζόμενο virtual memory από λειτουργικά συστήματα: ένα γρήγορο tier μέσα στο παράθυρο, ένα αργό tier έξω από αυτό, και το ίδιο το μοντέλο να μετακινεί δεδομένα ανάμεσά τους με function calls.5 Και τα δύο επιβάλλουν την ερώτηση που ένα product πρέπει ούτως ή άλλως να απαντήσει — όχι πόσα μπορώ να κρατήσω, αλλά σε ποιο store ανήκει αυτό, και πότε λήγει.
Η πρακτική δοκιμή είναι μία ερώτηση ανά γεγονός: τι πρέπει να εξακολουθεί να ισχύει αύριο; Ένα αποτέλεσμα εργαλείου από το turn 12, τίποτα. Ένα summary της συνεδρίας, μέχρι να τελειώσει η συνεδρία. Ότι ο αριθμός υπαλλήλου του χρήστη είναι 4417, μέχρι να αλλάξει δουλειά. Τρεις απαντήσεις, τρία stores.
Πού πάει μετά
Σύνδεσμος στην ενότητα: Πού πάει μετάΜπορείτε τώρα να μετρήσετε τι υπάρχει σε ένα παράθυρο, να αποφασίσετε τι μένει σε αυτό, και να ξεχωρίσετε έναν agent που ξέχασε κάτι από έναν που το κουβαλούσε και δεν κοίταξε.
Η τελευταία από τις τέσσερις στρατηγικές είναι αυτή που δεν χωρά εδώ. Ένας sub-agent δεν είναι πολιτική context, είναι δεύτερος agent, και τη στιγμή που υπάρχουν δύο πρέπει να αποφασίσετε τι περνά ανάμεσά τους και ποιος έχει την ευθύνη. Το Κεφάλαιο 25 είναι αυτό: τα πέντε orchestration patterns και από πού προέρχεται πραγματικά το κάθε όνομά τους, οι δύο τοπολογίες που μπερδεύονται — να ρωτάς έναν sub-agent και να παίρνεις απάντηση πίσω, σε αντίθεση με το να του παραδίνεις τη συνομιλία και να μην την παίρνεις πίσω — και το μετρημένο εύρημα ότι στην εργασία που κοστολογεί, η απλούστερη διάταξη κερδίζει — ακολουθούμενο από το τεστ για το πότε σταματά να κερδίζει.
Κληρονομεί επίσης ακριβώς αυτό που μόλις μέτρησε αυτό το κεφάλαιο. Ένας sub-agent επιστρέφει ένα summary. Ένα summary είναι compaction που δεν γράψατε, παραγόμενο από μοντέλο του οποίου το παράθυρο δεν μπορείτε να δείτε, και ο γονέας δεν έχει τρόπο να ξεχωρίσει ένα καλό από ένα σίγουρο λάθος — την ίδια διάκριση που χώρισε το 84 % από το 19 % στην κορυφή αυτής της σελίδας, και που μετέτρεψε δεκαοκτώ missing facts σε δεκαοκτώ επινοημένα. Άρα: όταν ο sub-agent κάνει λάθος, τι ακριβώς μπορεί να κοιτάξει ο γονέας;
Πηγές και μέθοδος
Σύνδεσμος στην ενότητα: Πηγές και μέθοδοςΚάθε αριθμός εδώ παράχθηκε σε αυτό το μηχάνημα και κανένας δεν εκτιμήθηκε. Το μοντέλο είναι Qwen2.5-0.5B-Instruct σε float32 στη CPU με greedy decoding, σερβιρισμένο πάνω από loopback από ένα μικρό Python endpoint που μιλά στο σχήμα chat-completions και εκθέτει route token-count — ξανά το seam του Κεφαλαίου 14, tensors στην πλευρά της Python και το loop στην πλευρά της TypeScript — άρα κάθε μέτρηση είναι ο ίδιος tokenizer του μοντέλου εφαρμοσμένος στο ίδιο του το chat template. Ο πίνακας θέσης είναι 288 κλήσεις, εννέα θέσεις επί τριάντα δύο δοκιμές με διαφορετικό ticket σε κάθε δοκιμή· ο πίνακας μήκους είναι 140 κλήσεις· το agent run είναι 57 κλήσεις μοντέλου σε 43 λεπτά wall clock· ο πίνακας πολιτικών είναι εκείνο το ένα transcript αναπαραγμένο κάτω από επτά πολιτικές. Τα διαστήματα είναι του Wilson, από το Κεφάλαιο 4. Δεν κλήθηκε paid API, γι’ αυτό και δεν υπάρχει ούτε μία τιμή στο κεφάλαιο: τα token counts είναι ακριβή και τα rates με τα οποία θα τα πολλαπλασιάζατε είναι του Κεφαλαίου 16.
Παραπομπές
Σύνδεσμος στην ενότητα: Παραπομπές-
Anthropic, Effective context engineering for AI agents, 29 Σεπτεμβρίου 2025,
anthropic.com/engineering/effective-context-engineering-for-ai-agents, αναγνώστηκε 7 Σεπτεμβρίου 2026. Πηγή των δύο ορισμών που παρατίθενται στην αρχή, του «attention budget» και της δήλωσης ότι κάθε νέο token το εξαντλεί, της περιγραφής του context rot, του πλαισίου n² pairwise-relationships, και των στρατηγικών που χρησιμοποιούνται ως ραχοκοκαλιά αυτού του κεφαλαίου. Τρεις από αυτές είναι η long-horizon λίστα του — compaction, structured note-taking και multi-agent architectures· το just-in-time retrieval έρχεται νωρίτερα στο ίδιο άρθρο, κάτω από context retrieval και agentic search, και ομαδοποιείται μαζί τους εδώ. ↩ ↩2 ↩3 ↩4 -
Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. και Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (v1 Ιούλιος 2023, v3 Νοέμβριος 2023). Παρατίθεται στα Κεφάλαια 15, 16 και 19 και μετριέται εδώ. Η παρατιθέμενη πρόταση είναι από το abstract· οι δύο εργασίες του paper είναι multi-document question answering και key-value retrieval, και το εύρημά του ότι το effect επιμένει σε ρητά long-context μοντέλα είναι το μέρος που έχει σημασία για μια product decision. ↩
-
Anthropic, Code execution with MCP: building more efficient agents, 4 Νοεμβρίου 2025,
anthropic.com/engineering/code-execution-with-mcp, αναγνώστηκε 7 Σεπτεμβρίου 2026. Πηγή της μείωσης από 150.000 σε 2.000-token και του αριθμού 98,7 %, και της παρατήρησης ότι οι ορισμοί εργαλείων που φορτώνονται upfront καταλαμβάνουν context πριν διαβαστεί το request. ↩ -
Sumers, T. R., Yao, S., Narasimhan, K. και Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Οργανώνει language agents γύρω από «modular memory components, a structured action space to interact with internal memory and external environments, and a generalized decision-making process to choose actions», και χωρίζει τη μνήμη σε working, episodic, semantic και procedural. Το Κεφάλαιο 22 χρησιμοποίησε την taxonomy του για τον learning agent· ο πίνακας τριών stores παραπάνω είναι η πρακτική σκιά του. ↩
-
Packer, C., Wooders, S., Lin, K., Fang, V., Patil, S. G., Stoica, I. και Gonzalez, J. E. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560 (Οκτώβριος 2023). Προτείνει «virtual context management, a technique drawing inspiration from hierarchical memory systems in traditional operating systems», με το ίδιο το μοντέλο να μετακινεί δεδομένα ανάμεσα σε ένα γρήγορο tier μέσα στο παράθυρο και ένα αργό tier έξω από αυτό. Η καθαρότερη διατύπωση οπουδήποτε για το γιατί το παράθυρο είναι cache και όχι μνήμη. ↩