From 63e0c6fc07ac2e59662d45b3c36de474347a2df8 Mon Sep 17 00:00:00 2001 From: Antigravity Date: Tue, 6 Oct 2026 22:43:55 +0300 Subject: [PATCH] fix(ai): enforce zero-relative clause preservation and anti-omission rules in literary prompt --- app/ai.py | 13 +++++++------ tests/test_api.py | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/ai.py b/app/ai.py index 6c1f14e..9bc103a 100644 --- a/app/ai.py +++ b/app/ai.py @@ -51,18 +51,19 @@ def build_translation_prompt( return ( "Ты — профессиональный литературный переводчик художественной и научно-популярной литературы на русский язык.\n" - "Твоя задача — перевести указанное английское предложение на красивый, естественный и грамотный русский литературный язык, идеально вписывающийся в повествование книги.\n\n" + "Твоя задача — перевести указанное английское предложение на красивый, естественный, богатый и грамматически безупречный русский язык, идеально вписывающийся в повествование книги.\n\n" f"{context_section}" f'Предложение для перевода:\n"{clean_sentence}"\n\n' f"{target_section}" "Обязательные правила перевода:\n" - "1. Перевод должен быть живым и художественным (НЕ дословным, без топорного калькирования).\n" - "2. Переводи всё предложение ПОЛНОСТЬЮ от начала до конца, не обрывая на точках, обращениях или знаках препинания.\n" - "3. Обязательно сохраняй обращения и титулы: Mr. -> мистер, Mrs. -> миссис, Dr. -> доктор, Prof. -> профессор, St. -> святой/Сент-. Не теряй их!\n" - "4. В поле \"word_meaning\" укажи только точный перевод выделенного слова на русский язык в контексте данного предложения (выбрав самый подходящий вариант из словарных подсказок).\n\n" + "1. ПОЛНОТА И СВЯЗНОСТЬ: Переводи абсолютно ВСЕ смысловые части и придаточные обороты без пропусков! Обращай особое внимание на бессоюзные определительные обороты (zero relative clauses, например: 'the book I read' -> 'книга, которую я читал', 'Tuesday our story starts' -> 'вторник, с которого начинается наша история'). Ничего не выбрасывай!\n" + "2. БЕЗ ДОСЛОВНОГО КАЛЬКИРОВАНИЯ: Никаких топорных калек предлогов ('on Tuesday' -> 'во вторник', а не 'на вторнике'). Парные эпитеты ('dull, gray') переводи богатыми русскими синонимами ('пасмурный, серый'), не повторяя одно и то же слово.\n" + "3. ИМЕНА И ТИТУЛЫ: Имена персонажей и фамилии передавай полностью на русском языке (кириллицей), без латинских букв (Mr. and Mrs. Dursley -> мистер и миссис Дурсли). Сохраняй титулы: Mr. -> мистер, Mrs. -> миссис, Dr. -> доктор, Prof. -> профессор.\n" + "4. РУССКИЙ СИНТАКСИС: Сохраняй естественный русский порядок слов (обстоятельства времени и места ставь перед сказуемым: 'вскоре по всей стране начнут происходить...').\n" + f'5. В поле "word_meaning" укажи только точный перевод слова "{clean_word}" на русский язык в контексте этого предложения (выбрав лучший вариант из подсказок).\n\n' "Ответь ИСКЛЮЧИТЕЛЬНО в формате JSON:\n" "{\n" - ' "sentence_ru": "полный литературный перевод всего предложения",\n' + ' "sentence_ru": "полный качественный литературный перевод всего предложения без пропусков",\n' f' "word_meaning": "{"русский перевод слова в данном контексте" if clean_word else ""}"\n' "}" ) diff --git a/tests/test_api.py b/tests/test_api.py index 1451863..7ae85ec 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1920,7 +1920,8 @@ def test_robust_sentence_split_and_ai_translation(monkeypatch): assert "briefcase" in prompt assert "портфель, кейс, дипломат" in prompt assert "Mr. -> мистер" in prompt - assert "НЕ дословным, без топорного калькирования" in prompt + assert "БЕЗ ДОСЛОВНОГО КАЛЬКИРОВАНИЯ" in prompt + assert "ПОЛНОТА И СВЯЗНОСТЬ" in prompt # 3. Test API endpoint /api/translate-sentence # Authenticate client