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

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

Чтобы найти смысловые дубли FAQ, преобразуйте короткие вопросы в эмбеддинги, получите пары с высоким сходством и сравните полные ответы вместе с условиями их применения. Автоматический поиск готовит очередь для редактора. Решение об объединении зависит от того, можно ли ответить на оба вопроса одной действующей карточкой.

Инструкция предназначена для руководителя поддержки, редактора базы знаний и технического специалиста, который поможет запустить Python. Результат — CSV с кандидатами на объединение и понятный порядок работы с ними. Устанавливать векторную базу или подключать генеративную модель для этого примера не требуется.

Документация и карточка модели проверены 1 ноября 2026 года. Ниже — адаптированный документированный порядок и вручную составленные примеры. Модель на этих данных при подготовке статьи не запускалась: численные оценки сходства, скорость и качество на русском не измерены. Синтаксис Python и структура учебного CSV проверены отдельно; это не проверка работы модели.

Содержание

1. Определите, какие карточки действительно считаются дублями

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

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

Перед выгрузкой согласуйте с владельцем базы три решения:

  • какие условия меняют ответ: канал продажи, договор, регион, тип клиента, дата редакции;
  • какой источник подтверждает действующее правило;
  • кто вправе объединять карточки и менять ссылки на них.

Здесь речь о редакционной очистке FAQ, а не о слиянии клиентов в CRM или удалении юридических документов. Для общего наведения порядка есть отдельная статья о подготовке данных для ИИ.

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

2. Выгрузите вопросы с устойчивыми идентификаторами

Одна строка должна соответствовать одной карточке. Сохраните ID, вопрос, полный ответ, ссылку на источник и условия применения. Не подменяйте ID номером строки в редакторе: сортировка изменит порядок.

Для минимального запуска понадобятся только id и question; остальные поля оставьте в исходной выгрузке для редакторского сравнения. Учебный файл faq.csv в UTF-8 с разделителем-запятой:

id,question
F001,Как узнать где находится мой заказ?
F002,Где посмотреть статус заказа?
F003,Можно ли изменить адрес после отправки?
F004,Можно ли изменить адрес до отправки?
F005,Как получить закрывающие документы?

Это вымышленные вопросы, а не обращения клиентов. F001/F002 задуманы как возможный дубль. F003/F004 — контрольная пара: одно слово меняет ситуацию. Фактический порядок, в котором модель выдаст эти пары, здесь не предсказывается.

Удалите пустые строки. Проверьте уникальность ID. Сохраните исходную копию с полными ответами: файл поиска не должен стать единственным экземпляром базы.

Если таблица экспортировалась с точкой с запятой, повторите экспорт с запятой либо измените delimiter в чтении файла. Не исправляйте CSV заменой всех запятых в тексте: это повредит сами вопросы. Стандартный модуль csv в Python поддерживает табличное чтение через DictReader и параметры разделителя.

Результат этапа: файл с непустыми вопросами и уникальными ID, которые позволяют вернуться к полному ответу.

3. Подготовьте окружение и выберите модель

Эмбеддинг — числовое представление текста, по которому можно сравнивать близость формулировок. В примере используется Sentence Transformers и модель sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2. В её карточке указан русский язык; это основание включить её в пробу, а не доказательство качества на вашей терминологии. Указанные параметры — 384 измерения и ограничение последовательности 128 токенами — описывают модель, но не гарантируют точность поиска дублей. Карточка модели.

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

Используйте отдельное Python-окружение. Команды для терминала Linux/macOS с установленным python3:

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

Это документированный способ установки библиотеки, а не воспроизведённая здесь установка. Актуальная инструкция рекомендует Python 3.10+ и описывает зависимости PyTorch; для GPU требуется подходящая сборка. В примере ниже явно выбран CPU. Документация установки.

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

Результат этапа: окружение может импортировать библиотеку и загрузить выбранную модель. После успешного запуска сохраните версии зависимостей и ревизию модели для повторения результата.

4. Получите пары кандидатов в отдельный CSV

Функция paraphrase_mining возвращает тройки: оценка сходства и индексы двух исходных текстов. Для неё не нужен заранее размеченный список правильных дублей. Она ищет близкие формулировки; редакционная равнозначность ответов остаётся отдельной задачей. Официальный пример поиска парафраз.

