中文翻译暂不可用,显示俄语原文。
Реализация partial harnessing для AI-агента
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализация partial harnessing для AI-агента
1. Цель задачи
Научиться проектировать механизм Harnessing|partial harnessing — когда системе выдаётся только начало плана (первые 2 шага), а агент (LLM) должен самостоятельно достроить и выполнить оставшиеся шаги для достижения цели. Задача имитирует реальный сценарий, где агент получает неполную инструкцию и вынужден действовать автономно.
Ключевой результат Рабочий harness, который принимает задачу и первые 2 шага плана, запускает агента, который завершает остальные шаги, и возвращает итоговый результат в рамках заданных критериев успеха.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Среда для запуска AI-агентов | Скачать/установить LangChain, CrewAI или написать минимальную обёртку на Python |
| LLM-модель (API ключ) | OpenAI API (GPT-4 / GPT-4o), Anthropic Claude, или локальная через Ollama |
| Пример задачи с пошаговым решением | Придумать задачу (например: «Написать функцию на Python, вычисляющую числа Фибоначчи»), разбить на 5 шагов |
| Библиотека для управления планом | Pydantic (для схем), JSON для сериализации плана |
| Тестовый фреймворк | pytest для проверки корректности выполнения |
Если нет реального API — симулируем:
- Использовать локальную модель (Ollama с llama3.2:3b) — достаточно для демонстрации.
- Написать заглушку LLM, которая возвращает предопределённые шаги на основе входящего контекста — но это упрощение. Лучше использовать реальную модель с ограниченным контекстом.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык программирования | Python 3.11+ | Основной язык реализации |
| Фреймворк агентов | LangChain + LangGraph / CrewAI | Управление потоком агента и выполнением шагов |
| LLM | GPT-4o / Claude 3.5 Sonnet / Ollama | Генерация продолжения плана и выполнение шагов |
| Сериализация плана | Pydantic, JSON | Формат частичного плана (первые 2 шага) |
| Логирование | structlog / logging | Отслеживание выполнения каждого шага |
| Тестирование | pytest, pytest-asyncio | Верификация работы harness’а |
| Версионирование | Git + GitHub | Контроль версий кода |
4. Этапы выполнения
Этап 1: Проектирование структуры partial plan и harness (1 час)
Действия
-
Определить формат плана
Разработать Pydantic-модель PartialPlan, которая содержит:task_description: str— полное описание задачи.initial_steps: List[Вики/step_number|Step— первые 2 шага (с номером, описанием, ожидаемым результатом).total_steps_count: int— общее количество шагов (агент должен додуматьtotal_steps_count - len(initial_steps)шагов).
Пример модели:
from pydantic import BaseModel from typing import List class Step(BaseModel): number: int description: str expected_outcome: str = "" class PartialPlan(BaseModel): task: str initial_steps: List[Step] # первые 2 шага total_steps: int # всего шагов (>=2) -
Спроектировать интерфейс harness’а
Harness должен:- Принимать PartialPlan.
- Выполнять шаги 1 и 2 (через call|вызов LLM / внешние инструменты).
- После выполнения первых двух шагов вызывать LLM-агента с контекстом “Выполнены шаги 1 и 2. Придумай и выполни оставшиеся шаги для завершения задачи. Учитывай, что уже сделано.”
- Агент генерирует последующие шаги в том же формате и выполняет их.
- Возвращать итоговый ответ.
-
Создать директорию проекта и репозиторий Git.
mkdir partial-harness && cd partial-harness git init
Ожидаемый результат этапа
- Файл
models.pyс Pydantic-моделями. - Прототип интерфейса harness’а (заглушка или класс PartialHarness).
Этап 2: Реализация ядра harness’а (2 часа)
Действия
-
Написать класс PartialHarness
- Конструктор принимает LLM-клиента (например, ChatOpenAI), опционально инструменты.
- Метод execute(plan: PartialPlan) -> str.
- Логика:
- Валидировать план (первые шаги не пустые,
total_steps >= len(initial_steps)). - Выполнить первые шаги:
- Для каждого шага вызвать LLM с инструкцией “Ты выполняешь шаг X: {description}. Ожидаемый результат: {expected_outcome}. Предыдущие результаты: {контекст}”.
- Сохранить результаты выполненных шагов как строку
executed_context.
- Сформировать промпт для агента-продолжателя:
Задача: {task} Выполненные шаги (первые {n} из {total}): Шаг 1: {description} -> {result} Шаг 2: {description} -> {result} Теперь придумай и выполни оставшиеся шаги (с шага 3 по шаг {total}). Для каждого шага опиши его и верни результат. Итоговый ответ должен соответствовать задаче. - Вызвать LLM для генерации и выполнения остальных шагов. Рекомендуется сделать цикл: агент генерирует по одному шагу и выполняет его, пока не достигнет
total_stepsили не решит, что задача завершена. - Собрать полный лог выполнения и вернуть финальный результат.
- Валидировать план (первые шаги не пустые,
-
Интегрировать логирование
Каждый шаг должен логировать: номер, описание, результат, время выполнения. -
Написать unit-тесты для моделей и базовой логики harness’а.
Проверить, что валидация плана работает, что пустой список шагов вызывает ошибку.
Ожидаемый результат этапа
- Файл harness.py с классом PartialHarness (метод
execute). - Файл
test_harness.pyс 3-4 тестами (проверка валидации, выполнение первых шагов на заглушке LLM).
Этап 3: Создание тестовой задачи и интеграция (1 час)
Действия
-
Выбрать конкретную задачу для демонстрации
Пример: “Напиши Python-функциюfibonacci(n: int) -> int, которая возвращает n-е число Фибоначчи. Используй рекурсивный подход с мемоизацией.”
Разбить задачу на 5 шагов:- Шаг 1: Определить сигнатуру функции.
- Шаг 2: Реализовать рекурсивную функцию без мемоизации (заглушка).
- Шаг 3: Добавить кэш (декоратор functools.lru_cache или словарь).
- Шаг 4: Написать тестовый вызов (assert).
- Шаг 5: Вернуть код функции + краткое объяснение.
-
Создать файл
example_task.py, где задана эта задача и правильные шаги (для сравнения). -
Запустить harness с partial-планом (первые 2 шага).
- Убедиться, что LLM-агент генерирует шаги 3-5 (возможно, с небольшими вариациями).
- Проверить итоговый код на синтаксис и корректность (запустить в
execили импорте).
Ожидаемый результат этапа
- Harness успешно обрабатывает задачу и возвращает рабочий код функции.
- Лог выполнения сохранён в файл execution_log.json.
Этап 4: Тестирование на нескольких задачах и оценка (1.5 часа)
Действия
-
Подготовить 3 задачи разной сложности
-
Для каждой задачи задать частичный план (только первые 2 шага).
-
Запустить harness и записать результаты
- Если агент не завершает задачу (например, циклит или генерирует бессмысленный код) – это считается неудачей.
-
Оценить метрики успеха
- Completion rate: процент задач, где агент выдал валидный результат (проверяется через тесты/валидацию).
- Average number of steps generated: среднее количество шагов, додуманных агентом.
- Deviation from expected plan: сколько шагов отличаются от эталонного плана (ручная проверка).
- Time per task: среднее время выполнения.
-
Написать отчёт в markdown
results.mdс таблицей результатов.
Ожидаемый результат этапа
- Файл
results.mdс таблицей по 3 задачам (название, completion, кол-во шагов, отклонения). - Рекомендации по улучшению harness’а (например, добавить few-shot примеры в промпт).
Этап 5: Ретроспектива и улучшение (30 минут)
Действия
-
Проанализировать ошибки
- В каких задачах агент отклонился от плана? Почему?
- Какие добавления в промпт могли бы помочь?
-
Внести одно улучшение (например, добавить в промпт пример правильного завершения задачи или явную проверку на достижение
total_steps). -
Перезапустить тесты и сравнить метрики с предыдущими.
Ожидаемый результат этапа
- Обновлённая версия harness.py с улучшениями.
- Секция “Improvements” в
results.md.
5. Критерии приемки (Definition of Done)
- PartialPlan корректно сериализуется/десериализуется из JSON.
- Harness выполняет первые два шага, не изменяя их описания.
- Агент генерирует и выполняет как минимум 2 дополнительных шага (если total_steps >= 4).
- Итоговый результат задачи соответствует ожидаемому (проверяется через автоматический тест).
- Лог выполнения содержит информацию о каждом шаге (номер, описание, результат).
- Код покрыт тестами (минимум 4 теста: валидация, выполнение с заглушкой, интеграционный тест с реальной LLM).
- Проект хранится в Git с осмысленными коммитами.
-
results.mdсодержит результаты по 3 задачам и выводы.
6. Ожидаемый результат
Основной артефакт — кодовая база partial-harness/ со следующей структурой:
partial-harness/
├── models.py # Pydantic модели
├── harness.py # PartialHarness класс
├── example_task.py # Пример задачи и правильные шаги
├── test_harness.py # Unit/интеграционные тесты
├── execution_log.json # Лог последнего запуска
├── results.md # Отчёт по 3 задачам
├── requirements.txt # Python зависимости
└── README.md # Краткое описание задачи
Дополнительно:
- В
results.mdтаблица с метриками (completion rate, steps, время). - Пример успешного выполнения для задачи A (код функции).
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Агент генерирует шаги, которые не ведут к цели (off-policy) | Добавить в промпт требование “каждый шаг должен быть конкретным действием, приближающим к решению задачи”. Ограничить число генераций. |
| LLM не следует плану и начинает с нуля | Явно указать в промпте: “Не переделывай уже выполненные шаги, продолжай с шага 3”. |
| Бесконечный цикл (агент генерирует шаги без завершения) | Установить max_steps (например, общее количество шагов + 2). Если превысит — прервать и вернуть частичный результат. |
| Выполнение кода из LLM может быть опасным | Использовать sandbox (например, exec в изолированной среде или подпроцесс с ограничениями). |
| LLM плохо угадывает количество шагов | Передавать точное total_steps и просить генерировать шаги строго до этого числа. |
| Высокая стоимость API | Использовать локальную модель (Ollama) для отладки, дорогую — только на финальном тесте. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Проектирование моделей и интерфейса | 1 ч |
| Этап 2: Реализация ядра harness’а | 2 ч |
| Этап 3: Создание тестовой задачи и интеграция | 1 ч |
| Этап 4: Тестирование на нескольких задачах | 1.5 ч |
| Этап 5: Ретроспектива и улучшение | 0.5 ч |
| Итого | 6 ч |
Примечание Для первого запуска с реальным API рекомендуется увеличить бюджет до 8 ч (включая отладку промптов).
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 42 | Стратегии разбиения задачи на шаги (plan decomposition) |
| 73 | Prompt engineering для агентов: chain-of-thought и plan-and-execute |
| 108 | Реализация partial harnessing (данная задача) |
| 129 | Управление состоянием агента (agent state / memory) |
| 154 | Валидация промежуточных результатов в агентских системах |
| 208 | Логирование и трассировка вызовов LLM |
| 271 | Интеграция инструментов (tool use) в агентов |
| 305 | Ограничение количества шагов для предотвращения бесконечных циклов |
| 341 | Сравнение closed-source и open-source LLM для агентских задач |
| 412 | Тестирование агентов: unit vs integration vs end-to-end |
10. Чек-лист самопроверки
- Я убедился, что PartialPlan можно загрузить из JSON и он содержит ровно 2 шага.
- Я запустил harness хотя бы с одной задачей и получил финальный ответ.
- Я проверил, что первые два шага выполнены так, как я задал, а не изменены агентом.
- Я протестировал ситуацию, когда агент генерирует неверный результат — есть ли fallback?
- Я задокументировал все зависимости (requirements.txt) и инструкцию по запуску в README.md.