首页 > 开源 > 别再让 Agent 裸连数据库了:如何用 MCP + 语义网关解决 NL2SQL 幻觉与权限失控

别再让 Agent 裸连数据库了:如何用 MCP + 语义网关解决 NL2SQL 幻觉与权限失控

OSChina资讯 2026-09-18 20:54 5 阅读 查看原文

在 2026 年,给 AI Agent(Cursor、Claude Desktop、Dify、Coze 等)外挂一个数据库连接,已经成为很多开发者的标配操作。从简单的官方 SQLite/MySQL MCP 到各种通用客户端扩展,让大模型“直接查库”的门槛被降得极低。

  • 然而,一旦进入真实业务场景,大部分团队很快就会撞上两堵高墙:

  1. 语义幻觉严重:大模型根本不懂企业的“黑话”缩写、枚举字典与隐式多表关联,写出的 SQL 经常连表都 Join 错;

  2. 生产权限失控:直接给 Agent 暴露数据库连接凭证无异于“裸奔”,更无法防范越权删改与高危全表扫描;只读权限又导致 Agent 无法胜任轻量级 CRUD 应用。

本文将从我们从传统 BI、自建 ChatBI 到开源项目 DatI (Data Intelligence) 的演进实战出发,深入拆解:在 Agent 时代,企业级 NL2SQL 智能问数与轻应用到底应该怎么做?


一、演进溯源:从传统 BI、NL2DSL 到 MCP 语义网关

我的前两段职业经历都是围绕 BI。

  • 最开始主要是给一线业务做报表:用 SQL 写数据服务、高代码开发看板,也用过 Tableau、PowerBI、永洪 BI 做自助分析;第二段工作转向自主研发 BI 系统,适逢大模型浪潮爆发,团队重心聚焦在 智能问数(ChatBI) 方向。

  • 但彼时的智能问数,往往能做出很酷炫的 Demo,却极难在业务一线真正落地。核心痛点有两点:

  1. NL2DSL 的两难困境:早期模型能力有限,为了提升取数准确率,大家普遍采用“自然语言转结构化 DSL(如指标模型)”路线。但 DSL 在提升可控性的同时,也严重扼杀了复杂即席多维分析的灵活性。

  2. 交付形态的割裂:在实际业务中,用户要的往往不是一个单独被孤立的“问数看板”,而是想将“查数与改数的能力”无缝嵌入到各种日常工作流(如协同办公、自动化客服、巡检机器人)中。

随着 Model Context Protocol (MCP) 的普及,我们找到了破局的优雅解法:无需重型 BI 平台,直接将数据库封装为规范的 MCP 服务,配合轻量化的语义层与受控工具链,直接无缝插拔进任意 Agent。

这便是开源项目 DatI (Data Intelligence) 的核心初衷:

DatI
  • DatI 的设计哲学非常克制:对接多源数据库 ➔ 统一维护业务语义层 ➔ 组装预置与自定义工具 ➔ 一键发布为标准 MCP 服务。 终端 Agent 挂载该 MCP 后,不仅能完成准确的只读问数,还能通过白名单机制安全执行增删改,轻松构建低代码轻应用。


二、场景实战:从数据分析到轻应用构建(家庭记账案例)

我们通过一个经典的 “家庭双人记账与消费分析” 场景,来看轻量语义网关的实际落地流程:

  • 业务需求:两个用户共用一个家庭账本。记账时自动识别身份计入各自流水;分析时既可按个人拆解,也可按家庭大盘多维汇总。

  • 底层架构:MySQL 中包含 3 张表(account 账户表、category 类目表、transaction 流水表)。

1. 语义建模与工具配置

借助平台(支持 dati-ops skill 自动化配置):

  • 开启 4 个预置工具:元数据检索、表清单、表结构详情、受控 SQL 执行(限制只允许 SELECT)。

  • 配置 4 个参数化自定义工具:初始化账户、记账、改账、删除流水。

DatI
DatI
DatI

2. 跨宿主 Agent 无缝接入

发布为 MCP 服务后,用户 1 在 WorkBuddy 接入,用户 2 在 千问办公 接入。无需重复开发后端,两个 Agent 即可复用宿主自带的 OCR 识图报销、微信远程对话、图表可视化能力,直接进行记账与消费分析:


三、深度拆解:轻量数据库语义网关的架构设计

  • DatI 整体由三大核心模块构成:

1. 异构数据源接入

目前原生支持 MySQL、PostgreSQL、ClickHouse、Doris、MariaDB 等主流关系型与分析型数据库,并支持快速横向扩展。

为什么后端坚守 Java 构建? 在 AI 领域,Python 和 TypeScript 固然流行,但数据网关的底座是企业生产数据库。Java 生态中的 JDBC 标准规范 与 HikariCP 连接池,在突发瞬时高并发、长连接治理、事务控制与异构驱动兼容性上,历经了二十多年工业级高可用验证,其稳定性是动态语言难以企及的。

