Context Engineering: Защо вашият agent оглупява на ход 40
Един факт, преместен три реда надолу в prompt с 2,6% от context window, сваля retrieval от 84% на 19%. Проблемът не беше прозорецът.
На тази страница
Ето един prompt, изпратен 288 пъти към същия модел с greedy decoding. Дълъг е 853 token. Съдържа регистър от двадесет и пет тикета за поддръжка — град, опашка, приоритет, собственик, вътрешен номер — и един въпрос: Marta Ferreira има нужда от обратно обаждане за своя тикет. Какъв е директният вътрешен номер за този тикет?
Регистърът е идентичен всеки път. Моделът е идентичен всеки път. Единственото, което се променя, е кой от двадесет и петте реда съдържа отговора.
| позиция на отговора | попадения | retrieval rate | 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 % |
Тридесет и два опита на ред, различен тикет във всеки опит, Wilson интервали от Глава 4, защото седемнадесет от двадесет не различава нищо от нищо.
Позиция едно получава отговор в 84 % от случаите. Всяка друга позиция е между 9 % и 28 % и всичките осем интервала се припокриват, така че честният прочит е първо, а после всичко останало. Liu et al. откриват U-образна форма — високо в двата края, ниско в средата — а рамото на recency тук не се вижда ясно: 22 % в последната позиция е в размаха на средните. Това, което не е в ничий размах, е спадът от позиция 1 до позиция 4. Три реда.
context window на този модел е 32 768 token. prompt използва 853 от тях, 2,6 %. Нищо не преля, нищо не беше отрязано, не беше достигнат лимит, не се появи предупреждение. Моделът спря да намира ред, който му беше подаден, защото редът се премести три позиции надолу в списък от двадесет и пет.
Глава 16 остойности context window и завърши с предупреждение, че да имаш милион token не е същото като да ги използваш, и посочи насам. Това е тук.
Покажи подробности
Какво е нужно на тази глава от предишните.
- Глава 9 изведе self-attention и неговата цена . Всеки token attends to всеки друг, така че броят на двойковите отношения расте с квадрата на дължината. Този факт се използва по-долу, не се извежда отново.
- Глава 16 преброи петте таксуеми token кошници и показа, че сметката на разговор расте квадратично. Тази глава е какво да направите по въпроса, без да счупите agent.
- Глава 18 изгради каталога с инструменти и измери, че двадесет инструмента не вредят на избора, но умножават prompt по шест. Ето сметката за тях.
- Глава 19 изгради retrieval. Just-in-time retrieval по-долу е тази глава, приложена към собствената история на agent; chunking не се обяснява повторно.
- Глава 23 изгради harness. Всичко в тази глава е политика, която работи вътре в неговия цикъл, затова е TypeScript: артефактът е дългоживееща услуга, която държи състояние, не notebook, който държи тензори.
Две задачи с подобни имена
Връзка към раздела: Две задачи с подобни именаAnthropic начерта границата през септември 2025 г. и двете изречения трябва да стоят едно до друго. Prompt engineering е „методи за писане и организиране на LLM инструкции за оптимални резултати“. Context engineering е „наборът от стратегии за подбиране и поддържане на оптималния набор от token (информация) по време на LLM inference, включително цялата друга информация, която може да попадне там извън prompts“.1
Оперативната разлика е кога и от кого. prompt се създава веднъж, от човек, и се преглежда. context се сглобява при всяко извикване, от код, който никой не гледа, от материал, който никой не е писал на ръка: четиридесет хода история, шест резултата от инструменти, четири извлечени пасажа, потребителски профил, дванадесет JSON схеми. Глава 15 измери какво купуват по-добрите инструкции. Тази глава е за останалите деветдесет процента от token, които пристигат сами.
Същият документ назовава ресурса, който всички те харчат: моделите „имат ‘attention budget’, от който черпят, когато анализират големи обеми context. Всеки нов въведен token изчерпва този бюджет с някакво количество“. И назовава симптома: „с увеличаването на броя token в context window способността на модела да си припомня точно информация от този context намалява“ — context rot.1
Последното изречение е твърдение за поведение, което означава, че може да бъде проверено, а таблицата в началото на тази страница е проверката.
Как беше направена тази таблица
Връзка към раздела: Как беше направена тази таблицаЧетиридесет реда срещу локалния endpoint от Глава 22 — малък Python сървър, който държи Qwen2.5-0.5B-Instruct на CPU и говори във формата chat-completions, така че цикълът остава TypeScript, а тензорите остават от другата страна на порта.
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-те грешни отговора бяха вътрешен номер на друг тикет — реално четирицифрено число, правилно форматирано, прочетено от грешния ред. При позиция 1 само една от петте пропуснати беше такава; при позиция 7 — двадесет и една от двадесет и шест.
Това разграничение е важно в production. Модел, който казва Не мога да го намеря, е бъг, който забелязвате; модел, който връща номера от съседен ред, е бъг, който пускате, защото на екрана двете изглеждат еднакво. Това е провалът, срещу който Глава 19 изгради проверими цитати, но идващ отвътре на prompt вместо от индекса.
Не е само къде. А и колко.
Връзка към раздела: Не е само къде. А и колко.Позицията е едната ос. Дължината е другата и се тества по-лесно: задръжте отговора в средата и увеличавайте списъка.
| записи | prompt token | попадения | процент | 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 token: 90 %. Три записа и 159 token: 55 %. Осем записа и 315 token: 15 %, а оттам нататък ниско и плоско чак до 140 записа и 4 477 token. Целият срив се случва между първия и осмия ред на списък.
Последната колона е всичко, което не е нито правилният вътрешен номер, нито номер от друг запис — при един-единствен запис на страницата това е единственото място, където грешният отговор може да попадне. Двата пропуска при един запис заслужават да бъдат отчетени, вместо да бъдат закръглени, защото нито един не беше отказ: единият отговори 5806 на регистър, чийто единствен ред казва 5805. При 97 token и един-единствен кандидат този модел пак преписва грешно една цифра два пъти от двадесет, и това е подът, спрямо който се измерва всичко останало.
Следват две неща. По-голям context купува правото да изпращате повече, не сигурността, че ще бъде прочетено: този модел има context window от 32 768 token и работен диапазон, за тази задача, от няколкостотин token. И няма праг, няма пропаст, няма състояние „context е пълен“ — деградацията вече е в ход при третия запис и е завършена до осмия, при един процент от прозореца. Каквото и да е context limit, не той управлява това.
Обикновено се предлагат два механизма. Първият е аритметиката от Глава 9, която Anthropic формулира със същите думи като този курс: моделите „са базирани на transformer архитектурата, която позволява всеки token да attends to всеки друг token в целия context. Това води до n² двойкови отношения за n token“.1 Attention върху по-дълга последователност не е същата операция, приложена към повече материал; това е един фиксиран бюджет от вероятностна маса, разпределен върху повече конкуренти. Вторият е обучението: моделите виждат много повече кратки последователности, отколкото дълги, така че дългобойните позиционни модели са най-малко упражняваната част от мрежата. Това е аргумент, не измерване, и тази глава не може да го реши.
Това, което е решено, е формата, и то още от 2023 г. Liu et al. тестват multi-document question answering и key-value retrieval в различни семейства и размери модели и откриват, че „производителността често е най-висока, когато релевантната информация се намира в началото или края на входния context, и значително се влошава, когато моделите трябва да достъпят релевантна информация в средата на дълги contexts, дори при модели, изрично създадени за long-context“.2 Глава 15 взе своето правило за позиция от тази статия; Глава 19 взе от нея причината двадесет извлечени chunks да могат да се представят по-зле от четири. Практическата форма на факта е единственото изречение тук, по което трябва да действате: това се измерва за пет минути на вашия собствен модел с вашите собствени данни, и никоя публикувана крива не замества вашата.
Никой не знае какво има в прозореца му
Връзка към раздела: Никой не знае какво има в прозореца муПопитайте екип какво пълни context на техния agent и получавате оценка, защото никое API не връща отговора: отговорът ви дава prompt_tokens, едно число за всичко.
Можете да възстановите разбивката с четири броя и три изваждания — целия рендериран 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, което е по-важно, отколкото звучи: вашият текст не е това, което се брои. Маркерите за роли, преамбюлът за tool-calling и рендерирането на схемата са все token, за които плащате и които никога не сте въвеждали. Глава 7 изгради tokenizer, а Глава 16 брои с js-tiktoken; тук броят идва от същия модел, който ще прочете prompt, което е единственият точно правилен брой.
Сега прекарайте истински agent през него: четиридесет хода разследване на инцидент, дванадесет инструмента, фалшива операционна среда, която връща реалистични log dumps и metric series.
| ход | system | дефиниции на инструменти | разговор | резултати от инструменти | общ prompt | вход, таксуван този ход |
|---|---|---|---|---|---|---|
| 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 |
Прочетете първия ред срещу последния.
На ход 1 prompt е 2 547 token и 71 % от него са дефиниции на инструменти. System prompt е 3 %. Това, което потребителят е въвел, е 6 %. agent още не е направил нищо и вече носи 1 817 token JSON schema.
До ход 40 prompt е 10 632 token и дяловете са се обърнали: дефиниции 17 %, разговор 29 %, резултати от инструменти 53 %. Output от инструменти изпревари дефинициите на ход 5; разговорът не ги изпревари до ход 25, така че през първите шестдесет процента от сесията каталогът с инструменти беше по-голям от всичко, което беше казано.
После общата сума. В 57 model calls изпълнението беше таксувано за 370 291 input token за финален context от 10 632 — последният prompt беше платен около тридесет и пет пъти, което е квадратичното от Глава 16 с множителя на agent отгоре. От тези 370 291, 103 569, или 28 % от всичко таксувано, бяха дванадесетте дефиниции на инструменти, препращани byte-identical при всяко извикване.
Какво струва дефиниция на инструмент
Връзка към раздела: Какво струва дефиниция на инструментКаталогът с инструменти е най-големият фиксиран разход в agent и е невидим, защото никога не го виждате: подавате масив от обекти и 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 %)Маргиналната цена на инструмент е от 80 token за get_current_time, който приема един string, до 263 за search_tickets, който приема четири параметъра с enum и по едно изречение насоки за всеки. Това е обменният курс зад централния съвет на Глава 18, че описанието е API-то: добро описание струва около сто token при всяка заявка до края на живота на agent. Три последствия.
Инструмент, който не използвате, пак се таксува. agent извика седем от дванадесетте. Другите пет струваха 697 token при всяка от 57-те заявки — общо 39 729, повече от една десета от всичко, за което изпълнението беше таксувано, за възможности, които никога не докосна. Един от петте носи най-острия детайл в trace: моделът опита три пъти да извика read_log, който не съществува. Инструментът, който искаше, беше search_logs, втората най-скъпа дефиниция в каталога с 237 token. Той плати за тази дефиниция 57 пъти, никога не я използва и никога не намери името ѝ.
Рязането на проза е най-евтината налична оптимизация и е размяна. Съкращаването на описанията до едно изречение и махането на документацията на параметрите спести 526 token на извикване, 29 процента, без да се пипа ред логика — и накара модела да извиква инструментите по-зле, което е измереното в Глава 18. Идеята е, че двете страни на тази размяна вече са в една и съща единица.
При определен мащаб изобщо престава да има смисъл да се изпращат дефиниции. Anthropic сложи число през ноември 2025 г.: голям набор свързани сървъри означава обработване на „стотици хиляди token“ дефиниции преди заявката да бъде прочетена, а замяната на това с code execution — agent да открива и зарежда само дефинициите, от които има нужда — „намалява употребата на token от 150 000 token до 2 000 token, спестяване на време и разходи от 98,7%“.3 Същата идея като останалата част от тази глава, приложена към схеми вместо към история: запазете индекса, разрешавайте записа при нужда.
Чупене нарочно
Връзка към раздела: Чупене нарочноВ този четиридесетходов transcript бяха посадени две неща. На ход 2, преди реалната работа, потребителят задава постоянно правило: всеки тикет, който отвориш, трябва да бъде заведен под моя служителски номер, 4417. На ход 19, в средата на инцидента, факт: засегнатият shard е pay-shard-7, потвърден от екипа по плащанията. На ход 40 потребителят моли agent да отвори тикета за инцидента, което изисква и двете. Всяка проверка се задава в шест различни формулировки и се оценява от шест — greedy decoding е детерминиран, така че едно извикване дава неповторимо да или не, а шест дават процент.
След това transcript се преиграва при седем context политики. Преиграва, а не се изпълнява отново, умишлено: съобщенията, tool calls и резултатите от инструменти са byte-identical във всичките седем, така че единствената променлива е какво е избрала да задържи всяка политика. Глава 16 показа защо sliding window е лош икономически ход, защото унищожава cacheable prefix. Ето какво прави с поведението:
| context политика | input token през 40-те хода | prompt на ход 40 | правило от ход 2 | факт от ход 19 |
|---|---|---|---|---|
| пълна история | 370 291 | 10 632 | 6/6 | 5/6 |
| sliding window, последните 12 съобщения | 157 578 | 2 922 | 5/6 | 0/6 |
| скриване на резултати от инструменти, по-стари от 4 хода | 243 445 | 6 311 | 6/6 | 3/6 |
| compaction на всеки 6 хода | 195 515 | 3 220 | 6/6 | 0/6 |
| compaction плюс бележки, писани от модела | 200 849 | 3 286 | 6/6 | 0/6 |
| закрепяне на собствените ходове на потребителя, отпред | 168 550 | 3 559 | 6/6 | 5/6 |
| закрепяне на собствените ходове на потребителя, отзад | 168 835 | 3 564 | 6/6 | 6/6 |
| контрола: двата хода и нищо друго | — | 1 981 | 6/6 | 6/6 |
Редовете с compaction включват цената на самото compaction: 18 581 input token за седем обобщения и още 3 392 за note-taker. Контролният ред е там, за да може нула да се чете като нула — само с двете съобщения в prompt от 1 981 token този модел отговаря идеално и на двете проверки, така че никой ред не е „задачата е твърде трудна“.
Пълната история помни и е най-скъпото нещо в таблицата: 370 291 input token за сесия, чието трайно съдържание е две изречения.
Това отговаря на въпроса, който началото остави отворен. Защо transcript от 10 632 token държи факт, който регистър от 853 token губи? Защото дължината е грешната променлива. Регистърът държи двадесет и пет четирицифрени вътрешни номера в двадесет и пет идентични изречения — двадесет и четири почти съвършени примамки за този, който искате. transcript държи точно един служителски номер и едно име на shard. Context rot е интерференция, преди да е обем, затова 136 от 205-те грешни отговора горе бяха стойност на съсед.
Sliding window е с 57 % по-евтин и е загубил инцидента. Служителският номер оцелява само защото agent го беше повторил в последните ходове. shard, заявен веднъж на ход 19, не е в последните дванадесет съобщения — и моделът не го казва. Попитан шест пъти, той отговори „засегнатият payment shard е shard 4417“, посягайки към служителския номер, единствения друг идентификатор, останал в прозореца му, и два пъти „pool“, извадено от string pool_exhausted в log line.
Compaction е евтин и загуби същия факт. Седем обобщения, писани от модела под изрична инструкция да запазва идентификатори, числа, постоянни инструкции и отворени въпроси, и pay-shard-7 не е в нито едно от важните; шестте предположения бяха shard 1, pay_shard_1 и pool. Compaction не се проваля шумно. Той създава гладка, правдоподобна, много по-кратка сесия, която тихо е изпуснала един ред.
Три реда дадоха 0/6 за факта от ход 19 — sliding window, compaction и compaction с бележки. Осемнадесет грешни отговора между тях и нито един не беше „Не знам.“
После идва редът, който би трябвало да е неудобен. Запазването на собствените четиридесет съобщения на потребителя verbatim, плюс последните четири хода изцяло и нищо друго, струва 168 550 token — 54 % по-малко от пълната история — и отговаря на двете проверки толкова добре, колкото пълната история, или по-добре. Без summariser, без note-taker, без втори модел: филтър върху role === "user". Думите на потребителя са най-евтините високостойностни token в прозореца на agent, а повечето дизайни ги изхвърлят заедно с всичко останало.
Последните два реда са началната таблица отново, вътре в agent. Същият закрепен блок, преместен от system message към края на prompt: 5/6 става 6/6. При шест опита това не е значима разлика и не се предлага като такава — предлага се като напомняне, че къде е параметър, който задавате, независимо дали го знаете.
Четири начина да харчите по-малко прозорец
Връзка към раздела: Четири начина да харчите по-малко прозорецЧетирите стратегии по-долу са на Anthropic, в неговия ред, макар само последните три да са неговият long-horizon списък.1 И четирите са вариации на една инструкция: не носете това, което можете да извлечете, и не носете сурово това, което можете да носите компресирано.
Just-in-time retrieval
Връзка към раздела: Just-in-time retrievalНе зареждайте предварително съдържание. Запазвайте идентификатори — път до файл, query, номер на тикет, име на инструмент и аргументите му — и ги разрешавайте при нужда. Най-голямата кошница в agent по-горе е output от инструмент, който е бил прочетен веднъж, използван веднъж и после носен още тридесет хода. Замяната на всеки резултат, по-стар от четири хода, със 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 машинарията вече е там — това е каталогът с инструменти.
Compaction
Връзка към раздела: CompactionКогато transcript премине праг, заменете най-старата му част с обобщение, писано от модел, и продължете. prompt, който пише обобщението, е целият дизайн и именно там compaction се печели или губи: запазвай идентификатори, числа, постоянни инструкции и отворени въпроси; махай любезностите и output от инструменти, който можеш да извлечеш пак.
Compaction е lossy по конструкция, това, което губи, се избира от модел вместо вас, и нищо не дава грешка, когато избере неправилно. Не е и безплатно: всяко compaction е допълнително извикване, чийто input е нещото, което се compact-ва.
Structured note-taking
Връзка към раздела: Structured note-takingПоддържайте малко хранилище извън context и го вкарвайте отново изцяло при всеки ход. За разлика от обобщение, то е append-only и адресируемо: правило, записано на ход 2, още е там verbatim на ход 400. Версията, измерена тук, пита модела след всяко потребителско съобщение дали съдържа нещо трайно:
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 запази три бележки и нито една от двете важни: ред runbook съвет, съобщение, че сесията приключва, и Europe/Madrid в момента е 13:45 — час, който той измисли, защото инструментът, който перифразираше, върна 09:52 UTC. note-taker е модел и всичко в тази глава важи и за него.
Sub-agents
Връзка към раздела: Sub-agentsДайте на фокусирана задача собствен прозорец — собствен system prompt, собствен малък каталог, нищо от историята на родителя — и върнете кратък отговор вместо transcript. Глава 23 постави един зад tool schema и остави сметката тук; сметката е, че от прозореца на детето родителят плаща само за отговора на детето.
Sub-agent не е в таблицата по-горе, защото не работи четиридесет хода: работи веднъж, в прозорец, който някой е ограничил за него. С дадения system prompt, ходове 17 до 19 и нищо друго — 2 737 token — той отговори на shard проверката 6/6, по-добре от всяка политика в таблицата, и на employee проверката 0/6, защото този номер не е в трите хода, които са му подадени.
Това са sub-agents в две числа: чистият прозорец не е интелигентност, а обхват, и определянето на обхвата се прави предварително от код, който така или иначе трябва да знае кои ходове са важни. Още едно нещо в тези отговори си струва да се запази. Това беше единствената политика, която отговори „Няма налично“, вместо да измисли нещо. Модел с малък, кохерентен context знае какво му липсва; модел с голям, шумен context — не.
Трите памети
Връзка към раздела: Трите паметиПочти всеки объркан разговор за памет на agent е три механизма, носещи една дума. Те имат различен живот, собственици и режими на провал, и система, която ги държи на едно и също място, има проблем, който още не е забелязала.
| история на разговора | retrieval | постоянна потребителска памет | |
|---|---|---|---|
| държи | какво е казано в тази сесия | документи, които притежавате | факти за човек |
| живее | една сесия | докато не се re-index-не | през всички сесии, завинаги |
| писана от | цикъла, автоматично | ingestion pipeline | модела, нарочно |
| влиза в prompt | изцяло, при всяко извикване | четири пасажа, когато query съвпадне | изцяло, при всяко извикване |
| се проваля чрез | расте, докато изгние | извлича грешния chunk | помни нещо грешно за вас |
| изградена в | Глава 23 | Глава 19 | тази глава |
Академичната рамка е CoALA, която организира language agents около „модулни компоненти на паметта“ и отделя working memory от episodic, semantic и procedural хранилища.4 MemGPT приема същата идея буквално, заемайки virtual memory от operating systems: бърз слой вътре в прозореца, бавен слой извън него, и самият модел премества данни между тях с function calls.5 И двете налагат въпроса, на който продуктът така или иначе трябва да отговори — не колко мога да запазя, а в кое хранилище принадлежи това и кога изтича.
Практическият тест е един въпрос за всеки факт: какво трябва да остане вярно утре? Резултат от инструмент от ход 12 — нищо. Обобщение на сесията — докато сесията приключи. Че служителският номер на потребителя е 4417 — докато смени работа. Три отговора, три хранилища.
Накъде отива това
Връзка към раздела: Накъде отива товаВече можете да измервате какво има в прозорец, да решавате какво остава в него и да различавате agent, който е забравил нещо, от такъв, който го е носил и не е погледнал.
Последната от четирите стратегии е тази, която не се побира тук. Sub-agent не е context политика, а втори agent, и в момента, в който има два, трябва да решите какво минава между тях и кой командва. Глава 25 е това: петте orchestration patterns и откъде всъщност идва всяко от имената им, двете топологии, които се бъркат — да попиташ sub-agent и да получиш отговор обратно, срещу това да му предадеш разговора и да не го получиш обратно — и измереното откритие, че за задачата, която остойностява, по-простата подредба печели — последвано от теста кога спира да печели.
Тя наследява и точно това, което тази глава току-що измери. Sub-agent връща обобщение. Обобщението е compaction, който не сте писали, произведен от модел, чийто прозорец не можете да видите, а родителят няма начин да различи добро обобщение от уверено грешно — същото разграничение, което раздели 84 % от 19 % в началото на тази страница и превърна осемнадесет липсващи факта в осемнадесет измислени. Така че: когато sub-agent греши, какво точно може да погледне родителят?
Източници и метод
Връзка към раздела: Източници и методВсяко число тук е произведено на тази машина и нито едно не е оценка. Моделът е Qwen2.5-0.5B-Instruct във float32 на CPU с greedy decoding, served over loopback от малък Python endpoint, който говори във формата chat-completions и излага route за token count — отново seam от Глава 14, тензорите от Python страната и цикълът от TypeScript страната — така че всеки брой е собственият tokenizer на този модел, приложен към собствения му chat template. Таблицата за позиция е 288 извиквания, девет позиции по тридесет и два опита с различен тикет във всеки опит; таблицата за дължина е 140 извиквания; agent run е 57 model calls за 43 минути wall clock; таблицата с политики е този един transcript, преигран при седем политики. Интервалите са на Wilson, от Глава 4. Не беше извикано платено API, което е и причината в главата да няма нито една цена: token counts са точни, а тарифите, по които бихте ги умножили, са в Глава 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² двойкови отношения и на стратегиите, използвани като гръбнак на тази глава. Три от тях са неговият 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; двете задачи в статията са multi-document question answering и key-value retrieval, а откритието, че ефектът продължава при модели, изрично създадени за long-context, е частта, която има значение за продуктово решение. ↩
-
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 преди заявката да бъде прочетена. ↩ -
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 използва таксономията му за learning agent; таблицата с трите хранилища по-горе е практическата ѝ сянка. ↩
-
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“, при която самият модел премества данни между бърз слой вътре в прозореца и бавен слой извън него. Най-ясното твърдение някъде защо прозорецът е cache, а не памет. ↩