Як працює ШІ-агент: мовна модель у циклі з інструментами
Цикл міркування – виклик інструмента – результат на справжньому завданні над статтями сайту, три підходи та їхня ціна в токенах, чому росте контекст, план і пам’ять, надійність довгих завдань із перевіркою і без неї, і чому агентові потрібне схвалення.
Серія Основи ШІ Частина 50 з 52
- Мапа штучного інтелекту: що є що і як усе це пов’язано
- Коротка історія штучного інтелекту: від Тюрінга до мовних моделей
- Дані, модель, тренування, інференс: основні поняття на одному прикладі
- Як читати математичний запис: символи, індекси, суми та квантори
- Множини й відношення: конструктор, з якого складаються означення в ШІ
- Функції й відображення: чому кожна модель у ШІ — це функція
- Логіка й доведення: правила, за якими міркують у ШІ
- Графи й дерева: структура, на якій тримаються пошук і нейронні мережі
- Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
- Похідні, градієнт і правило ланцюжка: як модель дізнається, у якому напрямку вчитися
- Градієнтний спуск: як навчається модель
- Що таке ймовірність: від кидка кубика до аксіом Колмогорова
- Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове
- Випадкова величина і функція розподілу: одна функція, яка каже про розподіл усе
- Функція щільності та функція маси ймовірності: чому неперервна величина має в точці ймовірність нуль
- Математичне сподівання, дисперсія і коваріація: де лежить розподіл, наскільки він широкий і що з чим пов’язано
- Огляд розподілів ймовірностей: Бернуллі, біноміальний, Пуассона, рівномірний, нормальний і експоненційний
- Закон великих чисел і центральна гранична теорема: чому середні поводяться так передбачувано
- Статистика й оцінювання параметрів: максимальна правдоподібність, MAP і довірчі інтервали
- Теорія інформації: ентропія, перехресна ентропія і KL-дивергенція — звідки беруться функції втрат
- Пошук у просторі станів: BFS, DFS, UCS і A* з анімаціями
- Ігри та суперник: мінімакс, альфа-бета відсікання і Monte Carlo tree search
- Задоволення обмежень: бектрекінг, поширення обмежень і AC-3 на судоку та мапі чеських країв
- Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи
- Планування: STRIPS, світ кубиків, евристики з релаксації та планування в AI-агентах
- Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
- Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
- Еволюційні стратегії і генетичне програмування: від правила однієї п’ятої до закону Кеплера
- Оптимізація мурашиною колонією: як феромоновий слід знаходить короткий шлях
- Оптимізація роєм частинок: інерція, власний досвід і досвід рою
- Нейроеволюція: еволюція ваг і форми нейронних мереж та алгоритм NEAT
- Нечіткі множини й функції належності: як записати «трохи тепло»
- Нечітка логіка та ймовірність: чому «трохи тепло» не означає «імовірно тепло»
- Нечітка логіка: t-норми, імплікації та правила ЯКЩО–ТО
- Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку
- Нечітка кластеризація: алгоритм fuzzy c-means і точки між кластерами
- Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних
- Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
- Приховані марковські моделі: алгоритм Вітербі й нечесне казино
- Байєсівські мережі: чому трава мокра і що з цього випливає для дощувача
- Фільтр Калмана: як за неточними вимірюваннями оцінити, де авто і як швидко воно їде
- Види машинного навчання: з учителем, без учителя, з частковим залученням учителя та інші
- Промпти, контекст і RAG: як дати моделі правильну інформацію
- Варіаційні автокодувальники (VAE): нові зображення з неперервного латентного простору
- Генеративні змагальні мережі (GAN): фальшувальник проти детектива
- Дифузійні моделі: як із чистого шуму постає зображення
- Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
- Q-навчання і DQN: як навчитися цінності дій — від таблиці до нейронної мережі
- Policy gradient і PPO: навчання безпосередньо політики
- Як працює ШІ-агент: мовна модель у циклі з інструментами
- Програмування з AI-агентами: завдання, тести й перевірка
- Оцінювання і безпека систем ШІ: як вимірювати і як стежити
Повна програма серії Готово: 52 з 83 тем
- Що відбувається в агенті крок за кроком і що робить модель, а що обслуговувальна програма.
- Чому контекст дорогий і як добрі агенти його заощаджують.
- Чому довгі завдання без перевірки зазнають невдачі і як допомагають тести та схвалення.
Що варто знати заздалегідь: Промпти, контекст і RAG: як дати моделі правильну інформацію, Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
Мовна модель сама по собі лише відповідає: отримує текст і повертає текст. Агент — це модель, якій ми даємо руки — інструменти, якими вона може щось з’ясувати або зробити, — і дозволяємо працювати в циклі, доки вона не завершить завдання. Так працюють агенти для програмування, які самі читають код, запускають тести й виправляють помилки, і асистенти, які шукають в інтернеті. І так працює й агент, яким ви керуєте з телефона через coden. У цій частині ми розберемо цикл на справжньому завданні й порахуємо, скільки він коштує і де ламається.
Продовжує частини Промпти, контекст і RAG, Токенізація і Марковські процеси прийняття рішень.
1. Модель у циклі
Означення — ШІ-агент
Агент — це програма, у якій мовна модель багаторазово (1) отримує завдання й дотеперішній перебіг, (2) вирішує, що далі — викликати інструмент чи відповісти, (3) обслуговувальна програма справді виконує інструмент і додає результат до контексту. Цикл закінчується, коли модель напише остаточну відповідь або вичерпається бюджет кроків. Чергування міркування й дії описали Шуньюй Яо та ін. (2022) під назвою ReAct (reason + act).
Тямущий колега на телефоні, який не бачить вашого комп’ютера. Він каже «відкрий папку src», ви читаєте йому, що там є, він каже «тепер файл server.js, рядки від 100 до 150» — і так далі, доки не матиме відповіді. Модель — це той колега, обслуговувальна програма — ваші руки й очі. Мовою навчання з підкріпленням: станом є дотеперішня розмова, дією — виклик інструмента.
vk = M(ck), ck+1 = ck ⊕ vk ⊕ N(vk)
- ck
- контекст перед k-м викликом моделі: системний промпт, завдання і все, що досі сталося. Це весь «стан» агента — нічого іншого модель не пам’ятає
- M
- мовна модель; з контексту пише наступний крок. Єдина частина, яка «думає», і єдина, якій не можна повністю довіряти
- vk
- крок моделі: міркування й виклик інструмента або остаточна відповідь (тоді цикл закінчується)
- N(vk)
- результат інструмента, який обчислює обслуговувальна програма; додає до контексту те, чого модель сама знати не може (вміст файлу, вивід тестів)
kontext = [системний промпт, опис інструментів, завдання]
for k = 1 … K_max: # бюджет кроків
krok = model(kontext) # читає ВЕСЬ контекст
kontext += krok
if krok — остаточна відповідь: return її
if інструмент потребує згоди, а людина її не дала:
kontext += "відхилено"; continue
výsledek = proveď(krok.nástroj, krok.parametry) # обслуговувальна програма
kontext += výsledek
return "вичерпано бюджет кроків"
2. Інструменти
Означення — виклик інструментів (tool use, function calling)
До промпту вставляють опис інструментів: назву, для чого він і які має параметри (зазвичай як схему JSON). Модель донавчена так, щоб замість звичайного тексту вміла повернути структурований виклик, наприклад {"nastroj": "hledej", "text": "KL divergence"}. Обслуговувальна програма виклик перевіряє, виконує й повертає результат як наступне повідомлення. Модель сама нічого не запускає — лише пише, що треба запустити.
Меню й замовлення. Модель отримує меню («ось твої інструменти, і ось як їх замовляти») і пише замовлення саме в такому вигляді, який розуміє кухня. Готує кухня, а не гість. Тому кухні можна наказати, щоб деякі страви без згоди не видавала.
Наш агент працює над текстами 21 старішої статті цього сайту (тими самими, що й у частинах про токенізацію та RAG; вони чеською, тож і агент працює чеською) і має три інструменти. Увесь його системний промпт має 157 токенів:
Jsi agent, který odpovídá na otázky podle článků webu. Máš nástroje:
- seznam(): Vypíše články a jejich délku ve znacích.
- hledej(text, max): Najde výskyty textu ve všech článcích; vrátí článek, pozici a okolí.
- cti(clanek, od, do): Vrátí úsek článku od pozice do pozice (znaky).
V každém kroku napiš krátkou úvahu a zavolej jeden nástroj, nebo napiš konečnou odpověď s odkazem na článek. Když něco nenajdeš, zkus jiný dotaz.
Справжні інструменти агентів для програмування схожі: шукати у файлах, прочитати фрагмент файлу, змінити його, запустити команду в терміналі. Від 2024 року інструменти можна під’єднувати й через спільний протокол MCP (Model Context Protocol), тож той самий інструмент — базу даних, календар, браузер — може використовувати будь-який агент.
3. Одне питання, три підходи
Питання: «Чому KL-дивергенція не є відстанню? Наведи приклад зі статей.» (в оригіналі: «Proč KL divergence není vzdálenost? Uveď příklad z článků.»). Відповідь є в статті про теорію інформації: KL-дивергенція не симетрична, DKL(0,7 ‖ 0,5) = 0,119, але DKL(0,5 ‖ 0,7) = 0,126. Кроки агента ми записали вручну — замість моделі ми написали міркування й виклики. Але інструменти, їхні результати й токени — справжні.
Приклад — чому DKL(0,7 ‖ 0,5) ≠ DKL(0,5 ‖ 0,7)
Для двох розподілів так/ні (дощ з імовірністю p, модель каже q) маємо DKL(p ‖ q) = p log2(p/q) + (1 − p) log2((1 − p)/(1 − q)) біт.
DKL(0,7 ‖ 0,5) = 0,7 · log2 1,4 + 0,3 · log2 0,6 = 0,340 − 0,221 = 0,119.
DKL(0,5 ‖ 0,7) = 0,5 · log2(5/7) + 0,5 · log2(5/3) = −0,243 + 0,368 = 0,126.
Щоразу усереднюють за іншим розподілом (за тим, який є дійсністю), тому перестановка аргументів дає інше число — а відстань (метрика) мусить бути симетричною. Це і є відповідь, яку шукає агент.
-
Шукаю точно слова з питання.
hledej(text: "KL divergence není metrika")nic nenalezeno
+34 токенів, контекст 209 -
Нічого. Спробую лише назву поняття.
hledej(text: "KL divergence")5 výskytů: informace:3258: … minimum je tam, kde model říká pravdu. KL divergence Definice — Kullbackova–Leiblerova diver… informace:3656: …,222 bitu. Podle Gibbsovy nerovnosti je KL divergence vždy nezáporná a nulová jen pro q = p .… informace:3717: …záporná … (ще 310 символів)
+205 токенів, контекст 414 -
Це в статті informace. Прочитаю околицю.
cti(clanek: "informace", od: 3660, do: 3960)ivergence vždy nezáporná a nulová jen pro q = p . Pozor, KL divergence není vzdálenost: není symetrická. D KL (0,7 ‖ 0,5) = 0,119, ale D KL (0,5 ‖ 0,7) = 0,126. Záleží na tom, co je skutečnost a co model. Informační zisk Definice — podmíněná entropie H ( Y | X … (ще 40 символів)
+146 токенів, контекст 560
Три виклики інструментів, і четвертий виклик моделі пише відповідь. Перший пошук нічого не знаходить — слів із питання в тексті немає. Агент це бачить і пробує загальніший запит; у цьому перевага циклу над одноразовим пошуком. Наприкінці контекст має 560 токенів.
-
Не знаю, де це. Пройду статті одну за одною.
cti(clanek: "co-je-pravdepodobnost")Jazykový model nevybírá další slovo, ale pravděpodobnosti všech slov. Klasifikátor neříká „je to kočka“, ale „s pravděpodobností 0,93 je to kočka“. Celé strojov … (ще 7 175 символів)
+1 933 токенів, контекст 2 108 -
Тут цього немає, наступна стаття.
cti(clanek: "csp")Rozvrh hodin, ve kterém žádný učitel neučí dvě třídy naráz. Sudoku. Rozmístění součástek na desce, směny v nemocnici, přidělení letadel k branám. Všechny tyhle … (ще 11 914 символів)
+3 148 токенів, контекст 5 256 - … ще 8 кроків так само (контекст наприкінці 24 927 токенів)
Агент без пошуку проходить статті в алфавітному порядку. На відповідь натрапляє лише в 10-й статті, а контекст тим часом зростає до 24 927 токенів.
І третій підхід, одноразовий RAG з минулої частини: знайти три найподібніші фрагменти й вставити їх у промпт. Усі три фрагменти походять із правильної статті (informace, informace, informace), але жоден не містить прикладу з числами 0,119 і 0,126 — відповідь була б без прикладу. Агент у циклі може сказати собі «цього замало, читаю далі». Одноразовий пошук — ні.
4. Контекст дорогий
Означення — ціна циклу
Модель не має пам’яті між викликами; на кожному кроці вона знову читає весь контекст — системний промпт, завдання і всі дотеперішні кроки та результати інструментів. Якщо ck — довжина контексту перед k-м викликом, модель загалом обробляє ∑k ck токенів. Оскільки контекст із кожним кроком росте, загальна ціна росте приблизно з квадратом кількості кроків.
Наче перед кожним реченням листа вам доводилося б перечитувати весь лист від початку. Короткий лист — не біда. Довгий лист, до якого ви ще й вклеїли десять прочитаних книжок, дорогий — і серед усіх тих сторінок легко губиться головне.
Підхід «читай усе» коштує 141 820 оброблених токенів, «шукай і читай фрагмент» — лише 1 358, тобто в 104 разів менше, і за ту саму відповідь. Тому добрі агенти для програмування спершу шукають (grep) і читають лише шматки файлів. І тому довгу сесію час від часу ущільнюють: старішу частину розмови замінюють підсумком, щоб контекст вмістився і модель у ньому не губилася. Допомагає й кешування початку промпту (prompt caching), завдяки якому повторне читання того самого початку обходиться дешевше.
Z = ∑k=1K ck, ck = c1 + ∑j<k (vj + oj)
- Z
- загалом оброблені токени — те, за що платять і на що чекають
- K
- кількість викликів моделі (кроки з інструментом + остаточна відповідь); кожен виклик читає контекст знову від початку
- c1
- системний промпт і завдання; вони в контексті від першого виклику, тож за них платять K разів — тому варто мати їх короткими й кешувати
- vj + oj
- токени, які додав крок j: виклик і результат інструмента. Крок j читається в усіх пізніших викликах, тому за довгий результат інструмента платять багато разів
Теорема — ціна росте з квадратом кількості кроків
Якщо кожен крок додає однаково d токенів, то ck = c1 + (k − 1) d і
Z = K c1 + d · K(K − 1) / 2.
Доведення: ∑k=1K (k − 1) = 0 + 1 + … + (K − 1) = K(K − 1) / 2. ∎ Для великого K переважає другий член ≈ d K² / 2: удвічі довша сесія коштує приблизно вчетверо більше.
Приклад — перерахунок обох підходів
Шукай і читай фрагмент. Системний промпт має 157 токенів, питання 18, отже c1 = 175. Після трьох кроків контекст має 209, 414, 560 токенів. Чотири виклики моделі читають Z = 175 + 209 + 414 + 560 = 1 358 токенів.
Читай усе. K = 11 викликів, контекст зростає з 175 до 24 927 токенів, у середньому на d = (24 927 − 175) / 10 ≈ 2 475 за крок. За теоремою Z ≈ 11 · 175 + 2 475 · 11 · 10 / 2 = 138 050; насправді 141 820 (статті мають різну довжину, тож кроки додають не зовсім однаково). Системний промпт із питанням становить із цього лише 1 925 токенів — майже все інше є повторним читанням статей.
5. План і пам’ять
Означення — планування й пам’ять агента
План — це список кроків, який агент на початку записує до контексту й поступово відмічає та коригує. Робоча пам’ять — це контекст однієї сесії. Довготривала пам’ять — це файли або бази даних поза моделлю: нотатки, які агент записує й читає в наступній сесії. Субагенти отримують окремий контекст для підзавдання й повертають лише результат, тож не заповнюють головний контекст подробицями.
Майстер на довшому замовленні пише собі список на папері, а ввечері записує в зошит, що з’ясував, — уранці йому не треба все пам’ятати, досить відкрити зошит. На допоміжну роботу він посилає учня й хоче від нього лише «готово, це було тут».
В агентів для програмування довготривалою пам’яттю зазвичай є звичайний текстовий файл у проєкті (правила, команди, на що зважати), який агент читає на початку кожної сесії. Це найпростіша й найпрозоріша пам’ять: людина може її прочитати й виправити.
6. Довгі завдання й перевірка
Агент, який робить правильний крок у 90 % випадків, здається надійним. Але завдання складається з багатьох кроків, і помилка в будь-якому з них його псує. Якщо крок вдається з імовірністю p, то все завдання з n кроків вдається з імовірністю pn — якщо агент не розпізнає помилок.
Означення — замкнений цикл зі зворотним зв’язком
Після кроку агент перевіряє результат (запускає тести, читає вивід команди, порівнює з очікуваним). Якщо він розпізнає помилку з імовірністю d і може повторити крок до r разів, то успішність кроку q = p ∑k=0r ((1 − p) d)k, а всього завдання — qn.
Хто пише довгу програму, не запускаючи її, майже напевно має в ній помилку. Хто після кожної зміни запускає тести, знаходить помилку одразу, поки вона ще мала і відомо, де вона. З агентами так само.
q = p ∑k=0r ((1 − p) d)k = p + p (1 − p) d + p ((1 − p) d)² + …
- p
- спроба вдається; кожен доданок закінчується рівно однією вдалою спробою
- 1 − p
- спроба не вдається; кожна невдача перед успіхом коштує один такий множник
- d
- перевірка розпізнає невдачу; лише тоді агент повторює крок — нерозпізнана помилка проходить далі й псує завдання
- ∑k=0r, k
- k = скільки спроб не вдалося, перш ніж одна вийшла; щонайбільше r повторень, щоб агент не пробував безкінечно
З p = 0,9 і двадцятьма кроками без перевірки вдається лише 12 % завдань, з перевіркою 79 %. Симуляція 20 000 завдань дає 12 % і 79 %, формула сходиться. Навіть дуже добрий крок (p = 0,99) на сотні кроків без перевірки частіше зазнає невдачі, ніж вдається (37 %); з перевіркою вдається в 90 %. Це головна причина, чому агенти для програмування працюють так добре: код можна запустити й протестувати, тож майже кожен крок має зворотний зв’язок. Організація METR (2025) вимірює, що довжина завдань, із якими агенти справляються в половині випадків, подвоюється приблизно кожні сім місяців.
Приклад — p = 0,9, d = 0,9, r = 2, двадцять кроків
Успішність кроку: q = 0,9 + 0,9 · 0,1 · 0,9 + 0,9 · (0,1 · 0,9)² = 0,9 + 0,081 + 0,00729 = 0,98829.
Усе завдання: без перевірки 0,920 = 0,122, з перевіркою 0,9882920 = 0,790. Крок покращився лише з 90 % до 98,8 %, а завдання — з 12 % до 79 %: степінь n роздуває малі відмінності в кроці.
Означення — довжина завдання, з яким агент справляється в половині випадків
Це найбільше n, для якого qn ≥ 1/2, тобто n½ = ln 0,5 / ln q ≈ 0,69 / (1 − q) для q, близького до 1.
У нашій моделі: p = 0,9 без перевірки 6,6 кроку, з перевіркою 58,8; p = 0,99 без перевірки 69,0, з перевіркою 686. Завдання, з яким агент справляється наполовину, подовжується приблизно пропорційно тому, у скільки разів знижується частота помилок кроку 1 − q.
Ту саму величину (довжину завдання, з яким агент справляється в 50 % випадків) вимірює METR — тільки не в кроках, а в часі, якого завдання забрало б у людини (Thomas Kwa та ін., Measuring AI Ability to Complete Long Tasks, 2025). Наша формула — спрощена модель із незалежними кроками, а не їхній метод.
7. Дозволи й нагляд
Агент, якому дозволено запускати команди, може й шкодити — помилково (видалить не ту папку) або за вказівкою, яку прочитав у чужому тексті (prompt injection). Захист тримається не на моделі, а на обслуговувальній програмі: інструменти з обмеженими правами, робота в ізольованому середовищі, а головне — схвалення: небезпечні або незворотні кроки виконуються лише після згоди людини. На цьому тримається і coden: агент працює на вашому комп’ютері, а ви схвалюєте його кроки з телефона.
8. Підсумок
- Агент = мовна модель у циклі: міркування, виклик інструмента, результат у контекст, знову.
- Модель лише описує інструменти структурованим викликом; запускає їх обслуговувальна програма, яка може примусово застосовувати правила.
- Цикл уміє виправити невдалий пошук — одноразовий RAG ні.
- Кожен виклик читає весь контекст: «читай усе» коштувало 141 820 токенів, «шукай і читай фрагмент» — 1 358.
- План, нотатки у файлах і субагенти тримають контекст малим і зрозумілим.
- Без перевірки успішність падає з довжиною завдання як pn; тести й перевірка це змінюють (20 кроків при p = 0,9: 12 % → 79 %).
Хочете спробувати самі? Попросіть ШІ-агента описати вам кожен виклик інструмента, який він зробить під час завдання, а наприкінці оцінити, скільки токенів йому коштувало завдання. Потім дайте йому те саме завдання з вказівкою «спершу шукай, читай лише фрагменти».
Маєте іншу думку? Напишіть на support@coden-app.com.