Skip to content

fix(procurement): искать номинал независимо от кириллицы и латиницы - #852

Merged
ShaerWare merged 1 commit into
mainfrom
local/fix/homoglyph-search
Oct 1, 2026
Merged

ShaerWare merged 1 commit into
mainfrom
local/fix/homoglyph-search

Conversation

@ShaerWare

Copy link
Copy Markdown
Owner

Summary

Клиент прислал ссылку на АВР NXZM-630S/3B 3P 630A, которого 36 штук на складе, и спросил, почему ассистент отвечает «🕐 наличие уточняется» и предлагает три других АВР.

Данные были верные — in_stock=1, stock_qty=36, lead_time_days=4, обновлено ночным синком. До ассистента они просто не доезжали: позиция не попадала в выдачу вообще.

Причина — омоглифы. В названии «630A» латиницей (U+0041), в запросе «630А» кириллицей (U+0410): токен не находился, значимых совпадений оставалось ноль, и строку отбрасывал фильтр случайных чисел. Каталог при этом расколот почти пополам — 11 501 позиция с кириллической А/Р/В после цифры и 10 167 с латинской, так что любой запрос с номиналом видел лишь свою половину.

  • _fold() сворачивает визуально неотличимые кириллические буквы в латиницу только для сопоставления; в выдачу название идёт как есть. Буквы б/г/з в таблицу не входят: «б» это не «6», такая подмена давала бы ложные совпадения с цифрами.
  • Сворачиваются обе стороны — название, категория, артикул и токены запроса. Токены после стоп-слов и синонимов: в _STOPWORDS лежат русские «в», «для», и свёрнутое слово там бы не нашлось.
  • «ампер» словом добавлен в стоп-слова. На «нужен АВР 630 ампер» выдача состояла из АМПЕРМЕТРОВ: «ампер» был единственным значимым (≥4 символов) токеном и попадал в «амперметр», а «авр» и «630» короткие и значимыми не считаются.

NEWS

🔍 Ассистент перестал терять товары из-за похожих букв

В названиях товаров номиналы написаны по-разному: у одних «630А» русской буквой, у других «630A» английской — на вид не отличить, а для поиска это были разные слова. Из-за этого ассистент мог не найти товар, который лежит на складе, и предложить вместо него другие. Теперь он не различает такие буквы и видит весь каталог целиком.

Test plan

  • 7 новых тестов в test_offer_search_homoglyphs.py: запрос кириллицей находит латинское название (тот самый случай, и первой строкой), запрос латиницей находит кириллическое, оба написания «16А» находятся вместе, «ампер» не превращает запрос в амперметры, сам амперметр по прямому запросу по-прежнему находится, артикул с омоглифами ищется в любом написании, _fold не трогает не-омоглифы
  • Прежние тесты ранжирования целы — весь procurement-набор 67 passed
  • ruff check . + ruff format --check . — чисто
  • Проверено на живом каталоге прода: «АВР 630А» и «АВР 630A» → позиция клиента первой строкой, «в наличии 36 шт., срок до 4 дн.»; «автоматический ввод резерва 630А» → она же первой; «нужен АВР 630 ампер» → АВР вместо амперметров

🤖 Generated with Claude Code

Клиент прислал ссылку на «Автоматический ввод резерва АВР NXZM-630S/3B 3P
630A», которого 36 штук на складе, и спросил, почему ассистент отвечает
«наличие уточняется» и предлагает три других АВР. Позиция не попадала в
выдачу вообще: в названии «630A» латиницей (U+0041), в запросе «630А»
кириллицей (U+0410) — токен не находился, значимых совпадений оставалось
ноль, и строку отбрасывал фильтр случайных чисел.

Каталог расколот почти пополам: 11 501 позиция с кириллической А/Р/В после
цифры и 10 167 с латинской, так что любой запрос с номиналом видел лишь
свою половину. Данные при этом были верные — `in_stock=1, stock_qty=36,
срок 4 дня`, — до ассистента они просто не доезжали.

- `_fold()` сворачивает визуально неотличимые кириллические буквы в
  латиницу ТОЛЬКО для сопоставления; в выдачу название идёт как есть.
  Буквы б/г/з в таблицу не входят: «б» это не «6», такая подмена давала бы
  ложные совпадения с цифрами.
- Сворачиваются обе стороны: название, категория, артикул и токены
  запроса. Токены — после стоп-слов и синонимов, иначе свёрнутое слово в
  `_STOPWORDS` (там русские «в», «для») не нашлось бы.
- «ампер» словом добавлен в стоп-слова: на «нужен АВР 630 ампер» выдача
  состояла из АМПЕРМЕТРОВ — «ампер» был единственным значимым токеном и
  попадал в «амперметр», а «авр» и «630» короткие.

Проверено на проде: «АВР 630А» и «АВР 630A» дают позицию клиента первой
строкой с «в наличии 36 шт., срок до 4 дн.»; «нужен АВР 630 ампер» больше
не возвращает амперметры.

## NEWS

🔍 **Ассистент перестал терять товары из-за похожих букв**

В названиях товаров номиналы написаны по-разному: у одних «630А» русской
буквой, у других «630A» английской — на вид не отличить, а для поиска это
были разные слова. Из-за этого ассистент мог не найти товар, который лежит
на складе, и предложить вместо него другие. Теперь он не различает такие
буквы и видит весь каталог целиком.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ShaerWare
ShaerWare merged commit 9d4a6d5 into main Oct 1, 2026
3 checks passed
@ShaerWare
ShaerWare deleted the local/fix/homoglyph-search branch October 1, 2026 16:45
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