Агент может правильно вызвать каждый tool и сразу после этого потерять нить исследования. С небольшими LLM мы видим это чаще: они хорошо следуют короткой локальной инструкции, но не всегда восстанавливают весь workflow из длинного system prompt.
Результат семантического поиска легко принять за доказательство. Пустую выдачу grep — за доказательство, что такого кода нет. Обрезанный список связей — за полный список использований. Вызов формально успешен, данные получены, но следующий вывод оказывается неверным.
В агенте исследования кода CodeAlive мы используем для этого простое соглашение: каждый ответ tool заканчивается блоком hint.
Положение подсказки здесь важно. Сначала модель читает, что нашёл инструмент. Последним она видит, как интерпретировать результат и какое действие имеет смысл дальше. Так hint замыкает ответ tool и возвращает внимание модели к ходу исследования.
Новых способностей к рассуждению у небольшой модели от этого не появляется. Зато ей не нужно удерживать в активном контексте весь порядок работы. Нужное правило находится рядом с данными и прямо перед следующим решением, а не только в начале разговора.
Description до вызова, hint после
Описание tool учит модель составлять корректный вызов. Например, semantic_search просит полноценный вопрос на естественном языке вместо набора ключевых слов. read_file требует точный путь относительно корня репозитория.
У завершающего hint другая задача. Он уже знает, чем закончился вызов, и поэтому может дать более узкую подсказку:
- результаты поиска предупреждают, что описания и фрагменты нужны для отбора, а не для окончательных выводов;
- пустая выдача предлагает переформулировать вопрос, расширить фильтры или сменить тип поиска;
- загруженный исходник обозначается как ground truth;
- обрезанный граф связей сообщает, когда нужен ещё один вызов;
- recoverable error объясняет, какой аргумент исправить, не прерывая весь чат.
При этом hint не обязательно хранить как статический текст. В get_artifact_relationships он формируется из запрошенного профиля, возвращённых групп и счётчиков доступных связей. Успешный ответ может выглядеть так:
Tool уже успешно ответил: агент получил две исходящие связи. Финальный hint объясняет, что метаданных о связях ещё недостаточно для вывода о поведении, и указывает следующее полезное действие. Сам по себе агент часто неохотно загружает связанные артефакты и начинает писать ответ по идентификаторам и summary. После такой подсказки он часто исправляется и сначала читает исходники. Тот же метод формирует другие инструкции, если группы пусты, обрезаны или доступны в другом профиле связей.
В prompt агента достаточно один раз задать соглашение: учитывать <hint>, <next_tool> и списки кандидатов, когда они относятся к вопросу пользователя. Подробная инструкция приходит сразу после нужных данных, именно в тот момент, когда модель выбирает следующее действие. При этом она не занимает место в system prompt на каждом шаге.
Так ответ tool становится частью управления агентом. Данные отвечают на вопрос «что нашёл инструмент?», а финальный hint — «что теперь?». Для небольшой LLM эта короткая локальная инструкция может стать разницей между продолжением исследования и преждевременным ответом по первому правдоподобному результату.