Obsah
Weaviate
Weaviate je open-source, AI-nativní vektorová databáze (původně koncipovaná jako vektorový znalostní graf). Byla vyvinuta v jazyce Go a navržena s primárním cílem usnadnit vývojářům tvorbu aplikací založených na strojovém učení (ML) a velkých jazykových modelech (LLM).
Na rozdíl od tradičních databází, které vyhledávají přesné shody klíčových slov, Weaviate umožňuje sémantické vyhledávání – hledá objekty na základě jejich významu a kontextu pomocí vícerozměrných vektorů (tzv. embeddings).
Klíčové vlastnosti
Weaviate se od jiných vektorových databází (jako je např. Milvus) odlišuje silným zaměřením na „Developer Experience“ (vývojářský komfort) a schopností provádět operace přímo nad databází bez nutnosti složitého externího potrubí (pipeline).
- Automatická vektorizace (Moduly): Weaviate se umí přímo napojit na modely od OpenAI, Hugging Face, Cohere a dalších. Vývojář do databáze vloží pouze čistý text (nebo obrázek) a Weaviate si sám zavolá příslušný model, vygeneruje vektor a data uloží.
- Hybridní vyhledávání (Hybrid Search): Databáze exceluje v kombinování tradičního vyhledávání podle klíčových slov (algoritmus BM25) s vektorovým sémantickým vyhledáváním. Výsledky obou metod následně spojí (pomocí algoritmu Reciprocal Rank Fusion), což poskytuje maximální relevanci.
- Generativní vyhledávání (RAG out-of-the-box): Umožňuje rovnou s dotazem poslat instrukci pro LLM. Weaviate nejprve najde relevantní dokumenty a rovnou je předá jazykovému modelu (např. GPT-4), který z nich vygeneruje finální odpověď.
- GraphQL API: Historicky Weaviate silně sázel na dotazovací jazyk GraphQL, který umožňuje velmi flexibilní získávání prolinkovaných dat. Dnes nabízí i moderní gRPC rozhraní pro maximální rychlost a nízkoúrovňové REST API.
Architektura a indexování
Weaviate používá pro efektivní vyhledávání kombinaci několika datových struktur:
Vektorový index: HNSW
Pro hledání podobností ve vektorech využívá Weaviate vlastní, vysoce optimalizovanou implementaci algoritmu HNSW (Hierarchical Navigable Small World). Tento index drží v paměti (RAM), což zajišťuje sub-milisekundovou latenci při vyhledávání.
Protože je ale HNSW extrémně náročný na kapacitu RAM (jak bylo popsáno v příslušném článku), Weaviate postupně zavedl techniky pro úsporu paměti:
- Product Quantization (PQ): Technika ztrátové komprese, která zmenší velikost vektorů v paměti až o 70–90 % za cenu zanedbatelné ztráty přesnosti.
- Vektorový index na disku: Pro masivní datasety přidal Weaviate podporu pro ukládání indexů na rychlé NVMe SSD, čímž řeší podobný problém jako DiskANN.
Invertovaný index
Pro klasické vyhledávání klíčových slov (BM25) a rychlé filtrování metadat (např. „najdi podobné články, ale pouze ty vydané v roce 2023“) udržuje Weaviate tradiční invertovaný index, podobně jako Elasticsearch.
Srovnání: Weaviate vs. Milvus
Ačkoliv obě řešení patří na špičku mezi vektorovými databázemi, mají mírně odlišnou filozofii:
| Vlastnost | Weaviate | Milvus |
|---|---|---|
| Hlavní zaměření | Integrované „AI-native“ řešení, snadné použití, hybridní hledání. | Maximální škálovatelnost, obří datové clustery, podpora různých indexů. |
| Vektorizace | Umí data vektorizovat sám (integrované moduly pro LLM). | Dříve čistě BYOV (Bring Your Own Vectors), dnes už integrace také přidává. |
| Indexy | Primárně HNSW s PQ. | HNSW, IVF_FLAT, DiskANN a řada dalších. |
| Datový model | Objektově orientovaný (Třídy a Vlastnosti), podpora GraphQL. | Tradičnější tabulkový/kolekční přístup s primárními klíči. |
Základní ukázka kódu (Python)
Pro interakci s databází Weaviate se nejčastěji používá Python klient v4:
import weaviate import weaviate.classes.config as wc # Připojení k lokální instanci Weaviate běžící v Dockeru client = weaviate.connect_to_local() try: # Vytvoření kolekce s automatickou vektorizací (např. přes OpenAI) client.collections.create( name="Clanek", vectorizer_config=wc.Configure.Vectorizer.text2vec_openai(), ) # Vložení dat (vektor se vytvoří automaticky na pozadí) clanky = client.collections.get("Clanek") clanky.data.insert({ "titulek": "Úvod do vektorových databází", "obsah": "Vektorové databáze jsou základem pro RAG..." }) # Hybridní vyhledávání response = clanky.query.hybrid( query="jak fungují vektory", limit=2 ) for obj in response.objects: print(obj.properties["titulek"]) finally: client.close()
