Створення AI-агента з Code Interpreter: виконання коду в пісочниці

Агент, який сам пише і запускає код, ламається там, де немає контролю над виконанням: він псує дані, зависає або видає неправильний результат. Ми розробляємо AI-агентів з ізольованим запуском коду під ключ — від схеми до регламентів експлуатації. Ізоляція скорочує частку збоїв на живих задачах у рази, а відповіді агента стають перевірюваними.
Часті запитання

AI-агент з code interpreter: де ламається на реальних задачах

AI-агент з code interpreter працює інакше, ніж звичайний чат-бот: замість відповіді «з пам'яті» модель пише код, запускає його в ізольованому середовищі, читає вивід і уточнює розрахунок.

Саме виконання коду в агенті дає те, заради чого все затівається — цифри рахуються за вашими файлами, а не вгадуються. Тому такий агент насамперед ламається там, де дані перестають бути навчально-охайними.

Перша точка відмови — розбіжність схеми. На тестовому наборі таблиця з рівними колонками, у реальному вивантаженні — перейменовані поля, порожні значення, різні розділювачі, аркуші без заголовка. Агент генерує код під формат, який побачив у першій ітерації, і падає на першому ж несхожому файлі.

Друга — цикл: збій не читається як збій, агент править один рядок, отримує той самий результат і повторює до ліміту кроків, спалюючи час і токени.

Третя — ізоляція запуску: якщо середовище не обмежене, згенерований код лізе в мережу, читає змінні середовища з ключами й пише за межі робочої папки.

І відтворюваність результатів: без фіксації знімка даних, набору бібліотек і випадкового зерна два прогони однієї задачі дають різні числа, а звіт нема чим захистити перед тим, хто буде за ним ухвалювати рішення.

Далі розбираємо, як це закривається.

Що дає кероване виконання коду в агенті

Кероване виконання коду — це коли згенерований агентом код іде не в основний процес, а в одноразове ізольоване середовище з описаною політикою: доступні модулі, мережа, час життя процесу, ліміти пам'яті та диска. Агент залишається планувальником, а виконання — окремим кроком із перевірюваним входом і виходом.

Повторювані прогони тримаються на закріпленому середовищі, тих самих вхідних даних і тих самих лімітах, тому розбір інциденту зводиться до повтору запиту, а не до суперечок «у нас локально працює».

Слід прогону читається людиною: код, логи, проміжні файли й графіки складаються в блокнот на базі Jupyter, і видно, яким кроком отримано кожну цифру.

Обмеження прав агента прибирає цілий клас відмов: мережа — за списком дозволених адрес, запис — лише в робочу папку, секрети не потрапляють у середовище.

Неправильний код псує одноразове середовище, а не робочий контур, і стабільність агента перестає залежати від охайності моделі.

  • Однаковий запит і те саме середовище дають той самий артефакт — результат можна перепровірити перед передачею замовнику.
  • Збій на одному кроці не валить сервіс: середовище перестворюється з чистого стану, відновлення займає хвилини.
  • Ліміти за часом, пам'яттю та диском відсікають зациклення до того, як воно займе спільний контур.
  • Доступ у мережу за списком адрес закриває витік даних назовні.

Підсумок — передбачуване споживання ресурсів і повторюваність замість надії на вдалий запуск: межі прогону, його слід і ліміти описані заздалегідь.

Режими роботи code interpreter: порівняння підходів

Перш ніж AI-агент з code interpreter виконає перший рядок коду, потрібно вирішити, де цей код виконується. Від режиму залежать три речі: чи дістанеться агент до внутрішніх систем, які дані покинуть периметр і хто відповідає за експлуатацію середовища.

Варіант Коли підходить Обмеження
Пісочниця на нашій стороні Відкриті дані, швидкий старт, разові задачі Немає доступу до внутрішніх систем, дані йдуть за периметр
Ізольована пісочниця в контурі замовника Робота з чутливими даними Потрібні виділені ресурси та їх експлуатація
Локальний запуск на робочій станції Налагодження сценаріїв, разові обчислення Немає відтворюваності та спільних лімітів
Запуск у процесі агента без ізоляції Прототипи, довірений код Помилка або зациклення валить весь сервіс

Локальний запуск: де він доречний

Локальний запуск потрібен на етапі налагодження: інженер бачить вивід і повторює сценарій на своїх даних. Як постійний режим він не годиться — набір бібліотек у кожного свій, стан середовища не відтворюється, а збій одного сценарію забирає робочий процес. Спільного журналу немає, і розібрати за ним, що саме виконав агент, не вийде.

Пісочниця в інфраструктурі замовника

Ізольована пісочниця піднімається у вашому контурі: код іде в окремому контейнері з урізаними правами, файлова система — лише для читання, вихідні з'єднання обмежені явним списком адрес.

Дані не покидають периметр, а ліміти на процесорний час і пам'ять не дають одному сценарію зайняти вузол цілком. Плата — виділені ресурси та спільна експлуатація середовища.

