Skip to content

14.6 Caching Strategy & Vector Optimization ​

1. What It Is in Plain Words ​

Caching stores the results of computationally expensive operations (such as transformer vector calculations or database queries) in ultra-fast volatile memory (RAM or Redis) so subsequent identical requests are resolved in sub-millisecond times.


2. How THIS Project Uses It ​

  • Resident In-Memory Model Cache: The largest bottleneck in RAG systems is neural network embedding generation (~14ms). The backend loads FastEmbed and FAISS pointers permanently into process memory ([app.py:L24-L29](file:///Users/avishjain/avishjain9-repos/21-bis-compliance-engine/app.py#L24-L29)), ensuring that models are never re-initialized per request.
  • Dynamic Query Cache: Not explicitly implemented in code (currently re-embeds incoming queries). This was a conscious decision for the current scale, as 14ms is well within acceptable real-time UX thresholds (<100ms) [CONFIRM WITH DEVELOPER].

3. Comparison with Caching Alternatives ​

Caching LayerImplementationCache Hit LatencyInvalidation StrategyFit for This Engine
In-Memory Pre-Loaded Weights (Used)Global Python pointers0.00 ms (Zero overhead)Process restartOptimal for core models
Local LRU Cache (functools)In-process Python dictionary~0.01 msLRU eviction (maxsize=1024)Highly recommended quick win
Distributed Redis CacheStandalone Redis cluster~0.8 - 1.5 msTTL + Key-based invalidationRecommended for 100x scale
CDN Edge Caching (Cloudflare)Edge HTTP headers~10 - 25 msStale-while-revalidateNot suited for POST payloads

4. Trade-offs Accepted ​

  • Redundant Embedding Compute: Identical frequent queries (e.g., users repeatedly typing "Ordinary Portland Cement 53 Grade") incur the full 14ms ONNX CPU cycle every time instead of returning a cached vector in 0.05ms.

5. What Breaks at Scale ​

  • At 10x Load: Compute overhead remains manageable on multi-core servers.
  • At 100x Load: Repeating the 14ms embedding step across thousands of concurrent queries creates severe CPU throttling.
  • At 1000x Load: Lack of caching causes catastrophic request queueing, ballooning latency past 3 seconds.

6. How a Senior Engineer Would Improve It ​

Implement a two-tier cache-aside architecture:

  1. L1 Local Cache: Python's @functools.lru_cache(maxsize=2048) to cache normalized vector arrays in memory.
  2. L2 Distributed Cache: A Redis instance caching {sha256(query): vector_array} with a 30-day Time-To-Live (TTL). Cache hits bypass FastEmbed completely, dropping total query latency from 16ms to under 1.5ms.

7. 30-Second Spoken Answer ​

"Currently, our models and FAISS indexes are permanently pre-warmed in resident RAM, avoiding cold-start overhead. To scale past a hundred queries a second, we would implement a Redis cache-aside pattern on the raw query text: caching the 384-dimensional embeddings for the top five thousand product terms drops our inference time from fourteen milliseconds down to under one millisecond on cache hits."