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, 大语言模型, 测试用例, 自动化攻击, 请求拦截