Обмеження середовища ми фіксуємо до старту, а не після першого інциденту — інакше режим запуску коду вибирається за фактом збою.

Як ми впроваджуємо агента: етапи інженерної роботи

Роботи йдемо в порядку, за якого ризики спливають до того, як агент отримає доступ до даних і зовнішніх систем. Спочатку фіксуємо сценарії, потім будуємо ізоляцію, після — налаштовуємо права й ліміти, і лише потім запускаємо приймання на реальних задачах.

  1. Аудит сценаріїв агента — розбираємо, які задачі він вирішує, де виконує код, які дані читає й куди пише. Результат — карта сценаріїв із переліком операцій і точок, де потрібна перевірка людиною.
  2. Проєктування схеми ізоляції — визначаємо, у якому середовищі виконується код, як часто воно перестворюється і що залишається між запусками. Схему перевіряємо з двох боків: що агент може зламати і що може витекти.
  3. Налаштування прав і лімітів — видаємо лише необхідні доступи: конкретні каталоги, список дозволених адрес, обмеження за часом виконання та обсягом запису. Усе, що виходить за межі, просто не виконується.
  4. Підключення джерел даних — агент отримує файли, базу та зовнішні сервіси, з якими працює. Кожне підключення проходить через той самий контроль прав.
  5. Прогін на реальних задачах — перевіряємо сценарії разом із очікуваними збоями: неправильний ввід, недоступний сервіс, перевищення ліміту. Дивимося, як агент відновлюється і що потрапляє в журнал.
  6. Приймання агента — ви перевіряєте результат на своїх задачах за критеріями, узгодженими заздалегідь. Окремо фіксуємо, які збої вважаємо допустимими, а які блокують запуск.
  7. Передача схеми та регламенту супроводу — віддаємо опис архітектури, правила оновлення сценаріїв і порядок дій при відмові.

Що передаємо на руки: конфігурації, політики та регламенти

Передаємо не «працюючий прототип», а комплект, за яким ваша команда експлуатації може підняти агента на своєму контурі та супроводжувати його без нас.

Інтерпретатор коду виконує згенеровані програми в ізольованому середовищі — отже, усе, що стосується допусків, обмежень і спостережуваності, має бути зафіксовано письмово. Набір артефактів виглядає так.

  • Конфігурація середовища виконання: опис базового образу, зафіксований перелік бібліотек, правила мережевого доступу, точки монтування робочих файлів.
  • Політики доступу: ролі та права, строк життя ключів, порядок ротації секретів, розмежування між тестовим і робочим контуром.
  • Ліміти ресурсів: максимальний час одного запуску, обсяг пам'яті та диска на сесію, кількість одночасних сесій, поведінка при вичерпанні квоти.
  • Матриця інструментів агента: які виклики дозволені автоматично, які потребують підтвердження оператора, які закриті повністю.
  • Схема зберігання артефактів: де лежать проміжні файли, як налаштовано їхнє закінчення терміну дії та як видалити дані на запит.
  • Передавана документація: інструкція з розгортання, перелік залежностей, опис змінних середовища, точки підключення журналів і метрик.
  • Набір перевірок: сценарії на типові запити, тести на вичерпання лімітів, контроль якості підсумкових відповідей перед викаткою.
  • Регламент супроводу: рівні реагування на збої, вікна оновлення образів і бібліотек, порядок відкату на попередню версію.

Документи пишемо так, щоб інженер без нашої участі міг відтворити середовище, змінити ліміт або відкликати доступ. Окремо проговорюємо, які місця конфігурації розраховані на самостійне редагування, а які пов'язані з логікою агента й потребують узгодження.

Кейс: стабільність агента до та після ізоляції коду

Аналітична платформа замовника віддавала розрахунки AI-агенту: він писав код на запит користувача й виконував його прямо в процесі API.

Поки запити були простими, це працювало; на потоці з кількох сотень сесій на добу один нескінченний цикл або витік пам'яті в чужому скрипті забирали робочий процес цілком — разом із чужими задачами й незавершеними діалогами.

Частка зірваних задач трималася на 18%, а розбір кожного падіння займав у чергового інженера години: за логами не можна було відрізнити помилку агента від падіння спільного процесу.

Перенесли виконання в окреме ізольоване середовище на Docker: власна файлова система лише для читання, тимчасовий том для артефактів, заборона мережевих викликів і жорсткі ліміти за процесором і пам'яттю на сесію.

Образ із зафіксованим набором бібліотек збирається заздалегідь — код агента не тягне залежності з інтернету й не ламає середовище сусідам.

Що змінилося в поведінці агента

Зрив сесії перестав бути загальним збоєм: розрахунок, що впав, завершується за лімітом часу, а черга продовжує працювати. Частка зірваних задач знизилася з 18% до 2%, відмов виду «агент завис і не відповідає» за квартал не залишилося жодної.

Повторні запуски одного й того самого запиту дають ідентичний результат у 96% випадків — раніше розбіжності ловили вручну, бо середовище «пливло».

