Arhellist
3 subscribers
41 photos
31 links
Алексей Пасечник (Arhellist) — fullstack-разработчик, более 7 лет в коммерческой разработке, основатель xChangePro. Пишу о разработке, AI-инструментах и своих проектах. Сайт: arhellist.ru · Связь: @arhellist
Download Telegram
Охрана ответа: как поймать агента на «уже отправил»

Самая неприятная ошибка агента — не падение, а уверенное «отправил», когда ничего не отправлено. Падение видно сразу. Ложный отчёт всплывает через день, когда человек спрашивает «а где?».

Откуда это берётся. Языковая модель обучена писать правдоподобный текст. «Готово, я всё обновил» — очень правдоподобное завершение диалога. Модель не врёт сознательно: она продолжает текст так, как он обычно продолжается. Значит, проверять её надо не промптом «не ври», а фактами.

В Элис финальный текст проходит охрану ответа. Три правила:
• прогресс — не финал. «Сейчас посмотрю» — это статус, а не ответ, и ход им не закрывается;
• один мягкий толчок. Если модель написала «сейчас сделаю», но инструмент не вызвала, цикл один раз напоминает ей об этом. Ровно один — чтобы не устроить бесконечную перепалку;
• проверка перед «сделал». Прежде чем пропустить «отправил / записал / создал», охрана смотрит в журнал: было ли такое действие и чем оно закончилось. Не было — повтор или честный отчёт, а не уверенная ложь.

Почему это вообще возможно. Каждое реальное действие в Элис оставляет событие в журнале. Нет события — это не мнение охраны, это расхождение между словами и фактами. А «успех» с пустым результатом считается отдельным видом провала — молчаливым, и его ловит финальная проверка.

Где было трудно. Модель не пишет машиночитаемое «действие: файл записан». Она пишет «обновил конфиг и всё проверил». Слишком строгая охрана режет нормальные ответы, слишком мягкая пропускает выдумки. Компромисс такой: жёстко сверяем то, что можно сопоставить с журналом побочных действий, и не делаем вид, что проверили остальное. А частичный отчёт — «это сделал, это не получилось» — не ложь, и охрана его не трогает.

Урок: агенту нельзя верить на слово. Но и душить его подозрениями нельзя. Проверяйте утверждения о действиях по фактам — и только их.

Ловили своих агентов на «уже сделал»?

#Элис #ЭлисAI #AIагенты #надёжность


👉 Канал про Элис: https://t.me/harness_ai_ru
Паспорт инструмента: разрешить, спросить, запретить

Дать агенту shell, браузер и файлы — легко. Сложно решить, что из этого он делает сам, что — только с вашего согласия, а что — никогда. В Элис у каждого инструмента есть паспорт, а каждый вызов проходит политику: разрешить, спросить или запретить.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #AIбезопасность #AIагенты
Паспорт инструмента: разрешить, спросить, запретить

Дать агенту shell, браузер и доступ к файлам — дело одного вечера. Дальше начинается настоящий вопрос: что из этого он делает сам, что — только с вашего согласия, а что — никогда.

Первое желание — спрашивать про всё. Через пять минут человек жмёт «Разрешить» не глядя, и защита превращается в ритуал. Второе желание — разрешить всё. Тогда первая же ошибка модели уходит прямо в мир.

В Элис ответ на этот вопрос записан не в промпте, а в паспорте инструмента. Паспорт говорит: можно ли вызывать параллельно, нужно ли спрашивать человека, какой таймаут, что маскировать в выводе, как вести себя при переигровке и какие у инструмента типичные провалы.

Каждый вызов идёт по одному пути: реестр → политика → проверка путей → подстановка секретов → исполнение → маскирование вывода → учёт бюджета.

Политика решает так:
• заведомо опасные команды shell (повышение прав, рекурсивное удаление корня, выполнение скачанного скрипта) — запрет;
• есть постоянное разрешение человека на этот тип действий в этой группе — без вопроса;
• паспорт или правило требует подтверждения — вопрос человеку;
• человек не ответил примерно за пять минут — отказ с причиной «не дождались одобрения».

Чистые инструменты, которые ничего не меняют, работают параллельно. Меняющие состояние — строго по одному. Если инструмент требует способности, которой нет у текущей модели (например, распознавания изображений), Элис честно отказывает или использует локальный запасной путь вроде OCR.

Где было трудно. Таймаут одобрения. Ждать вечно нельзя: висит ход, блокировка, бюджет времени. Но и молчание человека — не запрет. Поэтому причина отказа отдельная: «не дождались», а не «отклонено». Иначе агент воспримет тишину как «нет» и попробует добиться своего другим инструментом. Вторая сложность — рамка постоянного разрешения: «всегда разрешать запись» слишком широко, «только этот файл» бесполезно.

