RAG s Ollama a Qdrant jako univerzální vyhledávač vlastních dat

Ve stále nepřehlednějším světě informací je stále důležitější, aby bylo možné cíleně vyhledávat ve vlastních databázích - nikoli prostřednictvím klasického fulltextového vyhledávání, ale prostřednictvím sémanticky relevantních odpovědí. Právě zde vstupuje do hry princip databáze RAG - řešení pro vyhledávání s podporou umělé inteligence, které se skládá ze dvou ústředních komponent:


Aktuální témata umělé inteligence

  1. vektorovou databázi (například Qdrant), ve které je veškerý obsah uložen jako číselné vektory,
  2. a jazykový model (např. prostřednictvím Ollama), který inteligentně kombinuje příslušné požadavky s příslušným obsahem.

Namísto toho, aby model "hádal", využívá tato architektura své vlastní zdroje znalostí - např.:

  • vlastní dokumentární filmy,
  • Obsah webových stránek,
  • technické příručky,
  • Podpůrné databáze,
  • Seznamy často kladených otázek,
  • nebo archivované textové zdroje (např. ze starých databází).

Rozhodující faktor: Všechny tyto zdroje lze předem připravit a "rozdělit" (tj. rozdělit na malé textové jednotky), aby bylo možné později poskytnout nejrelevantnější úryvky textu pro otázku uživatele.

Ať už tedy chcete analyzovat vlastní znalostní databázi, interní dokumentaci nebo celý archiv produktů, s pomocí nástroje Ollama + Qdrant můžete to dělat na vlastním Macu, bez jakýchkoli cloudových omezení a s plnou kontrolou nad daty.

Co je to databáze RAG - a proč vůbec "chunking"?

RAG je zkratka pro Retrieval-Augmented Generation - jinými slovy: umělá inteligence generující text s asistencí při vyhledávání informací. Místo toho, aby jazykový model, jako je GPT, Mistral nebo LLaMA, trénoval pouze na tom, co již "zná", může přistupovat k dalším vlastním informacím prostřednictvím připojené znalostní databáze (obvykle tzv. vektorové databáze).

Příklad:

Pokud se jazykového modelu zeptáte: "Co je v mém daňovém přiznání za rok 2023?", bude muset bez přístupu k původním datům hádat. Pokud však má přístup k lokálně uložené vektorové reprezentaci tohoto dokumentu, může příslušné informace získat a zahrnout je do své odpovědi.

Proč je obsah "rozdělen na části"

Dokumenty, webové stránky nebo knihy jsou obvykle příliš dlouhé na to, aby se daly zpracovat nebo prohledat najednou. Moderní jazykové modely mají také limity tokenů - tj. omezenou délku textu, kterému mohou najednou porozumět (často kolem 4 000-8 000 tokenů, u novějších modelů dokonce 32 000 a více).

Proto RAG používá následující trik:

  1. Původní text je rozdělen na malé části (chunks).
  2. Každý kus je převeden na vektor pomocí jazykového modelu (embedding).
  3. Tyto vektory jsou uloženy v databázi, jako je například Qdrant.
  4. Když uživatel zadá požadavek, výzva se také převede na vektor - a vyhledají se nejpodobnější kousky.
  5. Tento obsah je pak přidán do jazykového modelu - např. prostřednictvím systémové výzvy nebo kontextové injekce.

Vzniká tak systém, který se chová jako paměť - ovšem bez klasických klíčových slov nebo fulltextového vyhledávání, ale čistě významově (sémanticky).

Požadavky a cíl

Budujeme místní systém RAG, který se skládá z:

  • místní LLM přes Ollama
  • vektorovou databázi Qdrant
  • skript v jazyce Python, který rozděluje, vektorizuje a vkládá texty do databáze.
  • Volitelně: jednoduché rozhraní nebo rozhraní API pro dotazování

Cílová platforma: macOS (Intel nebo Apple Silicon)

