Домашка: парсер ревью
Домашка
Промпт ревьюера собирается, модель отвечает JSON-ом — «почти». Присказки, заборы, гуляющие поля: сегодня вы напишете для devbuddy слой, который превращает «почти JSON» в чистые типизированные замечания. Этот парсер переживёт всё, что модель придумает, и станет фундаментом ревьюера из третьего модуля.
Описание задачи
Файл review_parser.py с датаклассом и функцией.
Основная функциональность
ReviewComment— dataclass с полямиfile: str,line: int,severity: str,message: str.parse_review(raw: str) -> list[ReviewComment]— принимает сырой ответ модели и возвращает список замечаний. Порядок обработки:если в ответе есть ```json-забор — работать с его содержимым;
иначе взять срез от первого
[до последнего];распарсить JSON; если на выходе не список —
ValueError;каждый элемент провалидировать:
file— непустая строка;line— целое число ≥ 1 (не bool!);severity— одно из"info","warning","critical";message— непустая строка;
при любой проблеме —
ValueErrorс текстом, в котором есть индекс элемента и что именно не так.
Дополнительные условия
Только стандартная библиотека (
json,dataclasses).Ошибки парсинга JSON (
json.JSONDecodeError) наружу не просачиваются: любое некорректное сырьё означаетValueErrorс понятным сообщением.
Как проверить себя
test_review_parser.py, запуск python -m pytest test_review_parser.py -v:
Обратите внимание на test_bool_is_not_a_line: True в питоне — это int, и ленивая проверка isinstance(line, int) его пропустит. type(line) is int — честная.
Пример работы программы
>>> from review_parser import parse_review
>>> parse_review('Держите: [{"file": "calc.py", "line": 7, "severity": "critical", "message": "деление на ноль"}]')
[ReviewComment(file='calc.py', line=7, severity='critical', message='деление на ноль')]
>>> parse_review('{"status": "всё ок, замечаний нет"}')
Traceback (most recent call last):
...
ValueError: в ответе нет JSON-массива: '{"status": "всё ок, замечаний нет"}'Критерии готовности
Восемь тестов зелёные.
json.JSONDecodeErrorнаружу не торчит — толькоValueErrorс понятным текстом.Коммит:
review_parser.pyиtest_review_parser.py.
Проверьте на живой модели (необязательно)
Соберите промпт прошлой домашки, отправьте настоящей модели через LLMClient и прогоните ответ через parse_review. Поэкспериментируйте: уберите из промпта few-shot пример — и посмотрите, как часто парсеру придётся спасать ситуацию. Обычно после этого эксперимента роль примера в шаблоне перестаёт быть абстрактной.
Как устроены LLM: токены, контекст, цена
10 мин
Домашка: токен-калькулятор
4 мин
Квиз: Как устроены LLM: токены, контекст, цена
8 мин
Промпты как код: шаблоны и переменные
8 мин
Домашка: промпт ревьюера
3 мин
Квиз: Промпты как код: шаблоны и переменные
7 мин
Структурированный вывод: JSON вместо прозы
6 мин
Домашка: парсер ревью
3 мин
Квиз: Структурированный вывод: JSON вместо прозы
7 мин
Выбор модели: GPT, Claude, открытые
7 мин
Домашка: бенчмарк вслепую
4 мин
Квиз: Выбор модели: GPT, Claude, открытые
7 мин
HARD-задача: смета агента
3 мин
Локальная модель: Ollama по-настоящему
8 мин
Квиз: Локальная модель: Ollama по-настоящему
6 мин