Achter elke RAG-engine bevindt zich een documentopslag. Hazina’s Document Store is ontworpen als zowel een eenvoudige key-value store voor documenten als een geavanceerde vectordatabase voor gelijkeniszoekopdrachten. Laten we verkennen hoe het werkt.
Architectuur
De Document Store bestaat uit drie lagen:
- Documentopslag – Ruwe documenten met metadata
- Chunkopslag – Verwerkte tekstfragmenten
- Vectorindex – Embeddings voor gelijkeniszoekopdrachten
Basisdocumentbewerkingen
var store = serviceProvider.GetRequiredService<IDocumentStore>();
// Sla een document op
var docId = await store.StoreAsync(new Document {
Title = "Product Manual",
Content = "...",
ContentType = "text/plain",
Tags = new[] { "documentation", "product" },
Metadata = new Dictionary<string, object> {
["version"] = "2.0",
["department"] = "Engineering"
}
});
// Ophalen
var doc = await store.GetAsync(docId);
// Zoeken op tags
var docs = await store.SearchByTagsAsync(new[] { "documentation" });
// Volledige-tekstzoekopdracht
var results = await store.SearchAsync("product features");
Vector Gelijkeniszoekopdracht
// Vind documenten die lijken op een query
var similar = await store.FindSimilarAsync(
query: "How do I configure the API?",
topK: 5,
threshold: 0.7f // Minimale gelijkenisscore
);
foreach (var result in similar)
{
Console.WriteLine($"{result.Score:P0} - {result.Document.Title}");
Console.WriteLine($" Chunk: {result.ChunkText[..100]}...");
}
SQLite Configuratie
builder.Services.AddHazina(config => {
config.Storage.UseSqlite(new SqliteSettings {
DatabasePath = "./data/hazina.db",
EnableWAL = true, // Betere gelijktijdige toegang
VacuumOnStartup = false // Overslaan voor snellere opstart
});
});
PostgreSQL voor Productie
builder.Services.AddHazina(config => {
config.Storage.UsePostgreSQL(new PostgresSettings {
ConnectionString = connectionString,
EnablePgVector = true, // Vereist voor vectorzoekopdrachten
VectorDimensions = 1536 // OpenAI embedding grootte
});
});
Documentlevenscyclus
Documenten doorlopen een duidelijke levenscyclus:
- Opgeslagen – Ruwe inhoud opgeslagen
- Opgedeeld – Opgesplitst in doorzoekbare stukken
- Geëmbed – Vector embeddings gegenereerd
- Geïndexeerd – Beschikbaar voor gelijkeniszoekopdrachten
Alle stappen gebeuren automatisch wanneer je IndexDocumentAsync aanroept.
In de volgende post behandelen we een van Hazina’s krachtigste functies: het Dynamische Plugin Systeem.
Veelgestelde Vragen
Hazina’s Document Store gebruikt een drielaagse architectuur bestaande uit Documentopslag voor ruwe documenten, Chunkopslag voor verwerkte tekstfragmenten, en een Vectorindex voor gelijkeniszoekopdrachten. Je kunt documenten met metadata opslaan, ze ophalen via hun ID, en zoekopdrachten uitvoeren met tags of volledige-tekstqueries.
Vector gelijkeniszoekopdracht stelt gebruikers in staat om documenten te vinden die lijken op een gegeven query op basis van hun vector embeddings. Door een query en een drempel voor de minimale gelijkenisscore op te geven, kun je de top K documenten ophalen die aan je criteria voldoen.
Hazina’s Document Store kan worden geconfigureerd om SQLite te gebruiken voor ontwikkeling en PostgreSQL voor productie. De PostgreSQL-setup vereist het inschakelen van PgVector voor vectorzoekopdrachten en het specificeren van de verbindingsreeks en vectordimensies.
Documenten in Hazina’s Document Store ondergaan een levenscyclus die vier hoofdfasen omvat: Opgeslagen (ruwe inhoud opgeslagen), Opgedeeld (opgesplitst in doorzoekbare stukken), Geëmbed (vector embeddings gegenereerd), en Geïndexeerd (beschikbaar voor gelijkeniszoekopdrachten). Deze levenscyclus is geautomatiseerd wanneer je de methode IndexDocumentAsync aanroept.