To je předpokladem:

  • macOS 12 nebo novější (Monterey nebo vyšší)
  • Základní znalosti terminálu
  • Python 3.10 nebo novější
  • Volitelné: Homebrew installiert

Krok 1: Ollama 1TP12Animal

Ollama je štíhlý nástroj, který umožňuje spouštět místní jazykové modely, jako jsou Mistral, LLaMA, Gemma nebo Codellama, na vlastním počítači - i bez internetu.

Instalace v počítači Mac:

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

Alternativně lze Ollama přiřadit také prostřednictvím Homebrew install:
brew install ollama

Po instalaci:

ollama run mistral

Stáhne se model Mistral 7B a spustí se lokálně. Ollama je dodáván s rozhraním REST API, které později použijeme pro vektorizaci. Můžete samozřejmě použít i jiné modely, například Gemma3 (12B), Mistral Small (24B) nebo jiné LLM.

Krok 2: Qdrant 1TP12 zvířata (místní databáze vektorů)

Qdrant je bleskurychlá vektorová databáze založená na architektuře Rust. Je zdarma, má otevřený zdrojový kód a lze ji snadno spustit na Macu - nejlépe pomocí Dockeru. Pokud ještě nemáte na svém Macu 1TP12 nainstalovaný Docker, můžete si ho stáhnout ze stránky Webové stránky společnosti Docker zdarma a spustit ji na Macu jako běžnou desktopovou aplikaci installieren. Alternativně můžete také nainstalovat Docker přes Homebrew install, pokud již používáte Homebrew:

brew install --cask docker

Poté spusťte Qdrant prostřednictvím nástroje Docker:

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

Qdrant je pak k dispozici na adrese

http://localhost:6333

Pro testování:

curl http://localhost:6333/collections

Krok 3: Příprava prostředí Pythonu

Potřebujeme Python pro chunking, embedding a komunikaci s Qdrantem.

Příprava:

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

Pokud není ollama rozpoznán jako balíček Pythonu, použijte rozhraní REST API přímo prostřednictvím požadavků:

pip install requests

Krok 4: Rozdělení na části a vložení

Níže naleznete příklad skriptu, který rozdělí textový dokument na části, vytvoří vložení pomocí Ollama a vloží je do Qdrantu:

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: Dotazy prostřednictvím sémantického vyhledávání

Nyní můžete do Qdrantu posílat dotazy jako vektor a nechat jej vyhledat nejrelevantnější části textu:

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"])

Tyto kousky pak můžete předat Ollama například prostřednictvím systémové výzvy a nechat je formulovat jako odpověď související s kontextem.

Chunking + export JSON do FileMaker a dalších databází

V mnoha případech může chunking probíhat již ve stávajícím databázovém řešení - například v FileMaker. Přesně tak to funguje v mém vlastním pracovním prostředí: zdrojová data - například obsah webových stránek, záznamy podpory nebo technické články - jsou již k dispozici ve strukturované podobě v FileMaker.

Tento proces funguje takto:

  1. Texty jsou v rámci FileMaker rozděleny na úseky o délce např. 300-500 znaků pomocí vlastní logiky chunkingu.
  2. Každé části je přiřazeno vlastní ID a případně metadata (název, kategorie, zdroj, jazyk atd.).
  3. Všechny chunky jsou automaticky exportovány jako soubory JSON - např. do určitého adresáře na síťovém disku nebo přímo na pevný disk serveru AI.
  4. Skript v jazyce Python na serveru načte tyto soubory JSON a uloží je do databáze Qdrant.

Příklad exportovaného souboru 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"
}
}

Následný importní skript pak lze spouštět automaticky nebo pravidelně prostřednictvím terminálu - např. pomocí úlohy cron nebo ručního volání:

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

Skript přečte každý kus JSON, vygeneruje odpovídající vektor (např. pomocí Ollama nebo SentenceTransformers) a přenese záznam do databáze Qdrant.

Tato metoda je nejen transparentní, ale lze ji také velmi dobře kombinovat se stávajícími strukturami IT - zejména ve firmách, které již používají FileMaker nebo mají rády z důvodu přehlednosti procesů vše mapovat centrálně a vizuálně řídit.

Připojení všech databází k místní UI

Pomocí Ollama a Qdrant lze na Macu v krátké době vytvořit kompletní, vysoce výkonný systém RAG:

  • Místní, bez cloudu nebo předplatného
  • Rozšiřitelné o vlastní obsah
  • Data jsou v bezpečí, protože nic neopouští počítač
  • Efektivní, protože Qdrant zůstává rychlý i při velkém množství dat.

Pokud chcete umělou inteligenci používat nejen pro chatování, ale jako skutečný znalostní a paměťový systém, je tato kombinace nutností. A funguje bez většího úsilí - s plnou kontrolou nad vlastními daty.


Aktuální průzkum používání místních systémů umělé inteligence

Co si myslíte o lokálně provozovaném softwaru AI, jako je MLX nebo Ollama?

Výhled: Co je možné s RAG, Ollama a Qdrant

Nastavení popsané v tomto článku tvoří technický základ pro nový způsob nakládání se znalostmi - lokální, kontrolovaný a flexibilně rozšiřitelný. Tím však cesta v žádném případě nekončí. Jakmile pochopíte souhru chunkingu, embeddingu, sémantického vyhledávání a jazykových modelů, rychle si uvědomíte, jak univerzální je tato architektura v praxi.

1. připojení k vlastním databázím

Ať už se jedná o FileMaker, MySQL, PostgreSQL nebo MongoDB - jakýkoli obsah lze pravidelně extrahovat, rozdělit na části a automaticky vložit do databáze vektorů pomocí cílených dotazů. Tím se klasická databáze změní na sémanticky prohledávatelný zdroj znalostí. Zejména v podpůrných systémech, produktových archivech nebo digitálních knihovnách se tak otevírají zcela nové možnosti přístupu pro zaměstnance nebo zákazníky.

2. automatický import webových stránek, souborů PDF nebo dokumentů

Obsah není nutné přenášet ručně. Pomocí nástrojů, jako jsou BeautifulSoup, readability, pdfplumber nebo docx2txt, lze automaticky importovat celé webové stránky, příručky PDF nebo dokumenty Word, převést je do textové podoby a připravit pro chunking. Například technické wiki, zákaznické portály nebo online dokumentaci lze pravidelně aktualizovat a vkládat do databáze RAG.

3. dlouhodobé budování znalostí prostřednictvím strukturování

Na rozdíl od klasické aplikace umělé inteligence, která s každou otázkou začíná od nuly, umožňuje nastavení RAG postupné rozšiřování a kurátorství základních znalostí. Cílený výběr a příprava částí vytváří vlastní sémantickou paměť, která se s každým dalším zadáním stává hodnotnější.

4. propojení se znalostními grafy (Neo4j)

Pokud chcete jít ještě o krok dál, můžete informace nejen sémanticky ukládat, ale také je logicky propojit. Pomocí grafové databáze Neo4j lze vizualizovat vztahy mezi pojmy, osobami, tématy nebo kategoriemi a cíleně se na ně dotazovat. Tím se soubor textů změní ve strukturovaný znalostní graf, který mohou využívat jak lidé, tak umělá inteligence - např. k vizualizaci kauzálních řetězců, časových posloupností nebo tematických shluků.

5. použití ve vlastních nástrojích, aplikacích nebo chatbotech

Po nastavení lze logiku RAG integrovat do téměř jakékoli aplikace: jako funkci sémantického vyhledávání v interní webové aplikaci, jako inteligentní vstupní pomůcku v systému CRM nebo jako chatbota s vlastními odbornými znalostmi na webových stránkách společnosti. Díky využití lokálních rozhraní API (např. Ollama REST a Qdrant gRPC) zůstávají všechny komponenty flexibilní a rozšiřitelné - a to i za tradiční hranice společnosti.

