09 系统构建:分层架构、Agent 接入、选型与路线图
前面几篇讲的是"本体本身"。这一篇讲"本体所在的系统":它在整体架构里坐在哪一层、AI Agent 通过什么方式使用它(重点是 MCP 和工具调用)、有哪些产品和技术路线可选,以及一条从零到可用的分阶段路线图。
1. 分层架构
一个支撑示例商城售后的本体系统,可以分成六层:

| 层 | 职责 | 不该做的事 |
|---|---|---|
| 入口层 | 呈现信息、收集用户意图、展示确认卡片 | 自己实现业务规则 |
| 智能体层 | 理解用户想做什么、规划步骤、组织回复 | 直接访问数据库,或绕过动作改数据 |
| 能力暴露层 | 把本体能力包装成工具,做认证、限流(限制调用频率)、日志 | 复制一套权限规则 |
| 本体服务层 | 定义对象和关系,执行规则校验,编排动作,记录审计 | 替代数据库做海量计算 |
| 数据接入层 | 对接源系统,统一身份,保证数据质量 | 随意改写源数据 |
| 源系统 | 保存业务数据的当前值,执行最终事务 | 被 Agent 直接写库 |
一个国内厂商的说法很好地概括了分工:"AI 负责理解和编排,本体负责承载世界,数据库负责运行世界。"入口层也可以绕过智能体层直接调用能力层——客服工作台上的"发起退款"按钮,和 AI 客服调用的是同一个动作,这正是本体的价值之一。
1.1 两种流派:本体做"大脑",还是也做"肌肉"
在本体服务层要不要自己执行事务这件事上,业内有两种主张:
| 语义中枢型 | 本体自持型 | |
|---|---|---|
| 主张 | 本体是语义中枢和规则权威,但不是执行引擎;事务交给下层系统 | 本体自己拥有数据、函数、派生和行动能力,数据按本体定义持续更新 |
| 比喻 | 本体负责"立法与审判",事务层负责"执行与善后" | 应用"从本体中生长出来" |
| 优点 | 不替换现有系统,改造小,易于渐进落地 | 链路短、上下文一致、实时派生能力强 |
| 代价 | 跨层一致性要额外保障 | 需要迁移或复制数据,平台依赖重 |
| 适合 | 已有成熟业务系统的企业,如示例商城 | 新建系统,或数据分散且缺乏可用业务系统的场景 |
示例商城选择语义中枢型:业务数据留在原系统,本体保存语义、映射和轻量索引,动作最终通过售后系统和支付网关的接口落地。
1.2 一次请求穿过六层
用第 03 篇那句"外套不要了,退到原卡"走一遍,看每一层各做了什么:
| 层 | 这一层做的事 | 输出 |
|---|---|---|
| 入口层 | 收到客户消息,带上会话身份(已登录的会员号) | 用户消息 + 用户身份 |
| 智能体层 | 识别意图为"申请退货退款",抽取槽位:商品"黑色外套"、时间"上周"、退款方式"原路" | 结构化意图 |
| 能力暴露层 | 校验调用者身份,把请求转成对本体工具的调用,记录调用日志 | 工具调用 |
| 本体服务层 | 解析客户、沿关系找到订单行;计算可退金额;按规则判断资格和审批要求;创建动作实例 | 判断结果 + 动作实例 |
| 数据接入层 | 按主键实时读取订单、物流签收时间;把动作写入请求转成售后系统接口调用 | 读写请求 |
| 源系统 | 售后系统创建售后单,返回单号 | 业务回执 |
注意两点:一是身份从入口层一路传下去,每一层都知道"这是在替谁办事";二是判断集中在本体服务层,智能体层只负责理解和组织语言,不自己判断"能不能退"。
1.3 本体服务层里面有什么
本体服务层是整个系统的核心,内部通常包含六个组件:

