Как найти смысловые дубли в базе знаний с помощью ИИ

смысловые дубли базы знаний
поиск дублей Sentence Transformers
paraphrase mining
Как найти смысловые дубли в базе знаний с помощью ИИ

Чтобы найти смысловые дубли в базе знаний, сохраните идентификаторы статей, выделите короткие смысловые блоки и получите пары похожих текстов с помощью Sentence Transformers. Затем редактор должен сравнить условия ответа и выбрать, какие записи объединить. Высокий балл сходства сам по себе не разрешает удаление: две статьи могут описывать одинаковое действие для разных тарифов.

Инструкция для редактора корпоративной базы и разработчика, который готовит очистку материалов перед обновлением поиска или RAG-ассистента. Подготовлено 6 ноября 2026 года, издатель — AI студия Владимира Ломтева. Ниже — документированный порядок и предлагаемый учебный код. Модель на корпусе компании редакцией не запускалась; качество обнаружения дублей и время обработки не измерялись.

Содержание

Шаг 1. Определите, какие записи разрешено объединять

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

Например, «Как поменять платёжную карту» и «Как обновить карту для списания» могут быть дублями. Но инструкция для администратора компании и инструкция для сотрудника могут требовать разных прав. Их объединение без пояснений способно сделать ответ неверным.

Сохраните исходную выгрузку и работайте с копией. Для каждой записи оставьте постоянный id, заголовок, текст, ссылку на источник, дату актуальности, продукт, тариф и аудиторию. Это предлагаемая схема данных: Sentence Transformers не требует именно таких бизнес-полей. Они нужны редактору, чтобы восстановить контекст после поиска.

Результат шага — таблица записей и правило объединения. Если два редактора по-разному понимают слово «дубль», сначала разберите несколько спорных пар, а уже затем запускайте обработку всего корпуса.

Шаг 2. Подготовьте короткие блоки без потери условий

Удалите техническую HTML-разметку, одинаковые меню и повторяющийся подвал. Сохраните отрицания, числа, названия тарифов и исключения. Не превращайте «возврат разрешён» и «возврат не разрешён» в одинаковые строки агрессивной нормализацией.

Для первого прохода возьмите короткие карточки «вопрос — ответ» или отдельные законченные разделы. В карточке paraphrase-multilingual-MiniLM-L12-v2 указаны размер вектора 384 и max_seq_length 128. Это параметры конкретной модели, а не универсальные ограничения эмбеддингов. Длинный текст может быть обрезан, поэтому совпавшие вступления не подтверждают совпадение условий в конце документа.

Если нужна нарезка длинных документов, сохраните article_id и отдельный chunk_id. Пара похожих фрагментов ещё не означает, что целые статьи взаимозаменяемы. Сначала проверьте родительские материалы целиком.

Буквально одинаковые тексты можно предварительно собрать сравнением строк, сохранив все исходные идентификаторы. Даже здесь разные даты действия или аудитории требуют решения редактора. Цель подготовки — убрать лишние сравнения, сохранив происхождение каждой записи.

Шаг 3. Подготовьте окружение и зафиксируйте модель

Для примера используется Python и библиотека Sentence Transformers. Официальная инструкция установки описывает установку через pip; совместимость Python и зависимостей проверьте там перед запуском в своём окружении. Начните с отдельного виртуального окружения:

python -m venv .venv
source .venv/bin/activate
python -m pip install -U sentence-transformers

Команды активации приведены для bash. Это инструкция по документации, не протокол выполненной редакцией установки. После успешной установки сохраните версии зависимостей командой python -m pip freeze > requirements.txt, чтобы повторный запуск можно было сопоставить с исходным.

В качестве стартового кандидата используется sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2. Каталог предобученных моделей относит её к многоязычным моделям для семантической близости. Это не доказательство качества на русскоязычных регламентах вашей компании. Выбор модели для поиска по вопросам пользователей — отдельная задача; см. чек-лист выбора эмбеддингов для RAG.

При загрузке модель может скачиваться из репозитория. Заранее согласуйте место хранения модели и обработки текстов. Для воспроизводимого рабочего запуска параметр revision конструктора позволяет указать ревизию; его назначение описано в справочнике SentenceTransformer. Сохраните фактическую ревизию вместе с результатами.

Шаг 4. Получите пары кандидатов

Документация называет поиск перефразировок в корпусе *paraphrase mining*. Предлагаемый пример ниже адаптирует этот механизм к карточкам базы знаний. Тексты вымышлены; численные результаты намеренно не приведены, поскольку модель здесь не запускалась.

import csv
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import paraphrase_mining

records = [
    {"id": "kb-card", "text": "Как изменить карту для оплаты подписки?"},
    {"id": "kb-payment", "text": "Как заменить платёжную карту подписки?"},
    {"id": "kb-refund", "text": "Когда вернут деньги после отмены подписки?"},
    {"id": "kb-admin", "text": "Кто может изменить карту оплаты компании?"},
]
assert len({r["id"] for r in records}) == len(records)
assert all(r["text"].strip() for r in records)

