TECHNICAL ARTICLE

当 Agent 开始使用软件,我们还要先做一个页面吗?

从 Rust 版 Chat2DB 的产品讨论出发,重新思考 Agent 时代的软件设计:优先建设稳定的服务能力、权限和治理体系,让前端成为可以按场景组合的轻量入口。

二次元工程师为厚重的 Rust 服务核心插拔轻薄 UI 面板,小型 Agent 通过独立接口直接连接核心

最近和朋友聊起 Rust 版 Chat2DB,聊着聊着,话题从“要不要做可视化页面”,变成了另一个问题:

今天设计一款软件,我们应该优先考虑人怎么使用,还是 Agent 怎么使用?

朋友有一个很自然的判断:作为一款软件,总得有个前端展示一下。尤其涉及数据库接入、连接配置和权限管理,没有页面,好像总觉得产品还没做完整。

我能理解这种感觉。过去我们判断一款软件是否完整,往往会看它有没有一套完整的界面:能不能登录、能不能配置、能不能操作、能不能看到结果。

但现在,我越来越倾向于重新排列这个顺序。

先把服务能力做好,让 Agent 用得舒服。面向人的界面,可以先提供一个轻量的壳,再围绕真实需求慢慢补充。

我们需要的,究竟是什么?

这次讨论有一个很具体的背景。

我们的运营团队和增长实习生,经常需要查询数据、开展分析。如果直接给他们数据库账号,即使账号被配置为只读,账号分发、权限变更、访问范围和使用记录,也仍然需要管理。

而他们真正想做的,通常也不是“使用数据库客户端”。

他们想知道的是:最近的注册转化为什么下降了?某个渠道带来的用户留存怎么样?一次活动到底有没有效果?

过去,为了回答这些问题,人需要打开工具、找到表、理解字段、编写查询,再把结果整理成结论。

现在,这个过程有机会由 Agent 协助完成。人的主要工作逐渐变成表达问题、补充背景,以及判断结果是否可信。

在这种工作方式下,Chat2DB 最有价值的部分,就未必是 SQL 编辑器、结果表格和数据库管理页面了。

它可以成为数据库与 Agent 之间的一层服务:负责连接数据库、提供结构信息、执行查询,并在整个过程中落实身份、权限和审计。

产品的中心,也就从“给人一个操作数据库的地方”,转向了“让数据能够被安全、可靠地使用”。

人和 Agent 通过 Chat2DB 服务访问数据库,连接、权限、执行与审计集中在服务层

Chat2DB 可以成为人、Agent 与数据库之间稳定的服务层。

Agent 优先,不只是加一个 MCP 接口

如果只是给现有软件套上一层 MCP 接口,我觉得还谈不上 Agent 优先。

真正的变化,是把原来藏在页面和操作流程里的能力,整理成可以独立调用的服务。

比如,Agent 需要知道有哪些表、字段是什么意思、数据之间有什么关系。只有表名和列名,往往不足以支持业务分析,还需要指标口径、使用说明和必要的业务背景。

Agent 发起查询时,服务需要明确知道:它在代表谁操作,这个人属于哪个团队,可以访问哪些数据,这次请求是否在授权范围内。

执行成功后,服务要返回清楚的结果;执行失败后,也要说明是权限不足、请求不支持,还是数据库暂时不可用。

这些事情,原来可能依赖人阅读页面提示、理解报错,再自己调整操作。Agent 要稳定地使用软件,就需要软件把这些信息表达得更明确。

所以,Agent 优先首先是一种服务设计方式。MCP 可以是入口,但产品的核心仍然是入口后面的能力是否完整、边界是否清楚、行为是否可预期。

权限不能建立在“Agent 会听话”上

讨论中,我们聊到了一个问题:

如果底层连接使用的是高权限数据库账号,只在应用层配置“只能执行 SELECT”,是否就能保证不会产生修改数据的行为?

比如,一条看起来用于查询的语句,调用了一个具有副作用的函数,又该怎么处理?

我觉得这个问题的价值,在于提醒我们:权限配置、执行前检查和最终的安全保证,是不同层次的事情。不能因为加了代码检查,就直接把结论说成“百分之百安全”。

