TL;DR
Если ты собрал группы похожих текстов — отзывов, комментариев, идей, заметок — LLM может сыграть роль судьи: проверить, действительно ли каждая группа про одно, найти дублирующие группы и придумать точные названия. Не генератор, не сортировщик — именно судья, который оценивает предложенную структуру и говорит, где она рассыпается.
Проблема: когда группируешь тексты вручную или любым инструментом, результат часто выглядит разумно, но на деле — часть групп смешанная (туда попало всё подряд), часть дублирует друг друга под разными словами, а названия самих групп расплывчатые. Это трудно заметить "изнутри" — нет внешней точки зрения.
Метод решает это в три хода внутри чата: сначала проверяет, что каждая группа внутренне связная, потом объединяет те, которые про одно и то же, и наконец ставит точные метки. Каждый шаг — отдельный запрос к LLM.
Схема метода
Шаг 0: ТЫ группируешь тексты любым способом (вручную, таблицей, другим инструментом)
→ у тебя есть группы + по 3-5 примеров из каждой
Шаг 1 (Проверка связности) — отдельный запрос
Входные данные: краткое описание группы + 3-5 текстов из неё
Задача LLM: "Это описание точно отражает тексты? Или группа смешанная?"
→ LLM: подтверждает / объясняет, что не так
Шаг 2 (Поиск дублей) — отдельный запрос
Входные данные: список описаний всех групп
Задача LLM: "Какие группы про одно и то же? Что объединить?"
→ LLM: предлагает какие пары / кластеры слить
Шаг 3 (Присвоение названий) — отдельный запрос
Входные данные: итоговые группы с примерами
Задача LLM: "Придумай точную, конкретную метку для каждой"
→ LLM: названия, которые человек понял бы без объяснений
Пример применения
Задача: Ты — маркетолог сервиса доставки еды. Собрал 150 отзывов с Яндекс Карт, вручную разбил на 8 групп по теме. Хочешь убедиться, что группы получились чёткими — и правильно их назвать перед тем, как писать отчёт руководству.
Промпт — Шаг 1 (проверка одной группы):
Я собрал отзывы клиентов и сформулировал описание одной группы.
Проверь: точно ли описание отражает тексты в группе,
или группа на самом деле смешанная?
Описание группы: «Жалобы на опоздание курьеров»
Примеры текстов из группы:
1. «Курьер привёз заказ через 1,5 часа, хотя обещали 40 минут»
2. «Приложение показало "доставлено", а курьера нет уже 20 минут»
3. «Служба поддержки не отвечает, когда звонишь узнать где заказ»
4. «Опять опоздание. Третий раз за месяц»
5. «Еда приехала холодной, потому что долго везли»
Ответь:
— Насколько группа связная (по шкале 1-10)?
— Все ли тексты про одно?
— Если нет — какие тексты сюда не подходят и почему?
Промпт — Шаг 2 (поиск дублей):
Вот описания моих групп отзывов. Найди пары, которые фактически
про одно и то же — их стоит объединить.
Группа 1: «Жалобы на опоздание курьеров»
Группа 2: «Недовольство временем ожидания»
Группа 3: «Проблемы с качеством еды»
Группа 4: «Холодная или испорченная еда при доставке»
Группа 5: «Ошибки в составе заказа»
Группа 6: «Привезли не то, что заказывали»
Группа 7: «Вежливость курьеров»
Группа 8: «Плохой сервис при получении заказа»
Для каждой пары дублей: объясни почему их стоит объединить
и предложи одно общее название.
Результат:
На шаге 1 — LLM покажет конкретные тексты, которые выпадают из темы (например, «служба поддержки не отвечает» — это уже про другое), и объяснит почему. На шаге 2 — выявит смысловые дубли: группы 1+2 и 3+4 и 5+6 окажутся про одно, предложит объединить и переименовать. В итоге из 8 групп останется 5 чётких.
Почему это работает
LLM плохо делает сортировку с нуля из сотен текстов — слишком много, контекст не резиновый, нет системного контроля. Поэтому "дай LLM кучу текстов и попроси разбить на темы" работает непредсказуемо.
LLM хорошо делает локальное суждение: "вот 5 текстов и описание — они совпадают?" Это задача на сопоставление смысла, а не на глобальную оптимизацию. Именно здесь у неё нет слабых мест.
Метод использует это прицельно: грубую работу (разбивку на группы) делаешь ты или любой инструмент, а LLM получает маленькие, хорошо сформулированные задачи — проверить, слить, назвать. Разделение труда: алгоритм предлагает структуру, LLM её судит.
Рычаги управления: - k примеров на группу (в исследовании использовали 5) — меньше 3 ненадёжно, больше 7 не даёт новой информации, только растягивает контекст - Шкала связности в запросе (1-10) — даёт числовой сигнал, по которому легче отсортировать проблемные группы - Критерий для объединения — можно сузить: "объединяй только если описания буквально одинаковые" или расширить: "объединяй если клиент не отличил бы эти группы"
Шаблон промпта
Шаг 1 — проверка связности группы:
Проверь, насколько группа [{название_группы}] внутренне связная.
Описание группы: {описание_что_объединяет_тексты}
Примеры текстов из группы:
1. {текст_1}
2. {текст_2}
3. {текст_3}
4. {текст_4}
5. {текст_5}
Ответь по пунктам:
— Оценка связности: [1-10]
— Все ли тексты отражают описание?
— Если нет: какие тексты выпадают и почему?
— Предложи уточнённое описание группы, если нужно
Шаг 2 — поиск семантических дублей:
Вот список групп с их описаниями.
Найди пары или наборы групп, которые фактически про одно и то же.
{список_групп_с_описаниями_через_нумерацию}
Для каждого найденного дубля:
— Какие группы объединить (номера)
— Почему они дублируют друг друга
— Предложи единое название для объединённой группы
Шаг 3 — присвоение названий:
Придумай точное, конкретное название для каждой группы.
Название должно быть понятно без объяснений человеку,
который не видел исходные тексты.
{список_финальных_групп_с_примерами_текстов}
Формат ответа:
Группа X: [старое название] → [новое название]
Обоснование: [одна фраза почему именно так]
Плейсхолдеры:
- {название_группы} — как ты сейчас называешь эту группу
- {описание_что_объединяет_тексты} — 1-2 предложения про суть
- {текст_1..5} — буквальные примеры из группы, лучше самые "центральные"
- {список_групп} — все группы разом, каждая с кратким описанием
🚀 Быстрый старт — вставь в чат:
Вот шаблон трёхшагового метода проверки группировок через LLM.
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить нужные поля.
[вставить шаблон выше]
LLM спросит какой тип текстов ты группируешь, как сейчас выглядят группы и сколько примеров ты можешь дать на каждую — потому что без этого невозможно правильно сформулировать критерии проверки под твой контекст.
Ограничения
⚠️ Нужны уже готовые группы: Метод — это валидация, не первичная сортировка. Если группировки ещё нет вообще, начинать нужно с другого.
⚠️ Контекстное окно: Если групп много (больше 20-30) и в каждой много текстов, шаг 2 (поиск дублей) придётся разбивать на несколько запросов — всё сразу не влезет.
⚠️ Узкоспециальные домены: LLM может не поймать дубли в очень специфических профессиональных областях — медицине, праве, технике. Там нужна экспертная проверка поверх.
⚠️ Субъективность: "Связная группа" — суждение, не математика. Разные запросы дадут немного разные ответы. Запусти один и тот же шаг дважды, если результат важный.
Как исследовали
Команда из Purdue взяла реальные твиты и посты о веганстве с двух платформ — X (бывший Twitter) и Bluesky — и прогнала их через стандартный алгоритм кластеризации HDBSCAN. Получилось 359 кластеров для X и 37 для Bluesky. Потом применили трёхэтапную LLM-очистку и сравнили результат с двумя альтернативами: без очистки вообще и с очисткой через SBERT-эмбеддинги (без LLM).
Самый интересный результат — не там, где ожидали. По метрике "разделённости кластеров" (Davies-Bouldin Index) SBERT-очистка выиграла на X-данных. Зато по смысловой связности внутри кластеров LLM-очистка оказалась несравнимо лучше: силуэтный коэффициент 0,674 против 0,156 у SBERT. Это значит: геометрия в пространстве эмбеддингов и реальная смысловая близость текстов — разные вещи. Кластеры могут выглядеть "хорошо" статистически, но быть кашей по содержанию.
Финальную проверку делали живые люди: два эксперта по NLP оценили 500 случайных текстов на каждой платформе. Согласие между ними — Cohen's Kappa 0,82, это "почти идеальное". GPT-4o совпал с людьми на ~78% на X и ~90% на Bluesky — лучше Llama 3.2, Mistral и классических тематических моделей типа LDA и BERTopic.
Адаптации и экстраполяции
🔧 Техника: один промпт вместо трёх шагов → экспресс-аудит группировки
Если групп немного (5-7) и нужна быстрая проверка без детального разбора, можно объединить все три шага в один запрос:
Вот мои группы с примерами. Сделай три вещи:
1. СВЯЗНОСТЬ: для каждой группы — связная или смешанная? (1-10)
2. ДУБЛИ: какие группы фактически про одно? Что объединить?
3. НАЗВАНИЯ: предложи более точные метки
{список_групп_с_примерами}
Работает хуже на больших наборах — LLM начинает скользить по поверхности. Но для 5-7 групп — достаточно.
🔧 Экстраполяция: тот же принцип для структуры документа
Три этапа метода применимы не только к группировкам текстов, но и к структуре любого документа — статьи, отчёта, презентации:
Вот структура моего документа (разделы + краткое содержание каждого).
Сыграй роль строгого редактора:
1. СВЯЗНОСТЬ: в каком разделе содержание не соответствует заголовку?
2. ДУБЛИ: какие разделы говорят про одно и то же? Что объединить?
3. НАЗВАНИЯ: переименуй разделы, если текущие названия расплывчатые
Структура:
{список_разделов_с_кратким_содержанием}
Принцип тот же: LLM как внешний судья, который смотрит на структуру свежим взглядом.
Ресурсы
Название работы: Reasoning-Based Refinement of Unsupervised Text Clusters with LLMs
Код и датасеты: github.com/tunazislam/reasoning-based-refinement-llms-vegan
Автор: Tunazzina Islam — Department of Computer Science, Purdue University, West Lafayette, IN
