System wieloagentowy do automatyzacji semantyki z głosowaniem zespołowym
Skrypt rozwiązuje problem automatycznego zbierania semantyki: wprowadzenie maski, pobranie częstotliwości, eksport do tabeli. Zastępuje rutynowy cykl Wordstat → Excel. Wykorzystuje dwa źródła danych: darmowe API Bukvarix do szerokiego zakresu słów kluczowych z synonimami (z opóźnieniem o kilka miesięcy) oraz płatne XMLRiver do czasu rzeczywistego przez proxy do Yandex XML (bez CAPTCHA).
XMLRiver obsługuje trzy rodzaje częstotliwości:
- Podstawowa:
remont mieszkań→ 45 661 - Dokładna:
"remont mieszkań"→ 12 340 - Uściślona:
[!remont !mieszkania]→ 8 912
Zapytania przetwarzane równolegle na 10 wątkach z logiką ponownych prób. Heurystyka konkurencyjności oparta na wzorze: score = (liczba_słów * 1000) / (częstotliwość + 1). Wynik: 🟢 ŁATWO (>50), 🟡 ŚREDNIO (10–50), 🔴 TRUDNO (<10).
Optymalizowany pipeline przetwarzania kluczy
Przy ponad 3000 kluczach podejście bezpośrednie jest nieefektywne: powtarzające się zapytania SERP. Pipeline filtruje krok po kroku:
- Zbieranie: Bukvarix lub XMLRiver → ~3000 kluczy.
- Regex Shield: usuwanie śmieci (oferty pracy, Avito, fragmenty).
- Fuzzy Dedup: lematyzacja pymorphy2 + rapidfuzz (token_sort_ratio ≥82%, grupowanie po pierwszym słowie) → ~1500–2000 unikalnych.
- Zbieranie SERP: 10 wątków dla unikalnych kluczy.
- Klasteryzacja: NLP + Veto SERP.
- Intencja i metryki.
Progi 82% wybrano empirycznie: eliminuje 30–40% duplikatów (morfologia), nie łączy «remont mieszkania cena» i «remont mieszkania koszt».
Klasteryzacja z Veto SERP
SentenceTransformers (paraphrase-multilingual-MiniLM-L12-v2) do generowania embeddingów. Problem NLP: semantycznie bliskie klucze («remont mieszkań Moskwa» / «remont mieszkań Woroneż») nie konkurują.
Veto SERP: TOP-10 Yandex, przecięcie URL <2 → różne klastry:
overlap = len(urls_core.intersection(urls_cand))
if urls_core and urls_cand and overlap < 2:
continue # różne klastry
Tryby:
- Tylko NLP: embeddingi, szybko.
- Tylko SERP: według URL, dokładnie, wolno.
- Hybrydowy: NLP + Veto, optymalnie.
Izolacja geograficzna: klucze z różnymi miastami nie są klasteryzowane.
Wieloagentowa filtryzacja AI z głosowaniem zespołowym
LLM (DeepSeek) klasyfikuje: suitable / irrelevant / minus / check. Problemy: niestabilność (38% stabilnych przy 3 przebiegach), brak kontekstu branży.
PlannerAgent
Generuje plan branżowy: few-shot, pułapki, filtr geograficzny.
Przykład:
- SUITABLE: «remont mieszkania pod klucz moskwa».
- IRRELEVANT: «praca remont mieszkań».
Optymalizacja tokenów
Numeracja ID: model zwraca tylko ID, nie tekst. Partia 20 kluczy: ~80 tokenów zamiast 400.
Głosowanie zespołowe
3 równoległe przebiegi (temperature=0), majority vote (progi 2/3). Remis → ArbiterAgent.
def single_vote(_):
response = ai_client.call(system_prompt, user_message, temperature=0)
return ai_client.parse_json(response)
with ThreadPoolExecutor(max_workers=votes) as vote_pool:
vote_results = list(vote_pool.map(single_vote, range(votes)))
counts = Counter(votes_for_keyword)
threshold = votes // 2 + 1
Wynik: stabilność ~85%. Koszt: $0.3 za 3000 kluczy.
Tryb Paranoiczny: Whitelist (tokeny, nie substring) dla marek — pomijając AI.
Dodatkowe moduły
Moduł SERP: parsowanie organicznych wyników, powiązanych zapytań, reklam, odpowiedzi neuronowych.
Asystent AI: czat z pandas.query() nad DataFrame.
Co ważne
- Pipeline zmniejsza liczbę zapytań SERP z 3000 do 1500 dzięki Fuzzy Dedup (rapidfuzz + pymorphy2).
- Hybrydowa klasteryzacja łączy szybkość NLP z dokładnością Veto SERP.
- Głosowanie 3x zwiększa stabilność filtrowania AI do 85%.
- Oszczędność tokenów: numeracja ID + partie → $0.3 za pełen przebieg.
- Czas przetwarzania: 20–30 minut zamiast 3–4 godzin ręcznie.
Stos: Python 3.11, DeepSeek API, XMLRiver, SentenceTransformers, rapidfuzz, pymorphy2, pandas, customtkinter.
— Editorial Team
Brak komentarzy.