You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Searchable models can declare ordered media parts. Path fields name an
image, audio or video kind and a storage disk. Indexing loads bounded parts
through Storage. Boot and settings sync reject incompatible model profiles.
EmbeddingGemma 2 can embed images, audio and video locally. The media
profile verifies both encoder graphs and their weights with the text model.
Rust processors prepare image patches and WAV log-mel features. Video uses
a host ffmpeg binary with a timeout. Reference fixtures run without ONNX.
A knowledge-graph recommender ranks from your own events and relations. RECOMMEND_ENGINE=graph selects it. A queued rebuild derives a graph of
shared engagement (stored only where RECOMMEND_MIN_PEERS actors agree),
public engagement for the types RECOMMEND_PUBLIC_EVENT_TYPES lists, and
relations declared with Recommend::graph_relation. Reads authorize every
node and edge first, blend graph paths, stored vectors, followed actors'
agreement, freshness, negatives and trust risk per surface with diversity
caps, cite the evidence each row rests on, and answer with the starter's
rows when the graph's support is thin.
The graph lives in your database or in Memgraph. The GraphStore trait
ships a database store and, behind the graph-memgraph feature, a memgraph store over Bolt. recommendations:graph-rebuild rebuilds the
graph into a new generation and switches readers when it completes.
Search engines recommend and discover from their stored vectors. SearchEngine gains stored_vectors, recommend and discover; Qdrant
answers the latter two natively, and the database and collection engines
fold their stored vectors. Recommend::discover steers a discover query by
the viewer's own events. SearchEngine::stored_keys reports which documents
a generation holds, so the graph engine leaves out a document that left its
index; every shipped engine implements it, and a custom engine needs it to
serve the graph engine.
Changed
Recommendation, search and explanation structs carry new fields.RecommendConfig gains the graph settings and min_peers, SearchConfig gains media_max_bytes, IndexTimeSettings
gains embed_media, and RecommendationExplanation gains engine, evidence and fallback_reason. Code that builds one of them field by
field without ..Default::default() no longer compiles.
Fixed
A starter suggestion stands on at least three peers. The starter engine kept a
collaborative candidate a single peer contributed, and its explanation
showed a peer count of 1 beside the shared item, which points at that
person; the candidate was one of their own views or purchases. Recommend::for_user and Recommend::similar_to now count a collaborative
candidate only when RECOMMEND_MIN_PEERS distinct peers contribute it,
default 3. With fewer, it can still arrive through the affinity, popularity
or recent tier, which names no peers.
A model without updated_at keeps a search version per row. A searchable model without updated_at carried version 0 in every document, so a recommendation event
or a graph fact could not tell one revision of the row from the next. Each
save now raises a version kept in the new search_source_versions table, in
the save's own transaction, and Eloquent loads the kept versions with the
rows, so to_search_document() returns the row's version without a query of
its own. Run your migrations: the table comes with suprnova::search::migrations().
A local embedding model keeps its memory bounded on long documents. The fastembed
provider padded every text in a batch to the batch's longest, and attention
memory grows with the square of that length, so one long document among
short ones could take a single inference call past 24 GB. It now measures
each text with the model's own tokenizer and batches texts of similar
length: SEARCH_EMBED_BATCH counts texts of 512 tokens, a longer text takes
the room of several by the square of its length, and a text longer than
that runs alone.