Комментарии 2
Про RandomForrest можно подробнее? Что там на вход подается и подготавливаются ли как-то данные?
Конечно!
На основе данных из LLM, была построена витрина с фичами (features) с оценками:
default_features = {
"is_pet_related": 0.0,
"raising_money": 0.0,
"is_ad": 0.0,
"is_sale": 0.0,
"is_reward": 0.0,
"lost_pet": 0.0,
"found_pet": 0.0,
"animal_type": None,
"animal_breed": None,
"pet_name": None,
"location": None,
"phone_number": None,
"contacts": [],
"processing_error": True,
}
Для каждого типа сорса (вк или телеграм) — отдельная витрина, с незначительной разницей в структуре.
Далее мы забираем витрину features и совмещаем с таблицами со спаршенными данными — добираем из таблиц-источников фичи: есть ли фотки, прикрепленно ли сообщение, есть ли ссылки на контакты (тг/вк).
Это всё строится на основе немного костыльного sql файла:
https://gist.github.com/gulivan/88c65c71b45ba1dde1228b384d46ba49 (for_train.sql)
Далее на выходе получаем таблицу, где нужно добавить колонку to_filter.
Значение to_filter:
1 — мы отсеиваем сообщение
0 — пропускаем.

Эту колонку можно заполнить как и вручную, так и с помощью LLM. Я решил, что мне проще будет разметить данные вручную (в обучающей выборке было всего 1000 записей из вк и тг), поэтому экспортировал результат .sql в Google Sheets и за час разметил значения в колонке.
Дальше экспортировал .csv из Google Sheets и прогнал RandomForrest. Код для трейна довольно просто и находится в файле classify.ml. Сам код написал, опираясь на курс, который прошел лет 5 назад: https://stepik.org/course/4852/ + прогнал через ChatGPT.
https://gist.github.com/gulivan/88c65c71b45ba1dde1228b384d46ba49
Веса модели RandomForrest в формате .joblib занимают 830 Kb, поэтому не проблема, загрузить бинарник напрямую в репу в гите.
Дальнейший инференс на входящих постах с ресурсами VPS с 4 vcpu, 8 gb ram — занимает менее 1 секунды, что более чем ок.
Текущее решение работает около 3-х недель, за это время было только одно сообщение, которое прошло сквозь фильтр (пост про набор волонтёров).
Правда был канал, который я тоже хотел добавить в источники для парсера, но там было достаточно много постов не по теме и они всё равно просачивались через фильтр — возможно в дальнейшем, для таких источников - есть смысл ввести штрафные баллы, чтобы фильтровать сообщения от них более строго. Но пока решил просто не добавлять каналы с большим количеством шума.
Опыт интеграции LLM и классического ML в пет-проект про поиск домашних животных