Инженерная проблема
Технический товар нельзя описывать, подменяя характеристики правдоподобным текстом. Нужно получать SEO-черновик и сохранять значения из исходной спецификации.
ТЕХНИЧЕСКИЙ КЕЙС / AI + BACKEND
Черновики карточек измерительных приборов: FastAPI, Pydantic, GigaChat
Технический товар нельзя описывать, подменяя характеристики правдоподобным текстом. Нужно получать SEO-черновик и сохранять значения из исходной спецификации.
Тестовое задание для отбора на позицию AI/LLM-разработчика
Иллюстрация архитектуры · не live-демо
01 / CONTEXT
Технический товар нельзя описывать, подменяя характеристики правдоподобным текстом. Нужно получать SEO-черновик и сохранять значения из исходной спецификации.
Разработал HTTP API, контракты входа/выхода, адаптер GigaChat, защиту парсинга JSON, проверки результатов и тесты. Контроль исходных характеристик оставил программному коду, а не модели.
02 / FLOW
Каждый этап объясняет вход, действие и результат — без имитации реального API.
POST /generate: название, производитель, specs и необязательное описание. Pydantic проверяет формат и размеры входа.
Отклонённые некорректные данные не отправляются в LLM.
Сервис копирует specs из входного объекта и исключает технические параметры из генеративного контракта.
LLM не переписывает словарь specifications.
GigaChat отвечает только за SEO-заголовок, описание, поисковые запросы и коммерческий блок.
Текстовые поля разбираются из строго проверяемого JSON.
Pydantic, правила длины/формата и эвристики для отдельных рискованных и числовых утверждений.
Статусы ready_for_review, requires_revision или insufficient_data с предупреждениями.
Потребитель API получает диагностический JSON и самостоятельно проверяет текст.
ready_for_review не означает разрешение публикации.
03 / SOURCE-BACKED EXCERPT
Сокращённая выдержка из публичных демонстрационных файлов (4 из 13 характеристик). Результат получен через офлайн-воспроизведение записанного ответа и grounded fallback, а не в реальном времени на этом сайте. Смысловая проверка человеком обязательна.
{
"name": "Термометр РОСМА БТ-51.211 (0–100 °C) G1/2.100.1,5",
"manufacturer": "РОСМА",
"specs": {
"диаметр корпуса": "100 мм",
"диапазон показаний": "0…+100 °C",
"резьба гильзы": "G1/2",
"класс точности": "1,5"
}
}{
"status": "ready_for_review",
"card": {
"seo_title": "Термометр РОСМА БТ-51.211 (0–100 °C) G1/2.100.1,5 — характеристики",
"specifications": {
"диаметр корпуса": "100 мм",
"диапазон показаний": "0…+100 °C",
"резьба гильзы": "G1/2",
"класс точности": "1,5"
}
},
"missing_fields": [],
"warnings": []
}Происхождение: offline_replay · gigachat_recorded_response_with_grounded_fallback
Фрагмент входного JSON ↗Фрагмент результата ↗Полный пример и происхождение ↗
04 / ENGINEERING
Защита от фактических ошибок строится на отделении неизменяемых structured specs от свободного текста модели. Проверка текста намеренно эвристическая и не заменяет сверку с документацией производителя.
Доступен локальный HTTP API /generate и /health; карточка возвращается в виде черновика с диагностикой. Интеграции с публичным каталогом или автопубликации нет.
По отчёту приёмки v0.1.2: 384 теста, branch coverage 96,73%; 20 из 20 реальных карточек получили ready_for_review. Это результаты отчёта проекта, не повторный независимый замер для сайта.
05 / BOUNDARIES
Ограничение публикацииВсе карточки, включая ready_for_review, требуют ручной сверки перед публикацией.
06 / EVIDENCE
Файлы проекта привязаны к неизменяемому SHA. Числа тестирования взяты из отчёта приёмки, без повторного прогона.