| 组件 | 职责 | 示例商城的关键点 |
|---|---|---|
| 模型仓库 | 存放本体定义及其版本,支持评审和回滚 | 定义以文本形式放在版本库,发布时生成运行时模型 |
| 查询引擎 | 按对象和关系检索、遍历,把请求翻译成对源系统的读操作 | 读交易数据走实时查询,并设超时和行数上限 |
| 函数与规则引擎 | 计算派生属性,执行约束和决策表 | "可退金额"只在这里计算一次 |
| 动作引擎 | 管理动作实例的完整生命周期 | 幂等键、参数冻结、两层状态、补偿 |
| 索引 | 支持按名称、别名、编号快速定位对象 | 客户手机号、订单号、商品别名 |
| 审计台账 | 只追加地记录每次查询和动作的证据 | 第 10 篇的"证据表"就来自这里 |
1.4 本体不必换数据库:逻辑层与查询改写
很多团队一听"本体",第一反应是"是不是要上图数据库,把数据搬一遍"。不一定。1.1 节说的"语义中枢"路线里,本体就是一层逻辑模型:它定义"客户""订单行""售后单"是什么,再说明每个概念在现有数据里由哪些表、字段实现。数据留在原处,查询时再翻译过去。
这条路有成熟的标准和理论基础:
- 映射标准 R2RML:W3C 在 2012 年发布的推荐标准,用来描述关系数据库里的表、视图或一段 SQL 查询,怎样映射成本体里的对象、属性和关系。规范特别说明,映射是概念性的:实现方既可以把结果物化成一份数据,也可以提供虚拟访问,在查询时再去查底层数据库。规范里还有一个很实用的例子:用 SQL 的 CASE 语句把数据库里的代码翻译成有意义的标识——示例商城把
status=5翻译成"待退款",用的就是同一种办法。 - 基于本体的数据访问(OBDA,Ontology-Based Data Access):用户和 Agent 按概念模型提问,系统借助映射把问题改写成对底层数据库的 SQL。开源系统 Ontop 是一个典型实现,它把这种做法称为"虚拟知识图谱":数据留在数据源里,面向图的 SPARQL 查询被翻译成 SQL,交给关系数据库执行。按其官方文档,它支持 R2RML 映射和 OWL 2 QL 本体,可以连接 PostgreSQL、Oracle、Snowflake、BigQuery 等多种数据库。
- 为"可改写"做的取舍:OWL 2 QL:OWL 2 规范定义了几个"剖面"(Profile,即为效率裁剪过的子语言)。其中 OWL 2 QL 以 DL-Lite 描述逻辑为基础,设计目标是让存放在普通关系数据库里的数据,可以通过简单的改写机制、在不改动数据的前提下经由本体查询。代价是表达能力受限:传递属性、属性链、基数限制、"两个个体是同一个"这样的断言都不支持;但它保留了 UML 类图、ER 图里大多数常用的建模特征。换句话说,它有意放弃一部分推理能力,换来"语义查询最终能高效落到数据库上执行"。
放到示例商城看一个例子。Agent 想知道"客户 C-88 有哪些处理中的售后单"。在本体里,这只是沿着"客户—下单→订单—包含→订单行—被申请→售后单"走一遍,再筛选状态属于"处理中"。映射负责告诉系统:客户对应账号表(取归并后的客户编号),订单行对应 order_item,售后单对应 refund_apply,"处理中"对应几个状态码。查询改写后得到一条带几次连接的 SQL,交给订单库的只读副本执行。售后单的映射写成 R2RML,大致是这样(示意,省略了前缀声明):
# 示意:把售后申请表映射成"售后单"
<#AfterSaleCaseMap>
rr:logicalTable [ rr:tableName "refund_apply" ] ;
rr:subjectMap [
rr:template "https://shop.example/after-sale/{id}" ;
rr:class shop:AfterSaleCase
] ;
rr:predicateObjectMap [
rr:predicate shop:forOrderLine ;
rr:objectMap [ rr:template "https://shop.example/order-line/{order_item_id}" ]
] .
实际项目里,你不一定要用 R2RML 和 SPARQL;很多平台用自己的映射格式和查询接口。但"概念—映射—改写—执行"这四步是共通的。虚拟化和物化也不是二选一:
| 方式 | 适合什么情况 | 要注意什么 |
|---|---|---|
| 虚拟化(查询时改写) | 数据新鲜度要求高、不想复制数据、源系统能承受查询 | 复杂查询的性能取决于源库,要设超时和行数上限(见 1.3 节查询引擎) |
| 物化(把映射结果存成图或宽表) | 多跳遍历多、分析量大、源系统不能承压 | 有同步延迟,回答时要说明数据截至何时 |
| 混合 | 交易对象实时查,历史和统计物化 | 两边由同一份映射生成,避免口径分叉 |
这就是本体与 SQL 的分工:本体解释世界,SQL 负责计算。本体决定"问的是什么、谁能看什么、沿哪条关系走",数据库负责把数算对、算快。动作(写操作)不走这条路,仍按第 2 节通过业务系统的接口执行。
1.5 语义在上游,产品语义在下游
很多企业其实已经有好几套"语义":BI 里有一套指标,数据目录里有一套业务术语表,知识库里有一套概念,图数据库里有一套实体,Agent 的提示词里有一套上下文,API 又定义了一套对象。每一套都号称"单一事实来源",结果一个企业里有五六个"单一事实来源"(第 08 篇反模式 20)。
更稳妥的架构是反过来:先有一份规范语义模型(Canonical Semantic Model),再从它生成多个技术投影(Multiple Projections):给 BI 的指标定义、给 API 的数据结构、给 Agent 的工具说明、给图查询的模型、给人看的文档和自动测试。"定义一次、到处使用"真正难的不是定义一次,而是让所有系统都用同一份定义,而不是各自复制一份,再慢慢走样。
要做到这一点,这份上游模型至少需要六项能力:
| 能力 | 含义 | 示例商城怎么做 |
|---|---|---|
| 1 稳定身份 | 对象类型、关系、指标、规则都有稳定编号,不只靠名字 | "客户"类型编号 ot.customer,"退款率"指标编号 m.refund_rate;改名不改编号 |
| 2 可执行定义 | 公式、类型、粒度、单位、时间口径、约束写成机器能执行的形式,而不只是一段文字 | 可退金额是函数,审批阈值是带版本的规则 R04(第 07 篇),而不是 Wiki 上的一句话 |
| 3 物理映射 | 知道每个业务概念由哪些表、字段、事件或计算实现 | 售后单对应 refund_apply,状态码有映射表(见 1.4 节) |
| 4 关系是一等公民 | 关系有名字、方向、数量约束,必要时带时间和属性,而不只是外键 | "售后单针对订单行";"账号归并到客户"带生效时间 |
| 5 指标在同一语义体系 | 指标挂在对象上,和客户、商品、时间、组织等概念相连 | 退款率的分子分母都定义在"订单行"上,可以按客户等级、品类切片 |
| 6 多技术投影 | 同一份模型能生成 SQL 视图、API 结构、Agent 工具、图模型、文档和测试 | 工具清单(2.3 节)和指标层定义(第 05 篇 4.2 节)都从模型仓库生成或校验 |
小团队不必一开始就造一个"编译器"。最低限度的做法是:所有定义集中放在 1.3 节的模型仓库里;指标层、工具说明、文档在发布流程中从这里生成,或者至少和它自动比对;任何下游想新增一个概念,先回到模型仓库登记。这里讲的是原则,不是某个产品。有厂商文章把它概括为"语义在上游,产品语义在下游",并借此介绍自家平台(见参考引用),读者取其思路即可。
2. Agent 怎样接入本体
2.1 MCP 是什么
MCP(模型上下文协议)是一种让 AI 应用以统一方式发现和调用外部工具与数据的开放协议。在它的规范里,服务端通过"列出工具"接口告诉客户端有哪些工具,每个工具有名称、说明和输入参数的结构定义(也可以声明输出结构);客户端通过"调用工具"接口执行,执行出错时返回带错误标记的结果,供模型调整后重试。
规范对安全有明确要求:服务端必须校验所有输入、实施访问控制、对调用限流;客户端应当在敏感操作前向用户确认、记录工具调用以便审计;并且应当始终有人能够拒绝工具调用。规范还提醒,工具上声明的"只读""破坏性"等提示信息,除非来自可信的服务端,否则不应被信任。
2.2 工具设计的六条原则
原则一:暴露业务工具,不暴露原始查询语言。有工程实践者在 OWL 本体之上做数据 Agent 时发现,让模型直接拼写图查询语句很危险:在没有开启推理的情况下,查询"某类商品"可能静默漏掉它的子类,"语法正确、结果不完整"。他的做法是提供语义明确、参数化的高层函数,把"是否包含子类"这类细节封装在工具内部。
原则二:先发现,后调用。不要一次性把几十个工具的完整说明塞给模型。一种做法是"两级暴露":先给一份轻量能力目录(工具编号、能力描述、涉及的对象类型、风险级别),模型选中后再查询该工具的详细参数和前置条件。
原则三:读写分离,标注风险。查询类工具和动作类工具分开,动作类再按风险分级。模型看到的风险标注只是提示,真正的拦截必须在服务端完成。
原则四:写操作两段式。先"试算/校验"(不产生任何修改,只返回是否通过、为什么),再"提交"。12306 对比实验里的本体工具组就包含"动作校验(干跑)"和"动作执行"两个独立工具。
原则五:返回结构化的理由。被拦截时,返回规则编号、级别和证据,而不是一句"失败"。这样模型能向用户解释,也能决定是否转人工。
原则六:工具不比人大。工具以"当前用户"的身份执行,权限由业务系统判断;接入层只负责把 Agent 用户映射到真实账号,不复制权限规则(见第 08 篇反模式 11)。
2.3 示例商城的工具清单
| 工具 | 类型 | 说明 |
|---|---|---|
| list_capabilities | 发现 | 返回能力目录:工具、涉及对象、风险级别 |
| resolve_customer | 查询 | 按手机号、订单号等解析出唯一客户对象(合并多账号) |
| get_case_context | 查询 | 返回售后单及其订单行、退货包裹、退款单、相关规则 |
| compute_refundable | 函数 | 计算某订单行的可退金额,返回计算过程 |
| validate_action | 校验 | 对指定动作和参数做干跑,返回是否通过、命中的规则、是否需审批 |
| submit_action | 动作 | 提交动作;超阈值时进入待审批,返回执行实例编号 |
| get_action_status | 查询 | 查询某次动作的执行状态和卡点 |
{
"name": "validate_action",
"description": "对本体中已定义的动作做干跑校验,不产生任何修改。返回是否通过、命中的规则编号与证据、是否需要审批。",
"inputSchema": {
"type": "object",
"description": "按动作分支:不同动作的 target_id 含义和参数各不相同",
"oneOf": [
{
"properties": {
"action": { "const": "create_case" },
"target_id": { "type": "string", "description": "订单行编号,例如 L-2" },
"params": {
"type": "object",
"properties": {
"case_type": { "type": "string", "enum": ["no_reason_return", "quality_return"] },
"quantity": { "type": "integer", "minimum": 1 },
"amount": { "type": "number", "multipleOf": 0.01, "description": "申请退款金额,单位元" }
},
"required": ["case_type", "quantity", "amount"]
}
}
},
{
"properties": {
"action": { "const": "initiate_refund" },
"target_id": { "type": "string", "description": "售后单号,例如 AS-2045" },
"params": {
"type": "object",
"properties": {
"amount": { "type": "number", "multipleOf": 0.01, "description": "退款金额,单位元" },
"method": { "type": "string", "enum": ["original_route"] }
},
"required": ["amount", "method"]
}
}
}
],
"required": ["action", "target_id", "params"]
}
}
上面只列了两个分支,"关闭工单"等其他动作同理各占一个分支。要点有三:一是 target_id 的含义随动作而变(创建售后单时是订单行,发起退款时是售后单),必须按动作分别写清;二是参数要有类型和单位,而不是一个笼统的 object;三是 submit_action 的参数与此相同,另加一个 request_id 作为幂等键——它在"决定办这件事"时生成一次,之后的重试都带同一个值。MCP 规范还允许为工具声明输出结构(outputSchema)和行为注解(如只读、破坏性等提示);但规范同时要求,除非来自可信的服务端,客户端不应信任这些注解,真正的拦截仍在服务端完成。

