Add embedding vector storage and similarity search to smartbotic-database, enabling semantic search without external dependencies (sqlite-vec, FAISS, etc.).
New vector_dimension option at collection creation:
{
"type": "create_collection",
"collection": "memories",
"options": {
"vector_dimension": 4096
}
}
0 = no vector support (default, backward compatible)Documents in vector-enabled collections can include a _vector field:
{
"id": "memory-123",
"content": "The user prefers dark mode",
"tags": "preferences",
"_vector": [0.123, -0.456, 0.789, ...]
}
_vector is optional — documents without it are stored normally but excluded from similarity search_vector must be a float array of exactly vector_dimension lengthstd::vector<float> alongside the JSON document// In DatabaseService
rpc SimilaritySearch(SimilaritySearchRequest) returns (SimilaritySearchResponse);
message SimilaritySearchRequest {
string collection = 1;
repeated float query_vector = 2;
uint32 top_k = 3;
float min_score = 4; // optional minimum cosine similarity threshold (0.0-1.0)
}
message SimilaritySearchResponse {
repeated SimilarityResult results = 1;
}
message SimilarityResult {
string id = 1;
float score = 2;
bytes data = 3; // full JSON document (without _vector to save bandwidth)
}
message CollectionOptions {
bool auto_create_id = 1;
uint32 default_ttl_seconds = 2;
bool encrypted = 3;
repeated string sensitive_fields = 4;
uint32 max_versions = 5;
uint32 vector_dimension = 6; // NEW — 0 = disabled
}
std::vector<float> in a parallel map: collection → {doc_id → vector}VEC_PUT(collection, id, float_bytes), VEC_DELETE(collection, id)score = dot(a, b) / (norm(a) * norm(b))
__builtin_cpu_supportsmin_score filter (skip results below threshold)Put() with _vector field: extract vector, validate dimension, store separately, strip from JSON before document storagePut() without _vector on vector-enabled collection: store document without vector (excluded from similarity search)Delete(): remove both document and vectorGet() response: does NOT include _vector (large, not useful for display). Use SimilaritySearch for vector operations.create_collection with vector_dimension optionalter_collection cannot change vector_dimension (would invalidate all vectors)insert/upsert with vectors in migrations (vectors come from runtime embedding generation)// New method on Client
struct SimilarityResult {
std::string id;
float score;
nlohmann::json data;
};
std::vector<SimilarityResult> similaritySearch(
const std::string& collection,
const std::vector<float>& query_vector,
uint32_t top_k,
float min_score = 0.0f);
// Put with vector
void put(const std::string& collection, nlohmann::json document,
const std::vector<float>& vector = {});
| File | Change |
|---|---|
proto/database.proto |
Add vector_dimension to CollectionOptions, add SimilaritySearch RPC |
service/src/document.hpp |
Add vector_dimension to CollectionOptions struct |
service/src/memory_store.hpp |
Add vector storage maps, similarity search method |
service/src/memory_store.cpp |
Implement vector CRUD + cosine similarity with SIMD |
service/src/database_grpc_impl.cpp |
Handle SimilaritySearch RPC, extract _vector on Put |
service/src/wal.cpp |
Add VEC_PUT/VEC_DELETE WAL entries |
service/src/snapshot.cpp |
Serialize/deserialize vectors in snapshots |
client/src/client.cpp |
Add similaritySearch() and vector-aware put() |
client/include/smartbotic/database/client.hpp |
Client API additions |