model = SentenceTransformer(
    "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
pairs = paraphrase_mining(
    model,
    [r["text"] for r in records],
    top_k=3,
    max_pairs=20,
)

with open("candidate_pairs.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["score", "id_a", "id_b", "text_a", "text_b"])
    for score, i, j in pairs:
        writer.writerow([
            float(score), records[i]["id"], records[j]["id"],
            records[i]["text"], records[j]["text"],
        ])

Согласно руководству по paraphrase mining, функция возвращает тройки: балл сходства и два индекса текстов. Индексы относятся к переданному списку, поэтому порядок records нельзя менять между вычислением и экспортом.

Успешный технический запуск создаст CSV с заголовком и возвращёнными парами, чьи идентификаторы существуют в исходных данных. Проверьте это до редакторского разбора. Наличие файла подтверждает работу выгрузки, но не качество модели. Числа 3 и 20 здесь выбраны для маленького учебного примера, а не как настройки для промышленного корпуса.

Шаг 5. Проверьте, не ограничена ли выдача параметрами

В API-справочнике util описаны top_k, max_pairs, размеры блоков сравнения и функция сходства. top_k ограничивает рассматриваемых соседей, а max_pairs — число возвращаемых пар. Эти ограничения влияют на полноту списка кандидатов. Отсутствие пары в CSV не доказывает, что её тексты различаются по смыслу.

Если редактор уже знает несколько дублей, проверьте их присутствие в выдаче. При пропуске изучите длину текста, различия формулировок, модель и ограничения поиска. Увеличение списка кандидатов может повысить нагрузку на редактора; полезно сравнивать не только число найденных пар, но и количество пригодных для объединения записей.

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

Шаг 6. Разберите пары и оформите объединение

Добавьте к CSV поля decision, reason, canonical_id. Предлагаемые решения: «объединить», «оставить раздельно», «нужен владелец процесса». Сортировка по сходству помогает начать разбор, но окончательное решение зависит от содержания.

Что обнаружено Решение редактора Что сохранить
Один ответ разными словами Объединить после проверки условий Главную запись и соответствие старых ID новой
Одна операция для разных тарифов Разделить или явно описать ветки Ограничения каждого тарифа
Противоречащие версии инструкции Передать владельцу процесса Обе версии до решения об актуальности
Совпал только вводный абзац Сравнить полные материалы Уникальные разделы каждой статьи

Не объединяйте автоматически целую группу по цепочке: если A близка к B, а B близка к C, из этого не следует взаимозаменяемость A и C. Проверьте каждый материал относительно выбранной главной записи. Иначе в объединённую статью могут попасть несовместимые условия.

Перед применением изменений подготовьте итоговую карточку и список ссылок, которые нужно обновить. Старые ID не должны бесследно исчезнуть из истории обработки. Если база используется в RAG, обновление текста и удаление старых фрагментов из индекса оформите как отдельную операцию: готовый CSV сам по себе поисковый индекс не меняет.

Шаг 7. Проверьте результат на вопросах пользователей

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

Критерий завершения этой задачи — согласованные пары, сохранённые исходники, выбранные главные записи и доступные ответы после изменений. Заранее определите, какую долю ошибочных объединений процесс вообще допускает; универсального безопасного порога сходства здесь нет.

Если нужен автоматический порог, подготовьте отдельные размеченные пары и оцените ошибки на данных, не использованных для его подбора. Сходство эмбеддингов не является вероятностью дубля. В этой инструкции численный порог не предлагается: без проверки на вашем корпусе он создавал бы необоснованную уверенность.

Как AI студия Владимира Ломтева помогает подготовить базу знаний

AI студия Владимира Ломтева может связать подготовку данных с разработкой корпоративной базы знаний: организовать выгрузку с постоянными идентификаторами, встроить обработку согласованных изменений в RAG-систему и проверить ответы после обновления. Эти действия относятся к подготовке данных, интеграции и тестированию; качество конкретной модели требует отдельной оценки.

Первый шаг — выбрать одну базу, описать её текущие проблемы, источники, ограничения обработки и критерий успешного объединения. Обсудить задачу.

Итог: список кандидатов должен приводить к понятным изменениям

Начните с коротких записей и устойчивых ID, получите пары, сравните существенные условия и только затем объединяйте материалы. Результат работы — обновлённые ответы с сохранённым происхождением. CSV сходства служит редактору инструментом отбора; его численные оценки требуют проверки на реальных примерах вашей базы.

Оставить заявку

Заполните форму и мы свяжемся с вами

← Все статьи

Комментарии (0)

Пока нет комментариев. Будьте первым!

Оставить комментарий
Регистрация не требуется