Narad: The Intelligent Detective Engine
Inspiration
Narad, from ancient Indian history, was known for traveling across kingdoms, gathering information, and uncovering hidden connections between events. We drew inspiration from this idea to build a modern geopolitical intelligence engine.
Today, critical global events are fragmented across languages, regions, and news ecosystems. A policy shift in Chennai, a crop failure in Punjab, and disruptions in the Suez Canal may appear unrelated, but can form part of the same economic or geopolitical chain.
Narad was built to uncover these hidden relationships and provide deeper investigative insights.
What it does
Narad is a multilingual intelligence platform that analyzes over 150,000 news articles to detect hidden geopolitical, economic, and historical connections.
The system combines:
- Semantic vector search
- BM25 lexical retrieval
- Multilingual Named Entity Recognition
- Graph-based relationship analysis
- LLM-powered reasoning
to identify related events, bridge disconnected topics, and surface historical precedents.
We implemented a custom 3-tier temporal model to balance:
- Breaking news detection
- Medium-term developments
- Long-term historical analysis
using adaptive temporal scoring:
$$ S_{temporal} = e^{-\frac{\Delta t}{72}} $$
for recent events, and:
$$ S_{temporal} = 0.3 + 0.7 \left( 1 - e^{-\frac{\Delta t}{8760}} \right) $$
for historical precedent discovery.
Narad also uses graph centrality and Louvain community detection to identify “bridge” events connecting otherwise unrelated geopolitical domains.
How we built it
Backend & Infrastructure
- Python
- FastAPI
- PostgreSQL + pgvector
- SQLAlchemy
Machine Learning & Intelligence
- Sentence-Transformers
- spaCy
- AI4Bharat IndicNER
- NetworkX
LLM Orchestration
Using AWS Bedrock with:
- DeepSeek V3.2
- Llama 3.3 70B
- AWS Nova Pro
Frontend
- React
- Vanilla CSS
Challenges we ran into
DBSCAN Scaling Crisis
Running DBSCAN globally across 150k articles required nearly:
$$ 150{,}000^2 \times 4 \approx 90 \text{ GB RAM} $$
which exceeded our infrastructure limits.
Solution
We introduced a 7-day sliding clustering window, reducing active clustering size from 150k to ~5k articles and lowering memory usage below 100MB.
Query Latency
Our initial investigation pipeline triggered 120 sequential database queries per request, causing response times above 10 seconds.
Solution
We replaced sequential lookups with bulk batched SQL queries using: SQL query : WHERE id IN (...)
which significantly improved latency.
Recency Bias in Embeddings
Semantic embeddings naturally favored recent articles, suppressing older but strategically important precedents.
Solution
We built separate entity-linked historical retrieval paths to surface long-term geopolitical patterns effectively.
Accomplishments that we’re proud of
- Built a multilingual intelligence engine processing 150k+ active articles
- Combined vector search, graph intelligence, temporal reasoning, and LLM validation into a unified pipeline
- Reduced clustering memory usage from 90GB to under 100MB
- Improved investigation latency from 10+ seconds to near real-time
- Developed bridge-discovery analysis capable of uncovering non-obvious geopolitical relationships
What we learned
We learned that semantic search alone is insufficient for investigative intelligence. Effective geopolitical analysis requires combining:
- Vector search
- Lexical retrieval
- Entity graphs
- Temporal reasoning
- Graph centrality
We also learned that algorithmic optimization often outperforms expensive infrastructure scaling.
What's next for Narad
*IndicNER Native Deployment: Fully loading the 500MB AI4Bharat CPU model to automate regional entity parsing in our ingestion pipelines.
*Persistent Caching: Transitioning from process-local Python dictionaries to an ElastiCache Redis setup to maintain cached graph topologies across App Runner deployments.
*Precedent-Based Forecasting: Deploying a pattern-matching prediction engine that links active event chains to historical precedents to automatically output likely outcomes and confidence metrics for active crises.
Built With
- aws-app-runner
- aws-bedrock-(deepseek-v3.2
- aws-nova-pro)
- aws-rds
- fastapi
- langdetect
- llama-3.3
- pgvector
- postgresql
- python
- react
- scikit-learn
- sentence-transformers
- spacy
- unidecode
Log in or sign up for Devpost to join the conversation.