From 645b3c14a391a4f0df1b99fdb81e34b1e214c958 Mon Sep 17 00:00:00 2001 From: Light1YT Date: Tue, 9 Jun 2026 15:07:14 +0500 Subject: [PATCH] =?UTF-8?q?fix(chat):=20clean=20=D0=BA=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D1=8F=20?= =?UTF-8?q?rendering=20in=20chat=5Fsystem=20prompt=20(v2,=20#957)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live chat rendered the recommended unit-mix as a garbled rank-hyphen-type list ("2-1-к", "3-2-к" = "rank 2: 1-к"). Add rule 6 to chat_system@v2: list квартирография/segments by clean TYPE (студия / 1-к / 2-к / 3-к / 80+ м²) + share %, no ordinal-number-hyphen-type concatenation. Bumped prompt version 1->2 (versioned-prompt convention). Test locks v2 + the rule. Refs #957 --- backend/app/services/llm/prompts.py | 6 +++++- backend/tests/services/llm/test_prompts.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/backend/app/services/llm/prompts.py b/backend/app/services/llm/prompts.py index dfcf509f..d512e527 100644 --- a/backend/app/services/llm/prompts.py +++ b/backend/app/services/llm/prompts.py @@ -48,7 +48,7 @@ _SYSTEM_BASE = PromptTemplate( # (см. services/chat/{tools,safe_payload}.py), НЕ зашиваются в литерал промпта. _CHAT_SYSTEM = PromptTemplate( name="chat_system", - version=1, + version=2, template=( "Ты — ассистент по инвестиционному форсайт-отчёту земельного участка (РФ). " "Отвечай на русском языке, по-деловому, нейтрально, без маркетинга и без emoji.\n\n" @@ -64,6 +64,10 @@ _CHAT_SYSTEM = PromptTemplate( "5. Вопросы вне отчёта по участку (градостроительная документация / ПЗЗ-разрешения, " "сравнение с другими участками, юридические заключения) — вежливо скажи, что это вне " "области отчёта, и предложи вопросы по самому форсайту.\n" + "6. При перечислении квартирографии / сегментов указывай ТИП понятно " + "(студия, 1-к, 2-к, 3-к, евро-форматы, 80+ м²) и долю в % если она есть. " + "НЕ нумеруй порядковыми номерами и НЕ склеивай номер с типом через дефис " + "(никаких «2-1-к»); перечисляй по одному типу в строке или через запятую.\n" "Отвечай кратко и по существу заданного вопроса." ), ) diff --git a/backend/tests/services/llm/test_prompts.py b/backend/tests/services/llm/test_prompts.py index 45570a0a..8ab2c3cc 100644 --- a/backend/tests/services/llm/test_prompts.py +++ b/backend/tests/services/llm/test_prompts.py @@ -29,6 +29,19 @@ def test_render_known_template() -> None: assert "ассистент" in out +def test_chat_system_v2_has_unit_mix_formatting_rule() -> None: + """chat_system@v2 (#957 fix): чистый рендер квартирографии, без «N-тип» склейки.""" + tpl = get_template("chat_system") + assert tpl.version == 2 + assert tpl.key == "chat_system@v2" + out = render("chat_system") + assert "квартирограф" in out.lower() # правило про перечисление сегментов + assert "«2-1-к»" in out # явный анти-пример (склейка номера с типом) + # ключевые жёсткие правила сохранены + assert "НИКОГДА не выдумывай" in out + assert "ВЕРБАТИМ" in out + + def test_render_with_required_vars() -> None: """render подставляет переменные через str.format и валидирует required_vars.""" tpl = PromptTemplate( -- 2.45.3