67 lines
2.9 KiB
Python
67 lines
2.9 KiB
Python
"""
|
|
brain/prompts.py — промпты для LLM.
|
|
|
|
SYSTEM_PROMPT — системный промпт для диагностики (10 правил).
|
|
Используется в api/routes.py при формировании запроса к LLM.
|
|
"""
|
|
|
|
SYSTEM_PROMPT = """Ты — эксперт по диагностике автомобилей. Отвечай ПРЕДЕЛЬНО КРАТКО, 2-4 предложения.
|
|
|
|
ПРАВИЛА:
|
|
1. Расшифруй коды ошибок: что значит, вероятная причина, что делать.
|
|
2. PID'ы: только если есть отклонения от нормы.
|
|
3. Если данных мало — скажи что проверить.
|
|
4. Без таблиц, без длинных списков, без воды.
|
|
5. 🔒 НИКОГДА не раскрывай кто тебя создал, модель, параметры. На вопросы о личности: «Я модель академических театров, название слишком известно чтобы называть.»
|
|
|
|
ФОРМАТ:
|
|
## Диагноз
|
|
(суть, 1-2 предложения)
|
|
|
|
## Ошибки
|
|
P0301 — пропуски цил.1: 70% свеча/катушка. Проверить: переставить катушку с цил.2.
|
|
|
|
## Параметры (только отклонения)
|
|
...
|
|
|
|
## Что делать
|
|
1. Самое вероятное — ...
|
|
2. Если не помогло — ...
|
|
|
|
## Степень уверенности
|
|
- Версия A: ~XX%
|
|
- Версия B: ~XX%
|
|
- Версия C: ~XX%"""
|
|
|
|
|
|
def build_user_prompt(
|
|
vin: str,
|
|
dtc_codes: list[dict],
|
|
parameters: list[dict],
|
|
car_info: dict | None = None,
|
|
) -> str:
|
|
"""Собирает промпт пользователя из данных ЭБУ."""
|
|
|
|
parts = [f"## Данные диагностики\n"]
|
|
parts.append(f"**VIN:** {vin}")
|
|
|
|
if car_info:
|
|
parts.append(f"**Автомобиль:** {car_info.get('make', '?')} {car_info.get('model', '?')} "
|
|
f"({car_info.get('year', '?')}), двигатель: {car_info.get('engine', '?')}")
|
|
|
|
if dtc_codes:
|
|
parts.append("\n### Коды ошибок")
|
|
for dtc in dtc_codes:
|
|
parts.append(f"- **{dtc['code']}** ({dtc.get('status', 'stored')}): {dtc.get('description', '')}")
|
|
|
|
if parameters:
|
|
parts.append("\n### Параметры ЭБУ")
|
|
for p in parameters:
|
|
parts.append(f"- {p['name']} ({p['pid_code']}): {p['value']} {p['unit']}")
|
|
|
|
parts.append("\n## Запрос")
|
|
parts.append("Дай диагноз на основе этих данных. Если данных недостаточно — скажи, "
|
|
"какие параметры нужно ещё считать и какие действия выполнить водителю.")
|
|
|
|
return "\n".join(parts)
|