我花了 8000 块/月的服务器自研问数,最后被一只"龙虾"教做人🦞

23 阅读12分钟

一、领导在群里甩了一张表

先讲一个上周刚发生的事。

领导在群里@我:"今年年初上报的资产表跟平台目前录入的有出入,请查明原因。"

按照三个月前的我,这事大概率要这么干——打开 Navicat、连上数据库、对照 Excel 一行行肉眼比对、写几条 SQL、再把结果整理成 Word 发回群里。运气好两小时,运气不好一下午。

但这次我没这么干。

我把那张资产表和领导的原话,直接丢给了 OpenClaw(中文社区里大家叫它"小龙虾")。它连上数据库跑了一圈,过了几分钟,给我返回了两个原因:

问题一:某栋大厦面积不一致,平台 106㎡ vs 检查表 140㎡,差了 34㎡。可能是口径问题——平台登记的是套内使用面积,检查表用的是建筑面积;也可能是 B1 和 B2 两个单元,平台只登记了其中一个,检查表把两个合起来了。账面原值也能印证这个推测:平台 655.07 万,检查表 638.93 万,接近但不完全一致。

问题二:有 2 处合计 31.81㎡ 的房产在检查表中完全缺失。这 2 处在平台上有完整登记,产权清晰、两证合一、有账面原值合计 268.78 万元,所属单位也写得明明白白。但检查表里(无论是具体填报还是汇总),全部 44 条记录翻遍了都没有。属于明显的漏报。

我拿着结论去线下核对了一下——就是这两个问题。

那一刻我突然意识到,我前两年熬夜加班搞的那个"智能问数"项目,可能从立项的第一天就走错了方向。

这篇文章想聊聊这件事。我会从三个角度展开:过去我体验过的工具、我自己折腾问数的那段血泪史、以及为什么我现在觉得 Agent 是这件事的最优解。

二、那些年我们追过的问数工具

第一次听到 Text2SQL 这个词的人,基本都会觉得这玩意儿神了——数据库工程师和分析师可以下课了。

用户问一句"某家公司有多少不动产?",大模型理解问题、自动写 SQL、数据库跑一下、答案出来,顺带还能给你分析一波数据和未来趋势。看起来非常丝滑。

这也是 Text2SQL 曾经很火的原因:它把"查数据库"这件事,包装成了一个非常自然的 AI 交互场景。不会写 SQL 的人,也能像聊天一样问数。

在 2026 年的今天之前,开源社区已经涌现过一大堆 Text2SQL 工具:国产的飞致云 SQLBot、国外的 Vanna.ai、AskYourDatabase 等等。

国产里 SQLBot 我个人体验下来算是最友好的。它采用了符合国人习惯的交互方式——类似 ChatGPT 的问答模式,支持快速配置数据源、后台术语和 SQL 示例,输出还能直接渲染成图表。普通业务人员稍微培训一下就能用。

至于 Vanna.ai 和 AskYourDatabase,当时确实给了小小的我一个大大的震惊 🤯。高深程度和愿景都很美好,但真上手——不是科班程序员出身的我,看到一堆 API 和代码配置就头大,真不如一剑杀了我痛快。更何况当时还没有 Claude Code、Codex 这种神器傍身,光看文档就心累,更别说真正落地了。

但话说回来,真正把这些工具放到业务现场之后,我反而越来越觉得:

Text2SQL 最难的地方,可能根本不是"把中文翻译成 SQL"。

真正难的是——怎么把一个业务问题,稳定地翻译成一条正确、可解释、可执行、可复盘的 SQL。

这两件事听起来很像,实际差很多。

比如用户问"富吉股份有多少不动产?",这句话里至少埋了几个坑:

  • "富吉股份"是不是数据库里的标准公司名?有没有同名、简称、别名?

  • "不动产"的业务口径到底是什么?

  • 如果用户下一句追问"那江苏的呢?",系统还能不能接得住?

  • 如果模型写错 SQL,会不会查出一个看起来很合理但其实完全错的结果?

后来我才慢慢意识到,问数系统不能只靠"模型会写 SQL"。

因为在真实业务里,最危险的不是模型不会答,而是它答得很像真的。

三、烂尾的 8000 块

