Vektor-Datenbanken - Semantische Suche & RAG
VelinScript bietet native Unterstützung für Vektor-Datenbanken für semantische Suche, Retrieval Augmented Generation (RAG) und Embedding-basierte Anwendungen.
Übersicht
Vektor-Datenbanken speichern Daten als hochdimensionale Vektoren (Embeddings) und ermöglichen semantische Suche basierend auf Ähnlichkeit statt exakter Schlüsselwort-Matches.
Pinecone
Cloud-basiert & Scalable
Weaviate
Open-Source & GraphQL
Qdrant
High Performance Rust
Local
In-Memory Development
Quick Start
Initialisieren Sie eine Vektor-Datenbank und führen Sie eine semantische Suche in wenigen Schritten durch:
use ml;
use embedding;
// 1. VectorDB initialisieren
let vectorDB = VectorDB::new(
VectorDBProvider::Pinecone,
"https://your-index.svc.environment.pinecone.io"
);
// 2. Embedding generieren
let llmClient = LLMClient::new(LLMProvider::OpenAI, apiKey);
let vec = llmClient.embed("Dies ist ein Beispieltext");
// 3. Vektor speichern
vectorDB.upsert("documents", "doc-1", vec);
// 4. Semantische Suche
let results = vectorDB.search("documents", vec, 5);Embedding-Modul
Das embedding Modul bietet grundlegende Funktionen für Vektor-Operationen:
use embedding
// Ähnlichkeit berechnen (Cosine Similarity: 0.0 bis 1.0)
let similarity = embedding.similarity(vec1, vec2);
// Vektor normalisieren (Länge = 1.0)
let normalized = embedding.normalize(vec);
// Dimensionen abfragen
let dims = embedding.dimension(vec); // z.B. 1536Vollständiges RAG-System
RAG (Retrieval Augmented Generation) füttert LLMs mit relevantem Kontext aus Ihren Dokumenten:
use ml;
use embedding;
@POST("/api/rag/query")
fn ragQuery(question: string): string {
let llm = LLMClient::new(LLMProvider::OpenAI, apiKey);
let vdb = VectorDB::new(VectorDBProvider::Pinecone, endpoint);
// 1. Suche relevante Dokumente
let queryVec = llm.embed(question);
let results = vdb.search("docs", queryVec, 5).unwrap();
// 2. Erstelle Kontext
let context = results.map(|res| {
let doc = db.find(Document, res.id);
return doc.content;
}).join("\n\n");
// 3. LLM mit Kontext generieren
let prompt = format("""
Kontext: {}
Frage: {}
Antworte nur basierend auf dem Kontext.
""", context, question);
return llm.generate(prompt);
}Empfehlungssysteme
Nutzen Sie Vektoren, um ähnliche Produkte oder Inhalte basierend auf ihrer Bedeutung zu finden:
@GET("/api/items/:id/similar")
fn getSimilarItems(id: string, limit: number): List<Item> {
let item = db.find(Item, id);
// Suche ähnliche Items in der "items" Collection
let results = vectorDB.search("items", item.embedding, limit);
return results.unwrap()
.filter(|res| res.id != id) // Original ausschließen
.map(|res| db.find(Item, res.id));
}Fehlerbehandlung
Robuste Integration durch Result-Typen für alle Vektor-Operationen:
let result = vectorDB.upsert("docs", id, vec);
match result {
Ok(_) => log.info("Erfolgreich gespeichert"),
Err(e) => log.error("Vektor-Fehler: " + e)
}Best Practices
Embedding-Dimensionen
Stellen Sie sicher, dass alle Vektoren in einer Collection die gleiche Dimension haben (z.B. 1536).
Batching
Nutzen Sie Batch-Upserts für große Datenmengen, um API-Latenz zu minimieren.
Hybrid Search
Kombinieren Sie Vektorsuche mit klassischen Filtern (Metadaten) für präzisere Ergebnisse.
Sicherheit
Speichern Sie Connection Strings und API-Keys niemals im Code, sondern in Umgebungsvariablen.
Local Provider speichert Daten nur im Arbeitsspeicher und ist ideal für automatisierte Tests.