LLM 可以帮助理解业务问题、组织请求,但它不应该决定自己有没有权限,也不应该成为权限控制的最后一道防线。

对于这样的产品,真正需要投入的,恰恰是那些不太容易展示在截图里的能力:

谁在访问数据,Agent 代表的是谁;权限如何分配,何时生效;员工离职或岗位调整后,授权如何收回;出现问题时,能否还原当时访问了什么、执行了什么。

这些能力决定了企业敢不敢把真实的数据访问交给它。

漂亮的查询页面能帮助演示产品,可靠的治理体系才能支撑日常使用。

Agent 请求经过服务端身份与权限校验,授权通过后执行,越权请求被拒绝,并保留访问记录

权限在执行边界落实,访问记录覆盖允许与拒绝的请求。

前端可以有,但不必承载整个产品

我并不觉得以后软件就不需要页面了。

管理员需要配置连接、管理授权和查看审计记录。业务人员需要确认分析结果,有时也需要查看图表,或者对一个敏感操作作出确认。

这些都是明确的人类交互需求,值得做好。

但它们不一定需要长成一个功能庞大的数据库桌面客户端,更不一定要在服务能力成熟之前就全部完成。

我更偏向讨论里提到的、类似 Dsh 的思路:我们保证底层服务完整、稳定,提供一个能用的前端壳子,上层界面允许用户按自己的场景组织。

同一套服务,运营团队可以接在日常使用的 Agent 里,数据团队可以接进自己的工作台,管理员可以通过一个简单的网页完成配置。

部署方式也可以因此更灵活。产品可以先是一个服务进程,配套一个轻量的 Web 管理入口。是否需要桌面端、是否需要云端页面,再由实际的部署和使用场景决定。

这里有一个前提:所谓“壳子”,不能意味着把未完成的产品交给用户。

默认界面仍然应该让用户完成基本的接入、配置和排错。开放定制,是为了容纳不同需求,而不是要求每个用户都先开发一套前端。

Agent 入口、默认管理页面与用户自建工作台共同连接统一服务与治理层

界面可以按场景组合,底层能力与权限规则保持一致。

当界面越来越容易生成,产品应该沉淀什么?

过去,标准软件通常会把所有人带进同一套界面,再不断增加功能,满足不同角色的需要。

最后,产品很容易变成一个庞大的操作系统:导航越来越长,设置越来越多,每个团队却只使用其中一小部分。

如果 Agent 能调用稳定的服务能力,而界面也更容易按需求生成,那么我们就有机会换一种组织方式。

把身份、权限、业务规则和执行能力沉淀在服务层;把人与软件交互的方式,留给具体场景。

当然,界面可以灵活变化,授权边界不能跟着变化。无论请求来自官方页面、用户自建工作台,还是某个 Agent,都应该受到同一套服务规则约束。

这也是我认为这条路线有价值的地方:用户可以更换入口,产品仍然提供一致、可靠的能力。

软件的价值,不必全部体现在它自己的页面里。

Rust 重写的机会,是重新决定产品的重心

回到 Chat2DB。

如果 Rust 版只是把 Java 版的接口、功能和页面重新实现一次,它当然可能带来工程上的收益,但这些收益本身,还不足以构成新的产品方向。

更值得借这次重写想清楚的是:未来谁会高频调用 Chat2DB?它替用户承担的核心责任是什么?

如果答案越来越接近 Agent,以及 Agent 背后的运营、增长和数据分析团队,那么研发优先级就应该发生变化。

先让服务可独立部署、可稳定调用;让 Agent 获得足够的数据库语义;把身份、权限和审计贯穿整个访问过程;再提供完成基本管理任务的页面。

至于复杂的编辑器、丰富的可视化,以及完整的桌面端体验,可以随着真实需求逐步投入。

我倾向于把这种选择概括为:服务 Agent 优先,人保留理解、配置和控制系统的入口。

我们仍然是在为人设计软件。只是当人开始把更多操作交给 Agent,软件就没有必要要求每一步都回到自己的页面上完成。

对 Chat2DB 来说,我更期待它成为一个可以放心接入的数据库服务:底层能力完整稳定,上层既能接 Agent,也能接不同的界面。

页面可以是一个壳。真正需要做厚的,是这个壳背后的能力和信任。