fix(chat): clean квартирография rendering in chat_system prompt (v2, #957)
All checks were successful
CI / frontend-tests (push) Has been skipped
CI / changes (push) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / backend-tests (pull_request) Successful in 6m24s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 3m5s
Deploy / deploy (push) Successful in 1m49s
CI / backend-tests (push) Successful in 6m24s
Deploy / changes (push) Successful in 5s
Deploy / build-backend (push) Successful in 2m8s

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
This commit is contained in:
Light1YT 2026-06-09 15:07:14 +05:00
parent 98ecdecb5b
commit 645b3c14a3
2 changed files with 18 additions and 1 deletions

View file

@ -48,7 +48,7 @@ _SYSTEM_BASE = PromptTemplate(
# (см. services/chat/{tools,safe_payload}.py), НЕ зашиваются в литерал промпта. # (см. services/chat/{tools,safe_payload}.py), НЕ зашиваются в литерал промпта.
_CHAT_SYSTEM = PromptTemplate( _CHAT_SYSTEM = PromptTemplate(
name="chat_system", name="chat_system",
version=1, version=2,
template=( template=(
"Ты — ассистент по инвестиционному форсайт-отчёту земельного участка (РФ). " "Ты — ассистент по инвестиционному форсайт-отчёту земельного участка (РФ). "
"Отвечай на русском языке, по-деловому, нейтрально, без маркетинга и без emoji.\n\n" "Отвечай на русском языке, по-деловому, нейтрально, без маркетинга и без emoji.\n\n"
@ -64,6 +64,10 @@ _CHAT_SYSTEM = PromptTemplate(
"5. Вопросы вне отчёта по участку (градостроительная документация / ПЗЗ-разрешения, " "5. Вопросы вне отчёта по участку (градостроительная документация / ПЗЗ-разрешения, "
"сравнение с другими участками, юридические заключения) — вежливо скажи, что это вне " "сравнение с другими участками, юридические заключения) — вежливо скажи, что это вне "
"области отчёта, и предложи вопросы по самому форсайту.\n" "области отчёта, и предложи вопросы по самому форсайту.\n"
"6. При перечислении квартирографии / сегментов указывай ТИП понятно "
"(студия, 1-к, 2-к, 3-к, евро-форматы, 80+ м²) и долю в % если она есть. "
"НЕ нумеруй порядковыми номерами и НЕ склеивай номер с типом через дефис "
"(никаких «2-1-к»); перечисляй по одному типу в строке или через запятую.\n"
"Отвечай кратко и по существу заданного вопроса." "Отвечай кратко и по существу заданного вопроса."
), ),
) )

View file

@ -29,6 +29,19 @@ def test_render_known_template() -> None:
assert "ассистент" in out 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: def test_render_with_required_vars() -> None:
"""render подставляет переменные через str.format и валидирует required_vars.""" """render подставляет переменные через str.format и валидирует required_vars."""
tpl = PromptTemplate( tpl = PromptTemplate(