Ты правишь system prompt и не понимаешь: стало лучше или хуже? «На глаз» работает плохо — вчера казался хорошим ответ, сегодня тот же самый ответ кажется сухим. Нужен стабильный способ измерять качество бота. Эта область называется evals (от evaluations).
len(text.split()).?.def check_length(response):
return len(response.split()) <= 50
def check_single_question(response):
return response.count("?") <= 1
def check_no_judgment(response):
bad = ["правильно", "неправильно", "надо", "должен", "обязан"]
return not any(w in response.lower() for w in bad)
# Прогоняем все тест-диалоги
test_dialogs = load("test-dialogs.json")
scores = []
for d in test_dialogs:
r = get_bot_reply(d["user_message"], d["history"])
scores.append({
"length_ok": check_length(r),
"single_q": check_single_question(r),
"no_judgment": check_no_judgment(r),
})
print(f"length ok: {sum(s['length_ok'] for s in scores) / len(scores):.0%}")
Что здесь происходит: ты подгружаешь файл с тест-диалогами (10-50 штук), прогоняешь каждый через бота, проверяешь простыми функциями. Три строчки кода — и ты видишь процентное качество. При изменении промпта сравниваешь «было 85%, стало 92%» — факты, не ощущения.
def judge_tone(user_msg, bot_reply):
prompt = f"""Оцени тон ответа бота-помощника для людей с СДВГ по
шкале 1-5:
1 — холодный, осуждающий
5 — мягкий, принимающий
Сообщение пользователя: {user_msg}
Ответ бота: {bot_reply}
Ответь только числом."""
# отдельный вызов OpenAI, желательно другая модель (не та, что генерирует)
response = client.chat.completions.create(
model="gpt-5.4-mini",
messages=[{"role": "user", "content": prompt}]
)
return int(response.choices[0].message.content.strip())
Что здесь происходит: для того, что нельзя померить кодом, используем вторую модель как «судью». Ответ — число, его легко усреднить по всему тестовому набору. Судью лучше делать на другой модели (не той, что генерирует), чтобы не подсуживать себе.
test-dialogs.json с 20-30 кейсами. Формат:
{"history": [...], "user_message": "..."}.