Pokazywanie postów oznaczonych etykietą big data. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą big data. Pokaż wszystkie posty

poniedziałek, 7 lipca 2025

EA - Wektorowe bazy danych - wstęp

 W erze rosnącej popularności modeli językowych, rekomendacji, wyszukiwania semantycznego i rozpoznawania obrazów coraz częściej słyszymy o bazach danych wektorowych. Choć ich koncepcja istnieje od lat, to właśnie rozwój sztucznej inteligencji dał im nowe życie. W tym artykule pokażę Ci, czym są, do czego służą i jak się z nimi pracuje w praktyce.



Czym są wektorowe bazy danych?

Bazy danych wektorowe służą do przechowywania i wyszukiwania danych w postaci wektorów osadzonych (embeddings). W odróżnieniu od klasycznych baz SQL czy NoSQL, gdzie szukamy po kluczach, tekstach czy relacjach, tutaj wyszukujemy po podobieństwie matematycznym między punktami w przestrzeni wielowymiarowej.

Do czego to służy?

Bazy wektorowe są fundamentem takich zastosowań jak:

  • Wyszukiwanie semantyczne (np. „znajdź podobne dokumenty”)

  • Rekomendacje (np. „użytkownicy podobni do Ciebie kupili…”)

  • Chatboty RAG (Retrieval-Augmented Generation) – pobieranie kontekstu z bazy wiedzy dla modelu LLM

  • Analiza obrazów, dźwięku, filmów – porównywanie treści na poziomie cech ukrytych

  • Wykrywanie anomalii – poprzez odległość od normalnych przypadków

Jak to działa?

  1. Osadzanie danych (embedding):

    • Każdy dokument, obraz czy rekord przechodzi przez model AI (np. BERT, CLIP, OpenAI), który przekształca go w wektor liczb rzeczywistych (np. 768-wymiarowy).

    • Ten wektor reprezentuje znaczenie treści, a nie jej dokładne słowa.

  2. Przechowywanie:

    • Wektor trafia do bazy danych wektorowych razem z identyfikatorem i metadanymi (np. kategoria, źródło, użytkownik).

    • Baza indeksuje te dane pod kątem szybkiego wyszukiwania.

  3. Wyszukiwanie (query):

    • Nowy wektor zapytania (np. pytanie od użytkownika) porównywany jest z istniejącymi wektorami.

    • Używa się metryk podobieństwa jak:

    • Cosine similarity mierzy kąt między wektorami i ignoruje ich długość — im bliżej 1, tym bardziej podobne.

    • Dot product to iloczyn skalarny dwóch wektorów, który rośnie wraz z ich zgodnością kierunkową i wielkością.

    • Euclidean distance to fizyczna odległość między punktami w przestrzeni — im mniejsza, tym większe podobieństwo.

  4. Zwracane są najbardziej podobne rekordy – a niekoniecznie identyczne słowa.

Jakie narzędzia są dostępne?

Najpopularniejsze silniki baz wektorowych:

NarzędzieCechy
PineconeSaaS, skalowalny, integracja z OpenAI
WeaviateOpen-source + REST/GraphQL API
QdrantWydajny silnik z Rust, JSON API
FAISSBiblioteka od Meta (do lokalnego użycia)
MilvusDuży ekosystem, klastrowy
ChromaProstota, idealna do aplikacji RAG

 Jak budować model danych?

Zazwyczaj każdy rekord (np. dokument, paragraf, obraz) zawiera:

json
{ "id": "doc-123", "embedding": [0.11, -0.22, ..., 0.03], "metadata": { "title": "Jak działa GPT", "tags": ["AI", "LLM"], "language": "pl" } }

Przykład: Wyszukiwanie podobnych dokumentów

  1. Użytkownik wpisuje zapytanie: „Co to jest tokenizacja tekstu?”

  2. Zapytanie jest osadzane w wektor.

  3. Silnik porównuje go z wektorami w bazie i zwraca najbardziej podobne dokumenty.

  4. Backend prezentuje wyniki lub przekazuje kontekst do LLM (RAG).

