DAY 6 — OPTIMIZATION (MAKE THE SYSTEM FAST, STABLE, AND USABLE DAILY)

Skip to main content
< All Topics
Print

🎯 Goal

By the end of Day 6 you will have:

  • faster RAG retrieval
  • smoother LLM response flow
  • reduced lag in dashboard
  • model routing (7B / 14B / 20B automatically)
  • caching for repeated queries
  • a system that feels “production stable” on your Mac

This is the final step that turns your build into a daily research tool instead of a prototype.


⚙️ STEP 1 — ADD BASIC CACHING (RAG SPEED BOOST)

Edit analysis_engine.py

Add caching for retrieval:

from functools import lru_cache

Wrap retrieval:

@lru_cache(maxsize=128)
def retrieve_context(query, k=3):
    query_embedding = embedder.encode(query).tolist()

    results = collection.query(
        query_embeddings=[query_embedding],
        n_results=k
    )

    return "\n".join(results["documents"][0])

🧠 STEP 2 — MODEL ROUTING LOGIC (IMPORTANT)

Instead of manually choosing models, automate it:

Add function:

def select_model(question):

    q = question.lower()

    if "compare" in q or "deep" in q or "why" in q:
        return "deepseek-r1:20b"

    if "summarize" in q or "quick" in q:
        return "llama3.1:8b"

    return "qwen2.5:14b"

Update main function:

def run_analysis(question, model=None):

    if model is None:
        model = select_model(question)

    context = retrieve_context(question)
    prompt = build_prompt(question, context)

    response = ollama.chat(
        model=model,
        messages=[{"role": "user", "content": prompt}]
    )

    return response["message"]["content"]

⚡ STEP 3 — SPEED OPTIMIZATION RULES

HARD RULES:

  • never send full datasets to LLM
  • always use top-K retrieval only
  • keep context under control
  • avoid repeated embeddings

IMPROVEMENT:

Reduce retrieval size:

n_results=2  # instead of 5 or 10

💾 STEP 4 — DISK + MEMORY OPTIMIZATION

Add cache folders:

CACHE/
EMBEDDINGS/
TEMP/

Rules:

  • store embeddings once
  • reuse them (never recompute unless data changes)
  • delete temp analysis files periodically

🖥️ STEP 5 — STREAMLIT PERFORMANCE FIXES

Edit dashboard.py


Add caching for UI:

@st.cache_data
def cached_analysis(question, model):
    return run_analysis(question, model=model)

Replace:

result = run_analysis(question, model=model)

With:

result = cached_analysis(question, model)

🧠 STEP 6 — REDUCE LAG IN UI

Add spinner + delay control:

with st.spinner("Running analysis engine..."):

Limit reruns:

st.session_state["last_query"] = question

🔁 STEP 7 — FINAL SYSTEM FLOW (OPTIMIZED)

User Query
   ↓
Model Router (7B / 14B / 20B)
   ↓
Cached RAG Retrieval
   ↓
Compressed Context Builder
   ↓
Ollama LLM Call
   ↓
Cached Result (Streamlit)
   ↓
Dashboard Display

🧠 WHAT YOU JUST COMPLETED

You now have:

✔ fast retrieval system

✔ smart model selection

✔ reduced compute waste

✔ cached responses

✔ responsive UI

✔ stable local AI system


🚫 WHAT THIS IS NOT

  • ❌ not real-time trading system
  • ❌ not predictive engine
  • ❌ not self-learning AI
  • ❌ not market-connected system

It is:

a fast, optimized historical trading research engine


🏁 FINAL RESULT (AFTER DAY 6)

Your Mac now runs:

  • RAG-based trading memory
  • multi-model reasoning system
  • structured analysis engine
  • ChatGPT-style dashboard
  • optimized performance layer

💡 ONE-LINE SUMMARY

Day 6 turns your AI trading system into a fast, stable, locally running research platform with caching, model routing, and performance optimization.