Сохраните этот адаптированный пример как find_pairs.py рядом с faq.csv:

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

with open("faq.csv", encoding="utf-8-sig", newline="") as f:
    rows = list(csv.DictReader(f))

if not rows or not {"id", "question"} <= rows[0].keys():
    raise ValueError("Нужны колонки id и question и непустой файл")

ids = [r["id"].strip() for r in rows]
questions = [r["question"].strip() for r in rows]
if any(not x for x in ids + questions) or len(set(ids)) != len(ids):
    raise ValueError("Проверьте пустые значения и повторяющиеся ID")
if len(rows) < 2:
    raise ValueError("Нужны хотя бы две карточки")

model = SentenceTransformer(
    "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    device="cpu",
)
pairs = paraphrase_mining(
    model, questions, batch_size=16,
    query_chunk_size=128, corpus_chunk_size=1024,
    top_k=20, max_pairs=10000,
)

with open("pairs.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["score", "id_a", "id_b", "question_a", "question_b"])
    for score, i, j in pairs:
        writer.writerow([
            float(score), ids[i], ids[j], questions[i], questions[j]
        ])

Запуск из той же папки:

python find_pairs.py

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

Признак технического успеха: появился читаемый pairs.csv; обе колонки ID ссылаются на исходные карточки, а вопросы в парах соответствуют этим ID. Это ещё не означает, что дубли найдены правильно. Отсутствие пары в выдаче при ограничениях top_k и max_pairs не доказывает её уникальность.

5. Разберите пары по ответам и условиям

Начните с верхних оценок сходства, но не превращайте первую понравившуюся цифру в правило удаления. Score — мера близости эмбеддингов, не вероятность того, что карточки можно объединить, и не уверенность юридического или продуктового эксперта.

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

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

В учебном наборе F001/F002 можно объединить только после подтверждения, что обе карточки ведут к одному способу отслеживания заказа. F003/F004 следует рассматривать раздельно, пока владелец процесса не подтвердил одинаковый порядок изменения адреса до и после отправки. Модель этого решения за владельца не принимает.

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

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

6. Обновите базу, сохранив варианты вопросов

После согласования перенесите полезные формулировки в основную карточку или в поддерживаемое вашей системой поле альтернативных вопросов. Если такого поля нет, сохраните отдельное соответствие «старый ID → основной ID». Не добавляйте выдуманные поля в рабочую систему без изменения её схемы.

Сначала проверьте ссылки, закладки и интеграции, которые обращаются к старым ID. Затем обновляйте поиск по правилам используемой платформы. Если FAQ участвует в RAG, изменение карточек и обновление поискового индекса — разные операции; порядок выпуска разобран в чек-листе обновления базы знаний RAG.

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

Результат этапа: повторные формулировки находят основную карточку, а отличающиеся процедуры остаются доступны отдельно.

Типичные ошибки и способы исправления

Симптом Возможная причина Действие
Файл читается как одна колонка Другой разделитель CSV Указать фактический delimiter или повторить экспорт
Высоко похожи вопросы с разными ответами Общая тема сильнее различия условий Сравнить полные ответы; уточнить условие в вопросе
Длинные карточки выглядят одинаково Значимое окончание могло не попасть в вход модели Сравнивать короткий вопрос; длинные ответы разбирать отдельно
Процессу не хватает памяти Велики пакеты кодирования или сравнения Снизить соответствующие размеры; повторить пробу
Найдено мало полезных дублей Модель не подходит терминологии или ограничен набор пар Разобрать пропуски, расширить поиск; сопоставить другие модели

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

Короткие ответы на дополнительные вопросы

Можно ли сразу удалять всё выше порога сходства?

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

Обязательно ли отправлять FAQ в облачный чат?

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

Подходит ли этот скрипт для огромного архива?

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

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

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

Первый шаг — выбрать один раздел FAQ, его владельца, источники правил и критерий результата: одинаковые вопросы находят общий ответ, разные условия сохраняются. Обсудить задачу.

Итог: ищите похожие вопросы, объединяйте подтверждённые ответы

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

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

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

← Все статьи

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

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

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