Wydajność i indeksowanie

Wyszukiwanie po setkach tysięcy lub milionach rekordów wymaga specjalnych algorytmów:

  • HNSW (Hierarchical Navigable Small World)
    Struktura grafu oparta na wielu warstwach, gdzie najwyższe poziomy łączą tylko najbardziej reprezentatywne punkty, a niższe warstwy szczegółowo łączą bliskie punkty. Umożliwia bardzo szybkie przechodzenie między odległymi wektorami — zbliżone do działania GPS w nawigacji drogowej.
  • IVF (Inverted File Index)
    Przestrzeń wektorów dzieli się na klastry (centroidy), a każdy wektor przypisuje do najbliższego klastra. Wyszukiwanie ogranicza się tylko do kilku najbliższych klastrów, co znacząco przyspiesza czas odpowiedzi.

  • PQ (Product Quantization)
    Kompresuje wektory, dzieląc je na podprzestrzenie i kodując każdą z nich jako dyskretny indeks. Dzięki temu zamiast przeszukiwać pełne wektory, algorytm porównuje ich zakodowane, uproszczone wersje — drastycznie redukując zużycie pamięci i czas obliczeń.

Silniki bazują na technikach Approximate Nearest Neighbor (ANN), by przyspieszyć wyszukiwanie kosztem dokładności (co często jest akceptowalne).

Bezpieczeństwo i wyzwania

  • Zarządzanie aktualizacjami osadzeń (embedding drift)

  • Przechowywanie i prywatność danych

  • Integracja z bazami metadanych (SQL/NoSQL)

  • Skalowanie i replikacja (dla dużych systemów produkcyjnych)

Podsumowanie

Bazy wektorowe nie zastępują klasycznych baz danych — uzupełniają je w kontekście AI i przetwarzania nieustrukturyzowanych danych. Jeśli tworzysz systemy rekomendacyjne, chatboty, aplikacje RAG lub przeszukujące duże zbiory danych – to narzędzie, które powinieneś poznać.

wtorek, 7 lipca 2015

ELK w praktyce

Wstęp