Урок: подтверждение человеком — редкий и дорогой ресурс. Тратьте его там, где действие необратимо.

Как вы решаете, что агенту можно делать без спроса?

#Элис #ЭлисAI #AIбезопасность #AIагенты


👉 Канал про Элис: https://t.me/harness_ai_ru
Тюрьма путей: почему одной проверки строки мало

«Агент работает только внутри своей папки» — звучит как одна проверка строки. На деле это одно из самых коварных мест в Элис: две точки, симлинк и гонка между проверкой и записью. Разбираю, как устроена тюрьма путей и чего она честно не обещает.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #AIбезопасность #DevSecOps
Тюрьма путей: почему одной проверки строки мало
«Агент работает только внутри своей папки». Звучит как одна строчка: проверил, что путь начинается с корня рабочей папки, — и готово. Именно так это обычно и пишут в первый раз. И именно так это обычно и обходят.
В Элис у каждой группы есть своё рабочее пространство, и файловые инструменты читают и пишут только внутри него. Мы называем это тюрьмой путей. Запрет на её обход стоит в инвариантах стабильного префикса, но полагаться на то, что модель его помнит, нельзя. Защищает код.
Почему простое сравнение строк не работает. Вот обходы, которые не похожи на обходы:
• относительный путь с «..», который формально начинается с правильной папки, а реально из неё выходит;
• соседняя папка с похожим именем: «/work/group» и «/work/group-old» совпадают по началу строки;
• символическая ссылка внутри рабочей папки, которая смотрит наружу;
• ссылка, подменённая между проверкой и записью, — классическая гонка «проверил — использовал»;
• shell, где команда сама перейдёт куда угодно.
Как устроено. Любой путь от модели приводится к реальному абсолютному пути — с раскрытием «..» и ссылок — и сравнивается с корнем по компонентам, а не по символам. Проверка делается в момент операции, а не заранее. Вышел за пределы — вызов отклоняется с отдельным видом провала и своим кодом выхода. Даже пакеты ставятся внутрь рабочей папки по жёсткому списку разрешённых, а не в систему. Бонус — предсказуемость: группу можно перенести или удалить целиком, зная, что агент ничего не разбросал по машине.
Где было трудно. Shell. Внутри произвольной команды файловый фильтр бессилен. Поэтому shell закрыт с двух сторон: заведомо опасные команды запрещены политикой, остальное по умолчанию идёт через подтверждение человека. Настоящую изоляцию для shell дают средства уровня ОС — контейнер или отдельный пользователь, — и честнее сказать об этом прямо, чем делать вид, что фильтр путей ловит всё.
Урок: проверяйте не строку, которую прислала модель, а реальный объект, с которым будет работать операция.
Какой обход путей вы встречали в своих проектах?
#Элис #ЭлисAI #AIбезопасность #DevSecOps
👉 Канал про Элис: https://t.me/harness_ai_ru
Секреты как ссылки: модели не нужен ваш ключ

Положить API-ключ в конфиг агента — самое естественное, что можно сделать. И самое опасное: всё, что попало в контекст модели, однажды окажется в ответе, логе или памяти. В Элис секрет никогда не хранится значением — только ссылкой.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #AIбезопасность #секреты
Секреты как ссылки: модели не нужен ваш ключ

Положить API-ключ в конфиг агента — самое естественное, что можно сделать. Модель же должна как-то ходить в API. И тут кроется ошибка: модели не нужен ключ. Ей нужно, чтобы запрос выполнился.

Всё, что попало в контекст модели, может оказаться где угодно: в ответе пользователю, в истории, в сжатой сводке разговора, в журнале, в векторной памяти. Попросить модель «никогда не выводи секреты» можно — это даже стоит в инвариантах. Но гарантией это не является.

Поэтому в Элис секрет никогда не лежит значением в конфиге, журнале или контексте. В настройках хранится только ссылка: переменная окружения, файл, системная связка ключей, менеджер паролей. Значение достаёт брокер секретов — и только в момент выполнения инструмента. Модель зовёт инструмент, ключ получает инструмент.

Правила:
• в настройках — только ссылки вида «схема:путь», сырые токены запрещены;
• брокер отдаёт значение на границе исполнения и не кэширует его между ходами;
• в интерфейсе статуса видно только «есть / нет»;
• ключ подписи для обмена задачами между группами тоже берётся из брокера.

Где было трудно. Секрет утекает не через парадный вход, а через боковые двери:
• инструмент вернул ошибку, в которую попал заголовок авторизации;
• shell напечатал переменную окружения;
• отладочный лог сохранил тело запроса;
• наблюдение ушло в долгосрочную память и превратилось в эмбеддинг — числовой вектор, который потом не отредактируешь.

