Jak w Polskie.AI przebudowaliśmy aplikację InBefore do współpracy z usługami AI?


Nasze serwisy prasowe oparte są na przebudowanej, komercyjnej aplikacji InBefore. Zmian w stosunku do oryginału jest bardzo dużo, ale:

  • utrzymujemy pełną kompatybilność na poziomie schematu bazy danych (dodaliśmy sporo dodatkowych tabel, kolumn i indeksów, natomiast modyfikacje oryginalnych obiektów sprowadzają się do zmiany typów 2 tabel na InnoDB)
  • utrzymujemy identyczny schemat routingu do poszczególnych typów podstron
  • utrzymujemy identyczną strukturę ścieżek do plików (obrazków, JS, CSS, elementów szablonu i tłumaczeń)
  • nie robimy żadnych zmian w oryginalnych plikach JS i CSS, a oryginalne style CSS nadpisujemy własnymi, podpinanymi w osobnych plikach
  • zmiany w kodzie szablonów (katalog site/themes/default) są stosunkowo niewielkie i punktowe

Dzięki temu, jeśli chcesz zacząć eksperymenty z układem strony jeszcze przed nawiązaniem współpracy z nami, możesz zacząć od zakupu oryginalnej wersji InBefore, a potem na swój kod nanieść nasze zmiany, które otrzymasz w postaci tzw. diffa.

import artykułów

  1. Dodaliśmy nasz analizator języka polskiego oparty na AI (w oryginalnej aplikacji InBefore artykuły po prostu dziedziczą kategorię po kategorii strony źródłowej).
  2. Przebudowaliśmy importer artykułów, dzięki czemu jesteśmy w stanie sprawdzać kolejki co 5 minut i indeksować w razie potrzeby nawet 200 nowych artykułów na minutę:
    • podział jednej kolejki na 11 osobnych, każda dla artykułów innego typu (np. 3 polityka, 4 technologia, 5 celebryci, 6 sport itd.)
    • osobna kolejka dla źródeł “problematycznych” (gdzie ktoś lub coś próbuje nas blokować lub robić throttling), oraz mechanizmy do łatwej identyfikacji takich problematycznych źródeł
    • użycie memcached i różne optymalizacje, aby odciążyć bazę danych
    • integracja push z Google, Bingiem i Twitterem (powiadamianie o nowych artykułach), możliwość dopinania kolejnych klas integracyjnych
    • integracja pull z mniejszymi partnerami przez wystawianie dedykowanych feedów w formacie RSS lub JSON
    • pełny monitoring wszystkich działań: drożności poszczególnych kolejek, drożności powiadomień itd. (z użyciem Heartbeat i Uptimerobot)
  3. Mocno usprawniliśmy wyszukiwanie obrazków w treści importowanych feedów RSS. Dzięki temu ponad 3x więcej importowanych artykułów posiada obrazek.

obsługa wielu niezależnych domen i stron

  1. Dodaliśmy obsługę wielu różnych stron na różnych domenach:
    • każda strona ma własny plik konfiguracyjny, wg nazwy domeny
    • funkcja get_option najpierw czyta ustawienia z plików konfiguracyjnych, dopiero potem (opcjonalnie) z bazy danych i innych mechanizmów InBefore
    • każda strona obsługuje tylko “swoje” kategorie, a do pozostałych kategorii funkcja post_url automatycznie tworzy linki do innych stron
    • każda strona ma swój logotyp, obrazek OpenGraph, favicon, oraz dedykowany plik ze stylami CSS
  2. Dodaliśmy obsługę cross-linkowania pomiędzy stronami i kategoriami:
    • podstawą są klastry tematyczne kategorii (np. kategorie Pozostały hardware, Motoryzacja i Wyścigi są w tym samym klastrze tematycznym)
    • artykuły zawierają dwie osobne sekcje linków: Powiązane (inne artykuły z tej samej kategorii) i Polecane (artykuły z innych stron w ramach klastra tematycznego)
  3. Dodaliśmy obsługę strony-konsoli do łatwej moderacji treści:
    • widoczne są wszystkie kategorie
    • można ad hoc włączać i wyłączać widoczność artykułów z poszczególnych kategorii i źródeł