今年春节后,中国互联网突然火了一个叫 OpenClaw 的东西。我下载玩了几天,觉得没啥意思就卸了——当时的我,还把它当玩具看。

然后我一头扎进了自研问数工具的大坑。

SQL 标准化、大模型返回内容的 SQL 提取、后台配置功能……一项一项硬磕。最离谱的是,我还跟公司申请了一台 8000 元/月的云服务器,准备搞本地化模型训练。那段日子,加班到一两点是常态,周末基本都给了显卡。

但是测试阶段我就开始有不祥的预感了:

  • 大模型太"礼貌",时不时给你多生成点没让它写的内容;

  • SQL 飘忽不定,同一个问题问两次能给你两版完全不同的写法;

  • 修正和补缺的工作量大到让人头皮发麻。

然后……我品尝到了开发生涯中第一次"项目烂尾"的滋味。那个项目现在还躺在我 Mac 的时间机器备份里,像一座小型墓碑。

8000 块的服务器,几个月的加班,换来一个我自己都不敢上线的玩意儿。

四、小龙虾的逆袭

不久后的某一天,公司发了一波 Token,本着"白嫖不嫖白不嫖"的心态,我把 OpenClaw 又下了回来。

一开始也没想搞什么大事,就跟它吐槽自研问数有多痛苦。聊着聊着我突然冒出一个念头:

如果让小龙虾连上数据库,它能做什么?

但彼时我对它的态度,仍然是"不信任、但愿意试试"。所以我没有让它自由发挥去写 SQL,而是给它做了一个叫 wen-shu 的 Skill 包,里面包含:

  • Skill.md 主文件:问数工作流说明、工具调用方式、业务知识和术语

  • 一份公司名单

  • 之前本地训练用的"问答-SQL"对

  • 几个我自己写的 .py 脚本

插一句:个人玩家其实根本不用准备这么多。直接让 OpenClaw 连数据库、再把业务术语丢给它当 context 就行。我搞 Skill 包纯粹是因为想做得工程化一点,有点强迫症的味道。

我设计的核心链路是这样的:

用户提问 → 公司名标准化 → 模板召回 → 安全执行 SQL → 返回可理解结果

对应三个脚本:

normalize_company.py → find_template.py → query.py

听起来有点技术,我一段段拆给你看。

第一步:不是写 SQL,而是先搞清楚——你到底在问谁

回到那个例子,用户问:"富吉股份有多少不动产?"

系统不能马上开始写 SQL。因为"富吉股份"可能只是简称,不一定是数据库里真正存的全称。

normalize_company.py 会去公司名清单里做匹配,处理简称、别名、以及去掉"有限公司""集团"等后缀之后的写法。最后返回四种状态之一:

  • exact:完全匹配

  • resolved:通过简称/别名找到了标准名

  • ambiguous:有歧义,需要用户确认

  • no_company:没找到

如果能确定,就把问题改写成 {标准公司名}有多少不动产?;如果有歧义,就先停下来,不继续猜。

这一步是很多 Text2SQL Demo 直接跳过的。但在企业场景里,第一步从来不是写 SQL,而是确认对象——你到底在问哪家公司。

第二步:也不是让模型从 0 写,而是先找最像的业务模板

这是我这条路线和传统 Text2SQL 最大的不同。

在 wen-shu 里,find_template.py 会先从已有问数模板里找最接近的一条。我目前的本地实现里大概有:

  • 505 个公司名参考

  • 近 9 万条问数模板(绝大部分是让 Codex 基于真实业务问法批量扩写的,核心 SQL 经过人工校验)

这些模板里不只有自然语言问法,也有对应 SQL。也就是说,系统不是每次都让模型重新发明一遍 SQL,而是优先复用已经验证过的业务经验。

举几个例子:

  • "某公司有多少不动产?" → 数量类,套 COUNT(*) 的模板

  • "某公司有哪些不动产?" → 明细查询

  • "某公司不动产总额是多少?" → SUM(...)

  • "排名前 5 的是什么?" → ORDER BY ... LIMIT 5

模板召回这一步,本质上是把"模型会不会胡写 SQL"这个问题,变成了"系统能不能从已有经验里找对模板"。

压力不再全压在大模型身上。它更像一个业务助理:先识别问题、再匹配流程、最后才执行。

