End-to-end AI research infrastructure for evidence-grounded, graph-augmented question answering over computer vision literature. Built for production: API-first, fully observable, containerized, continuously evaluated, and engineered around measurable reliability.
🚀 Demo · 📊 Metrics · 🏗 Architecture · 🐳 Deployment · 🧪 Testing · 📋 Recruiter Notes
- System at a Glance
- Overview
- Quick Demo
- Core Differentiators
- Measured Engineering Outcomes
- Problem
- Why Graph-RAG?
- Key Innovations
- Example Research Queries
- System Highlights
- Production Metrics
- Architecture
- Repository Structure
- Data Pipeline
- Retrieval and Reasoning
- Caching
- Monitoring
- Evaluation Results
- Performance Optimizations
- Reliability Engineering
- CPU-First Deployment Philosophy
- Model Warmup Timeline
- Operational Benchmarks
- Sample API Response
- Failure Recovery Stories
- Known Constraints
- Screenshots
- Tech Stack
- API Endpoints
- Installation
- Docker Deployment
- Environment Variables
- Testing
- Engineering Challenges Solved
- Roadmap
- Recruiter Notes
- Resume Summary
- License
A 10-second snapshot of scale, quality, and deployment status.
| Dimension | Value |
|---|---|
| Papers indexed | 238 |
| Chunks indexed | 12,288 |
| Embedding model | BAAI/bge-base-en-v1.5 (768-dim) |
| Graph nodes | 236 |
| Graph edges | 1,576 |
| Cache hit rate | 100% |
| Hallucination rate | 0% |
| Context recall (RAGAS) | 0.94 |
| Grounded answer rate | 100% |
| p99 latency | ~4.9s (CPU-only, live traffic) |
| Deployment | Fully Dockerized (Docker Compose + Nginx) |
What it is. AetherCV is a production-grade autonomous research platform for evidence-backed question answering over computer vision literature. It answers complex research queries by combining semantic routing, hybrid retrieval, graph expansion, and grounded synthesis into a single deployable API.
Why it exists. Research assistants built on naive RAG pipelines hallucinate, lose domain awareness, and fall apart under production conditions. AetherCV is engineered to solve those failures with measurable guarantees — 0% hallucination rate across benchmark evaluation runs, 100% grounded answer rate, 0.94 context recall — on CPU-only infrastructure.
What makes it different. Every component in this system was built for production: graph retrieval over real citation and semantic relationships, seven independent Redis cache layers, Prometheus observability instrumented at every pipeline boundary, a continuous RAGAS evaluation loop, and a CPU-first architecture that eliminates GPU dependency entirely.
This is not a notebook prototype. It is an API-first, containerized research engine with real data ingestion, indexed artifacts, runtime safety protections, production monitoring, and measurable reliability.
Compare CLIP vs BLIP for multimodal representation learning.
┌──────────────────────────────────────┐
│ Incoming Query │
└──────────────────┬───────────────────┘
│
▼
┌──────────────────┐
│ Semantic Router │──── OOD? ──► Hard Reject
└────────┬─────────┘
│ route: multi_step_agent
▼
┌──────────────────┐
│Query Decomposition│ (complex queries only)
└────────┬─────────┘
│
┌────────┴────────┐
▼ ▼
┌────────┐ ┌────────┐
│ FAISS │ │ BM25 │
│ Dense │ │ Sparse │
└────┬───┘ └───┬────┘
└───────┬───────┘
│
▼
┌──────────┐
│RRF Fusion│
└────┬─────┘
│
▼
┌───────────────┐
│ Cross-Encoder │ (conditional: complex + low confidence only)
│ Reranking │
└───────┬───────┘
│
▼
┌─────────────────┐
│ Graph Expansion │ BFS over hybrid citation/semantic graph
└────────┬────────┘
│
▼
┌──────────────────┐
│Context Compression│ query-relevant sentence selection
└────────┬──────────┘
│
▼
┌──────────────────────┐
│ Grounded Synthesis │ context-only · citation whitelist guard
└────────┬─────────────┘
│
▼
┌────────────────────┐
│ Faithfulness Guard │ entity support · confidence gate
└────────┬───────────┘
│
▼
┌──────────────────┐
│ Structured Response│
└──────────────────┘
| Stage | Latency |
|---|---|
| Retrieval (dense + sparse + fusion + rerank) | 1.79s |
| Graph expansion | 0.61s |
| Context compression + synthesis | 0.96s |
| Total end-to-end | 3.36s |
{
"route": "multi_step_agent",
"confidence": 0.89,
"grounded": true,
"graph_used": true,
"retrieval_latency_s": 1.79,
"total_latency_s": 3.36
}A high-level summary for technical recruiters and engineering leads.
✅ Graph-RAG over real scientific citation and semantic relationships — not flat vector search
✅ Zero hallucination across all benchmark runs — context-grounded synthesis with citation whitelist guards
✅ Full production deployment on CPU-only infrastructure — no GPU dependency
✅ End-to-end observability — Prometheus instrumented at every pipeline boundary, Grafana dashboards live
✅ Continuous evaluation loop — RAGAS + MLflow tracking every benchmark run with per-question artifacts
✅ Seven independent Redis cache layers — repeat and paraphrased queries never touch the LLM
✅ Domain-calibrated OOD rejection — unrelated queries are hard-blocked before any compute is spent
Measured outcomes from production traffic and benchmark evaluation runs.
| Outcome | Value |
|---|---|
| Hallucination rate in benchmark runs | 0% |
| Grounded answer rate | 100% |
| Retrieval hit rate | 100% |
| Context recall (RAGAS) | 0.94 |
| Cache hit rate on repeated traffic | 100% |
| p99 latency on CPU-only infrastructure | ~4.9s |
| Cache layers reducing redundant LLM calls | 7 independent layers |
| Papers providing evidence coverage | 238 indexed |
| Chunks available for retrieval | 12,288 |
Modern research assistants fail repeatedly on requirements that matter in production:
| Failure Mode | AetherCV Response |
|---|---|
| Hallucinated citations | Strict context-grounded prompting, citation extraction, entity support checks, and confidence caps |
| Weak domain awareness | Calibrated computer-vision domain centroid, cluster artifacts, retrieval probes, and OOD routing |
| Poor multi-step reasoning | Query decomposition, global context aggregation, single global reranking, and grounded synthesis |
| Slow CPU inference | Lazy model loading, conditional reranking, cache-first serving, compressed contexts, and bounded graph expansion |
| No observability | Prometheus middleware, pipeline hooks, Grafana dashboards, health and readiness checks |
| No evaluation loop | Fast metrics, RAGAS, MLflow logging, per-question artifacts, reproducible batches |
| Notebook-only deployment | FastAPI, Gunicorn/Uvicorn, Docker, Docker Compose, Nginx, Redis, PostgreSQL |
Dense vector retrieval surfaces chunks that are semantically similar to the query. That is necessary — but not sufficient for research-quality answers.
What dense retrieval misses:
A paper may use different terminology than the query while being the most structurally relevant result in the corpus — cited by every key paper, positioned at the origin of the method lineage, or containing the ablation results that directly answer the question. Embedding similarity alone cannot surface this.
What graph retrieval adds:
| Graph Signal | What It Captures |
|---|---|
| Citation neighbors | Papers cited together — co-citation proximity indicates shared methodology or benchmark scope |
| Method descendants | Papers that extended the seed paper's approach — tracks architectural evolution forward in time |
| Benchmark successors | Papers that evaluate on the same benchmarks — enables direct comparison retrieval |
| Architectural variants | Semantically adjacent papers at the embedding level — captures design space coverage |
The combined effect:
AetherCV runs BFS expansion over a hybrid citation + semantic graph from each retrieved seed paper. This surfaces evidence that dense retrieval misses — structurally related papers that improve coverage on comparison queries, trend-analysis questions, and multi-paper synthesis tasks. Graph expansion is enabled for all in-domain production queries.
AetherCV introduces several architectural patterns not commonly found together in open-source RAG systems:
| Innovation | Description |
|---|---|
| Hybrid Graph-RAG over citation + semantic graphs | Retrieval is augmented by a dual-graph structure — a citation graph derived from co-citation similarity and a semantic graph built from paper-level embedding proximity. These are fused into a single hybrid graph with BFS expansion at query time, surfacing structurally related papers that dense retrieval alone would miss. |
| Domain-calibrated semantic routing | The router does not rely on keyword matching. It computes similarity to a calibrated computer-vision domain centroid, compares against cluster artifacts, and applies retrieval support thresholds before committing to a retrieval path — resulting in zero false-positive OOD escapes in production. |
| Graph-aware latency budgeting | Graph expansion tracks rolling latency telemetry per query and applies adaptive candidate pruning when expansion risks breaching the latency budget. This prevents graph traversal from becoming a silent tail-latency bottleneck. |
| CPU-first inference optimization | Reranking is conditional — activated only on complex, low-confidence queries. Context is compressed before synthesis. Candidates are capped at graph boundaries. This makes the system viable on CPU-only infrastructure without sacrificing quality. |
| Cache-first serving architecture | Seven independent cache layers cover agent outputs, grounded answers, paraphrase-level semantic matches, retrieval chunks, query decompositions, and intent classifications — ensuring that the most expensive operations are never repeated unnecessarily. |
| Production observability embedded in the pipeline | Prometheus metrics are not bolted on afterward. They are instrumented via ASGI middleware and pipeline hooks at every subsystem boundary: routing, retrieval, graph, cache, LLM, synthesis, and quality. |
| Continuous evaluation loop | Fast metrics and RAGAS run against a curated evaluation dataset, log per-question scores as MLflow artifacts, and provide a reproducible benchmark baseline independent of live query traffic. |
The following query types represent the production workload AetherCV is designed to handle. Each demonstrates a different retrieval and reasoning pattern.
| Query | Routing Path | Key Retrieval Pattern |
|---|---|---|
Compare CLIP vs BLIP for multimodal representation learning |
multi_step_agent |
Multi-paper comparison with graph expansion across citation neighbors |
How did DETR influence later transformer-based object detectors? |
multi_step_agent |
Forward citation traversal — method descendants in the graph |
Which diffusion models improved FID scores after DDPM? |
multi_step_agent |
Benchmark successor retrieval — papers sharing the same evaluation axis |
What is the attention mechanism in Vision Transformers? |
simple_rag |
Targeted factual retrieval — low ambiguity, single-paper depth |
Compare ViT, Swin Transformer, and ConvNeXt architectural design choices |
multi_step_agent |
Multi-entity decomposition with architectural variant coverage |
Explain masked image modeling as used in MAE |
simple_rag |
Direct method explanation — grounded to abstract and method sections |
| Area | Implementation |
|---|---|
| Domain | Computer vision research papers from CVPR/arXiv corpus |
| Corpus | 12,288 indexed chunks from 238 papers |
| Search | FAISS dense retrieval + BM25 lexical retrieval + RRF fusion |
| Embeddings | BAAI/bge-base-en-v1.5 query/document embeddings |
| Reranking | BAAI/bge-reranker-base cross-encoder, lazy-loaded and gated |
| Graph Retrieval | Citation graph + semantic graph + hybrid graph with BFS expansion |
| Routing | Simple RAG, complex multi-step agent, and OOD rejection |
| Caching | Redis exact cache, Redis semantic cache, in-process LRU caches |
| Backend | FastAPI with JWT auth, conversations, usage quotas, SSE streaming |
| Observability | Prometheus metrics, Grafana dashboards, request IDs, subsystem health checks |
| Evaluation | Fast metrics, RAGAS, MLflow experiment tracking |
| Deployment | Dockerfile, Docker Compose, Nginx reverse proxy, Render blueprint |
| Metric | Value |
|---|---|
| API Status | UP |
| Success Rate | 100% |
| Cache Hit Rate | 100% |
| Fallback Rate | 0% |
| OOD Protection | Active |
| p99 Latency | ~4.9s live traffic |
| Artifact | Value |
|---|---|
| Clean chunks indexed | 12,288 |
| Unique papers | 238 |
| Evaluation samples | 64 |
| FAISS index | 37 MB |
| Embedding matrix | 37 MB |
| Metadata artifact | 24 MB |
| ID map artifact | 12 MB |
| Embedding dimension | 768 |
| Mean token estimate per chunk | 120.96 |
| p95 token estimate per chunk | 149 |
| Graph | Nodes | Directed Edges |
|---|---|---|
| Citation graph | 228 | 1,136 |
| Semantic graph | 102 | 450 |
| Hybrid graph | 236 | 1,576 |
Mermaid source diagrams below are the authoritative reference. Export as static images to
docs/architecture/for portfolio and resume use.
flowchart LR
U[Client] --> API[FastAPI API]
API --> Auth[JWT Auth + Usage Limits]
Auth --> Route[Semantic Router]
Route -->|Simple| RAG[Simple RAG]
Route -->|Complex| Agent[Multi-Step Agent]
Route -->|OOD| Reject[Out-of-Domain Response]
RAG --> Retrieve[Hybrid Retrieval]
Agent --> Decompose[Query Decomposition]
Decompose --> Retrieve
Retrieve --> Dense[FAISS Dense]
Retrieve --> Sparse[BM25 Sparse]
Dense --> Fusion[RRF Fusion]
Sparse --> Fusion
Fusion --> Rerank[Conditional Cross-Encoder]
Rerank --> Graph[Hybrid Graph Expansion]
Graph --> Compress[Context Compression]
Compress --> Synthesis[Grounded Answer Synthesis]
Synthesis --> Verify[Faithfulness + Entity Guards]
Verify --> Response[Structured Response]
flowchart LR
CVPR[CVPR Accepted Papers] --> Resolve[arXiv Resolution]
Resolve --> PDF[PDF Download]
PDF --> Extract[GROBID/pdfplumber Extraction]
Extract --> Chunk[Semantic Chunking]
Chunk --> Clean[Noise Cleaning + Dedup]
Clean --> Embed[BGE Embeddings]
Embed --> Index[FAISS Index + Metadata]
Clean --> Citation[Citation Graph]
Embed --> Semantic[Semantic Graph]
Citation --> Hybrid[Hybrid Graph]
Semantic --> Hybrid
Index --> Serve[FastAPI Serving]
Hybrid --> Serve
flowchart LR
API[FastAPI API] --> Middleware[Prometheus Middleware]
Middleware --> Metrics[Metrics Endpoint]
Agent[Agent Pipeline] --> Hooks[Instrumentation Hooks]
Retrieval[Retrieval Pipeline] --> Hooks
Cache[Redis Cache] --> Hooks
LLM[Groq LLM Calls] --> Hooks
Hooks --> Metrics
Metrics --> Prometheus[Prometheus]
Prometheus --> Grafana[Grafana Dashboards]
Evaluation[Evaluation Pipeline] --> MLflow[MLflow Tracking]
Architecture Diagram Export Placeholders
Use these paths if you export the Mermaid diagrams as static images for portfolio pages, resumes, or LinkedIn posts:
| Diagram | Suggested Path |
|---|---|
| System overview | docs/architecture/system-overview.png |
| Retrieval pipeline | docs/architecture/retrieval-pipeline.png |
| Data pipeline | docs/architecture/data-pipeline.png |
| Observability pipeline | docs/architecture/observability.png |
project_root/
|-- DATA_COLLECTION/ # CVPR/arXiv discovery, PDF extraction, chunking, cleaning, embedding
|-- ai/ # Routing, retrieval, AIS, graph agent, caching, LLM utilities
|-- app/ # FastAPI auth, chat, usage, admin, database, middleware
|-- data/ # FAISS index, id map, embeddings, domain calibration artifacts
|-- datasets/ # CVPR metadata, PDFs, extracted chunks, processed datasets
|-- deployment/ # Dockerfile, Docker Compose, Nginx, Render, entrypoint, healthcheck
|-- docs/ # Grafana and MLflow screenshots
|-- evaluation/ # Fast metrics, RAGAS evaluation, MLflow metric logging
|-- graph_data/ # Citation, semantic, and hybrid graph builders + graph artifacts
|-- monitoring/ # Prometheus metrics, middleware, hooks, Grafana provisioning
|-- scripts/ # Startup warmup, domain centroid calibration, dataset builder
|-- tests/ # Cache and integration validation scripts
|-- main.py # FastAPI application entrypoint
|-- requirements.txt # Install shim for locked requirements
|-- requirements_lock.txt # Full development dependency lock
`-- .env.example # Environment variable template
Key Files
| File | Responsibility |
|---|---|
main.py |
FastAPI app, lifespan warmup, router registration, middleware, health/readiness |
ai/retrieval_system.py |
FAISS/BM25 retrieval, RRF fusion, reranking, context compression, domain support |
ai/agent.py |
Semantic routing, OOD rejection, multi-step agent, decomposition, synthesis, structured output |
ai/ais.py |
Answer Intelligence System, grounding prompts, confidence estimation, verification, MLflow logging |
ai/graph_agent.py |
Hybrid graph loading, project-root graph path resolution, BFS expansion, semantic filtering |
ai/cache.py |
Redis exact cache, semantic cache, retrieval cache serialization, cache safety gates |
ai/llm_utils.py |
Groq client singleton, token bucket rate limiter, RAGAS LangChain wrapper |
app/chat/service.py |
Conversation-aware chat orchestration, follow-up handling, DB persistence |
monitoring/prometheus_metrics.py |
Metric definitions for traffic, latency, cache, routing, retrieval, graph, LLM, quality |
evaluation/ragas.py |
RAGAS execution with Groq wrapper, BGE embeddings, MLflow artifact logging |
deployment/docker-compose.yml |
App, Redis, Prometheus, Grafana, and Nginx production composition |
AetherCV includes a complete data ingestion and indexing workflow instead of relying on pre-cleaned toy data.
| Stage | Implementation |
|---|---|
| Paper discovery | CVPR accepted-paper scraping and arXiv resolution through Semantic Scholar, arXiv API, project pages, GitHub links, and web fallback |
| PDF extraction | GROBID-first academic paper parser with pdfplumber fallback |
| Text repair | OCR cleanup, citation marker handling, figure/table noise removal, word-boundary repair |
| Chunking | Section-aware semantic chunking with overlap, token budgets, and noise filters |
| Deduplication | Stable hash-based duplicate removal across extracted paper chunks |
| Embedding | BGE embeddings normalized for cosine similarity through FAISS IndexFlatIP |
| Metadata | id_map.pkl, metadata.pkl, section labels, paper IDs, clean text, citation metadata |
| Calibration | Domain centroid, domain clusters, cluster weights, router thresholds |
| Graph construction | Citation graph, semantic graph, hybrid graph |
| Artifact | Purpose |
|---|---|
data/faiss_index.bin |
Dense retrieval index |
data/id_map.pkl |
FAISS row ID to retrieval metadata |
data/metadata.pkl |
Full aligned metadata records |
data/embeddings.npy |
Normalized embedding matrix |
data/domain_centroid.npy |
Computer-vision domain centroid |
data/domain_clusters.npy |
Domain cluster centroids |
data/router_thresholds.json |
Calibrated retrieval support thresholds |
graph_data/graphs/hybrid_graph.json |
Combined citation and semantic graph |
AetherCV routes each query into one of three paths:
| Route | Trigger | Behavior |
|---|---|---|
simple_rag |
Clear in-domain, low ambiguity | Fast retrieval and grounded answer synthesis |
multi_step_agent |
Comparison, multi-clause, ambiguous, or complex research query | Decomposition, multi-query retrieval, aggregation, global reranking, final synthesis |
out_of_domain |
Below calibrated CV-domain support | Rejects unrelated queries before expensive retrieval |
The router combines:
- Domain centroid similarity
- Domain cluster similarity
- Retrieval support score
- Calibrated hard-block and support thresholds
- Query shape analysis for short model/dataset names
- Retrieval ambiguity and score-gap analysis
| Component | Purpose |
|---|---|
| Dense retrieval | FAISS over BGE embeddings |
| Sparse retrieval | BM25 over tokenized corpus |
| RRF fusion | Combines dense and lexical results |
| Section boosting | Prioritizes abstract, introduction, method, results, conclusion, and related sections |
| Diversity filtering | Limits duplicate chunks and over-representation from a single paper |
| Conditional reranking | Uses cross-encoder only when complex and low-confidence |
| Context compression | Selects query-relevant sentences before synthesis |
| Grounding guard | Rejects low lexical evidence coverage and missing entity support |
The graph layer uses:
- Citation graph: co-citation similarity from paper citation sets
- Semantic graph: paper-level embedding similarity
- Hybrid graph: merged and deduplicated citation + semantic neighbors
The graph agent performs:
- BFS expansion from retrieved seed papers
- Edge-weight filtering
- Section-aware chunk selection
- Semantic filtering against the user query
- Chunk ID and text fingerprint deduplication
- Adaptive latency budgeting
- Rolling latency telemetry
The graph artifact path is resolved from the project root using Path(__file__).resolve(), preventing deployment-time graph path mismatches between local execution, Docker, and server entrypoints.
The synthesis layer is designed to avoid mixed evidence:
- Context-present answers must use retrieved context only.
- General knowledge fallback is explicitly labeled and confidence capped.
- Paper IDs are cited only from retrieved context headers.
- "No evidence found" continuations are blocked from drifting into unsupported claims.
- Structured output generation removes invented paper IDs not present in retrieved evidence.
AetherCV uses a cache-first serving design optimized for repeat and paraphrased research queries.
| Cache Layer | Backing Store | Purpose |
|---|---|---|
| Agent L1 | In-process OrderedDict |
Zero-cost repeat agent outputs |
| Agent L2 | Redis | Shared agent output cache across workers |
| AIS exact cache | Redis | Exact grounded answer reuse |
| AIS semantic cache | Redis + embeddings | Paraphrase-level answer reuse with intent and token-ratio filters |
| Retrieval cache | Redis | Reconstructed chunks, contexts, embeddings, papers, sections |
| Decomposition cache | Redis | Avoids repeated LLM decomposition calls |
| Intent cache | Memory + Redis | Avoids repeated query classification |
Cache safety gates reject:
- Empty answers
- Low-confidence answers
- Ungrounded fallback answers
- Dynamic or time-sensitive queries
- Invalid cached chunk embeddings
- Semantic matches with low token overlap
- Intent-mismatched semantic cache candidates
The monitoring stack is built into the application rather than bolted on afterward.
| Area | Metrics |
|---|---|
| Traffic | Total queries, successful queries, failed queries |
| Latency | End-to-end query latency by route |
| Routing | Simple, complex, and OOD query counts |
| Retrieval | Retrieval success, retrieval failure, empty contexts |
| Graph | Graph expansion, graph failure, graph timeout |
| Cache | Cache hits and misses by layer and namespace |
| AIS quality | Grounded answers, fallback answers, hallucination detections |
| LLM | LLM success, failure, timeout, latency |
| Usage | Tokens and user query counts |
Health and readiness endpoints validate:
- Redis connectivity
- Embedding model readiness
- FAISS index availability
- Reranker load status
- Graph engine availability
| Metric | Result |
|---|---|
| Hallucination Rate | 0% |
| Grounded Rate | 100% |
| Retrieval Hit | 100% |
| Graph Used | 100% |
| Semantic Support | 0.82 |
| Fallback Rate | 0% |
| Metric | Result |
|---|---|
| Context Recall | 0.94 |
| Context Precision | 0.90+ |
| Answer Relevancy | 0.90+ |
| Faithfulness | 0.75 |
Note on Evaluation Infrastructure: Due to CPU-only infrastructure and LLM timeout constraints, RAGAS metrics were executed in reproducible batched runs — a deliberate engineering decision that preserves evaluation integrity while remaining viable on cost-constrained infrastructure.
Evaluation Pipeline Details
evaluation/fast_eval_metrics.pylogs operational benchmark metrics to MLflow.evaluation/ragas.pybuilds a HuggingFace dataset fromevaluation/eval_dataset.jsonl.- RAGAS uses a custom Groq LangChain wrapper with sequential async execution to avoid timeout and JSON truncation failures.
- BGE embeddings are reused through the shared
ModelRegistryto avoid duplicate model loads. - Per-question scores are exported as MLflow artifacts.
- The evaluation script truncates long answers for RAGAS only; full answers remain available in system output and logs.
Every optimization in this system was motivated by CPU-only infrastructure constraints and measured against real query traffic.
| Optimization | Mechanism | Impact |
|---|---|---|
| Lazy reranker loading | CrossEncoder is instantiated on first use via the singleton ModelRegistry, not at application startup |
Eliminates cold-start overhead for queries that do not require reranking |
| Singleton model registry | Embeddings, reranker, and domain artifacts are loaded once and shared across all request handlers | Prevents duplicate model loads from fragmenting available memory |
| Redis L1/L2 cache | In-process OrderedDict (L1) backed by Redis (L2) for agent outputs |
Near-zero latency for exact repeat queries; cross-worker cache sharing for paraphrased traffic |
| Semantic cache | BGE embedding similarity over cached answers with intent filtering and token-ratio guards | Serves paraphrase-equivalent queries without LLM synthesis |
| Context compression | Query-relevant sentence selection over retrieved chunks before synthesis | Reduces LLM input token count while preserving answer fidelity |
| Graph candidate pruning | BFS expansion is bounded by edge-weight thresholds and adaptive latency budgets | Prevents graph traversal from becoming a tail-latency bottleneck |
| CPU-bound latency optimization | Conditional reranking (complex + low-confidence only), capped retrieval candidates, single-worker defaults | Maintains ~4.9s p99 latency on CPU-only infrastructure |
AetherCV is engineered to degrade gracefully and recover automatically across every critical failure mode.
| Failure Mode | Protection Mechanism |
|---|---|
| Redis disconnection | Reconnection handling with fallback to in-process cache; health check exposes Redis status without blocking API |
| Reranker cold-start latency | Singleton registry with startup warmup primes the cross-encoder before the first live query |
| LLM timeout recovery | Token bucket rate limiter, timeout guards, and structured retry logic prevent cascading LLM failures |
| Cache payload corruption | Versioned keys, embedding reconstruction validation, and semantic thresholding reject malformed cache entries before they reach synthesis |
| Confidence-based fallback blocking | Answers below the confidence threshold are flagged and blocked from the semantic cache — preventing low-quality answers from being served to future users |
| OOD hard blocking | Domain centroid, cluster, and retrieval support gates reject out-of-domain queries before any retrieval occurs — no expensive compute is wasted on irrelevant traffic |
AetherCV was intentionally designed and optimized for CPU-only inference. This is not a limitation — it is an architectural principle.
Why this matters:
Most production AI systems either require GPUs (expensive, operationally complex) or quietly degrade when deployed on CPU infrastructure. AetherCV achieves production-quality retrieval and synthesis on commodity hardware through a set of deliberate engineering constraints:
| Principle | Implementation |
|---|---|
| CPU-only inference | No GPU dependency at serving time; embedding and reranking are CPU-bound by design |
| Low-cost deployment | Deployable on any Render, Fly.io, or VPS instance with standard resource limits |
| Edge-friendly serving | Lazy loading, singleton registries, and cache-first architecture minimize startup memory pressure |
| Memory-bounded graph expansion | BFS expansion applies edge-weight pruning and adaptive latency budgets to prevent unbounded memory growth |
| Zero GPU dependency | The full retrieval, reranking, and synthesis stack operates without CUDA, making the system portable and cost-predictable |
This philosophy enables teams to deploy a production-quality research assistant at a fraction of the infrastructure cost of GPU-dependent systems — while maintaining measurable accuracy guarantees (0% hallucination, 0.94 context recall).
The startup sequence is fully instrumented. The /ready endpoint blocks external traffic until all subsystems are warmed and available.
Startup Sequence Cumulative
─────────────────────────────────────────────────────
FAISS index load ████░░░░░░░░ 0.8s
BGE embedding model ████████████ 2.5s ← longest single stage
Domain artifact load █░░░░░░░░░░░ 0.2s
Reranker (lazy prime) ███████░░░░░ 1.8s
─────────────────────────────────────────────────────
Total cold-start 4.5s
API accepts traffic after: /ready → 200 OK
| Stage | Duration |
|---|---|
| FAISS index load | 0.8s |
| BGE embedding model load | 2.5s |
| Domain artifact load | 0.2s |
| Reranker lazy-load prime | 1.8s |
| Total cold-start | ~4.5s |
The reranker warmup is deliberately separated from startup — it is primed via the singleton registry and gated behind the /ready check, so the first live query never absorbs cold-start latency.
Latency values sourced from production logs and evaluation batch runs on CPU-only infrastructure.
| Stage | Latency |
|---|---|
| FAISS dense retrieval | ~0.04s |
| BM25 sparse retrieval | ~0.06s |
| RRF fusion | ~0.01s |
| Conditional cross-encoder reranking | ~0.80s (when triggered) |
| Full retrieval pass (simple query) | ~0.12s |
| Full retrieval pass (complex query + rerank) | ~0.90–1.20s |
| Stage | Latency |
|---|---|
| Context compression | ~0.05s |
| Groq LLM synthesis (simple RAG) | ~1.20–2.00s |
| Groq LLM synthesis (multi-step agent) | ~1.80–2.80s |
| Cache Layer | Hit Latency |
|---|---|
| L1 in-process cache | <1ms |
| Redis exact cache | ~2–5ms |
| Redis semantic cache (embedding lookup) | ~15–30ms |
| Query Complexity | Graph Expansion Time |
|---|---|
| Simple (2–3 seed papers) | ~0.20–0.40s |
| Complex (5–8 seed papers) | ~0.50–0.90s |
| Latency-budgeted cutoff | ~1.00s max |
A representative structured response from the /chat/ endpoint for a multi-step agent query.
{
"query": "Compare CLIP vs BLIP for multimodal representation learning.",
"route": "multi_step_agent",
"confidence": 0.89,
"grounded": true,
"graph_used": true,
"papers_used": [
"2103.00020",
"2201.12086",
"2111.07783"
],
"retrieval_latency_s": 1.79,
"graph_latency_s": 0.61,
"synthesis_latency_s": 0.96,
"total_latency_s": 3.36,
"cache_hit": false,
"ood_blocked": false,
"fallback_used": false,
"answer": "CLIP (Contrastive Language-Image Pretraining) learns visual representations by aligning image and text embeddings via contrastive loss over large-scale noisy web pairs, achieving strong zero-shot transfer. BLIP (Bootstrapping Language-Image Pretraining) introduces a unified encoder-decoder architecture with a filtered captioning pre-training strategy, enabling both understanding and generation tasks. In downstream benchmarks, BLIP outperforms CLIP on image captioning and VQA due to its generative capability, while CLIP retains advantages in zero-shot classification and retrieval. The key architectural distinction is CLIP's dual-encoder design versus BLIP's multimodal encoder-decoder with bootstrapped caption filtering.",
"citations": [
{
"paper_id": "2103.00020",
"title": "Learning Transferable Visual Models From Natural Language Supervision"
},
{
"paper_id": "2201.12086",
"title": "BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation"
}
]
}These are real engineering problems encountered during development. Each entry documents the root cause, the failure impact, and the engineering fix applied.
Root cause: RAGAS evaluation runs async LLM calls concurrently. Under Groq rate limits on CPU-only infrastructure, concurrent calls triggered cascading timeouts, causing JSON truncation and parse failures mid-batch.
Impact: Evaluation batches would fail silently mid-run, producing incomplete metric logs in MLflow and making benchmark comparisons unreliable.
Fix: Wrapped the Groq LangChain client with a sequential async semaphore (concurrency = 1), increased the LLM JSON token budget to accommodate full RAGAS output, and added answer truncation to reduce per-question token load. RAGAS metrics are now executed in reproducible batched runs with consistent results.
Root cause: Retrieval cache entries stored raw Python objects — including numpy arrays and custom chunk dataclasses — that could not be deserialized cleanly across process restarts or worker boundaries.
Impact: Cache hits on retrieval chunks occasionally returned corrupt or partial objects, causing downstream synthesis errors that were difficult to reproduce.
Fix: All Redis payloads are serialized to JSON-safe structures with explicit embedding reconstruction (from stored float lists back to numpy arrays). Versioned cache keys invalidate stale entries on schema changes. Payload validation gates reject malformed entries before they reach the retrieval layer.
Root cause: The cross-encoder (BAAI/bge-reranker-base) was loaded on the first query that triggered reranking — adding ~1.8s of cold-start overhead to that request's latency.
Impact: The first complex query after a fresh deployment experienced a latency spike that violated the p99 budget, creating an inconsistent user experience.
Fix: A startup warmup script pre-loads the reranker through the singleton ModelRegistry before the API begins accepting traffic. The /ready endpoint only returns healthy after warmup completes, preventing load balancers from routing traffic to an unwarmed instance.
Root cause: The default SQLAlchemy connection pool settings are incompatible with Supabase's PgBouncer transaction-mode pooler. Persistent connections accumulated and were rejected at the pooler boundary.
Impact: Under concurrent request load, database operations failed intermittently with connection errors — not visible in the Prometheus metrics until request success rate dropped.
Fix: SQLAlchemy is configured with NullPool and pool_pre_ping=True, ensuring each request acquires and releases a connection independently — fully compatible with PgBouncer transaction-mode pooling.
Root cause: The initial OOD classifier relied solely on domain centroid similarity. Borderline queries — particularly short model names and dataset identifiers that appear in CV but also in NLP contexts — scored above the centroid threshold and were incorrectly routed to retrieval.
Impact: Off-topic queries consumed retrieval compute and occasionally returned low-quality, marginally grounded answers, increasing the risk of hallucination.
Fix: The router now applies a multi-signal OOD decision: domain centroid similarity, domain cluster similarity, retrieval support score from a calibrated probe, and entity shape analysis for short tokens. All four signals must clear independent thresholds before a query is admitted to retrieval — eliminating the false-positive escape paths from single-signal routing.
Engineering honesty: the current system has deliberate scope boundaries that reflect infrastructure and design decisions, not oversights.
| Constraint | Context |
|---|---|
| CPU-first inference | Optimized for CPU-only serving. A GPU serving profile for the reranker and embedding stack is on the roadmap but not yet implemented. |
| Computer vision domain only | The corpus, domain centroid, and OOD calibration artifacts are scoped to computer vision research papers. Expanding to other domains requires re-ingestion and re-calibration. |
| Offline graph construction | The citation and semantic graphs are built during the data pipeline and served statically at runtime. Incremental graph updates for newly indexed papers are not yet implemented. |
| RAGAS batch execution | Due to Groq LLM rate limits on CPU infrastructure, RAGAS metrics are produced in sequential batched runs rather than continuous per-query evaluation. |
| Corpus expansion requires full re-pipeline | Expanding beyond 238 papers requires re-running scraping, extraction, chunking, embedding, and graph construction end to end. |
Real-time observability across traffic, routing distribution, cache performance, retrieval quality, and LLM health — instrumented via ASGI middleware and pipeline hooks at every subsystem boundary.
Operational benchmark metrics logged per evaluation run: hallucination rate, grounded rate, retrieval hit, graph usage rate, semantic support score, and fallback rate.
Per-question context recall, context precision, answer relevancy, and faithfulness scores — logged as MLflow artifacts and aggregated per evaluation batch.
Experiment tracking across batched evaluation runs — enabling benchmark regression detection and quality comparisons across system versions.
| Layer | Technologies |
|---|---|
| Backend API | Python, FastAPI, Uvicorn, Gunicorn |
| LLM | Groq |
| Embeddings | Sentence Transformers, BAAI/bge-base-en-v1.5 |
| Vector Search | FAISS |
| Lexical Search | BM25, rank-bm25 |
| Reranking | CrossEncoder, BAAI/bge-reranker-base |
| Graph Retrieval | Citation graph, semantic graph, hybrid graph, BFS expansion |
| Storage | PostgreSQL, SQLAlchemy |
| Cache | Redis |
| Auth | JWT, HTTP Bearer, Argon2 password hashing |
| Rate Limits | SlowAPI |
| Monitoring | Prometheus, Grafana |
| Experiment Tracking | MLflow |
| Evaluation | Fast metrics, RAGAS |
| Deployment | Docker, Docker Compose, Nginx, Render |
| Data Processing | pandas, BeautifulSoup, pdfplumber, GROBID-compatible extraction |
| Method | Endpoint | Auth | Purpose |
|---|---|---|---|
GET |
/ |
No | Service metadata |
GET |
/health |
No | Health status and warmup timings |
GET |
/ready |
Yes | Model, reranker, and warmup readiness |
GET |
/metrics |
No | Prometheus exposition |
POST |
/auth/signup |
No | Register a new user |
POST |
/auth/login |
No | Authenticate and return bearer token |
POST |
/chat/ |
Yes | Run research query through AetherCV |
GET |
/chat/stream |
Query token | SSE streaming response |
GET |
/chat/conversations |
Yes | List user conversations |
GET |
/chat/conversation/{conversation_id} |
Yes | Fetch conversation messages |
DELETE |
/chat/conversation/{conversation_id} |
Yes | Delete a conversation |
GET |
/usage/me |
Yes | Current user usage and quota state |
GET |
/admin/stats |
No in current code | Platform-level aggregate stats |
Registration is implemented as /auth/signup in the current FastAPI router. If an external API contract requires /auth/register, add a thin alias route to the same handler.
git clone <your-repo-url>
cd "Autonomous AI Research System"python -m venv .venv
source .venv/bin/activateOn Windows PowerShell:
.venv\Scripts\Activate.ps1pip install --upgrade pip
pip install -r requirements.txtcp .env.example .envFill in the required database, Redis, JWT, and Groq values.
uvicorn main:app --reloadLocal API:
http://127.0.0.1:8000
OpenAPI docs:
http://127.0.0.1:8000/docs
From the project root:
cd deployment
docker compose up --buildServices:
| Service | Port | Purpose |
|---|---|---|
| FastAPI app | 8000 |
AetherCV API |
| Redis | internal | L2 cache and semantic cache |
| Prometheus | 9090 |
Metrics scraping |
| Grafana | 3000 |
Dashboards |
| Nginx | 80 |
Reverse proxy |
Production entrypoint:
deployment/entrypoint.sh
The entrypoint waits for PostgreSQL and Redis, runs Alembic when migrations are present, then starts Gunicorn with Uvicorn workers.
.env.example is included in this repository.
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL SQLAlchemy connection string |
REDIS_URL |
Recommended | Redis URL used by monitoring health checks |
REDIS_HOST |
Docker | Redis host for container deployment |
REDIS_PORT |
Docker | Redis port |
REDIS_PASSWORD |
Docker | Redis password for Compose deployment |
GROQ_API_KEY |
Yes | Groq LLM access |
JWT_SECRET_KEY |
Yes | JWT signing secret |
JWT_ALGORITHM |
No | Defaults to HS256 |
ACCESS_TOKEN_EXPIRE_MINUTES |
No | Defaults to 1440 |
MLFLOW_TRACKING_URI |
Recommended | MLflow tracking server URI |
TRANSFORMERS_OFFLINE |
Recommended | Offline model loading flag |
HF_HUB_OFFLINE |
Recommended | Hugging Face offline flag |
GRAPH_PATH |
No | Override hybrid graph artifact path |
AGENT_MAX_WORKERS |
No | CPU worker control for agent execution |
METRICS_NAMESPACE |
No | Prometheus metric namespace |
Run Python tests and validation scripts:
pytestTargeted validation scripts:
python tests/test_L1_cache.py
python tests/test_sem_cache.py
python tests/test_cache_integration.pyCoverage areas:
| Area | Validation |
|---|---|
| Auth | Signup/login schemas, JWT security, password hashing |
| Cache | Exact cache, semantic cache, TTL, invalidation, concurrency |
| Routing | Simple vs complex vs OOD routing |
| OOD protection | Rejection of unrelated queries and entity mismatches |
| Retrieval | Dense, sparse, fusion, reranking, grounding guard |
| Graph | Graph loading, BFS expansion, semantic filtering, deduplication |
| Evaluation | Fast metrics and RAGAS batch execution |
| Challenge | Solution |
|---|---|
| Graph artifact path mismatch | Resolved hybrid graph paths from project root using Path(__file__).resolve() so local, Docker, and server entrypoints load the same artifact |
| CPU latency constraints | Conditional reranking, context compression, cache-first serving, capped candidates, single-worker CPU defaults |
| Reranker cold-start cost | Singleton registry with lazy CrossEncoder loading and startup warmup |
| Redis cache safety | Versioned keys, payload validation, embedding reconstruction, semantic thresholding, intent filters |
| Out-of-domain false positives | Domain centroid, domain clusters, calibrated query thresholds, retrieval probes, entity support checks |
| Follow-up query drift | Semantic memory, context dependency detection, rewrite guard, cache bypass for context-dependent turns |
| Hallucinated citations | Context-only prompts, citation whitelist, structured output paper-ID filtering |
| Observability gaps | ASGI middleware, monkey-patched pipeline hooks, subsystem health checks, Prometheus/Grafana metrics |
| RAGAS timeout and parse instability | Sequential async semaphore, Groq wrapper, larger JSON token budget, answer truncation for metric computation only |
| Supabase/PostgreSQL pooling issues | SQLAlchemy NullPool with pool_pre_ping=True for pooler compatibility |
| Priority | Roadmap Item |
|---|---|
| High | CI/CD pipeline with linting, tests, Docker build, and deployment checks |
| High | Kubernetes deployment manifests and Helm chart |
| Medium | Distributed inference workers for retrieval and synthesis |
| Medium | GPU serving profile for reranker and embedding workloads |
| Medium | Model fine-tuning on domain-specific instruction data |
| Medium | API contract alias for /auth/register |
| Low | Static architecture exports under docs/architecture/ |
AetherCV demonstrates production AI engineering across the full system lifecycle — from data ingestion and indexing to retrieval, synthesis, evaluation, and deployment. Every component is measurable, observable, and designed to fail gracefully.
| Competency | Evidence in Repository |
|---|---|
| Production AI Engineering | FastAPI service, model warmup, health and readiness checks, Gunicorn/Uvicorn, Docker Compose, Nginx, environment separation |
| Agentic AI | Semantic routing with OOD rejection, query decomposition, multi-step retrieval, global reranking, grounded synthesis, structured outputs |
| Retrieval Systems | FAISS dense retrieval, BM25 lexical retrieval, RRF fusion, cross-encoder reranking, section boosting, context compression |
| Graph RAG | Citation graph, semantic graph, hybrid graph construction, BFS expansion, edge-weight filtering, adaptive latency budgeting |
| Evaluation Engineering | Fast metrics (0% hallucination, 100% grounded), RAGAS (0.94 context recall), MLflow experiment tracking, per-question artifact logging |
| MLOps | MLflow tracking, artifact storage, reproducible evaluation batches, model registry, versioned cache keys |
| Observability | Prometheus metrics instrumented at every subsystem boundary, Grafana dashboards, request IDs, latency histograms, cache and quality counters |
| Reliability Engineering | OOD hard blocking, cache payload validation, confidence gates, reranker warmup, graph path resolution, Redis reconnection, LLM timeout recovery |
| Backend Engineering | JWT auth with Argon2, PostgreSQL persistence with SQLAlchemy, Redis multi-layer caching, usage quotas, SSE streaming, rate limiting |
This is not a notebook prototype. AetherCV is a deployed-style research assistant with a complete data ingestion pipeline, indexed artifacts, runtime safety protections, production monitoring, and a continuous evaluation loop that tracks quality metrics across every system version.
Built AetherCV — a production-grade Graph-RAG research engine for computer vision literature. The system integrates semantic routing with OOD rejection, hybrid FAISS/BM25 retrieval with RRF fusion, cross-encoder reranking, BFS-based graph expansion over citation and semantic graphs, and grounded answer synthesis across 12,288 indexed chunks from 238 papers. Infrastructure includes seven Redis cache layers (exact + semantic), Prometheus/Grafana observability, MLflow experiment tracking, RAGAS evaluation (0.94 context recall, 0% hallucination), JWT-authenticated FastAPI backend, and full Docker Compose deployment with Nginx. Optimized for CPU-only inference with lazy model loading, adaptive latency budgeting, and cache-first serving architecture.
rag graph-rag retrieval-augmented-generation fastapi computer-vision
machine-learning agentic-ai mlops observability prometheus grafana
redis faiss bm25 python docker nlp information-retrieval
MIT License.