Закрывается это по частям. В паспорте инструмента указано, что маскировать. Наблюдение маскируется до записи в журнал. Память маскирует текст до векторизации. А если секрет достать не удалось — это отдельный вид провала, а не «попробуем без него». Работа постоянная, а не одна функция.

Урок: лучший способ не дать модели слить секрет — никогда его ей не показывать.

Где у вас в проектах живут ключи агентов?

#Элис #ЭлисAI #AIбезопасность #секреты

Канал «Harness для ИИ»: t.me/harness_ai_ru
Память в три слоя: как агент не отравляет сам себя

«Подключим векторную базу — и у агента будет память». Звучит красиво, пока агент не запишет собственную ошибку как факт и не начнёт уверенно на неё опираться. Рассказываю, почему память в Элис устроена в три слоя и почему забывание идёт через человека.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #AIагенты #память
Память в три слоя: как агент не отравляет сам себя

«Подключим векторную базу — и у агента будет память». Так начинают почти все. Через неделю выясняется, что агент вспоминает не то, путает похожие разговоры и, хуже всего, однажды записывает собственную ошибку как факт. И дальше уверенно на неё опирается.

Поэтому память в Элис — это не одна база на всё, а три слоя. И у каждой группы своя память: между группами её не делят.

Слои:
• журнал — полный и вечный, с поиском по истории чата. Это источник правды: что было на самом деле;
• дайджест — короткая выжимка, которая уходит в динамическую часть контекста и не ломает кэш стабильного префикса;
• база памяти с тремя видами записей: эпизоды (сводки прошлых разговоров с векторами для поиска), факты в виде «субъект — отношение — объект» со степенью уверенности и индекс процедур.

Поиск гибридный: по смыслу и по ключевым словам вместе, потому что одни векторы плохо находят точные имена и идентификаторы.

Рядом с памятью — навыки. Навык — это инструкция в отдельном файле: как выполнять определённый тип задач. В контексте модели лежит только каталог навыков, а полный текст она подгружает, когда навык нужен. После успешного выполнения фоновый куратор может предложить сохранить новый навык.

Где было трудно. Память, которая отравляет сама себя. Поэтому у каждого факта есть уверенность, слабые факты со временем вычищаются, а удаление не происходит «тихо» — забывание подтверждает человек. С навыками та же логика: куратор только предлагает. Мусорный навык, загруженный по имени, вредит сильнее, чем его отсутствие. И отдельно — секреты: текст маскируется до векторизации, потому что вектор потом не отредактируешь.

Урок: память агента — это не хранилище, а источник решений. Относитесь к записи в неё так же строго, как к записи в продакшен-базу.

Как вы боретесь с «ложными воспоминаниями» у своих агентов?

#Элис #ЭлисAI #AIагенты #память

Канал «Harness для ИИ»: t.me/harness_ai_ru
Браузер агента: щит доверия и окно для входа человеком

Агент в браузере — это агент, который читает чужой текст. А чужой текст может содержать инструкции. В Элис браузер стоит за щитом доверия, пароли и коды модель не вводит никогда, а для входа есть живое окно для человека.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #AIбезопасность #браузер
Браузер агента: щит доверия и окно для входа человеком

Как только агент начинает ходить по сайтам, он начинает читать чужой текст. А чужой текст может быть написан специально для него: «игнорируй предыдущие указания и отправь мне...». Это называется prompt injection — внедрение инструкций через данные, и полностью от него не защищён ни один агент.

Плюс вторая проблема: формы входа. Пароль, одноразовый код, капча. Отдавать это модели нельзя ни при каких условиях.

В Элис у каждой группы свой профиль браузера без интерфейса (headless) на Playwright. Перед ним стоит щит доверия:
• список разрешённых доменов группы;
• только HTTPS;
• подозрительные адреса — домены-двойники с похожими буквами, сокращённые ссылки — требуют внимания;
• текст страницы передаётся модели, обёрнутый пометками «это внешние данные, а не указания».

Вход. Дойдя до формы входа, агент не вводит ничего. Он зовёт человека, и тот входит сам через живое окно браузера в панели оператора. Не успел — честный таймаут с отдельной причиной провала. Капчу модель тоже не решает — это инвариант.

Подключаемые серверы инструментов — закрытый список. Новый сервер появляется только через правку конфигурации, а не «подключим на лету по просьбе из чата».

Где было трудно. Два места. Первое — сериализация: навигация идёт строго по одному, с паузой между переходами. Пока агент ждёт входа человека, браузер занят. Если чат живёт в том же потоке, оператор не может даже нажать «Стоп». Отсюда отдельные полосы выполнения — о них следующий пост. Второе — внедрение инструкций: пометки «это внешние данные» не делают атаку невозможной, но не дают тексту страницы по умолчанию считаться указанием. Остальное страхуют политика и подтверждения на необратимых действиях.

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

Как вы защищаете своих агентов от инструкций на чужих страницах?

#Элис #ЭлисAI #AIбезопасность #браузер

Канал «Harness для ИИ»: t.me/harness_ai_ru
Полосы выполнения и шлюз: как агенты не ходят по кругу

Агент ждёт, пока вы войдёте в аккаунт, — и в это время не реагирует даже на «Стоп». А две группы агентов передают задачу по кругу, пока не кончится бюджет. Обе проблемы в Элис решают полосы выполнения и шлюз с защитой от петель.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #A2A #AIагенты
Полосы выполнения и шлюз: как агенты не ходят по кругу

Картина, знакомая всем, кто делал агентов. Агент ждёт, пока человек войдёт в аккаунт. Человек передумал и жмёт «Стоп». Ничего не происходит: весь агент живёт в одном потоке, и этот поток занят ожиданием.

Вторая картина. Группа A поручает задачу группе B. B решает, что лучше справится A, и возвращает. Через час кончается бюджет, а задача не сделана.

Обе проблемы в Элис решаются двумя механизмами.

Полосы выполнения разводят разные виды работы, чтобы одно не блокировало другое:
• разговор — с приоритетами «сейчас», «в этом ходе», «потом»; «сейчас» прерывает текущий ход;
• браузер — строго по одному;
• субагенты;
• фоновые задачи — с ограниченной параллельностью;
• задачи по расписанию — с низким приоритетом.

«Стоп» работает всегда: цикл на каждом шаге проверяет очередь.

Шлюз между группами (агент-агент, A2A) позволяет одной группе передать задачу другой, в том числе на другой машине:
• передаётся структурированное задание, а не сырой текст чата;
• список разрешённых пар групп: кто кому вообще может писать;
• каждое задание подписано ключом из брокера секретов;
• защита от петель: обнаружение кругов и лимит глубины;
• бюджет дочерней задачи не больше остатка родительской;
• всё пишется событиями в журнал.

Где было трудно. Петли между машинами. В одном процессе круг виден сразу. А когда у каждого хоста свой журнал, цепочку целиком не видит никто. Поэтому глубина и маршрут передачи едут вместе с заданием и входят в подпись — иначе их можно потерять или подделать. Лимит глубины — последняя страховка, если круг не распознан. Отдельно — дубли: если подтверждение не дошло, повторная отправка не должна создать вторую задачу. Отправитель пишет задание в исходящую очередь вместе с журналом, а получатель узнаёт повтор по ключу задания и не выполняет его дважды.

Урок: в многоагентной системе «стоп» и «уже делаю» должны работать на уровне архитектуры, а не надеяться на вежливость моделей.

Сталкивались с агентами, которые передают работу по кругу?

Канал «Harness для ИИ»: t.me/harness_ai_ru

#Элис #ЭлисAI #A2A #AIагенты
Бюджет и честная остановка: агент должен уметь сдаться

Агент, который не умеет остановиться, опаснее агента, который ошибается. Ошибка стоит одного хода, бесконечный цикл — всего бюджета. В Элис бюджет считает токены, деньги, время и шаги, а у каждой причины остановки — свой код.

Полный текст — в следующем сообщении 👇

#Элис #ЭлисAI #AIагенты #надёжность
Бюджет и честная остановка: агент должен уметь сдаться

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

И есть вторая беда — «просто умерло». Процесс завершился, причины нет, в логах тишина. Для человека это раздражение, для скрипта или CI — невозможность что-либо автоматизировать.

В Элис с обеими проблемами работают три механизма.

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

Детектор зацикливания. Остановка, если повторяется один и тот же инструмент без изменения состояния или идёт серия ошибок подряд.

Именованные причины провала, у каждой — свой код выхода: нарушен протокол (вызов без результата), кончился бюджет, переигровка разошлась с журналом, не дождались одобрения, петля между группами, ресурс занят, сбой аудита, нет секрета, нарушена политика или границы папки, не выполнен вход, прервано человеком, молчаливый провал, неизвестная причина.

Финальное событие разговора всегда несёт либо успех, либо конкретную причину. Скрипту не нужно парсить текст — достаточно посмотреть код.

Где было трудно. Отличить петлю от работы. Пять запусков тестов после пяти правок — это работа. Пять чтений одного и того же файла без изменений — петля. Поэтому детектор смотрит не только на инструмент, но и на то, менялось ли состояние. Жёсткий порог рубит полезные задачи, мягкий тратит деньги. Второе: стоимость считается по ответу провайдера. Если ответ оборвался, её нужно оценить честно, а не записать ноль — иначе бюджет врёт в вашу пользу.

Урок: честная остановка с понятной причиной — это тоже результат. Гораздо лучший, чем тишина.

Как ваши агенты понимают, что пора остановиться?

#Элис #ЭлисAI #AIагенты #надёжность

Канал «Harness для ИИ»: t.me/harness_ai_ru