2. 业务语义建模层

大模型在 NL2SQL 中犯错,90% 是因为缺乏业务上下文。DatI 允许为表、列、枚举字典值、领域术语配置业务别名与详细描述:

  • 比如把 txn_type=1 明确绑定为“转账支出”,把“GMV”绑定到具体的聚合计算公式。

  • 为大模型推理提供精准、结构化的 Prompt 上下文补全。

3. MCP 服务动态发布

将选定的数据范围、工具集与系统提示词(Prompt),一键发布为标准 Streamable HTTP MCP 端点。

为什么选择服务端 MCP 协议? 传统的本地 Skill 需要在每个用户电脑上明文配置数据库帐号密码,风险极高。而服务端 MCP 将数据源凭证集中托管与鉴权,终端开发者和 Agent 仅需一个个人 Token 即可连接,实现“一处语义配置,全员安全复用”


四、工具链的核心设计:预置探索 + 参数化模板

  • 工具是整个 MCP 网关与大模型交互的核心中枢。DatI 采用了“预置探索”与“参数化模板”双轨机制:

1. 预置工具链(自主探索空间)

  • Elasticsearch 元数据联合检索:将表名、字段注释、枚举字典和业务术语打平存入 ES。Agent 只需发起一次自然语言关键词检索,就能基于倒排索引精准召回最相关的候选表与字段上下文,极大缩减 Prompt Token 开销。

  • 表空间探索工具(ListTables / DescribeTable):让 Agent 在必要时按需展开表结构深挖。

  • 受控 SQL 执行器:支持大模型自主编写即席查询,但严格施加 AST 语法级操作管控(如禁止 DROP、可选禁止写操作、限制查询超时与最大行数)。

  • 元数据自演化更新:允许 Agent 在交互中提报或更新术语元数据,形成越用越懂业务的自进化闭环。

2. 参数化 SQL 模板(高危操作与多租户安全锁)

针对复杂的多表联查或高危的 UPDATE/DELETE 操作,DatI 推荐采用参数化 SQL 模板。 模板引擎采用类似 Handlebars 的声明式动态语法,并且支持注入上下文会话变量(如当前用户的 {{_user.id}} 或 {{_user.name}}):


 

UPDATE transaction SET {{#if amount}}amount = {{amount}},{{/if}} {{#if category}}category_id = (SELECT id FROM category WHERE name = {{category}}),{{/if}} updated_at = now()WHERE id = {{transaction_id}} AND user_name = {{_user.name}}

这种设计的巨大优势在于

  1. 防止 SQL 注入与越权篡改:大模型只能填入具体参数,无法篡改核心更新逻辑;

  2. 行级数据隔离:即便大模型“幻觉”了,底层的 WHERE user_name = {{_user.name}} 也会由服务端强行从认证上下文注入,彻底杜绝越权访问。


五、横向对比:DatI 的核心生态位

给 AI 接入数据库的方案层出不穷,从官方的单库 MCP、DBHUB 到商业 ChatBI,DatI 到底有什么不可替代的价值?

评估维度

DatI (语义网关)

裸写代码定制

官方开源单库 MCP

DBHUB / 通用工具箱

独立重型 ChatBI

接入形态

服务端标准 MCP

任意形态

本地进程 MCP

本地进程 MCP

封闭独立 Web 应用

凭证安全

服务端集中托管 / Token 隔离

视代码实现而定

本地配置文件明文存放

本地明文存放

服务端托管

业务语义层

完整支持(术语/字典/ES检索)

需硬编码 Prompt

仅有原始 DDL schema

仅有原始 DDL schema

绑定私有 DSL 建模

复杂查询保障

预置探索 + 参数化 SQL 模板

手写复杂 Tool 逻辑

无保障,极易翻车

简单自定义工具

绑定固定指标模型

工作流嵌入度

极高(任意 MCP 宿主即插即用)

极高(但开发量大)

极低(有限 iframe/API)

简单概括,DatI 的定位是专为 AI Agent 设计的企业级数据库语义网关

  • 比官方单库 MCP 更懂业务、更安全(多了语义层、ES 检索与参数化防注入);

  • 比重型 ChatBI 更轻量、更开放(免部署重型套件,秒级嵌入任意 Agent 工作流);

  • 比纯代码定制更敏捷(可视化配置、全员 Token 复用、零维护成本)。


六、开源共建

任何一个开发工具的成熟,都离不开真实业务场景的持续锤炼。我们非常期待大家把 DatI 带入你的 Cursor、Dify 或者自建 Agent 中尝试,欢迎体验、吐槽与共建!