ELK(https://www.elastic.co/) - Elasticsearch + Logstash + Kibana, czyli grupa narzędzi pomagająca scentalizować logi.
Ostatnio w firmie zaprzegneliśmy ELK do zarządzania i analizowania access logów oraz logów aplikacyjnych.
 Po krótce opisze proces instalacji  i konfiguracji całego pakietu.

 

ElasticSearch

Sciągnij i zainstaluj ElasticSearch

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.1.deb
sudo dpkg -i elasticsearch-1.5.1.deb

zainstaluj  Java Service Wrapper dla ElasticSearch

curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
sudo mkdir /usr/local/share/elasticsearch
sudo mkdir /usr/local/share/elasticsearch/bin
sudo mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch

w pliku elasticsearch.yml odkomentuje i zmien na poprawny IP np:

network.host: 192.168.XXX.XXX


starujemy  ElasticSearch:

sudo service elasticsearch start

Upewnijmy się czy  service wystartował:

curl http://192.168.XXX.XXX:9200
 
odpowiedź powinna wyglądać mniej więcej tak:

{
  "status" : 200,
  "name" : "Storm",
  "version" : {
    "number" : "1.3.1",
    "build_hash" : "2de6dc5268c32fb49b205233c138d93aaf772015",
    "build_timestamp" : "2014-07-28T14:45:15Z",
    "build_snapshot" : false,
    "lucene_version" : "4.9"
  },
  "tagline" : "You Know, for Search"
 }

Logstash

instalujemy:
cd ~ 
wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz
tar xzvf logstash-1.4.2.tar.gz 
mv logstash-1.4.2 /opt/logstash
adduser --system --disabled-login --no-create-home --group logstash 
usermod -a -G adm logstash

#auto start script for logstash
# download init script 
wget -O /etc/init.d/logstash https://raw.githubusercontent.com/elasticsearch/logstash/master/pkg/logstash.sysv
# make it executable 
chmod +x /etc/init.d/logstash 
# make it auto-startable 
update-rc.d logstash defaults

# configure logstash folder

# create logstash config dir 
mkdir -p /etc/logstash/conf.d 
# create logstash logs dir 
mkdir /var/log/logstash 
chown -R logstash: /var/log/logstash 
# make home folder 
mkdir /var/lib/logstash 
chown -R logstash: /var/lib/logstash


konfiguracja Logstasha i Logstash-forwardera

tworzymy certyfikaty SSL

sudo mkdir -p /etc/pki/tls/certs
sudo mkdir /etc/pki/tls/private



OpenSSL configuration file:
sudo vi /etc/ssl/openssl.cnf

Znajdź sekcje  [ v3_ca ] w pliku, i dodaj pod ną natępujący wpis (oczywiście z prawidłowym namiarem na maszynkę z logstashem):
subjectAltName = IP: 192.168.XXX.YYY

Teraz wygeneruj certyfikat SSL i klucz prywatny  (/etc/pki/tls/),za pomoca komendy:
cd /etc/pki/tls
sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

konfigurujemy Logstasha


sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

wrzucamy konfiguracje input do pliku:
input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

sudo vi /etc/logstash/conf.d/10-syslog.conf


wrzucamy konfigurację filter do pliku:
filter {
 if [type] == "json" {
        json {
        source => "message"
        }
                }
if [type] == "accesslog" {
          grok {
                match => { "message" => "%{COMBINEDAPACHELOG}" }
        }
      
       date {
                locale => 'en'
                match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
        }
        }
}


sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
 

wrzucamy konfigurację output do pliku:

output {
        if [type] == "json" {
                elasticsearch {
                host => "192.168.XXX.XXX"
                port => "9200"
                protocol => "http"
                index => "json-logs-%{+YYYY.MM.dd}"
                }
                stdout { codec => rubydebug }
        }
}

kopiowanie certyfikatu SSL

Z serwera  Logstash , kopiujemy  SSL'a na drugi Server, gdzie będzie zaintsalowany logstash-forwarder:
scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp


konfiguracja Logstash Forwarder

 instalujemy:
wget https://download.elastic.co/logstash-forwarder/binaries/logstash-forwarder_linux_amd64
tar xzvf logstash-forwarder_linux_amd64 sudo chmod +x logstash-forwarder_linux_amd64
sudo mv logstash-forwarder_linux_amd64  /opt/logstash-forwarder/logstash-forwarder



cd /etc/init.d/; sudo wget https://raw.githubusercontent.com/elasticsearch/logstash-forwarder/a73e1cb7e43c6de97050912b5bb35910c0f8d0da/logstash-forwarder.init -O logstash-forwarder
sudo update-rc.d logstash-forwarder defaults

sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
sudo vi /etc/logstash-forwarder

w pliku wstawiamy:

{
  "network": {
    "servers": [ "192.168.XXX.YYY:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
  },
  "files": [
    {
      "paths": [
         "/path/to/json/log/file",
       ],
      "fields": { "type": "json" }
    }
   {
        "paths": [
           "/path/to/access/log/file"
         ],
        "fields": { "type": "accesslog" }
      }
   ]
}
sudo service logstash-forwarder restart
  

Instalacja Kibana


  cd ~
    wget https://download.elasticsearch.org/kibana/kibana/kibana-4.0.1-linux-x64.tar.gz
    tar xzvf kibana-4.0.1-linux-x64.tar.gz
    rm kibana-4.0.1-linux-x64.tar.gz
    mv kibana-4.0.1-linux-x64 /var/opt/kibana-4.0.1
#start screen which keeps running even if you disconnect your session
w pliku kibana.ymlzmieniamy wpis:
elasticsearch_url: "http://192.168.XXX.XXX:9200"
 
sudo wget https://gist.githubusercontent.com/thisismitch/8b15ac909aed214ad04a/raw/bce61d85643c2dcdfbc2728c55a41dab444dca20/kibana4
sudo chmod +x kibana4
sudo ./kibana4 start|stop|restart|status