Skip to content

fix(procurement): не превращать подсказки ассистента в требования клиента - #853

Merged
ShaerWare merged 1 commit into
mainfrom
local/fix/query-builder-brand-leak
Oct 1, 2026
Merged

ShaerWare merged 1 commit into
mainfrom
local/fix/query-builder-brand-leak

Conversation

@ShaerWare

Copy link
Copy Markdown
Owner

Summary

Продолжение разбора по АВР NXZM-630S/3B 3P 630A. После #852 поиск находил позицию первой строкой, но в живом диалоге ассистент продолжал отвечать «ни по одной позиции нет подтверждённого наличия» — ответ от 01.10 18:06 UTC, через 1 ч 20 мин после выката.

Лог билдера показал почему:

query_builder: 'А 630А есть ?'            -> 'устройство АВР 630А 3Р'
query_builder: 'Мне нужен из наличия'     -> 'устройство АВР 630А 3Р EKF PROxima'
query_builder: 'Авр 630А из наличия нет ?'-> 'устройство АВР 630А 3Р EKF PROxima'

Клиент ни разу не называл EKF. И бренд, и слово «устройство» билдер взял из ответа самого ассистента, который до этого предложил «Устройство АВР ТСР1/ТСM … EKF PROxima». Поиск честно вернул только EKF, три позиции «Устройство АВР …» забрали всё окно выдачи — и Chint NXZM-630S (36 шт. на складе, срок 4 дня) до клиента не доехал вообще.

Воронка: что ассистент показал первым, то и становилось требованием клиента навсегда.

  • В промпт билдера добавлено правило: бренд, серию и модель брать только из слов клиента; ответы ассистента — контекст для понимания «из наличия»/«этот», а не источник требований. Плюс пример ровно этого случая.
  • Инструкции мало — она не гарантия, поэтому чистится и кодом: _drop_words_only_the_assistant_used() убирает из запроса то, что произносил ассистент и не произносил клиент.
  • Критерий именно «сказал ассистент, но не клиент», а не «нет у клиента»: нормализацию модель делает своими словами («нужен промышленный» → «контактор силовой»), и «силовой» не произносил никто — такие слова нужны и остаются.
  • Числовые номиналы («630а», «3р», «220в») не отбираются никогда, даже от ассистента: он мог уточнить «трёхполюсный?» — «да».

NEWS

💡 Ассистент больше не зацикливается на том, что предложил первым

Если ассистент показывал варианты одного бренда, дальше он искал только по нему — даже когда клиент про бренд не спрашивал. Из-за этого подходящий товар со склада мог вообще не попасть в ответ. Теперь требованиями считаются только слова клиента, а свои прошлые подсказки ассистент за них не принимает.

Test plan

  • 7 новых тестов в test_offer_query_builder.py: слова ассистента (бренд + «устройство») выкидываются, серия ТСР1 выкидывается, названный клиентом бренд сохраняется, модель клиента сохраняется в другом алфавите, нормализованное «контактор силовой» не принимается за модель, запрос из одних чужих слов не опустошается, номинал от ассистента сохраняется
  • Весь procurement-набор — 73 passed
  • ruff check . + ruff format --check . — чисто
  • Проверено на реальном диалоге прода: устройство АВР 630А 3Р EKF PROxima → АВР 630А 3Р, и клиентский канал видит NXZM-630S/3B 3P 630A — в наличии 36 шт., срок до 4 дн. первой строкой вместо трёх EKF с «наличие уточняется»

🤖 Generated with Claude Code

…ента

Клиент спросил «АВР есть на 630А?», ассистент предложил два варианта
«Устройство АВР ТСР1/ТСM … EKF PROxima», клиент ответил «мне нужен из
наличия» — и билдер запроса собрал `устройство АВР 630А 3Р EKF PROxima`,
подставив и бренд, и слово «устройство» из ответа САМОГО ассистента.

Поиск честно вернул только EKF, три позиции «Устройство АВР …» забрали всё
окно выдачи, и Chint NXZM-630S/3B 630A — 36 штук на складе, срок 4 дня —
до клиента не доехал вообще. Ассистент отвечал «ни по одной позиции нет
подтверждённого наличия», и это было правдой про то, что ему дали.

Получалась воронка: что ассистент показал первым, то и становилось
требованием клиента навсегда, а остальной каталог он больше не видел.

- В промпт билдера добавлено правило: бренд, серию и модель брать только из
  слов клиента; ответы ассистента — контекст для понимания «из наличия»/
  «этот», а не источник требований. Плюс пример ровно этого случая.
- Инструкции мало, она не гарантия, поэтому слова чистятся и кодом:
  `_drop_words_only_the_assistant_used()` убирает из запроса то, что
  произносил ассистент и не произносил клиент.
- Критерий именно «сказал ассистент, но не клиент», а не «нет у клиента»:
  нормализацию модель делает своими словами («нужен промышленный» →
  «контактор силовой»), и «силовой» не произносил никто — такие слова нужны
  и остаются.
- Числовые номиналы («630а», «3р», «220в») не отбираются никогда, даже если
  их назвал только ассистент: он мог уточнить «трёхполюсный?» — «да».

Проверено на реальном диалоге прода: запрос превращается в «АВР 630А 3Р», и
клиентский канал видит NXZM-630S первой строкой с «в наличии 36 шт., срок
до 4 дн.» вместо трёх EKF с «наличие уточняется».

## NEWS

💡 **Ассистент больше не зацикливается на том, что предложил первым**

Если ассистент показывал варианты одного бренда, дальше он искал только по
нему — даже когда клиент про бренд не спрашивал. Из-за этого подходящий
товар со склада мог вообще не попасть в ответ. Теперь требованиями считаются
только слова клиента, а свои прошлые подсказки ассистент за них не принимает.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ShaerWare
ShaerWare merged commit 49536da into main Oct 1, 2026
3 checks passed
@ShaerWare
ShaerWare deleted the local/fix/query-builder-brand-leak branch October 1, 2026 18:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant