RAG z Ollama i Qdrant jako uniwersalna wyszukiwarka własnych danych

W coraz bardziej zagmatwanym świecie informacji coraz ważniejsze staje się umożliwienie przeszukiwania własnych baz danych w ukierunkowany sposób - nie poprzez klasyczne wyszukiwanie pełnotekstowe, ale poprzez semantycznie istotne odpowiedzi. Właśnie w tym miejscu do gry wkracza baza danych RAG - rozwiązanie wyszukiwania wspierane przez sztuczną inteligencję, składające się z dwóch centralnych komponentów:


Aktualne tematy dotyczące sztucznej inteligencji

  1. wektorowa baza danych (taka jak Qdrant), w której dowolna zawartość jest przechowywana jako wektory liczbowe,
  2. i model językowy (np. za pośrednictwem Ollama), który inteligentnie łączy odpowiednie żądania z odpowiednią treścią.

Zamiast pozwalać modelowi „zgadywać“, architektura ta wykorzystuje własne źródła wiedzy - na przykład:

  • samodzielnie napisane filmy dokumentalne,
  • Zawartość stron internetowych,
  • instrukcje techniczne,
  • Obsługa baz danych,
  • Listy FAQ,
  • lub jakiekolwiek zarchiwizowane źródła tekstu (np. ze starych baz danych).

Decydujący czynnik: Wszystkie te źródła mogą być przygotowane z wyprzedzeniem i „chunked“ (tj. podzielone na małe jednostki tekstowe), aby móc później dostarczyć najbardziej odpowiednie fragmenty tekstu na pytanie użytkownika.

Niezależnie od tego, czy chcesz analizować własną bazę wiedzy, dokumentację wewnętrzną czy całe archiwum produktów - dzięki Ollama + Qdrant Możesz to zrobić na własnym komputerze Mac, bez żadnych ograniczeń w chmurze i z pełną kontrolą nad danymi.

Czym jest baza danych RAG - i dlaczego w ogóle „chunking“?

RAG to skrót od Retrieval-Augmented Generation - innymi słowy: sztuczna inteligencja generująca tekst ze wspomaganym wyszukiwaniem informacji. Zamiast trenować model językowy, taki jak GPT, Mistral lub LLaMA tylko na tym, co już „wie“, może on uzyskać dostęp do dodatkowych informacji za pośrednictwem połączonej bazy danych wiedzy (zwykle tak zwanej wektorowej bazy danych).

Przykład:

Jeśli zapytasz model językowy: „Co jest w moim zeznaniu podatkowym za 2023 rok?“, będzie on musiał zgadywać bez dostępu do oryginalnych danych. Jeśli jednak ma dostęp do lokalnie przechowywanej, wektorowej reprezentacji tego dokumentu, może pobrać odpowiednie informacje i uwzględnić je w swojej odpowiedzi.

Dlaczego zawartość jest „dzielona“

Dokumenty, strony internetowe lub książki są zwykle zbyt długie, aby można je było przetwarzać lub przeszukiwać za jednym razem. Nowoczesne modele językowe mają również limity tokenów - tj. ograniczoną długość tekstu, który mogą zrozumieć jednocześnie (często około 4000-8000 tokenów, w nowszych modelach nawet 32 000 lub więcej).

Dlatego RAG stosuje następującą sztuczkę:

  1. Oryginalny tekst jest podzielony na małe sekcje (fragmenty).
  2. Każdy fragment jest konwertowany na wektor przez model językowy (osadzanie).
  3. Wektory te są przechowywane w bazie danych, takiej jak Qdrant.
  4. Gdy użytkownik wysyła żądanie, monit jest również tłumaczony na wektor - i pobierane są najbardziej podobne fragmenty.
  5. Zawartość ta jest następnie dodawana do modelu językowego - np. za pomocą monitu systemowego lub wstrzyknięcia kontekstowego.

Tworzy to system, który zachowuje się jak pamięć - ale bez klasycznych słów kluczowych lub wyszukiwania pełnotekstowego, ale wyłącznie w oparciu o znaczenie (semantyczne).

Wymagania i cel

Budujemy lokalny system RAG składający się z:

  • lokalny LLM przez Ollama
  • wektorowa baza danych o nazwie Qdrant
  • skrypt Pythona, który dzieli, wektoryzuje i wstawia teksty do bazy danych
  • Opcjonalnie: prosty interfejs lub API do wysyłania zapytań

Platforma docelowa: macOS (Intel lub Apple Silicon)

Jest to warunek wstępny:

  • macOS 12 lub nowszy (Monterey lub nowszy)
  • Podstawowa znajomość terminali
  • Python 3.10 lub nowszy
  • Opcjonalnie: Homebrew installiert

Krok 1: Ollama 1TP12Animal

Ollama to proste narzędzie, które umożliwia uruchamianie lokalnych modeli językowych, takich jak Mistral, LLaMA, Gemma lub Codellama, na własnym komputerze - nawet bez Internetu.

Instalacja na komputerze Mac:

curl -fsSL https://ollama.com/install.sh | sh

Alternatywnie, Ollama można również przypisać za pośrednictwem Homebrew install:
brew install ollama

Po instalacji:

ollama run mistral

Spowoduje to pobranie modelu Mistral 7B i uruchomienie go lokalnie. Ollama jest dostarczany z interfejsem API REST, którego użyjemy później do wektoryzacji. Oczywiście można również użyć innych modeli, takich jak Gemma3 (12B), Mistral Small (24B) lub innych LLM.

Krok 2: Zwierzęta Qdrant 1TP12 (lokalna baza danych wektorów)

Qdrant to błyskawiczna wektorowa baza danych oparta na Rust. Jest darmowa, open source i łatwa do uruchomienia na Macu - najlepiej za pośrednictwem Dockera. Jeśli nie zainstalowałeś jeszcze Dockera na swoim Macu 1TP12, możesz pobrać go ze strony Strona internetowa Docker i uruchomić go na komputerze Mac jako zwykłą aplikację komputerową installieren. Alternatywnie, można również zainstalować Docker za pośrednictwem Homebrew install, jeśli używasz już Homebrew:

brew install --cask docker

Następnie uruchom Qdrant przez Docker:

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant jest dostępny pod adresem

http://localhost:6333

Do testowania:

curl http://localhost:6333/collections

Krok 3: Przygotowanie środowiska Python

Potrzebujemy Pythona do chunkingu, osadzania i komunikacji z Qdrant.

Przygotowanie:

python3 -m venv rag-env
source rag-env/bin/activate
pip install qdrant-client sentence-transformers ollama numpy

Jeśli ollama nie jest rozpoznawana jako pakiet Pythona, użyj interfejsu API REST bezpośrednio za pośrednictwem żądań:

pip install requests

Krok 4: Chunking i osadzanie

Poniżej znajduje się przykładowy skrypt, który dzieli dokument tekstowy na fragmenty, tworzy osadzenia za pomocą Ollama i wstawia je do Qdrant:

import requests
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct
import uuid

# Konfiguration
CHUNK_SIZE = 500 # Zeichen
COLLECTION_NAME = "mein_rag_wissen"

# Text vorbereiten
with open("mein_text.txt", "r") as f:
text = f.read()

chunks = [text[i:i+CHUNK_SIZE] for i in range(0, len(text), CHUNK_SIZE)]

# Qdrant vorbereiten
client = QdrantClient("localhost", port=6333)

# Neue Collection anlegen (falls noch nicht vorhanden)
client.recreate_collection(
collection_name=COLLECTION_NAME,
vectors_config={"size": 4096, "distance": "Cosine"}
)

def get_embedding_ollama(text):
response = requests.post(
"http://localhost:11434/api/embeddings",
json={"model": "mistral", "prompt": text}
)
return response.json()["embedding"]

# Embeddings erzeugen und in Qdrant speichern
points = []
for i, chunk in enumerate(chunks):
vector = get_embedding_ollama(chunk)
points.append(PointStruct(
id=str(uuid.uuid4()),
vector=vector,
payload={"text": chunk}
))

client.upsert(collection_name=COLLECTION_NAME, points=points)
print(f"{len(points)} Chunks erfolgreich eingefügt.")

Krok 5: Zapytania poprzez wyszukiwanie semantyczne

Możesz teraz wysyłać zapytania jako wektor do Qdrant i poprosić go o znalezienie najbardziej odpowiednich fragmentów tekstu:

query = "Wie funktioniert ein RAG-System?"
query_vector = get_embedding_ollama(query)

results = client.search(
collection_name=COLLECTION_NAME,
query_vector=query_vector,
limit=3
)

for r in results:
print(r.payload["text"])

Następnie można przekazać te fragmenty do Ollama na przykład za pośrednictwem monitu systemowego i sformułować je jako odpowiedź związaną z kontekstem.

Chunking + eksport JSON do FileMaker i innych baz danych

W wielu przypadkach chunking może odbywać się już w istniejącym rozwiązaniu bazodanowym - na przykład w FileMaker. Dokładnie tak to działa w moim własnym środowisku pracy: dane źródłowe - takie jak zawartość strony internetowej, wpisy pomocy technicznej lub artykuły techniczne - są już dostępne w ustrukturyzowanej formie w FileMaker.

Oto jak działa ten proces:

  1. Teksty są dzielone na sekcje o długości np. 300-500 znaków w ramach FileMaker przy użyciu własnej logiki dzielenia na fragmenty.
  2. Każdy fragment otrzymuje swój własny identyfikator i, jeśli ma to zastosowanie, metadane (tytuł, kategoria, źródło, język itp.).
  3. Wszystkie fragmenty są automatycznie eksportowane jako pliki JSON - np. do określonego katalogu na dysku sieciowym lub bezpośrednio na dysk twardy serwera AI.
  4. Skrypt Python na serwerze odczytuje te pliki JSON i zapisuje je w bazie danych Qdrant.

Przykład wyeksportowanego pliku chunk (chunk_00017.json)

{
"id": "00017",
"text": "Dies ist ein einzelner Textabschnitt mit ca. 400 Zeichen, der aus einer größeren Quelle stammt. Er wurde in FileMaker vorbereitet und enthält alle relevanten Inhalte, die für eine semantische Suche benötigt werden.",
"metadata": {
"source": "support_center",
"category": "Fehlermeldung",
"language": "de",
"title": "Drucker wird nicht erkannt"
}
}

Późniejszy skrypt importu może być następnie wykonywany automatycznie lub regularnie za pośrednictwem terminala - np. poprzez zadanie cron lub ręczne wywołanie:

python3 import_json_chunks.py /Users/markus/Desktop/chunks/

Skrypt odczytuje każdy fragment JSON, generuje odpowiedni wektor (np. za pomocą Ollama lub SentenceTransformers) i przesyła wpis do bazy danych Qdrant.

Metoda ta jest nie tylko przejrzysta, ale może być również bardzo dobrze połączona z istniejącymi strukturami IT - szczególnie w firmach, które już korzystają z FileMaker lub lubią mapować wszystko centralnie i kontrolować wizualnie ze względu na przejrzystość procesu.

Podłącz dowolne bazy danych do lokalnej sztucznej inteligencji

Dzięki Ollama i Qdrant, kompletny, wysokowydajny system RAG można skonfigurować na komputerze Mac w krótkim czasie:

  • Lokalnie, bez chmury lub subskrypcji
  • Możliwość rozbudowy o własną zawartość
  • Dane są bezpieczne, ponieważ nic nie opuszcza komputera
  • Wydajny, ponieważ Qdrant pozostaje szybki nawet przy dużych ilościach danych

Jeśli chcesz używać swojej sztucznej inteligencji nie tylko do czatowania, ale jako prawdziwego systemu wiedzy i pamięci, ta kombinacja jest koniecznością. I działa przy niewielkim wysiłku - z pełną kontrolą nad własnymi danymi.


Aktualne badanie dotyczące korzystania z lokalnych systemów AI

Co sądzisz o lokalnie uruchamianym oprogramowaniu AI, takim jak MLX lub Ollama?

Perspektywy: Co jest możliwe dzięki RAG, Ollama i Qdrant?

Konfiguracja opisana w tym artykule stanowi techniczną podstawę nowego sposobu radzenia sobie z wiedzą - lokalną, kontrolowaną i elastycznie rozszerzalną. Na tym jednak podróż się nie kończy. Po zrozumieniu wzajemnego oddziaływania chunkingu, osadzania, wyszukiwania semantycznego i modeli językowych, szybko zdasz sobie sprawę, jak wszechstronna jest ta architektura w praktyce.

1. połączenie z własnymi bazami danych

Niezależnie od tego, czy jest to FileMaker, MySQL, PostgreSQL czy MongoDB - dowolna zawartość może być regularnie wyodrębniana, dzielona na fragmenty i automatycznie wstawiana do wektorowej bazy danych za pomocą ukierunkowanych zapytań. W ten sposób klasyczna baza danych staje się semantycznie przeszukiwalnym źródłem wiedzy. Szczególnie w systemach wsparcia, archiwach produktów lub bibliotekach cyfrowych otwiera to zupełnie nowe możliwości dostępu dla pracowników lub klientów.

2. automatyczny import stron internetowych, plików PDF lub dokumentów

Treści nie muszą być przenoszone ręcznie. Dzięki narzędziom takim jak BeautifulSoup, readability, pdfplumber lub docx2txt, całe strony internetowe, instrukcje PDF lub dokumenty Word mogą być automatycznie importowane, konwertowane do postaci tekstowej i przygotowywane do chunkingu. Na przykład techniczne wiki, portale dla klientów lub dokumentacja online mogą być regularnie aktualizowane i wprowadzane do bazy danych RAG.

3. długoterminowe budowanie wiedzy poprzez strukturyzację

W przeciwieństwie do klasycznej aplikacji AI, która zaczyna od zera przy każdym pytaniu, konfiguracja RAG pozwala na stopniowe rozszerzanie i kuratorowanie podstawowej wiedzy. Ukierunkowana selekcja i przygotowanie fragmentów tworzy własną pamięć semantyczną, która staje się bardziej wartościowa z każdym wpisem.

4. połączenie z grafami wiedzy (Neo4j)

Jeśli chcesz pójść o krok dalej, możesz nie tylko przechowywać informacje semantycznie, ale także łączyć je logicznie. Dzięki Neo4j, grafowej bazie danych, relacje między terminami, osobami, tematami lub kategoriami mogą być wizualizowane i specjalnie wyszukiwane. Przekształca to zbiór tekstów w ustrukturyzowany graf wiedzy, który może być wykorzystywany zarówno przez ludzi, jak i sztuczną inteligencję - np. do wizualizacji łańcuchów przyczynowych, sekwencji czasowych lub klastrów tematycznych.

5. używać we własnych narzędziach, aplikacjach lub chatbotach

Po skonfigurowaniu, logika RAG może być zintegrowana z niemal każdą aplikacją: jako funkcja wyszukiwania semantycznego w wewnętrznej aplikacji internetowej, jako inteligentna pomoc w systemie CRM lub jako chatbot z własną wiedzą na stronie internetowej firmy. Dzięki wykorzystaniu lokalnych interfejsów API (np. Ollama REST i Qdrant gRPC), wszystkie komponenty pozostają elastyczne i rozszerzalne - nawet poza tradycyjnymi granicami firmy.

Ci, którzy mają odwagę zapoznać się z tymi narzędziami, tworzą podstawy niezależnych, lokalnych systemów sztucznej inteligencji o rzeczywistej wartości użytkowej - w duchu kontroli, suwerenności i przejrzystości technicznej.


Aktualne tematy związane z oprogramowaniem ERP

Często zadawane pytania dotyczące RAG z Ollama + Qdrant

1. Co to jest baza danych RAG i do czego służy?

Baza danych RAG (Retrieval Augmented Generation) łączy wektorową bazę danych z modelem językowym. Umożliwia to semantyczne przeszukiwanie własnych treści - np. dokumentacji lub stron internetowych - dzięki czemu modele sztucznej inteligencji mogą uzyskać dostęp do odpowiednich sekcji własnej bazy danych.

2 Co oznacza „chunking“ w tym kontekście?

Chunking oznacza dzielenie długich tekstów na mniejsze, spójne sekcje (fragmenty) - zwykle od 200 do 500 znaków. Pozwala to na efektywne zapisywanie poszczególnych fragmentów tekstu w bazie danych wektorów i ich późniejsze wyszukiwanie w przypadku pojawienia się pytań.

3. dlaczego nie można po prostu zapisywać całych tekstów w Qdrant?

Ponieważ modele AI i wyszukiwanie wektorowe działają z ograniczoną długością tekstu. Duże dokumenty mogłyby „ukryć“ ważne treści lub sprawić, że byłyby one niedokładne. Chunking zwiększa dokładność, ponieważ porównywane są określone sekcje zamiast całych tekstów.

4. Czy mogę używać treści z dowolnego źródła?

Tak, o ile masz teksty w edytowalnej formie (np. jako zwykły tekst, HTML, Markdown, PDF, wpisy FileMaker itp.), możesz je przygotować, podzielić i zintegrować z Qdrant. Możliwe są również źródła mieszane.

5. Czy muszę umieć programować, aby zbudować taki system?

Podstawowa znajomość Terminala i Pythona jest pomocna, ale nie niezbędna. Wiele kroków (np. chunking w FileMaker, eksport JSON) można zaimplementować wizualnie i automatycznie. Skrypt importu Qdrant można łatwo dostosować.

6. Czy mogę również zarządzać kilkoma dokumentami lub kategoriami?

Tak, każdy fragment może zawierać metadane - np. tytuł, źródło, język lub kategorię. Mogą one być brane pod uwagę podczas wyszukiwania w celu dokładniejszego filtrowania wyników.

7 Które modele są odpowiednie do generowania embeddingu?

Można użyć lokalnego modelu za pośrednictwem Ollama (np. mistral, llama2, gemma) lub oddzielnego modelu osadzania, takiego jak all-MiniLM z transformatorów zdań. Ważne jest, aby model generował dane wyjściowe osadzania jako wektory.

8. Jak uruchomić Qdrant na komputerze Mac?

Najprostszym sposobem jest polecenie Docker:

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Następnie Qdrant działa pod http://localhost:6333

9. Jak duże mogą być moje wolumeny danych?

Qdrant jest bardzo wydajny i może z łatwością zarządzać dziesiątkami lub setkami tysięcy fragmentów. Głównym ograniczeniem jest pamięć RAM i przestrzeń dyskowa, a nie ich liczba.

10. Czy to działa również z FileMaker?

Tak, można wykonać cały chunking i eksport JSON bezpośrednio w FileMaker. Fragmenty są eksportowane jako pojedyncze pliki JSON, które są następnie importowane do Qdrant za pomocą skryptu Python - całkowicie niezależnie od oryginalnego systemu.

11. Czy mogę również uruchomić to na innym serwerze zamiast na Macu?

Oczywiście. Konfiguracja działa również na serwerach Linux, Raspberry Pi lub w chmurze (w razie potrzeby). Docker czyni ją niezależną od platformy. Do produktywnego użytku zwykle zalecany jest serwer z większą ilością pamięci RAM i obsługą GPU.

12. Jak połączyć wyszukiwanie wektorowe z Ollama?

Najpierw tworzysz wektor dla pytania użytkownika za pośrednictwem Ollama (Embedding API), używasz go do wyszukiwania najbardziej odpowiednich fragmentów w Qdrant i przekazujesz je do modelu językowego jako kontekst. Następnie Ollama przetwarza pytanie + informacje związane z kontekstem i generuje dobrze uzasadnioną odpowiedź.

Zdjęcie (c) geralt @ pixabay

Zostaw komentarz