Инженерная практика

ИИ-агенты

Агент — это не чат-бот. Это модель в петле: она сама решает, какое действие сделать следующим, выполняет его настоящим инструментом, смотрит на результат и повторяет, пока задача не закрыта. Маршрут заранее не прописан.

Ниже — два наших агента в работе. Трейсы настоящие, снятые с реальных прогонов.

2 314 000 ₸КП, собранное агентом от запроса до PDF
9вызовов инструментов, которых никто не прописывал
23враждебных теста на защитный контур

Агент и конвейер — разное

Конвейер

Шаги заданы кодом: спарсить → отфильтровать → отправить. Дёшево, предсказуемо, отлаживается обычными тестами.

Большинство того, что на рынке называют «ИИ-агентом», — это конвейер с моделью внутри. И часто это правильный выбор.

Агент

Маршрут выбирает модель по ходу дела. Нужен там, где заранее неизвестно, что придётся сделать.

Дороже и менее предсказуем — поэтому к нему обязательны границы. О них ниже.

Агент-сметчик

Задача словами → коммерческое предложение в PDF и XLSX. Агент сам ищет позиции в прайсе, считает с НДС 16%, собирает документ.

агент-сметчик
$ kp "КП на видеонаблюдение: склад 2000 м², 16 камер, регистратор, монтаж и ПНР"
price_search{"query": "видеокамера купольная", "kind": "eq"}
Hilook 2 МП купольная — 16 000 ₸/шт
price_search{"query": "видеорегистратор 16 каналов", "kind": "eq"}
NVR Hikvision 16 кан — 89 000 ₸/шт
Камеры IP — значит нужно PoE-питание. Проверю коммутатор.
price_search{"query": "коммутатор PoE", "kind": "eq"}
Hikvision PoE 16-port — 78 000 ₸/шт
price_search{"query": "кабель UTP витая пара", "kind": "eq"}
Кабель UTP cat5e — 180 ₸/м
price_search{"query": "монтаж видеокамеры", "kind": "wk"}
Монтаж видеокамеры с юстировкой — 12 000 ₸/шт
price_search{"query": "прокладка кабеля", "kind": "wk"}
Прокладка UTP cat5e — 450 ₸/м
price_search{"query": "пусконаладка видеонаблюдение", "kind": "wk"}
в прайсе не найдено
ПНР и HDD в прайсе нет — поставлю вручную и помечу в итоге.
write_spec{"filename": "altyn_svn.yml", …}
СВН · оборудование 6 позиций / работы 5 → 2 314 000 ₸
build_kp{"filename": "altyn_svn.yml", "formats": "pdf,xlsx"}
altyn_svn.pdf · altyn_svn.xlsx
Готово
2 314 000 ₸ с НДС 16% · 6 позиций оборудования, 5 работ
altyn_svn.pdfaltyn_svn.xlsx

Агент сам добавил PoE-коммутатор, кабель и гофру — их не просили, но IP-камерам нужно питание. И честно перечислил три цены, которых в прайсе нет, чтобы их проверил человек.

Агент-бухгалтер и граница полномочий

Тот же принцип, но база боевая. Читает свободно. Всё, что меняет данные, останавливается и ждёт человека — попробуйте нажать «Отклонить».

агент-бухгалтер
$ buh --allow-writes "заведи контрагента ТОО Тест-Агент, БИН 123456789012"
list_tables{}
49 таблиц · entries (1855), documents (1362), contractors (87)…
describe_table{"table": "contractors"}
organization_id, bin_or_iin, name, is_vat_payer, is_resident…
run_sqlSELECT DISTINCT organization_id FROM contractors
11135, 11136, 11137
run_sqlSELECT id, name FROM contractors WHERE bin_or_iin = '123456789012'
0 строк — БИН не занят
Агент просит изменить данные
причина: заведение нового контрагента ТОО «Тест-Агент»
INSERT INTO contractors
  (organization_id, bin_or_iin, name, legal_form, is_resident, is_supplier)
VALUES
  (11135, '123456789012', 'ТОО «Тест-Агент»', 'ТОО', true, true)
RETURNING id
Отклонено человеком

Агент не повторил тот же запрос. Вместо этого спросил недостающее:

  • к какой организации привязать — 11135, 11136 или 11137?
  • роль: покупатель, поставщик или оба?
  • плательщик НДС?

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

Применено

Запись выполнена и закоммичена, агент продолжает работу.

В демонстрации ничего не происходит — она не подключена к базе. В настоящем прогоне подтверждение отдаёт живой человек в терминале.

Четыре рубежа вокруг записи

Агенту дают инструменты, а инструменты умеют менять мир. Поэтому граница — не финальная полировка, а часть конструкции.

1
Режим только чтение
Без явного флага любой не-SELECT отбивается до обращения к базе.
2
Одна операция за раз
«SELECT 1; DROP TABLE users» отклоняется — классический обход проверки первого слова.
3
Запись внутри CTE
«WITH x AS (…) INSERT …» по первому слову неотличим от чтения. Нашли враждебным тестом, до этого запрос шёл мимо подтверждения.
4
Транзакция READ ONLY
Последний рубеж на уровне СУБД: даже если маршрутизация ошибётся, запись не пройдёт.

Все четыре закреплены враждебными тестами — они проверяют не то, что счастливый путь работает, а то, что обход не проходит. Третий рубеж и появился благодаря такому тесту: до него запись внутри CTE обходила подтверждение.

Под капотом

Claude APIвызов инструментов, адаптивное рассуждение
Pythonинструменты — обычные функции с типами и схемой
Границыподтверждение внутри инструмента, транзакции только для чтения, потолок шагов
Проверкавраждебные тесты контура + инварианты предметной области

Агенты работают в наших внутренних задачах: подготовка коммерческих предложений и вопросы к учётной системе. Показать живьём — вопрос сорока секунд.

Связаться