funkcjonalność strony

  1. Dodaliśmy tryb “restricted”, czyli bardzo uproszczony tryb strony (przykład) – strona taka ma:
    • trwale wyłączone oba sidebary
    • schowane nazwy kategorii (w założeniu większość takich stron pokazuje tylko jedną kategorię, mamy tylko 2 wyjątki)
    • slider ze zdjęciami poszerzony na całą szerokość strony
  2. Dla pozostałych stron dodaliśmy możliwość selektywnego wyłączania poszczególnych widgetów na prawym sidebarze (wyłączany jest nie tylko widok widgetu, ale również zaciąganie danych do niego).
  3. Możliwe jest również tworzenie nowych, własnych widgetów i osadzanie ich na prawym sidebarze.
  4. Detekcja urządzeń mobilnych za pomocą Mobile Detect, możliwość delikatnego fine-tuningu strony pod dany typ urządzeń:
    • strony typu “restricted” na przeglądarkach desktopowych mają pełniejsze i ładniejsze listy artykułów na stronie głównej (poniżej slidera)

jakość wyświetlanych treści

  1. Poszczególne artykuły są pokazywane na podstawie szeregu kryteriów jakościowych i kierunkowych:
    • dla każdego kryterium możliwa biała lub czarna lista
    • np. na stronie głównej pomijane są artykuły bez zdjęć, oraz artykuły ze źródeł, dla których zostały zidentyfikowane zabezpieczenia przez hotlinkowaniem zdjęć, lub inne problemy techniczne, przez które zdjęcia się nie wyświetlają
    • możliwe jest tworzenie list źródeł spełniających określone założenia (np. tylko strony prorosyjskie, albo strony z obrazkami bardzo niskiej jakości) i podpinanie ich jako czarne lub białe listy
  2. Cały kod do obsługi wyszukiwania artykułów z klasy SiteController został przeniesiony do dedykowanej klasy, która obsługuje wspomniane wyżej dodatkowe funkcjonalności. To jest przypuszczalnie największa z naszych zmian, z punktu widzenia ilości zmienionych linii kodu.
  3. Napisany na nowo mechanizm przepisywania artykułów:
    • przepisywanie następuje już na etapie zwracania wyniku zapytania SQL, a więc działa też w trybach RSS, sitemap, wyszukiwarce i wszystkich innych
    • przepisywanie jest też robione na etapie powiadamiania o nowych artykułach, podczas ich importu
    • do poszczególnych stron możliwe jest podłączanie różnych słowników przekształceń, np. tutaj jest słownik podstawowy, a tutaj smerfowy
    • same słowniki mają nadal identyczny format jak w InBefore, możesz więc użyć pliku site/plugins/article-rewriter/dict/English.php jako przykładu

statystyki odwiedzin

  1. Informacje o wszystkich odwiedzinach każdej ze stron zapisywane są lokalnie w plikach JSON.
  2. Klient może zdecydować, czy statystyki odwiedzin oraz liczniki prezentowane użytkownikom końcowym mają obejmować również odwiedziny ze stron demonstracyjnych, czy jedynie swoje własne.

wydajność

  1. Żadna operacja, jaką jest w stanie wykonać użytkownik końcowy, nie powoduje zmian w bazie danych. Odwiedziny i wszystkie działania użytkowników odnotowywane są jedynie w lokalnych plikach, które są następnie importowane offline (na serwerze klienta, lub po przesłaniu na serwer centralny).
  2. Większość podstawowych danych (np. informacje o kategoriach i źródłach danych, statystyki odwiedzin itd.) są generowane w postaci tzw. includów PHP.
  3. Pozostałe dane są kilkupoziomowo cache’owane w użyciem memcached.
  4. Okres cache’owania danych jest wyliczany dynamicznie i zależy od:
    • ich typu – np. zawartość strony głównej od 5 do 30 minut w zależności od poniższych kryteriów, ale już dane do stronicowania 10 minut do nawet 32 godzin
    • wielkości kategorii – generalnie im większa kategoria, tym agresywniej cache’owane są jej kolejne podstrony z artykułami
    • konfiguracji priorytetu strony – newsy o celebrytach zmieniają się szybciej od artykułów medycznych o nowotworach, stąd dla każdej ze stron można osobno określić 1 z 4 poziomów agresywności cache’owania
    • pory dnia – w nocy pojawia się bardzo niewiele nowych artykułów, dzięki czemu wiele danych można bezpiecznie cache’ować aż do rana