Ti, kteří mají odvahu se s těmito nástroji seznámit, vytvářejí základ nezávislých lokálních systémů umělé inteligence se skutečnou užitnou hodnotou - v duchu kontroly, suverenity a technické čistoty.


Aktuální témata týkající se softwaru ERP

Často kladené dotazy týkající se RAG s Ollama + Qdrant

1. co je databáze RAG a k čemu je dobrá?

Databáze RAG (Retrieval Augmented Generation) kombinuje vektorovou databázi s jazykovým modelem. Umožňuje sémanticky prohledávat vlastní obsah - např. dokumentaci nebo webové stránky - tak, aby modely umělé inteligence mohly cíleně přistupovat k příslušným částem vlastní databáze.

2 Co v tomto kontextu znamená "chunking"?

Chunking znamená rozdělení dlouhých textů na menší, smysluplně ucelené části (chunks) - obvykle v rozsahu 200 až 500 znaků. To umožňuje efektivně ukládat jednotlivé úseky textu do databáze vektorů a později je vyhledat, když se objeví otázky.

3. proč nelze jednoduše uložit celé texty v Qdrantu?

Protože modely AI a vektorové vyhledávání pracují s omezenou délkou textu. Velké dokumenty by "skryly" důležitý obsah nebo by jej učinily nepřesným. Chunking zvyšuje přesnost, protože se porovnávají konkrétní úseky namísto celých textů.

4. mohu použít obsah z jakéhokoli zdroje?

Ano, pokud máte texty v editovatelné podobě (např. jako prostý text, HTML, Markdown, PDF, záznamy FileMaker atd.), můžete je připravit, rozdělit a integrovat do Qdrantu. Možné jsou i smíšené zdroje.

5. musím umět programovat, abych mohl takový systém vytvořit?

Základní znalost terminálu a jazyka Python je užitečná, ale není nezbytná. Mnoho kroků (např. chunking v FileMaker, export JSON) lze realizovat vizuálně a automaticky. Importní skript Qdrant lze snadno přizpůsobit.

6. mohu spravovat i několik dokumentů nebo kategorií?

Ano, každý oddíl může obsahovat metadata - např. název, zdroj, jazyk nebo kategorii. Tyto údaje lze při vyhledávání zohlednit, aby bylo možné přesněji filtrovat výsledky.

7 Které modely jsou vhodné pro generování embeddingu?

Můžete použít buď lokální model přes Ollama (např. mistral, llama2, gemma), nebo samostatný model pro vkládání, jako je all-MiniLM z větných transformátorů. Důležité je, aby model generoval výstupy vkládání jako vektory.

8. jak spustím Qdrant na Macu?

Nejjednodušší způsob je pomocí příkazu Docker:

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

Qdrant pak běží pod http://localhost:6333

9. jak velké mohou být mé datové objemy?

Qdrant je velmi výkonný a snadno zvládne desítky nebo stovky tisíc kusů. Hlavním omezením je paměť RAM a úložný prostor, nikoli jejich počet.

10. funguje to také s FileMaker?

Ano, veškeré chunkování a export JSON můžete provádět přímo v FileMaker. Chunky se exportují jako jednotlivé soubory JSON, které se pak importují do Qdrantu pomocí skriptu Python - zcela nezávisle na původním systému.

11. mohu to také spustit na jiném serveru místo Macu?

Rozhodně. Nastavení funguje také na serverech s Linuxem, Raspberry Pi nebo v cloudu (pokud chcete). Díky nástroji Docker je nezávislý na platformě. Pro produktivní použití se obvykle doporučuje server s větší pamětí RAM a podporou GPU.

12. jak mohu kombinovat vyhledávání vektorů s Ollama?

Nejprve vytvoříte vektor pro uživatelskou otázku prostřednictvím rozhraní Ollama (Embedding API), použijete jej k vyhledání nejrelevantnějších částí v Qdrant a předáte je jazykovému modelu jako kontext. Ollama poté zpracuje otázku + kontextově relevantní informace a vygeneruje fundovanou odpověď.

Obrázek (c) geralt @ pixabay

Napsat komentář