Story

Show HN: I built a RAG engine to search Singaporean laws

ambitious_potat Saturday, February 07, 2026

I built a "Triple Failover" RAG for Singapore Laws, then rewrote the logic based on your feedback.

Hi everyone!

I’m a student developer. Recently, I created Explore Singapore, a RAG-based search engine that scrapes about 20,000 pages of Singaporean government acts and laws.

I recently posted the MVP and received some tough but essential feedback about hallucinations and query depth. I took that feedback, focused on improvements, and just released Version 2.

Here is how I upgraded the system from a basic RAG to a production-grade one.

The Design & UI I aimed to avoid a dull government website.

Design: Heavily inspired by Apple’s minimalist style.

Tech: Custom frontend interacting with a Python backend.

The V2 Engineering Overhaul

The community challenged me on three main points. Here’s how I addressed them:

1. The "Personality" Fix Issue: I use a "Triple Failover" system with three models as backup. When the main model failed, the backups sounded entirely different.

The Solution: I added Dynamic System Instructions. Now, if the backend switches to Model B, it uses a specific prompt designed for Model B’s features, making it mimic the structure and tone of the primary model. The user never notices the change.

2. The "Deep Search" Fix Issue: A simple semantic search for "Starting a business" misses related laws like "Tax" or "Labor" acts.

The Solution: I implemented Multi-Query Retrieval (MQR). An LLM now intercepts your query. It breaks it down into sub-intents (e.g., “Business Registration,” “Corporate Tax,” “Employment Rules”). It searches for all of them at the same time and combines the results.

Result: Much richer, context-aware answers.

3. The "Hallucination" Fix Issue: Garbage In, Garbage Out. If FAISS retrieves a bad document, the LLM produces inaccurate information.

The Solution: I added a Cross-Encoder Re-Ranking layer.

Step 1: FAISS grabs the top 10 results.

Step 2: A specialized Cross-Encoder model evaluates them for relevance.

Step 3: Irrelevant parts are removed before they reach the Chat LLM.

*

The Tech Stack *

Embeddings: BGE-M3 (Running locally)

Vector DB: FAISS

Backend: Python + Custom Triple-Model Failover

Logic: Multi-Query + Re-Ranking (New in V2)

Try it out

I am still learning. I’d love to hear your thoughts on the new logic.

Live Demo: https://adityaprasad-sudo.github.io/Explore-Singapore/

GitHub Repo: https://github.com/adityaprasad-sudo/Explore-Singapore

Feedback, especially on the failover speed, is welcome!

Summary
This article provides a comprehensive guide to exploring Singapore, covering popular attractions, cultural experiences, and practical travel tips for visitors to the city-state.
4 4
Summary
github.com
Visit article Read on Hacker News Comments 4