注意 AI 客服在这里提交的是"创建售后单",而不是"发起退款":按第 07 篇的权限矩阵,它对"发起退款"只有建议权,submit_action 收到它提交的 initiate_refund 会直接按权限拦截。退款要等售后单审核通过、退货验收、进入"待退款"之后,由客服发起。比如客服小林在工作台上对售后单 AS-2045 发起 899 元退款时,validate_action 会返回"通过 R01;命中 R04 v2,需主管审批",submit_action 之后动作实例进入"待审批"、参数冻结,主管老周批准后才经支付网关执行。
2.4 智能体层的三道判断
工具设计好了,智能体层自身也要守住分寸。一篇讨论意图识别的文章给出了一个清晰的分层:意图层回答"用户想做什么",权限层判断"用户能不能这样做",执行层确认"这个动作是否应该立即发生"。三者不能混为一谈,否则很容易把"理解成功"误当成"授权完成"。相应地,智能体每一轮都应在四种出口中选一个:执行、追问(缺参数或有歧义时)、拒识(超出范围时)、确认(高风险动作前)。
放到示例商城:客户说"把那件外套退了",意图层识别为"申请退货退款";本体解析出对应的订单行,权限层确认 AI 客服对"创建售后单"只有"申请"权(对"发起退款"只有建议权);执行层判断这是会产生业务后果的动作,于是选择"确认"出口——先向客户复述要退的商品、数量和金额,客户确认后再提交申请。和本体配合时,意图和槽位最好直接映射到本体里的动作和参数类型,这样意图识别的结果可以原样交给干跑校验。
2.5 安全设计要点
把本体暴露给 Agent,等于开了一扇新的门。MCP 官方的安全最佳实践和 OWASP 的大模型安全清单里,有几条与本体系统直接相关:
| 要点 | 含义 | 示例商城的做法 |
|---|---|---|
| 不做令牌透传 | MCP 服务不能接受并转发并非颁发给它自己的访问令牌,否则会绕过限流、校验,审计也无法分辨调用方 | 能力暴露层不转发客户端的令牌,而是通过令牌交换(OAuth 2.0 Token Exchange,RFC 8693)换取一个面向业务系统、范围更窄、代表当前用户的新令牌,下游系统据此按用户权限判断;只有下游系统无法接受用户令牌时,才退而用服务账号加签名的用户身份声明,并在审计中同时记录两者 |
| 权限范围最小化 | 起步只授予低风险的发现和只读范围,需要高风险操作时再逐步提升,并记录提升事件 | "小售"默认只有查询和干跑权限,提交动作需要单独授权 |
| 防"糊涂代理" | 代理服务器替多个客户端访问第三方时,必须对每个客户端单独征得用户同意,不能复用一次同意 | 每个接入的 Agent 应用单独注册、单独授权 |
| 会话不等于认证 | 服务端必须验证每个请求,不能仅凭会话编号认定身份;会话编号要随机、不可猜测,并与用户绑定 | 每次工具调用都携带并校验用户身份 |
| 完全中介 | 所有经由工具发往下游的请求都要按安全策略校验,而不是靠模型判断 | 动作引擎和业务系统各自校验,模型的判断只作参考 |
| 记录与限流 | 记录工具调用,并对调用频率设上限,在造成大面积损害前发现异常 | 同一用户每分钟提交动作次数设上限,异常时告警 |
代表谁:三种身份要分清。同一个能力暴露层可能同时服务三类调用。一是面向客户的 AI 客服"小售",它代表已登录的客户(如会员 C-88),只能看这位客户自己的订单,只能以客户名义提交申请。二是面向员工的助手,例如客服小林工作台上的助手,它代表员工,按员工的角色和数据范围行事。三是 Agent 应用自身的身份(如"小售"这个应用),用于限流、审计和区分是哪个应用在调用。一次调用的实际权限,是"被代表的用户能做的"和"这个应用被允许做的"两者的交集:客户本人可以申请售后,但"小售"应用对"发起退款"只有建议权,所以它不能替客户提交退款。RFC 8693 把这种情况称为"委托":新令牌的主体是用户,代理方(actor)另行记录,审计时两者都能查到。

