photo_bot: жёсткий промпт — чек-лист A-E, фиксация мимики/графики, правила отказа
This commit is contained in:
+28
-20
@@ -21,32 +21,33 @@ def _build_prompt() -> str:
|
||||
"""Промпт проверки фото (без подсказки MediaPipe — в тест-моде геометрия не считается)."""
|
||||
cv_hint = 'ℹ️ ПОДСКАЗКА ОТ ALGORITHM: Геометрическая проверка в тестовом режиме не выполняется, проверяй визуально.'
|
||||
|
||||
return ('''Ты — автоматический эксперт пропускной системы. Проверь фотографию сотрудника на соответствие регламенту.
|
||||
return ('''Ты — строгий инспектор пропускной системы. Проверь фотографию сотрудника на соответствие регламенту.
|
||||
|
||||
%s
|
||||
|
||||
ЗАПРЕЩЕНО выводить внутренние рассуждения и теги размышлений. Сразу пиши финальный ответ.
|
||||
|
||||
БЛОК 0. КРИТИЧЕСКИЕ СТОП-ФАКТОРЫ:
|
||||
1. Не реальное фото: ИИ-генерация, 3D-арт, цифровой рисунок, мультфильм, стилизованный портрет, сильная обработка фильтрами.
|
||||
2. Графика и текст: Любые надписи, водяные знаки, рамки, декоративный фон с буквами, графическими элементами, коллажи.
|
||||
3. Костюмы и атрибуты: Исторические костюмы, короны, маски, каски (кроме строительных).
|
||||
4. Посторонние предметы: Оружие, предметы перед лицом.
|
||||
5. Неправильный ракурс и взгляд: Строгий боковой профиль, затылок, человек смотрит совсем в сторону.
|
||||
6. Гримасы и мимика: Гримасы, смешные рожи, высунутый язык, вытянутые щёки, скривленные губы, смех/улыбка с закрытым ртом, любой невынужденный и неспокойный вид. Выражение лица должно быть нейтральным или слегка спокойным.
|
||||
ПРЯМО СЕЙЧАС ВНИМАТЕЛЬНО РАССМОТРИ ФОТО И ПОСЛЕДОВАТЕЛЬНО ЗАФИКСИРУЙ:
|
||||
A) РЕАЛЬНОСТЬ: это живое фото, а не ИИ-генерация, рисунок, 3D, мультфильм, фильтр?
|
||||
B) ГРАФИКА: есть ли рамка, любые буквы/надписи/подписи (включая подпись с именем внизу), водяные знаки, декоративный фон с буквами, коллаж?
|
||||
C) МИМИКА: высунут ли язык? Скривлены ли губы? Есть ли гримаса, смешная рожа, щёлканье зубами, смех, скос глаз, закатанные глаза?
|
||||
D) РАКУРС: профиль, затылок, взгляд в сторону?
|
||||
E) МАСШТАБ: ниже линии груди видны ли живот, талия, подмышки?
|
||||
|
||||
БЛОК 1. МАСШТАБ И КАДРИРОВАНИЕ:
|
||||
- подбородок НИЖЕ середины кадра → тест пройден.
|
||||
- «Не прошел», если видны талия, живот, подмышки, одежда ниже линии груди.
|
||||
ПРАВИЛО ОТКАЗА: если по любому пункту A–E есть хоть малейшее отклонение — вердикт «Не прошел».
|
||||
Смех, ржа, рожи, высунутый язык, скривлённые губы — фото НЕ ПРОХОДИТ, даже если лицо анфас и хорошо освещено.
|
||||
Рамка или буквы/подпись на фоне или по краю кадра — фото НЕ ПРОХОДИТ.
|
||||
|
||||
ИТОГОВЫЙ ВЕРДИКТ:
|
||||
- «Прошел» — нормальные портретные фотографии.
|
||||
- «Не прошел» — только явные нарушения.
|
||||
- «На модерацию» — если фото качественное, но масштаб на грани.
|
||||
- «Прошел» — только если все пункты A–E идеальны: нейтральное спокойное лицо, чистый кадр без рамки и букв.
|
||||
- «Не прошел» — любое отклонение, описанное выше.
|
||||
- «На модерацию» — только если фото реальное и лицо нейтральное, но масштаб или ракурс на грани нормы.
|
||||
|
||||
ФОРМАТ ОТВЕТА — СТРОГО 2 строки:
|
||||
ФОРМАТ ОТВЕТА — СТРОГО 4 строки, без других слов:
|
||||
Мимика: <нейтрально / высунут язык / гримаса / скривленная улыбка / смех — что именно видно>
|
||||
Графика: <нет / рамка / буквы / подпись / коллаж — что именно видно>
|
||||
Вердикт: [Прошел / Не прошел / На модерацию]
|
||||
Причина: [1–2 предложения с указанием конкретной причины]
|
||||
Причина: [1–2 предложения с указанием конкретного пункта A–E]
|
||||
''') % cv_hint
|
||||
|
||||
|
||||
@@ -99,15 +100,22 @@ def validate_photo_with_ai(file_bytes: bytes) -> dict:
|
||||
verdict = 'Не прошел'
|
||||
|
||||
reason = ''
|
||||
mimi = ''
|
||||
grafika = ''
|
||||
for line in clean_ans.splitlines():
|
||||
if line.strip().lower().startswith('причина:'):
|
||||
ls = line.strip().lower()
|
||||
if ls.startswith('причина:'):
|
||||
reason = line.split(':', 1)[1].strip()
|
||||
break
|
||||
elif ls.startswith('мимика:'):
|
||||
mimi = line.split(':', 1)[1].strip()
|
||||
elif ls.startswith('графика:'):
|
||||
grafika = line.split(':', 1)[1].strip()
|
||||
if not reason:
|
||||
reason = clean_ans.replace('\n', ' ').strip()
|
||||
|
||||
logger.info(f"[TEST MODE] ИИ-вердикт: {verdict} | {reason}")
|
||||
return {'ok': True, 'verdict': verdict, 'reason': reason, 'error': ''}
|
||||
logger.info(f"[TEST MODE] ИИ-вердикт: {verdict} | мимика={mimi} | графика={grafika} | {reason}")
|
||||
return {'ok': True, 'verdict': verdict, 'reason': reason, 'error': '',
|
||||
'mimi': mimi, 'grafika': grafika}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[TEST MODE] Ошибка обращения к ИИ: {e}")
|
||||
|
||||
Reference in New Issue
Block a user