为什么这套在企业场景里更靠谱?因为领导真正关心的是这三件事:

  1. 这个口径对不对?

  2. 这条 SQL 能不能复用?

  3. 结果错了能不能查原因?

这三件事,单靠 Prompt 真的解决不了。

第三步:才是执行 SQL,而且我把它收得很紧

query.py 只允许执行一条 SELECT。不允许写操作、不允许多语句、数据库连接从固定配置里读。执行完之后,再按结构化结果返回。

目的很直接:

OpenClaw 可以帮我问数,但它不应该拥有"随便操作数据库"的自由。

很多人聊 Text2SQL 时,注意力都放在"生成 SQL"上。但真要落地,SQL 生成只是其中一环。更要紧的问题是:能不能安全执行?能不能限制权限?能不能避免模型乱跑?能不能在出问题时复盘?

一个问数系统如果只能在 Demo 里跑得很漂亮,但进了真实数据库就让人心里发毛——那它离生产可用还差一光年。

五、智能问数产品 vs Agent 问数

如果拿这条路和 SQLBot 这类产品对比,差别我觉得可以这么理解:

传统 Text2SQL 路线,做的是——让大模型直接学会问数。

OpenClaw + wen-shu 这条路,做的是——让大模型先学会遵守一套问数流程。

前者优点很明显:通用、灵活、冷启动快。只要 schema、字段说明、RAG 做得不错,大模型就能参与 SQL 生成。

但它的问题也很明显:一旦业务口径复杂、字段含义不稳定、多轮追问变多,系统就会在"看起来懂"和"实际答对"之间疯狂打滑。

后者牺牲了一部分自由度,换来的是:更稳、更可控、更容易解释、更容易排查。也更适合围绕某一类高频业务问题持续打磨。

这其实是个很现实的 trade-off。

如果你只是做 Demo,当然希望系统越自由越好。但你真要给业务方用,你会发现他们不需要一个"什么都敢答"的 AI,他们要的是一个在明确范围内能稳定答对的问数入口。

六、我的"小龙虾时刻"

聊了一堆方法论,最后讲一个真正让我细思极恐的小细节。

某次问数过程中,小龙虾像往常一样帮我分析完问题之后,在最后给我加了一句话——大意是:"顺便说一下,我注意到这两张表里好像有几条数据存在异常,要不要我帮你梳理一下?"

我当时愣了三秒。

如果说"AI 自己给自己装了语音识别插件"是 OpenClaw 发明者 Peter 的"OpenClaw 时刻",那这句话就是我的"OpenClaw 时刻"。我的第一反应是:

这玩意儿……不会还能干数据库日常维护和异常筛查吧?

抱着试试的心态,我给小龙虾下了个新指令:"帮我跑一下数据库,看看这两张表里有哪些明显有问题的数据,或者关联关系不一致的,给我列出来。"

结果它在飞书上给我返回了四份云文档:

  • 数据核查 - pro_type 非标准值(6 条)

  • 数据核查 - 空挂项目(3 条)

  • 数据核查 - 分项面积大于总面积(132 条)

  • 数据核查 - own_project 与 pro_name 不一致(53 条)

好家伙。

渺小的人类给伟大的 OpenClaw 爷磕一个。

七、规则是死的,业务是活的

聊到这里,顺便提个不容易被注意到的实操点:

实际把 Agent 接到数据库,直连就行,不用搞那么复杂的 Skill 包。但务必从数据库管理层面,给小龙虾分配一个只读账号,从根上掐死它乱改数据的可能。业务术语和领域知识,要么事前跟它聊一聊,要么整理一份文档投喂给它。

最后我想抛一个问题。

现在市面上的业务系统里都有自己的规则引擎。比如不动产系统会设定"闲置 180 天以上自动告警"这种规则。但现实里这套规则常常很尴尬——有些房子下个月就要出租了,这段真空期其实根本不需要告警,业务员不需要每次都跟领导解释一遍,领导也不需要再三追问。

规则是死的,代码是死的,但业务是活的。

过去我们把"灵活"这件事丢给业务员去人肉解释,丢给开发去硬编码兜底。在 Agent 铺开的未来,这些事情,会不会本来就该是 Agent 的活儿?

至少在我负责的那个数据库里,小龙虾已经开始替我干了。