Mikel26/nextjs-text-to-sql
GitHub: Mikel26/nextjs-text-to-sql
为 Next.js + PostgreSQL 提供带安全防护的自然语言转 SQL 查询能力,让用户用日常语言直接与数据库交互。
Stars: 0 | Forks: 0
# 与你的数据聊天 — 精简版 🐘🤖
为 **Next.js + PostgreSQL** 提供的 **text-to-SQL** 功能(“用自然语言查询你的数据”),并具备合理的安全基础。用西班牙语提问 → 生成 SQL → 以表格展示结果。
## 演示
**▶ 在线体验:** https://nextjs-text-to-sql-green.vercel.app/
输入 *“¿Cuánto vendimos por ciudad?”*(我们在各个城市的销售额是多少?),你就能针对演示数据库获取生成的 SQL 和结果表格。
## ⚡ 快速开始
环境要求:Node 18+,Docker(用于运行 Postgres)以及一个 Groq 的 API key(免费,无需信用卡)。
```
# demo 数据库(创建 schema、数据和 read-only 角色)
docker compose up -d
# 依赖项
npm install
# 环境变量
cp .env.example .env # añade tu GROQ_API_KEY
# 启动
npm run dev # http://localhost:3000
```
## 🧠 工作原理
3 步流水线(`src/app/api/query/route.ts`):
1. **自然语言 → SQL** — LLM 根据问题和数据库 schema 生成 SQL(`src/lib/llm.ts`)。
2. **防护** — 通过 AST 验证,确保它只是针对允许表的单一 `SELECT` 语句(`src/lib/guard.ts`)。
3. **只读执行** — 使用只读数据库角色,并在 `READ ONLY` 事务中执行(`src/lib/db.ts`)。
## 🔒 包含的安全特性(以及缺失的部分)
精简版已经包含了你**绝对不应该**省略的基础防护:
- ✅ **只读**数据库角色 + `READ ONLY` 事务
- ✅ 基于 **AST** 的验证:仅允许 `SELECT`,单条语句,表级白名单
- ✅ 设置了 `statement_timeout` 和行数上限
- ✅ 将用户提问作为**数据**处理,与系统指令严格分离
- ✅ 展示生成的 SQL(人类在环)
**Pro** 版本增加了严谨的生产环境所需功能:
- 🔓 行级安全 / 租户隔离以及 PII 脱敏
- 🔓 **弃权机制**:检测低置信度并拒绝回答(而不是凭空捏造)
- 🔓 **token 成本**控制(模型路由 + 缓存)
- 🔓 针对提示词注入的强化防御
- 🔓 在发布前用于衡量准确性的 **evals** 套件
→ 完整指南 + Pro 仓库:**[Gumroad 等候名单](https://mikeo6.gumroad.com/l/ffuzxy)**
→ 逐步详解如何强化安全:**(即将推出)**
## ⚠️ 免责声明
这是一个教育性质的基础项目。在将其暴露给真实用户之前,请检查并根据你的具体使用场景调整安全配置。
## 许可证
MIT — 查看 [LICENSE](./LICENSE)。
标签:AST验证, DLL 劫持, MITM代理, PostgreSQL, Sysdig, Text-to-SQL, 大语言模型, 测试用例, 自动化攻击, 请求拦截