Окремо виграла діагностика: артефакти, логи запуску та вхідні дані складаються в один каталог — інцидент розбирається за фактами, а не за листуванням. Час відновлення після падіння розрахунку — секунди замість ручного перезапуску процесу й повторного прогону діалогу.

Що робити, якщо агент уже працює без ізоляції коду?

Зупиняти сценарії не потрібно: виконання переїжджає в ізольований контейнер паралельно, а попередній шлях залишається робочим до звірки результатів.

Різниця принципова — пісочниця процесу обмежує виклики всередині інтерпретатора, але поділяє з агентом адресний простір, а ізоляція на рівні контейнера задає межу для файлової системи, мережі та прав користувача. Тому збій у першому варіанті валить сервіс цілком, а в другому гаситься разом із контейнером.

Варіант Що обмежує Коли підходить Обмеження
Пісочниця процесу Імпорти, доступ до шляхів, час виконання Демонстрації та внутрішні задачі на довірених даних Поділяє пам'ять з агентом, падіння інтерпретатора зупиняє сервіс
Ізоляція контейнера Файлову систему, мережу, користувача, пам'ять Користувацький код і дані із зовнішніх джерел Потрібен прогрів середовища та збір логів, запуск довший

Переведення вже розгорнутого агента виглядає так: у кластері Kubernetes поруч піднімається друге середовище виконання, маршрутизація перемикається часткою трафіку через прапорець, а відповіді звіряються з попередніми на одній вибірці задач.

Розбіжності розбираються до повного перемикання, відкат робиться тим самим прапорцем. Контейнери перевикористовуються між викликами, тому час відповіді не зростає, а ліміти на пам'ять і кількість процесів виставляються на кожен запуск окремо.

У результаті код від користувача перестає вважатися довіреним за замовчуванням: навіть при шкідливому скрипті назовні йдуть лише дозволені файли, а решту відсікає межа середовища.

Часті технічні сумніви щодо ізоляції виконання

Такі питання інженери задають на розборі найчастіше: де межі доступу агента до файлів, що залишається в середовищі після сесії та як поводиться система, коли згенерований код падає. Нижче — короткі відповіді за кожним пунктом, без загальних слів.

Що агент бачить у файловій системі?

На сесію піднімається окремий контейнер із власним коренем. Усередину монтується лише робоча директорія — спочатку в режимі читання, запис відкривається явним дозволом на конкретні шляхи.

Ключі та змінні середовища хоста не прокидаються, вихід за межі змонтованого дерева закритий політикою доступу, а мережевий обмін за замовчуванням вимкнено.

Як очищається середовище між запусками?

Стан живе рівно стільки, скільки триває діалог: агенту потрібно бачити проміжні файли та результати попередніх кроків. Після завершення сесії контейнер видаляється цілком разом із файловою системою, кешем пакетів і тимчасовими даними — наступний запуск стартує з чистого образу.

Назовні переносяться лише артефакти з явного списку, тому дані одного користувача не перетинаються з іншим.

Що буде, якщо код упав або зациклився?

На виконання ставиться ліміт за часом, пам'яттю та кількістю кроків на задачу. При перевищенні процес знімається, а агенту повертається лог помилки — він переписує код і повторює крок, але не йде в нескінченний цикл: зациклення відсікається лічильником ітерацій.

Один збійний запуск не витягує ресурси всієї задачі, а причина падіння залишається в журналі для розбору.

Обговоримо задачу: зберемо схему під ваш сценарій

Щоб оцінка обсягу робіт спиралася на факти, а не на припущення, до першої розмови достатньо опису сценарію, прикладу вхідних даних і переліку систем, з якими агент буде обмінюватися.

Якщо є поточні напрацювання — формулювання інструкцій для моделі, тести, логи відмов — надсилайте: вони помітно скорочують розбір.

Обговорення задачі йде за кроками: проходимо сценарій цілком, відзначаємо, що агент робить сам і де підключається людина, як перевіряється коректність результату і що вважаємо помилкою.

За підсумками збираємо план впровадження з черговістю етапів і точками, на яких фіксуємо готовність. За підсумками обговорення замовник отримує:

  • схему рішення: звідки надходять дані, у якому ізольованому середовищі виконується код, куди повертається результат;
  • межі середовища: доступні бібліотеки, обмеження за мережею та файловою системою, час життя процесу;
  • перелік перевірок і тестових сценаріїв, включно з відмовними гілками та повторними запусками;
  • оцінку обсягу робіт за етапами з порядком запуску та точками контролю;
  • список ризиків і рішень, які знімають їх до початку розробки;
  • регламент експлуатації: логування, відстеження помилок, порядок оновлення правил агента.

Опишіть задачу у вільній формі — повернемося з оцінкою, схемою середовища та планом першого етапу. Якщо сценарій ще не усталився, розберемо варіанти й запропонуємо той, який швидше перевірити на реальних даних.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139