Поиск по внутренним сокращениям: как добавить словарь в RAG

Внутри компании сервис называют «ЛК», в документах он записан как «кабинет партнёра», а в интерфейсе — Partner Portal. Сотрудник задаёт естественный вопрос и не находит инструкцию. Такой разрыв языка удобно исправлять небольшим управляемым словарём, если сохранить неоднозначность сокращений и проверить, какие документы добавились в выдачу.

Соберите словарь из рабочих запросов

Возьмите вопросы, где сотрудник и владелец документа используют разные названия одного объекта. Для записи нужны исходное выражение, каноническое название и область применения. Словарь должен объяснять связь, подтверждённую владельцем продукта. Автоматически найденные похожие слова сначала отправляйте на проверку.

Не смешивайте синоним и похожее понятие. «Возврат» и «отмена» могут иметь разный порядок действий, хотя тексты о них близки. Запись словаря изменяет поиск для всех последующих вопросов, поэтому ошибка здесь размножается быстрее, чем единичная неудача модели.

Добавляйте варианты, сохраняя исходный запрос

Для подтверждённого однозначного сокращения можно построить дополнительный поисковый запрос с полным названием. Исходный запрос сохраняйте и выполняйте рядом: в старых документах встречается именно внутреннее сокращение. Затем объедините кандидатов и уберите дубликаты по ID фрагмента.

Сокращение «КП» может означать коммерческое предложение или кабинет партнёра. Если контекст не разрешает неоднозначность, задайте вопрос пользователю либо выполните раздельные поиски с явно отмеченными вариантами. Молчаливая подстановка одного значения сделает уверенный ответ о другом процессе.

Проверяйте границы слов. Замена «ЛК» внутри другого слова портит текст. В простом примере ниже используется регулярное выражение с границами. Для склонений, пунктуации и составных названий понадобятся дополнительные тесты или токенизация; начните с тех форм, которые действительно встречаются у сотрудников.

Сделайте расширение наблюдаемым

Пример формирует список запросов, сохраняя исходную фразу. В нём нет поиска и оценки эмбеддингов: это отдельная проверяемая часть приложения перед retrieval. Для неоднозначного сокращения функция возвращает варианты уточнения вместо произвольного выбора.

import re
aliases = {"лк": ["кабинет партнёра"], "кп": ["коммерческое предложение", "кабинет партнёра"]}
def expand(query):
    variants = [query]
    for alias, meanings in aliases.items():
        pattern = r"\b" + re.escape(alias) + r"\b"
        if re.search(pattern, query, re.I):
            if len(meanings) > 1:
                return {"queries": [], "clarify": meanings}
            variants.append(re.sub(pattern, meanings[0], query, flags=re.I))
    return {"queries": list(dict.fromkeys(variants)), "clarify": []}
assert len(expand("Где открыть ЛК?")["queries"]) == 2
assert len(expand("Пришлите КП")["clarify"]) == 2
print(expand("Где открыть ЛК?"))

Проверьте пользу на замороженном наборе

Соберите вопросы с подтверждёнными сокращениями, обычные вопросы без них и вопросы с неоднозначными формами. Для каждого задайте допустимые ID документов. Сравните поиск со словарём и без него на одинаковом индексе. Если правильный документ появился, а затем потерялся после пересортировки, следующий объект разбора — объединение выдач.

Измерьте и обратный эффект: какие нерелевантные документы добавило расширение. Словарь «всегда заменять КП на коммерческое предложение» может улучшить одну группу и испортить другую. Смотрите результаты по значению сокращения, а не только общий средний показатель.

Назначьте владельца словаря и храните его версию вместе с конфигурацией поиска. При переименовании сервиса старое имя остаётся полезным для старых вопросов; его не обязательно немедленно удалять. В записи можно указать период и продукт, к которому относится вариант.

После запуска пополняйте словарь по конкретным промахам. Пользовательское выражение, ожидаемый источник и решение владельца дают достаточно материала для маленького изменения и повторной проверки. Такой цикл обычно проще контролировать, чем добавлять всё больше неограниченных перефразировок.

Продолжить проект на практике

Словарь становится полезнее, когда его эффект можно проверить на поиске целиком. В платном курсе Vector DB & RAG Developer вы объедините BM25 и векторную выдачу, добавите реранжирование и измерите качество. На этих инструментах можно проверить, помогает ли расширение запроса находить нужный документ и где теряется результат.

Откройте программу курса и выберите следующий этап своего проекта.

По теме: Гибридный поиск для RAG: BM25, векторы и расчёт RRF.

Продолжить на практике

  • Vector DB & RAG Developer ↗

    Практический курс по векторным базам данных и семантическому поиску. Вы развернёте Qdrant, Weaviate и FAISS, научитесь индексировать миллионы эмбеддингов, строить k-NN-поиск с фильтрами, объединять его с BM-25 и создавать RAG-ботов, которые отвечают на вопросы на основе ваших данных.