Siestai
Memory ArchitecturePipeline

Relevance Scoring

The composite scoring formula combining cosine similarity, importance, and recency decay

Memory retrieval uses a weighted composite score combining three signals: semantic similarity, importance rating, and recency decay.

Scoring Formula

score = 0.5 × cosine_similarity
      + 0.3 × importance
      + 0.2 × recency_decay

Where:

  • cosine_similarity = 1 - (embedding <=> query_vector) (pgvector cosine distance)
  • importance = importance column value (0.0–1.0)
  • recency_decay = exp(-0.05 × days_since_last_access)

Component Weights

SignalWeightPurpose
Cosine similarity0.5Semantic relevance to the query
Importance0.3User/system-assigned priority
Recency decay0.2Freshness preference with exponential decay

Full SQL Query

SELECT
  id, agent_id, content, memory_type, importance,
  created_at, last_accessed_at,
  (0.5 * (1 - (embedding <=> $query::vector)))
  + (0.3 * importance)
  + (0.2 * exp(-0.05 * EXTRACT(EPOCH FROM (now() - last_accessed_at)) / 86400))
  AS score
FROM agent_memories
WHERE agent_id = $agent_id
  AND embedding IS NOT NULL
  AND status = 'active'
ORDER BY score DESC
LIMIT $top_k

Recency Decay Curve

The decay function exp(-0.05 × days) produces:

Days since accessDecay value
0 (today)1.000
10.951
70.705
140.497
300.223
600.050

Memories accessed within the last week retain strong recency scores. After 30 days, recency contributes minimally.

pgvector Indexes

The schema uses HNSW (Hierarchical Navigable Small World) indexes for approximate nearest neighbor search:

CREATE INDEX ON agent_memories
USING hnsw (embedding vector_cosine_ops);

CREATE INDEX ON team_memories
USING hnsw (embedding vector_cosine_ops);

The <=> operator computes cosine distance (not similarity), so the formula uses 1 - distance to get similarity.

OperationThresholdPurpose
Dedup check0.92Prevent near-identical memories
Search retrievalN/A (scored)Rank by composite relevance
Consolidation clustering0.80Group related memories

See operations/configuration for all threshold values.

On this page