v3.1.0KI & Machine LearningVollständig dokumentiert

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. 1536

Vollstä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.