Найти в Дзене
Цифровая Переплавка

🧩 Как приручить хаос LLM: путь к детерминированной классификации из стохастических моделей

Современные языковые модели — словно гениальные, но капризные собеседники: каждый раз отвечают по-новому, даже на один и тот же вопрос. Эта стохастическая природа — то, что делает их живыми, но в задачах классификации превращается в кошмар. Ведь если одна и та же запись получает то метку joke_about_rust, то humor_on_rust_programmers, то make_fun_of_rust, — никакая аналитика не выдержит такого разброса. Автор проекта consistent-classifier нашёл изящный способ «успокоить» LLM, превратив их хаотичный выход в устойчивую систему меток. И сделал это не теоретически, а на практике — обработав 10 000 твитов и уменьшив число уникальных лейблов с 🌀 6520 до 1381. Модели вроде GPT не «ошибаются» — они просто лексически разнообразны, но семантически устойчивы. То есть смысл одинаков, но слова разные. Автор воспользовался этим свойством, применив векторизацию и кластеризацию: В результате LLM остаётся стохастической — но система вокруг неё становится детерминированной. Процесс классификации выгляди
Оглавление

Современные языковые модели — словно гениальные, но капризные собеседники: каждый раз отвечают по-новому, даже на один и тот же вопрос. Эта стохастическая природа — то, что делает их живыми, но в задачах классификации превращается в кошмар. Ведь если одна и та же запись получает то метку joke_about_rust, то humor_on_rust_programmers, то make_fun_of_rust, — никакая аналитика не выдержит такого разброса.

Автор проекта consistent-classifier нашёл изящный способ «успокоить» LLM, превратив их хаотичный выход в устойчивую систему меток. И сделал это не теоретически, а на практике — обработав 10 000 твитов и уменьшив число уникальных лейблов с 🌀 6520 до 1381.

🧠 Ключевая идея

Модели вроде GPT не «ошибаются» — они просто лексически разнообразны, но семантически устойчивы. То есть смысл одинаков, но слова разные.

Автор воспользовался этим свойством, применив векторизацию и кластеризацию:

  • 🧭 Embedding всех меток — каждая текстовая метка превращается в вектор;
  • 🔍 Поиск ближайших соседей в векторном пространстве (через Pinecone);
  • 🌳 Сжатие до корневого названия кластера с помощью Disjoint Set Union (DSU) — алгоритма, часто используемого в графах и системах объединения множеств.

В результате LLM остаётся стохастической — но система вокруг неё становится детерминированной.

⚙️ Как это работает

Процесс классификации выглядит как мини-производственная линия:

🧩 1. Генерация эмбеддинга.
Каждая новая метка векторизуется с помощью
Voyage-3.5-lite (1024-мерное пространство).

📦 2. Проверка кэша.
Система ищет в векторном индексе ближайшие метки. Если находит похожую — берёт уже готовый «корневой» лейбл.

3. При промахе.
Если совпадений нет, вызывается LLM (в примере — gpt-4.1-mini) для генерации новой метки, которая потом добавляется в индекс и объединяется в кластер.

📈 4. Обучение со временем.
Чем больше данных, тем чаще система «угадывает» нужный кластер без обращения к модели.

Итог: при 10 000 твитах кэш-хит достиг 🚀 94 %, а средняя стоимость классификации упала в 10 раз, латентность — почти в 2 раза.

💾 Технический стек

🧠 LLM: GPT-4.1-mini
🧮
Векторизация: Voyage-3.5-lite
🗂
Индекс: Pinecone
🧱
Код: на Go, с адаптерами под OpenAI, Voyage и Pinecone
🧩
Архитектура:

pkg/
├── classifier/ # основная логика классификатора
│ ├── classifier.go
│ ├── config.go
│ ├── types.go
│ └── interfaces.go
├── adapters/ # подключения внешних API
│ ├── llm_client.go
│ ├── pinecone/
│ └── voyage/
└── utils/disjoint_set/ # DSU для сжатия меток

Порог косинусного сходства выставлен на 0.8 — оптимальное значение для коротких текстов (вроде твитов). Это обеспечивает баланс между точностью и скоростью кластеризации.

🔬 Интересные результаты

📊 Сжатие пространства меток.
Количество уникальных лейблов растёт линейно при LLM-only подходе, но по «корню» — как квадратный корень при векторном.

⚙️ Рост эффективности.
Начальные накладные расходы:
💸 +15 % по стоимости
⏱ +130 % по времени
Но уже после первых сотен записей всё окупается, а дальше — экспоненциальное снижение затрат.

🧮 Формула масштабируемости:

Чем больше база эмбеддингов, тем выше шанс кэш-попадания, тем меньше LLM-вызовов → тем дешевле и быстрее система.

💬 Мой взгляд

Этот подход — блестящий пример инженерного трюка в эпоху LLM. Он не требует тренировки моделей и не борется с их стохастичностью напрямую — вместо этого строит слой согласования поверх хаоса.

По сути, это микросистема самокоррекции: LLM генерирует новые данные, но сама же потом подстраивается под свои прошлые ответы через векторное «зеркало».

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

Особенно вдохновляет, что всё реализовано на Go — лаконично, быстро, без лишних зависимостей. В мире, где всё чаще RAG-решения строят на Python, этот проект демонстрирует, что строго типизированный бэкенд и ML-логика могут жить вместе.

🌟 Заключение

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

Работа Verdi показывает, как добавить этому художнику структуру, не убивая вдохновение.

🔗 Источники: