从 ObjectStack 看 AI-Native 企业软件,为什么正从 Code-Centric 走向 Metadata / Ontology-Centric
当 AI 能读懂整个 CRM,软件的代码时代可能正在结束
一次关于 AI-Native 企业软件架构的认真思考
适合阅读:CTO / 技术负责人 / SaaS 创业者 / AI 产品经理 / 企业软件与 Agent 从业者
全文约 7200 字,阅读时间约 18 分钟
先做一个思想实验。
你让一个 AI Agent 去做一件在企业里再普通不过的事:给 CRM 的客户对象,加一个客户等级字段。
如果这个 CRM 是用传统方式写的,Agent 要做的事大致是这样:先找到数据库、改表结构;再找到后端的数据模型、改定义;再找到 API 层、加字段;再找到前端的表单、加输入框;再找到列表页、加一列;再检查权限逻辑要不要动;最后还得看看有没有报表依赖这个对象。它得在一个庞大、破碎、彼此耦合的代码库里,一处一处地搜索、理解、修改,还要祈祷自己没漏掉任何一个隐藏的依赖。
一个字段的改动,尚且如此。你可以想象,让它理解、修改、甚至运维整个应用,是什么样的噩梦。
这引出了一个正在被越来越多人意识到的问题:AI 已经很能写代码了,但能写代码不等于能理解整个企业应用。而后者,才是企业软件真正的难点所在。
这篇文章想借一个具体的开源项目 ObjectStack,讨论一个比它本身大得多的问题——当 AI Agent 开始成为软件的主要使用者、甚至构建者,企业软件的底层架构,是不是该从代码中心,转向元数据 / 本体中心?
这不是一篇开源项目介绍。ObjectStack 只是一个足够具体的切片,让我们能借它看清一个更大的趋势:AI 时代的软件,到底该长什么样。
一、为什么AI 会写代码还远远不够?
Claude Code、Cursor、Copilot 这些工具已经证明,AI 写代码的能力是真实且强大的。但如果你真的用它们改过一个复杂的企业系统,你会撞到一堵墙——它能漂亮地写出一个函数,却很难有把握地改动「整个系统」。
原因不在模型不够聪明,而在传统企业软件的形态,天生对 AI 不友好。一个业务系统的逻辑,是被打散、摊平、散落在无数个地方的:
同一个客户概念,散落在: 数据库 schema → 表结构 后端 Model → ORM 映射 Controller/API → 接口定义 前端 Form → 表单字段 前端 List → 列表列 权限中间件→ 谁能看、谁能改 工作流引擎→ 状态怎么流转 报表 / 定时任务 → 各种衍生依赖 一个加字段的需求,要在以上每一处都改对、且不漏。 |
这就是 AI Coding 的根本困境:它面对的是一张庞大、破碎的代码图谱,只能局部理解、逐处搜索。它永远无法百分百确定我改这里,会不会弄坏那里——因为那个那里,藏在几十个它没同时看到的文件里。
于是我们得到一个反直觉、但很关键的判断:让 AI 更好地驾驭企业软件,光靠让它更会写代码是不够的。真正该改变的,也许不是 AI,而是软件本身的形态——让软件,从一开始就长成 AI 能够整体理解的样子。
二、ObjectStack 的核心主张:把整个应用,压缩成 AI 能读懂的 Metadata
ObjectStack 是一个开源项目,它的核心主张,可以浓缩成一句话——
把整个企业应用,压缩成 AI 能够理解、读取、推理和修改的、带类型的元数据(Typed Metadata)。
传统软件的顺序是:先有业务需求,然后一路往下翻译成数据库 schema、后端代码、API、前端代码、权限代码、工作流代码,以及把它们黏在一起的大量胶水代码,最后堆成一个复杂应用。业务语义,在这个翻译过程里被打散、稀释、埋进了代码。
ObjectStack 反过来做。它认为,一个业务系统最核心的东西,从来不是代码,而是业务定义本身——有哪些业务对象、每个对象有哪些字段、对象之间是什么关系、谁有什么权限、业务怎么流转、有哪些视图和动作。它把这些,全部提升成结构化的、带类型的、经过校验的元数据。
然后,运行时(Runtime)根据这一份定义,自动派生出下面这一切:
一份带类型的定义→ 数据库 · REST API · 客户端 SDK · UI · MCP 工具
注意这句话的分量。过去你要分别手写数据库、后端、API、前端、权限;现在它们都成了同一份业务定义的自动产物。代码不再是你要维护的核心资产,它退化成了运行时的实现细节。
三、把它放进历史:软件的第三次抽象
要理解这件事的分量,得把它放进软件抽象的历史里看。软件的进步,一直是一部不断把人从底层细节里解放出来的历史。
从什么 | 到什么 | 解放了什么 | |
第一次抽象 | 机器码 | 高级语言 | 不用再管寄存器和指令 |
第二次抽象 | 裸代码 | 框架 / 组件 | 不用再重复造轮子 |
第三次抽象 | 代码 | 业务元数据 / 本体 | 不用再手写业务的实现 |
前两次抽象,我们早已习以为常。而第三次抽象——把业务的定义本身,变成软件的核心、让代码退居为实现细节——其实一直是低代码、模型驱动开发追逐了很多年的梦想。但它过去始终没能真正成立,卡在一个关键的地方:
过去,元数据只是配置——它是死的,需要人去读、去点、去拖拽。而现在,AI Agent 第一次能够读懂元数据、推理元数据、修改元数据;运行时能执行元数据;校验能约束元数据;MCP 能让 Agent 操作元数据。于是元数据第一次从配置层,跃升成了AI 可执行的软件定义层。
AI Agent 的出现,让软件的第三次抽象,第一次真正具备了实现条件。这可能才是这个方向最值得讨论的地方。
四、不只是配置,而是企业的业务本体
这里要小心一个误解:不要把这套元数据,简单理解成换个格式的配置文件。
当你把客户是什么、机会是什么、客户和机会是什么关系、谁能看客户、什么条件下机会能进入下一阶段这些都显式地定义出来时,你定义的其实不是一张数据库的表,而是这门生意的本体(Ontology)——是这家企业对自己业务的、结构化的自我认知。
这是一个重要的观念升级:企业软件里真正值得被 AI 理解的,不是代码,而是企业的业务本体。代码是易变的、实现层面的;而业务本体是稳定的、语义层面的。让 AI 面对本体、而不是面对代码,它才有可能真正读懂这门生意。
五、把一个完整应用,装进一个上下文窗口!
前面都是理念。现在看一个具体的、可衡量的证据——这也是 ObjectStack 最值得写的地方。
根据仓库当前的 README,它给出的那个完整 CRM 示例,包含了一个真实业务系统该有的东西:6 个业务对象、多种视图、仪表盘、线索转化流程、权限集、动作、多语言翻译。而这样一个完整应用,规模是:
一个功能完整的 CRM 应用: 6 个业务对象(objects) 多视图 + 仪表盘 + 线索转化流 + 权限集 + 动作 + 翻译 ——总计—— 31 个文件 1,792 行 约 16K tokens |
这个数字的意义,怎么强调都不过分:约 16K tokens,意味着一个完整的业务系统,可以被 AI Agent 一次性地、完整地放进上下文窗口里。
回想第一节那个困境:传统 Agent 面对代码,永远只能局部理解,永远无法确定改这里会不会影响那里。而当整个应用只有 16K tokens、能被一次读完时,一切都变了——
把整个应用放进 Context ↓ 理解完整的业务模型(不是局部,是全局) ↓ 修改 Metadata ↓ 验证 ↓ 重新生成 / 运行 |
Agent 不再是隔着钥匙孔、逐个文件地猜,而是看完整张业务全景图,再动手。看得全,才改得准——这正是让 AI 从代码补全工具变成系统维护者的分水岭。
说了这么多原理,不如直接看一眼。下面这支视频录自 ObjectStack 的官方开源示例——同一份任务数据,不改一行代码、不重写任何界面,切换出表格、看板、时间线、地图、图表等多种视图。你会直观地看到,'视图是声明出来的,不是搭出来的'到底是什么意思。
六、从代码可维护性到Context 可维护性
这引出一个我认为值得提出的原创判断。
过去衡量软件质量,我们看代码行数、圈复杂度、模块耦合、测试覆盖率、技术债。这些指标,都是围绕人怎么维护代码建立的。
但在 AI-Native 的时代,也许需要一个新指标——Context Complexity(上下文复杂度):一个 AI Agent,需要多少上下文,才能真正理解一个系统?
一个有 500 万行代码的 CRM,即使模型再强,也不可能一次装进上下文、真正整体理解它。而如果同一个 CRM 的完整业务语义,能被压缩成几十个元数据文件、十几 K tokens,那么 AI 就可能真正成为它的开发者、维护者、重构者、乃至运维者。
AI-Native 软件的一个关键指标,或许不再只是代码有多少,而是AI 能否在一个上下文窗口内,理解整个系统。软件工程,可能要从优化代码可维护性,转向优化Context 可维护性。
七、凭什么敢让 AI 改生产系统?
讲到这,一个尖锐的问题必然出现:让 AI 去改生产环境的业务系统,不是很危险吗?万一它改错了呢?
这恰恰是这套架构最关键、也最容易被忽略的部分。它的答案不是相信 AI 不会错,而是让 AI 在一个有强约束的系统里改,错了也能被拦住。根据仓库 README,它设了四道关卡(Gate):
第一道:带类型(Typed)
整套元数据建立在严格的 TypeScript 加 Zod 校验之上。这意味着,大量错误在编辑阶段就会暴露——就像你写错类型时 IDE 会立刻标红,而不是等到运行时才崩。AI 改出来的东西,第一时间就要过类型这一关。
第二道:被校验(Validated)
光有类型还不够。它有一层专门的元数据校验,不只查 TypeScript 类型,还检查更业务的东西:有没有悬空的引用(dangling bindings)、CEL 条件表达式对不对、安全姿态(security posture)是否合规、运行时配置是否正确。这是一层比类型更懂业务的体检。
第三道:可审查(Reviewed)
这一道很妙。因为 AI 改的是元数据,所以它产生的是一份可读的 diff(几行业务定义的变化),而不是几十万行难以审阅的胶水代码。人可以真正地 review 它、看懂它改了什么、决定放不放行。可读,是人能保留最终控制权的前提。
第四道:受治理(Governed)
即使前三道都过了,运行时在执行阶段仍然持续强制:权限(Permissions)、行级安全(RLS)、审计(Audit)。也就是说,AI 能改的是业务定义,但它改出来的系统,依然跑在一套不可绕过的治理约束之内。
所以核心从来不是让 AI 随便改软件,而是让 AI 去修改一个有强约束的业务定义系统。这四道保险,才是 AI Agent 能够进入企业生产环境的真正前提。
八、MCP,让软件天然可被 AI 操作
如果说前面讲的是AI 写元数据、构建软件,那还有另一个方向同样重要:软件建成之后,怎么被 AI 操作?
ObjectStack 的运行时默认提供 MCP(Model Context Protocol)端点。业务对象可以自动暴露给 Agent;一个动作(Action)只要标记为对 AI 开放,就能变成 Agent 的一个工具。
一个 Action 加上这样一行标记: ai: { exposed: true } 它就从人点的按钮,变成了Agent 能调用的工具。 |
这意味着一件深刻的事:一个建立在这套架构上的业务系统,不只是能被人使用,它天然能被 AI Agent 操作。CRM 里的客户、机会、线索这些对象,本身就能成为 Agent 的工具——Agent 可以查询客户、创建客户、修改客户、执行动作、推进业务流程。
而且——这是关键——Agent 的这些操作,依然完整地受制于前面那套治理:权限、行级安全、审计,一样不少。它不是绕过系统的后门,它就是系统的一等公民入口。
九、软件的使用者正在改变
把上面两件事合起来,会推导出一个对 SaaS 架构影响深远的结论。
传统软件的使用路径只有一条:人,通过 UI,使用应用。所以过去几十年,SaaS 设计的核心命题是怎么让人更容易点击——UI/UX 是软件的门面和入口。
而在 AI-Native 的世界里,路径变成了两条并行,甚至三条:
传统:Human → UI → Application 现在:Human → UI → Application AI Agent → MCP → Application 未来:AI Agent → Application(直接操作) |
UI,不再是软件唯一的入口。于是 SaaS 设计的核心命题,可能从怎么让人更容易点击,慢慢变成怎么让 Agent 更容易理解和操作。而要让 Agent 好用,软件就必须提供:结构化的元数据、带类型的对象、有语义的动作、受治理的工具、机器可读的权限与流程。
这恰恰就是这套架构在提供的东西。换句话说,它不是在给人用的软件做优化,它是在为人和 AI 共同使用的软件重新设计地基。
十、它是个企业软件运行时,不是低代码 UI 搭建器
看到元数据驱动,很多人第一反应是:这不就是低代码吗?这里必须做个区分——不是贬低低代码,而是它们的中间表示根本不同。
传统低代码 | 元数据架构 | |
谁来构建 | 人,通过 UI 拖拽配置 | AI,通过元数据构建 |
核心命题 | 有没有拖拽、好不好拖 | 软件的中间表示是什么 |
中间表示 | UI 配置 | 带类型的业务元数据 / 本体 |
面向 | 让人更好地点 | 让机器可读、可推理、可执行 |
真正的区别,不在有没有拖拽这种表面,而在一个更根本的问题:软件真正的中间表示(Intermediate Representation)是什么?传统低代码的中间表示是UI 配置,它服务于人的鼠标;而这套架构的中间表示是带类型的业务元数据 / 本体,它服务于机器的推理。
从工程上看,它更像一个企业软件的运行时(Runtime):一个微内核(Microkernel)只提供依赖注入、事件总线、生命周期这些最基础的能力,其余的一切——鉴权、安全、工作流、审批、审计、存储、实时、MCP——全部作为插件(Plugin)组合上去。它不是一个巨大的 CRM,而是一个可以组合出各种企业业务能力的运行时。
一个可能的判断:AI 时代的软件架构,也许会从框架 + 应用,进一步演化成协议 + 内核 + 元数据 + 插件。
一个连带的推论:数据库,只是运行时的一个实现
既然业务语义活在上层的元数据里,那么底层用什么数据库,就变成了一个可替换的实现细节。这套架构可以把同一份业务定义,跑在 PostgreSQL、MySQL、SQLite、MongoDB 等不同的存储之上,而业务定义本身不必改动。
这颠覆了一个传统认知:过去,数据库 schema 是企业应用的真理之源(Source of Truth),一切围着它转。而在这里,真理之源上移到了业务元数据,数据库退化成了它的一种落地方式。顺序从数据库 → 应用代码 → UI,变成了本体 / 元数据 → 运行时 → 存储。
十一、和 Claude Code、Cursor 是竞争关系?
讲到这可能有个疑问:既然 AI 能写元数据,那它和 Claude Code、Cursor 这类 AI 编程工具,是替代关系吗?
恰恰相反,它们是互补的,处在不同的层。
做什么 | 扮演的角色 | |
Claude Code / Cursor | Agent → 代码 | AI 软件工程师 |
这套元数据运行时 | Agent → 业务元数据 → 运行时 | AI 软件的运行时 / 业务底座 |
一个负责写,一个负责跑。理想的组合恰恰是两者结合:用 Claude Code 这样的编程 Agent 去编写和修改业务元数据,再通过 MCP 去操作那个运行中的应用。前者是聪明的手,后者是稳固的地基——它们不抢彼此的活。
十二、如何把理念落地?
场景一:给 CRM 加一个字段
传统方式:改数据库→ 改后端 Model → 改 API → 改前端表单 → 改列表 → 可能改权限 → 可能改报表,一处不能漏。
这套架构:AI 只需在 Customer 的元数据里,加上 customer_level 这个字段。剩下的——数据库列、API 字段、UI 输入框、SDK、MCP 工具——全部由运行时自动派生、保持同步。一处定义,处处生效。
场景二:让 AI 从零创建一个工单系统
你对 AI 说一句帮我创建一个 Support Desk,并说清要什么:一个工单对象(含主题、描述、优先级、状态),一个解决动作,一个未处理工单视图,一个支持导航入口。
AI 做的,不是去写一个新应用的成百上千行代码,而是新增一份工单对象的元数据定义。校验关卡检查它是否合法,运行时据此生成完整的、可用的应用——数据库、API、界面、权限,一步到位。
场景三:让 AI 操作运行中的 CRM
CRM 通过 MCP,把客户、机会、线索这些对象和相关动作暴露出来。于是一个 AI Agent 可以直接查询、创建、修改这些业务数据,并执行动作、推进流程——同时,它的每一个操作,都仍然受权限、行级安全、审计的约束。业务系统,就这样天然地变成了 Agent 可以安全操作的对象。
这个方向解决的,是一个非常值得探索的真问题:如何让企业应用,变成 AI 可以整体理解、验证、修改和操作的对象。这是一个有分量的命题。
但它不意味着以后不需要程序员了,也不意味着所有企业软件都该元数据化。有大量场景——极致性能、复杂算法、高度定制的交互——仍然需要、也应该用代码来写。把一切都塞进元数据,是另一种极端。
更现实的图景是:程序员的工作重心会迁移。从写大量业务胶水代码,转向设计业务模型、设计本体、设计运行时、设计权限边界、设计 Agent 工具、设计验证规则、设计业务约束。也就是——从 Code Engineer,走向 System / Ontology Engineer。写实现的人会变少,设计结构的人会变值钱。
结语:真正该被重新设计的,是软件本身
回到开头那个给 CRM 加个字段的思想实验。
我们习惯的思路,是让 AI 变得更强,强到能啃下那一大堆散落的代码。但也许,方向从一开始就反了。
AI 时代真正值得重新设计的,不是让 AI 写更多代码,而是让软件本身,变得更容易被 AI 理解。
当一个业务系统可以被压缩成一套带类型的元数据、小到能被一次读完时,AI Agent 才第一次真正有机会读懂整个应用——不是猜、不是局部理解,而是把整张业务全景图收进眼底,然后有把握地去修改、去运行、去维护。
代码不会消失,但它可能正在从系统的核心资产,退位成运行时的实现细节。而站在它上面的,是那份人和 AI 都能读懂的、关于这门生意本身的定义。
软件的第一次抽象,把我们从机器码里解放出来;第二次,从重复造轮子里解放出来。而这一次,也许是把我们从手写业务的实现里解放出来——让我们终于可以只谈业务本身,把实现,交给能读懂它的机器。
——本文借 ObjectStack(开源)为例展开。文中技术细节以其仓库当前公开内容为准;涉及未来趋势的部分为作者判断,非既成事实。
ObjectStack · 开源的 AI-Native 企业软件运行时
让软件变得能被 AI 整体理解、验证、修改与操作
夜雨聆风