Как построить радар конкурентной разведки в Telegram

Информационный поток в профессиональных каналах подчиняется неприятной пропорции. Из тысячи сообщений, которые за сутки генерируют сорок тематических Telegram-источников, реальную ценность для бизнеса представляют от четырех до семи постов. Все остальное пространство занимают партнерские ссылки, пересказы чужих постов и вирусные опросы.

Как построить радар конкурентной разведки в Telegram

Задача автоматического мониторинга - срезать девяносто девять процентов этого мусора еще до того, как текст попадет на глаза человеку или в дорогую языковую модель.

Разбираем устройство автономного радара-фильтра на базе скользящего векторного буфера и языковых моделей.

Почему семантический анализ бьет поиск по ключевым словам

Традиционный мониторинг на регулярных выражениях или алгоритмах полнотекстового поиска вроде BM25 работает только с буквальными совпадениями.

Если вы поставили фильтр на слова "сбой" или "отключение", скрипт пропустит новость, где конкурент написал "наблюдаются временные задержки в обработке транзакций". И наоборот, скрипт пришлет ложное уведомление на рекламный пост со словами "работаем надежно и без сбоев".

Семантический подход оперирует смыслом предложения в многомерном пространстве.

Кстати, если вы хотите протестировать все самые свежие модели уровня Claude Sonnet 5, GPT-5.6 или Gemini 3 в одном удобном месте и сравнить их ответы без костылей с иностранными картами - на платформе SYNTX.AI это можно сделать за пару кликов.

По промокоду NEIROSKUF дадут 15% скидку на все тарифы.

Модель эмбеддингов переводит текст в математический вектор. В этом пространстве фраза о снижении тарифов на двадцать процентов окажется рядом с фразой "обновили ценовую сетку в пользу клиентов", даже если в текстах нет ни одного общего слова.

Скользящий векторный буфер для склейки дубликатов

Вместо тяжелых векторных баз данных для суточного мониторинга достаточно легковесного кольцевого буфера в оперативной памяти на базе библиотеки NumPy.

Каждое новое сообщение переводится в вектор через модель text-embedding-3-small или открытые аналоги. Вектор сравнивается с центроидами активных событий за последние двадцать четыре часа.

Если косинусное сходство превышает порог 0.82, сообщение признается дубликатом. Система не запускает повторный анализ текста, а просто увеличивает счетчик упоминаний и сохраняет ссылку на новый источник.

import numpy as np from typing import List, Dict, Any class SlidingVectorBuffer: def __init__(self, similarity_cutoff: float = 0.82, max_age_hours: int = 24): self.cutoff = similarity_cutoff self.events: List[Dict[str, Any]] = [] def process_incoming_vector(self, text: str, source: str, url: str, vector: List[float]) -> tuple[bool, int]: vec_np = np.array(vector) for idx, event in enumerate(self.events): center_vec = np.array(event["vector"]) # Косинусное сходство векторов score = float(np.dot(vec_np, center_vec) / (np.linalg.norm(vec_np) * np.linalg.norm(center_vec))) if score >= self.cutoff: event["mentions"] += 1 event["sources"].append({"source": source, "url": url}) return False, idx # Склеено с существующим инфоповодом # Создаем новый узел события self.events.append({ "vector": vector, "anchor_text": text, "mentions": 1, "sources": [{"source": source, "url": url}] }) return True, len(self.events) - 1

Сортировочная станция: трехуровневая классификация

После склейки дубликатов уникальный инфоповод отправляется на экспресс-оценку в скоростную модель DeepSeek V4 Flash или Gemini 3.7 Flash.

Задача классификатора - распределить события по трем жестким категориям.

Как построить радар конкурентной разведки в Telegram

Первая категория - PROMO. Сюда летят любые рекламные интеграции, реферальные хвосты, ссылки на розыгрыши и скидочные купоны. Такие сообщения сразу отправляются в корзину.

Вторая категория - BACKGROUND. Фоновые рассуждения, авторские мнения, переводы старых зарубежных статей и мемы. Текст сохраняется в лог, но не идет в приоритетные уведомления.

Третья категория - MARKET_SIGNAL. Прямые факты о рынке. Технические инциденты, запуск новых продуктов конкурентов, падение или взлет тарифов, регуляторные предписания и кадровые перестановки.

Промпт классификатора исключает любые рассуждения со стороны модели:

def classify_market_signal(client, text: str) -> str: prompt = ( "Ты фильтр конкурентной разведки. " "Определи категорию текста. Верни строго одно слово - PROMO, BACKGROUND или MARKET_SIGNAL. " "К категории MARKET_SIGNAL относятся только твердые факты о сбоях, ценах, релизах и законах." ) res = client.chat.completions.create( model="deepseek/deepseek-v4-flash", messages=[ {"role": "system", "content": prompt}, {"role": "user", "content": text} ], temperature=0.0 ) return res.choices[0].message.content.strip()

Разделение контуров доставки - Срочные алерты против Утренней сводки

События категории MARKET_SIGNAL распределяются по двум независимым контурам доставки в зависимости от критичности.

Критический контур (Hot Alerts) срабатывает немедленно при обнаружении признаков масштабного сбоя у ключевых партнеров или критических законодательных изменений.

Агент формирует короткую текстовую карточку из двух предложений без вводных слов и отправляет ее прямым вебхуком в дежурный чат технических специалистов.

Плановый контур (Cold Digest) собирает все подтвержденные отраслевые события за сутки, упорядочивает их по количеству упоминаний в разных источниках и формирует Markdown-документ утренней сводки к началу рабочего дня.

def format_digest_entry(client, event_item: Dict[str, Any]) -> str: prompt = ( "Сделай армейскую выжимку инфоповода для руководства. " "Первое предложение - голый факт с цифрами и именами. " "Второе предложение - практическое последствие для отрасли. " "Пиши сухо, без оценок и без единого двоеточия." ) res = client.chat.completions.create( model="deepseek/deepseek-v4-flash", messages=[ {"role": "system", "content": prompt}, {"role": "user", "content": event_item["anchor_text"]} ], temperature=0.1 ) summary = res.choices[0].message.content.strip() sources_list = " | ".join([f"[{s['source']}]({s['url']})" for s in event_item["sources"] if s.get("url")]) return f"{summary}\nИсточники - {sources_list if sources_list else 'Внутренний монитор'}\n"
Как построить радар конкурентной разведки в Telegram
77