2.6 可观测与审计
出了问题时,要能回答"Agent 为什么这样做"。建议每次工具调用至少记录这些字段:
| 字段 | 示例 |
|---|---|
| 调用编号与会话编号 | call-7f3a,会话 s-1029 |
| 代表的用户与 Agent 应用 | 员工:客服小林;应用:客服工作台 |
| 工具与参数(敏感字段脱敏) | submit_action;发起退款,AS-2045,899.00 元,request_id 由工作台生成 |
| 本体版本与规则版本 | aftersales 1.0.0;R01 v1,R04 v2 |
| 结果与耗时 | R01 v1 通过;R04 v2 命中,进入待审批;耗时若干毫秒 |
| 关联的动作实例 | ACT-0098 |
这些记录有三个用途:排查问题、做影子模式对比、在审计时还原决策过程。注意日志本身也包含敏感信息,要设置访问权限和保留期限。
2.7 工具说明怎么写
工具说明是 Agent 在运行时读到的"操作手册",写得好不好直接影响它选对工具、填对参数。一位作者把它概括为"工具说明是 Agent 的运行时知识"。比较一下同一个工具的两种写法:
| 写法 | 工具说明 | 问题或优点 |
|---|---|---|
| 差 | refund:退款接口,参数 id 和 amount | 不知道 id 是什么编号,不知道金额单位,不知道会不会真的退钱 |
| 好 | submit_action:提交本体中已定义的业务动作。target_id 为售后单号(形如 AS-开头),amount 单位为元、两位小数。提交前应先调用 validate_action;若命中审批规则,动作进入待审批而非立即执行。不支持修改已有退款金额。 | 说明了编号格式、单位、调用顺序、可能的结果和边界 |
写工具说明的几条经验:
- 说清楚参数用的是哪种编号。"客户 ID"可能是会员号、小程序编号或手机号,必须写明,并提示"不确定时先调用 resolve_customer"。
- 说清楚调用顺序。例如"先干跑、后提交","先解析对象、后查询详情"。
- 说清楚结果的几种可能。成功、需审批、被拦截、需人工,各自返回什么。
- 说清楚不能做什么。明确写出边界,能减少模型"试探性"调用。
- 与本体定义同源生成。工具说明里的对象名、属性名、枚举值都应从本体定义自动生成,避免两边不一致。
2.8 平台里的现成做法
商业平台已经在提供类似能力。Palantir 的 Ontology MCP 把应用范围内的对象类型、动作类型和查询函数暴露为 MCP 工具,外部 Agent 可以读取对象、执行预先定义的动作、调用查询函数,并受应用层面的范围限制;它与另一个面向开发者、用于搭建和修改本体结构的 Palantir MCP 是两回事。Palantir 文档还展示过一种配置:让 AI 提出的修改只是"暂存",由人审查后才生效,并记录决策的来龙去脉——这是可以选择的配置方式,并不是所有场景的默认行为。微软 Fabric IQ 的本体也把"供 AI Agent 使用同一套业务词汇"作为主要目标之一(目前为预览版)。
3. 选型
| 路线 | 代表 | 适合 | 注意 |
|---|---|---|---|
| 商业运营本体平台 | Palantir Foundry / AIP;Microsoft Fabric IQ 本体(预览) | 预算充足、需要完整动作与写回、愿意平台化 | 闭源,平台依赖重;预览版功能可能变化 |
| 指标语义层加数据 Agent | Snowflake、Databricks 的语义与指标能力;dbt、Cube 等指标语义层 | 以分析问数为主,数据已在数仓 | 写操作和业务动作能力弱 |
| 图数据库与 RDF 平台 | Neo4j(属性图);Stardog、TopBraid 等(RDF/OWL) | 关系复杂、需要推理或严格校验 | 动作和业务写回需另建 |
| 国内本体平台 | 多家厂商的本体应用平台 | 需要中文支持、私有化部署 | 公开材料多为厂商自述,务必做概念验证 |
| 开源组合与自研薄层 | YAML 或 OWL 定义本体,关系数据库加图扩展,自建 MCP 服务 | 团队有工程能力,想先小步验证 | 开源项目成熟度差异大,选型前读源码 |
选型时建议回答六个问题:
- 需要写回和业务动作,还是以只读分析为主?
- 现有数据主要在哪个平台?能否就近建设?
- 是否有私有化部署、数据不出境、完全离线的要求?
- 团队熟悉的是 SQL、图查询还是语义网技术?
- 预算和持续运维能力如何?
- 将来想换平台时,本体定义能否导出?(尽量让本体定义以文本形式保存在版本库里)
对示例商城这样的场景,一条务实的路线是:先用自研薄层(YAML 定义本体、规则表、少量 MCP 工具)跑通退货退款闭环,验证价值和团队能力之后,再决定是否迁移到商业平台。
3.1 演练:示例商城的打分表
把六个问题变成可打分的维度,按业务需要设权重。下面是一次演练性质的打分(满分 5 分,分数代表"与示例商城需求的匹配度",不是对产品的客观评价):
| 维度 | 权重 | 自研薄层 | 商业运营本体平台 | 指标语义层加数据 Agent |
|---|---|---|---|---|
| 写回与业务动作 | 30% | 4(自己实现,可控) | 5 | 2 |
| 与现有系统的贴合 | 20% | 5(直接对接现有接口) | 3(需要接入平台) | 4 |
| 部署与合规 | 15% | 5 | 3 | 3 |
| 团队技能匹配 | 15% | 4 | 3 | 4 |
| 成本 | 10% | 4 | 2 | 4 |
| 可迁移性 | 10% | 5(定义在自己版本库) | 2 | 3 |
按权重计算,自研薄层在这个演练中得分最高。但请注意:打分的前提是示例商城有工程团队、有可用接口、范围小。换一家系统老旧、团队薄弱的公司,结论可能完全相反。打分表的价值不在分数,而在于逼着团队把"我们最在意什么"说清楚。另外,这张表没有单列"上线周期"和"持续运维负担":自研薄层起步快,但动作引擎、审计、权限对接都要自己长期维护;商业平台起步慢、运维多由厂商承担。如果这两项对你很重要,应当加进来重新算。
3.2 概念验证怎么做
不论选哪条路线,正式投入前都应做一次概念验证。建议把它设计成一次"用能力问题考试":
- 准备考题:从第 06 篇的能力问题里挑 8 到 10 个,覆盖查询、判断、动作三类,每题准备标准答案。
- 准备考场:用脱敏的真实数据,至少包含身份重复、部分退款、遗留状态码这些"脏"情况。
- 考三件事:答案对不对(结果正确率)、过程对不对(工具和参数是否正确、是否越权)、改起来难不难(现场改一条规则,例如把审批阈值从 500 改成 800,看需要多久、影响哪些地方)。
- 看非功能:查询耗时、并发表现、日志是否完整。
- 写结论:哪些能力问题过了、哪些没过、没过的原因是平台限制还是建模问题。
第 3 点里的"现场改规则"特别能看出差别:有的方案改一条配置即可,有的需要改代码、重新部署。
4. 路线图

