3,583 papers
arXiv:2511.20403 27 25 нояб. 2025 г. FREE

LLM для автоматической генерации и оценки модульных тестов в Java: фреймворк AgoneTest

КЛЮЧЕВАЯ СУТЬ
Тесты, сгенерированные LLM «в слепую», компилируются в 40-60% случаев — модель выдумывает несуществующие импорты и методы. Метод AgoneTest позволяет поднять успешность компиляции до 85-90% через добавление примера и точного пути к файлу. Один пример правильного теста + строка с путём к классу устраняют 70% ошибок типа "symbol not found" — модель перестаёт додумывать структуру проекта и генерирует код на основе реальных данных.
Адаптировать под запрос
📌

Ключевые аспекты исследования:

Исследователи создали систему AgoneTest для автоматической оценки качества юнит-тестов для Java, сгенерированных разными LLM. Они сравнили, как разные модели и типы промптов (zero-shot vs few-shot) справляются с этой задачей, измеряя качество кода по таким метрикам, как покрытие и успешность компиляции.

🔬

Объяснение всей сути метода:

Суть подхода, который можно извлечь из этого исследования, заключается в контекстуальном обогащении промпта. Вместо того чтобы давать LLM общую задачу, вы должны снабдить ее максимально релевантной информацией, чтобы сузить "пространство для домысливания" и направить генерацию в нужное русло.

Исследование выделяет две ключевые тактики:

  1. Обучение на примере (Few-shot Prompting): Не просто говорите модели, что сделать, а покажите ей пример того, как это должно выглядеть. В исследовании модели давали пример связки "Java-класс -> Тестовый класс". Это помогает LLM понять не только задачу, но и требуемый стиль, структуру и формат ответа. Для пользователя это означает: прежде чем просить LLM что-то создать, дайте ей пример уже готового, хорошего результата.
📌

Анализ практической применимости:

  • Прямая применимость: Пользователь может немедленно начать применять эти два принципа.

    1. Для few-shot: При написании поста в блог, сначала вставить в промпт пример другого удачного поста. При генерации email-ответа, дать пример хорошо написанного письма в нужном тоне.
    2. Для "уточнения окружения": При написании текста о компании, добавить в промпт блок <О компании: ...>, где указаны ключевые факты. При просьбе проанализировать данные, указать точные названия столбцов и их смысл.
  • Концептуальная ценность: Исследование помогает понять, что LLM — это не волшебник, а очень мощный "статистический попугай", который работает тем лучше, чем точнее его направляют. Оно учит пользователя перестать задавать вопросы в стиле "Напиши мне хороший текст" и перейти к подходу "Вот пример хорошего текста, вот вся информация о продукте, вот моя целевая аудитория — на основе этого напиши текст". Это сдвиг от роли "просителя" к роли "постановщика задачи".

  • Потенциал для адаптации: Метод "добавления пути к файлу" легко адаптируется. "Путь" — это метафора для любого уникального идентификатора или ключевого контекста.

    • В задаче по написанию email: "путь" — это тема письма и предыдущая переписка.
    • В задаче по созданию контент-плана: "путь" — это ссылка на блог и описание целевой аудитории.
🚀

Практически пример применения:

Представим, что вы SMM-менеджер и вам нужно написать рекламный пост для нового продукта — фитнес-браслета.

Ты — опытный SMM-менеджер, специализирующийся на продвижении гаджетов. Твой стиль — энергичный, мотивирующий и сфокусированный на пользе для клиента.

Твоя задача — создать рекламный пост для социальной сети.

### Пример успешного поста для другого продукта (умные весы):

"Хватит гадать, пора знать! Наши новые умные весы SkyScale 7 не просто показывают вес. Они анализируют 12 показателей тела: от процента жира до мышечной массы. Синхронизируй с приложением и отслеживай прогресс каждый день. Сделай первый шаг к телу мечты! #умныевесы #фитнес #здоровье"

---

Теперь, используя этот пример как образец, создай пост для нового продукта.

