我如何为新加坡法律构建 RAG 引擎
Source: Dev.to

大家好!
我是一名学生开发者。最近,我创建了 Explore Singapore,一个基于 RAG 的搜索引擎,抓取了约 20,000 页新加坡政府的法案和法律。
在发布 MVP 后,我收到了关于幻觉(hallucinations)和查询深度的关键反馈。我采纳了这些反馈,专注于改进,并刚刚发布了 Version 2。
设计与 UI
我希望避免枯燥的政府网站。
设计:深受 Apple 极简风格的启发。
技术:自定义前端与 Python 后端交互。
V2 的工程大改造
社区在三个主要方面对我提出了挑战。以下是我的解决方案:
1. “人格” 修复
问题:我使用了“三重故障转移”系统,包含三个模型作为备份。当主模型失效时,备份模型的回答风格完全不同。
解决方案:添加了动态系统指令。当后端切换到 Model B 时,会使用专为 Model B 设计的提示,使其模仿主模型的结构和语调。用户不会察觉到切换。
2. “深度搜索” 修复
问题:对 “Starting a business” 的简单语义搜索会遗漏相关的法律,如 “Tax” 或 “Labor” 法案。
解决方案:实现了多查询检索(Multi‑Query Retrieval,MQR)。现在,一个 LLM 会拦截你的查询,将其拆分为子意图(例如 “Business Registration”、 “Corporate Tax”、 “Employment Rules”),同时搜索所有子意图并合并结果。
结果:答案更加丰富、具备上下文感知。
3. “幻觉” 修复
问题:垃圾进,垃圾出。如果 FAISS 检索到了不合适的文档,LLM 会产生不准确的信息。
解决方案:加入了交叉编码器重新排序层。
- FAISS 抓取前 10 条结果。
- 专用的交叉编码器模型对它们进行相关性评估。
- 将不相关的部分剔除后再交给聊天 LLM。
技术栈
- 嵌入模型:BGE‑M3(本地运行)
- 向量数据库:FAISS
- 后端:Python + 自定义三模型故障转移(在 Hugging Face 上运行)
- 逻辑:多查询 + 重新排序(V2 新增)
试一试
我仍在学习中,期待听到你们对新逻辑的看法。
- 在线演示: Explore Singapore
- GitHub 仓库: adityaprasad-sudo/Explore-Singapore
欢迎对平台提出反馈——尤其是关于故障转移速度的意见!👇