| 阶段 | 目标 | 交付物 | 进入下一阶段的条件 |
|---|---|---|---|
| 0 准备 | 定范围、定裁决人 | 范围卡、能力问题、术语表 | 业务负责人签字确认 |
| 1 只读 | Agent 能准确回答查询和判断类能力问题 | 对象与关系、数据绑定、质量报告、只读工具 | 能力问题测试通过率达标 |
| 2 建议 | Agent 能给出正确的动作建议 | 动作定义卡、规则表、干跑校验、影子模式报表 | 影子模式指标连续稳定 |
| 3 有限执行 | 低风险动作自动执行,高风险走审批 | 审批流、补偿机制、审计台账 | 无重大事故,人工接管率可接受 |
| 4 扩展 | 换货、价保等新场景复用已有对象 | 公共核心模型与场景应用分离 | 按新场景重新走一遍阶段 0 |
扩展阶段有一个值得提前规划的结构:把客户、商品、订单这些跨场景共用的定义放在公共核心模型(注意它不是第 05 篇说的指标语义层),售后、营销、风控等场景应用只声明自己需要用到哪些对象、关系、工具和权限。这样新场景接入时复用而不是复制。
4.1 每个阶段最容易出的问题
| 阶段 | 常见问题 | 应对 |
|---|---|---|
| 0 准备 | 范围越谈越大;裁决人只挂名 | 用能力问题卡范围;裁决人参加每周评审 |
| 1 只读 | 身份归并和数据质量问题集中爆发 | 预留数据治理时间;低置信度归并交人工 |
| 2 建议 | 建议和人工处理不一致,但原因说不清 | 每条不一致都记录原因,分到"理解错 / 数据错 / 规则缺"三类 |
| 3 有限执行 | 外部系统故障导致中间状态 | 幂等、补偿、两层状态;先在低峰时段开放 |
| 4 扩展 | 新场景另起炉灶,复制了一套客户定义 | 公共核心模型评审,新对象先查重 |
5. 非功能要求清单
| 类别 | 要求 | 说明 |
|---|---|---|
| 性能 | 查询有超时、返回行数和并发上限 | 防止 Agent 发起过大的查询拖垮源系统 |
| 一致性 | 本体写入、质量检查、索引更新作为一次整体操作,失败整体恢复;索引与源系统之间的同步(如变更数据捕获 CDC)要监控新鲜度,需要最新值的判断一律回源查询 | 避免 Agent 在"本体已改、索引未改"的中间状态下工作 |
| 可用性 | 本体服务不可用时,客服工作台可退回到原有系统操作 | 本体是增强,不应成为单点 |
| 安全 | 以用户身份执行、最小权限、敏感字段脱敏 | 见 2.5 节 |
| 审计 | 工具调用和动作执行全量记录,只追加不修改 | 见 2.6 节 |
| 可迁移 | 本体定义可导出为文本 | 降低平台锁定风险 |
| 可测试 | 有独立的测试环境和能力问题回归集 | 每次变更先在测试环境跑一遍 |
6. 常见问题
问:一定要用 MCP 吗?
不一定。MCP 的好处是标准化,同一套工具可以被不同的 Agent 框架和客户端使用。如果你的 Agent 只在一个内部框架里运行,用普通的函数调用或内部接口也可以。关键是本篇第 2.2 节的那些设计原则,而不是协议本身。
问:本体服务会不会成为性能瓶颈?
如果交易数据都实时回源查询,确实会增加延迟。常见的缓解办法是:主数据和关系建索引,交易数据只按主键查询,并对热点查询做短时缓存。对客服场景来说,正确性通常比几百毫秒的延迟更重要。
问:本体服务层和业务中台是什么关系?
可以互补。业务中台提供可复用的业务服务(如统一的退款服务),本体在其上提供统一的语义、规则和面向 Agent 的动作入口。如果中台的服务已经很规范,本体的动作可以直接编排中台服务。
问:本体服务出故障时,客服还能工作吗?
应该能。设计时就要保留"降级通道":本体服务不可用时,AI 客服停止办理动作、只做安抚和转人工;客服工作台退回到原有业务系统的操作界面。等服务恢复后,再核对故障期间人工办理的单据,必要时补录审计记录。
问:要不要一开始就支持多个 Agent?
不必。先服务好一个 Agent 和一个人工入口(如客服工作台),证明"人和 Agent 用同一套动作"可行。多 Agent 接入时,主要的新增工作是为每个 Agent 应用单独注册、单独授权和单独记录日志。
本篇要点
- 六层架构:入口、智能体、能力暴露、本体服务、数据接入、源系统;人和 Agent 调用同一套动作。
- 本体可以只做语义中枢,也可以自持数据并执行;已有成熟业务系统的企业通常选前者。
- 本体可以是数仓之上的逻辑层:用 R2RML 一类映射指向现有表,按基于本体的数据访问(OBDA)的思路把语义查询改写成 SQL;OWL 2 QL 为此有意牺牲部分表达能力。本体解释世界,SQL 负责计算。
- 语义在上游,产品语义在下游:一份规范语义模型具备稳定身份、可执行定义、物理映射、关系一等公民、指标同体系、多技术投影六项能力,再投影给 BI、API、Agent 和文档。
- 通过 MCP 接入时:暴露业务工具而非原始查询、先发现后调用、读写分离、写操作两段式、返回结构化理由、工具不比人大。
- 选型从写回需求、现有数据平台、部署要求、团队技能、预算和可迁移性六方面判断;可先用自研薄层验证。
- 路线图按准备、只读、建议、有限执行、扩展五个阶段推进,每阶段都有明确的进入条件;本体服务层内部可拆为模型仓库、查询、规则、动作、索引、审计六个组件。
- 安全上不做令牌透传,而是通过令牌交换代表用户调用,并分清客户、员工和应用三种身份;权限范围最小化、每个请求都校验身份、授权由下游完全中介;每次工具调用都留下可还原决策的日志。
- 概念验证应当是一场"能力问题考试":考结果、考过程、考修改成本。
参考引用
- 《Model Context Protocol Specification: Tools(2025-11-25 版)》,Model Context Protocol 官方规范。原文
- 《Model Context Protocol Specification: Security Best Practices(2025-11-25 版)》,Model Context Protocol 官方规范。原文
- 《LLM06:2025 Excessive Agency》,OWASP Gen AI Security Project。原文
- 《Ontology MCP (OMCP): Overview》,Palantir Foundry 官方文档。原文
- 《Why create an Ontology?》,Palantir Foundry 官方文档。原文
- 《Ontology building: Overview》,Palantir Foundry 官方文档。原文
- 《What is ontology (preview)? — Microsoft Fabric IQ》,Microsoft Learn。原文
- 《Cube MCP Server》,Cube 官方文档(经本项目调研报告收录)。原文
- 《neo4j/mcp》,Neo4j 官方 GitHub(经本项目调研报告收录)。原文
- 《一文读懂怎么让 Agent 理解业务,别一上手就写 Prompt!》,陈思州 Datawhale。Cubox,原文
- 《AI FDE 从一句话到运行系统:本体平台背后的真实架构》,OntoFlow本体平台 AbutionGraph。Cubox,原文
- 《什么是Palantir本体论?不难理解,在12306买一次车票就懂了》,月夜烛峰。Cubox,原文
- 《Palantir平替-“平民级”本体应用开发平台:4个步骤完成交付》,OntoOS-本体智能 AbutionGraph。Cubox,原文
- 《Ontology(本体)Part 3:Ontology (OWL) 驱动的数据分析智能体设计与实战》,Fan 技术与艺术认知。Cubox,原文
- 《LLM Wiki + Ontology:让企业知识从“可检索”走向“可行动”》,划小船。Cubox,原文
- 《分享一个Ontology本体论的AI实操演示,从实际业务看懂本体价值》,月夜烛峰。Cubox,原文
- 《WorkBuddy+金蝶云星空落地一席谈:权限怎么管》,老丁 老丁AI。Cubox,原文
- 《我做了一套本体Ontology工程系统,让Agent能读懂企业数据》,windom Yu 硅基斥候S01。Cubox,原文
- 《分享一个 AI 本体智能应用开发平台设计方案》,月夜烛峰。Cubox,原文
- 《自称开源版 Palantir:一张图让每个 AI 决策都查得到来龙去脉》,AhaAaron Hey AI Coder。Cubox,原文
- 《RFC 8693: OAuth 2.0 Token Exchange》,IETF,2020。原文
- 《R2RML: RDB to RDF Mapping Language》,W3C Recommendation,2012-09-27。原文
- 《OWL 2 Web Ontology Language Profiles (Second Edition)》,W3C Recommendation,2012-12-11。原文
- 《Ontop Guide: Introduction》,Ontop 项目官方文档(自由大学博尔扎诺与 Ontopic 支持)。原文
- 《企业AI真正缺的不是 SQL,而是Semantic Layer》,本体论应用 AbutionGraph(厂商文章:作者团队开发 OntoFlow 等本体产品,文中观点带有产品立场)。Cubox,原文