### Контекст и информация о продукте (аналог "пути к файлу"):

*   **Название продукта:** FitPulse Go
*   **Категория:** Фитнес-браслет
*   **Ключевые функции:**
    *   Мониторинг пульса 24/7
    *   Отслеживание сна (фазы быстрого и глубокого сна)
    *   GPS для точного трекинга пробежек
    *   Водонепроницаемость до 50м (можно плавать в бассейне)
    *   Батарея держит 14 дней
*   **Целевая аудитория:** Активные люди 25-40 лет, которые занимаются бегом, плаванием, ходят в зал, но не являются профессиональными спортсменами.
*   **Главное сообщение:** "Твой идеальный партнер для ежедневной активности, который не боится воды и долго работает".

Создай рекламный пост для FitPulse Go.
🧠

Почему это работает:

Этот промпт эффективен благодаря прямому применению выводов исследования:

  1. Few-shot (Пример успешного поста): Мы не просто говорим "напиши пост". Мы показываем модели образец (### Пример успешного поста...). Это помогает ей мгновенно понять требуемую длину, структуру (короткие предложения, призыв к действию, хэштеги) и тональность. Это аналог предоставления example_test_class из статьи.
📌

Другой пример практического применения

Задача: Проанализировать отзывы клиентов на отель и структурировать их для отчета.

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

### Пример анализа одного отзыва:

**Исходный отзыв:** "В целом неплохо, номер был чистый и кровать удобная. Но завтрак просто ужасный, кофе холодный, а персонал на ресепшене какой-то сонный и неприветливый."

**Результат анализа (JSON):**
json

{ "positive": [ "чистота в номере", "удобная кровать" ], "negative": [ "плохое качество завтрака", "холодный кофе", "неприветливый персонал на ресепшене" ] }

---

Теперь проанализируй следующий набор отзывов и предоставь результат в виде массива JSON-объектов.

### Отзывы для анализа (аналог "класса для теста"):

1.  "Расположение отеля просто супер, самый центр! Но в номере было шумно из-за дороги, спать невозможно. Wi-Fi постоянно отваливался, работать было нельзя."
2.  "Очень понравился бассейн на крыше, вид потрясающий. Еда в ресторане тоже на высоте. Единственный минус — очень медленная регистрация при заезде, простояли в очереди полчаса."
3.  "Чисто, уютно, персонал улыбчивый и всегда готов помочь. Завтраки разнообразные и вкусные. Никаких нареканий, обязательно вернемся!"
🧠

Объяснение механизма почему этот пример работает.

Этот промпт использует те же принципы для решения задачи структурирования данных:

  1. Few-shot (Пример анализа): Предоставление примера с Исходный отзыв -> Результат анализа (JSON) является критически важным. Модель видит не только что нужно извлечь (позитив/негатив), но и в каком формате это сделать (JSON с ключами positive и negative). Это аналог few-shot из статьи, который задает точную структуру выходных данных.

  2. Enhanced Context (Отзывы для анализа): Блок с новыми отзывами — это прямой аналог class_under_test. Мы даем модели точные данные для работы. Без этого контекста задача была бы невыполнима. Сочетание четкого примера и конкретных данных для обработки позволяет LLM надежно и последовательно выполнять структурирование, минимизируя "галлюцинации" и отклонения от требуемого формата. Это повышает "надежность" (аналог compilation rate) ответа.

📌

Оценка полезности: 78

📌

Основные критерии оценки

  • A. Релевантность техникам промтинга: Да. Исследование напрямую сравнивает zero-shot и few-shot промпты, а также вводит "улучшенную стратегию промптинга" (добавление пути к файлу), что является чистым промт-инжинирингом.
  • B. Улучшение качества диалоговых ответов: Нет. Фокус на генерации кода (Java unit-тесты), а не на диалоговых сценариях. Качество измеряется компилируемостью и метриками покрытия кода, а не релевантностью в чате.
  • C. Прямая практическая применимость: Да. Выводы о пользе few-shot и предоставления дополнительного контекста (путь к файлу) напрямую переносимы на любые другие задачи, даже без использования кода.
  • D. Концептуальная ценность: Очень высокая. Исследование наглядно демонстрирует, почему LLM совершает ошибки (не находит символы, т.к. не знает контекст проекта) и как точечное обогащение промпта решает эту проблему. Это помогает сформировать у пользователя правильную "ментальную модель" LLM как инструмента, требующего точных входных данных.
  • E. Новая полезная практика (кластеризация): Работа попадает в несколько кластеров:
    • 1. Техники формулирования промптов: Прямое сравнение zero-shot и few-shot.
    • 3. Оптимизация структуры промптов: Введение "улучшенной стратегии" с добавлением пути к классу — это структурная оптимизация.
    • 6. Контекст и память: Исследование по сути о том, как правильно подавать контекст (класс для теста, пример теста, путь к классу) для получения корректного результата.
    • 7. Надежность и стабильность: Основная цель RQ3 — повысить "compilation success rate", что является синонимом надежности и правильности генерации в данном контексте.
  • Чек-лист практичности (+15 баллов): Да, исследование дает готовые конструкции (шаблоны промптов), показывает, как структурировать запросы (few-shot), и раскрывает неочевидные особенности поведения LLM (причины ошибок компиляции), предлагая способ повысить точность.
📌

Цифровая оценка полезности

Оценка 78/100 дана за то, что исследование, несмотря на узкоспециализированную тематику (генерация Java-тестов), предоставляет чрезвычайно ценные и универсальные уроки для любого пользователя LLM. Оно наглядно, с цифрами, доказывает два фундаментальных принципа промт-инжиниринга: 1. "Покажи, а не расскажи": Few-shot промпты (с примером) работают значительно лучше, чем zero-shot (просто инструкция). 2. "Контекст решает всё": Большинство ошибок LLM происходит не из-за "глупости" модели, а из-за нехватки специфического контекста. Добавление всего одной строки с путем к файлу (class_under_test_path) резко повысило успешность генерации.

Контраргументы (почему оценка могла быть выше): * Оценка могла приблизиться к 90+, так как это идеальное, подкрепленное данными исследование, иллюстрирующее, как небольшие изменения в промпте приводят к значительному улучшению результата. Принципы абсолютно универсальны и являются основой эффективного промптинга.

Контраргументы (почему оценка могла быть ниже): * Оценка могла быть в районе 60-65, так как предметная область (Java, unit-тесты, mutation score) абсолютно нерелевантна для обычного пользователя. Чтобы извлечь пользу, нужно мысленно "перевести" выводы из мира программирования в свою задачу, что требует дополнительных усилий.

📌

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

📌

Ключевой результат: предоставление модели примера (few-shot) и дополнительного контекста (например, точного пути к файлу) значительно повышает качество и корректность сгенерированного кода.

📋

Уточнение окружения (Enhanced Context): Исследователи обнаружили, что LLM часто генерирует код с ошибками, потому что не знает точной структуры проекта (например, откуда импортировать нужный класс). Решением стало добавление в промпт переменной class_under_test_path — точного пути к файлу. Это простое действие резко снизило количество ошибок. Для обычного пользователя это главный урок: предоставляйте LLM всю фоновую информацию, которая кажется вам очевидной, но неизвестна модели. Это может быть ваша роль, роль собеседника, предыдущая история, специфические термины или, как в данном случае, "адрес" ключевого объекта.

📌

* В задаче по суммаризации документа: "путь" — это сам документ и указание, для кого делается краткое изложение (для CEO или для технического специалиста).

📌

Enhanced Context (Контекст и информация о продукте): Блок ### Контекст и информация о продукте работает как class_under_test и class_under_test_path вместе взятые. Мы даем модели всю необходимую "сырую" информацию, устраняя необходимость додумывать. Это предотвращает "ошибки компиляции" в мире маркетинга — например, выдуманные функции или неправильное позиционирование продукта. Модель точно знает, на чем основывать свой креатив.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с