《Ontology 入门与实践手册》

10 实战演练:电商售后从零走一遍

这一篇把前九篇的方法串起来,以示例商城的"退货退款"为范围,从零走完八个步骤(与第 06、07 篇的八步一一对应),并用五个场景检验结果。文末附上可直接复用的检查清单和全系列术语表。文中的公司、数据、阈值和指标都是演练用的虚构内容。

1. 背景

示例商城是一家中型综合电商,售后相关的系统有六个:会员、订单、售后、支付、物流、客服工单。公司准备上线 AI 客服"小售",第一期目标是:客户发起退货退款时,"小售"能准确查询进度、判断资格、计算金额,并在授权范围内提交申请;客服工作台同步使用同一套能力。

图 10-1:八步走完,每步留下什么
图 10-1:八步走完,每步留下什么

2. 第一步:范围卡

项内容
范围售后申请、审核、退货寄回与验收、退款(含部分、分次)、相关工单
不包含换货、价保、发票、商家结算、补偿券发放
裁决人客服运营负责人
成功标准12 个能力问题全部通过;影子模式两周,对象误配率和动作误判率低于约定阈值

3. 第二步:能力问题(节选)

下表只节选了 12 个能力问题中的 6 个,完整清单见第 06 篇第 3 节。

编号能力问题将用到的本体元素
CQ1这位客户所有账号下最近 30 天的售后单及状态客户(身份合并)、售后单、状态
CQ3这个订单行还能退多少钱订单行、退款单、函数"可退金额"
CQ5这件商品现在能否无理由退货,依据哪条规则正向发货单(装有该订单行)的签收时间(签收次日起算)、商品类别、规则 R02、R03
CQ6这笔退款是否需要主管审批规则 R04
CQ8发起 120 元部分退款需要什么、会产生什么动作"发起退款"
CQ12某笔退款谁发起、谁批准、依据哪版规则动作执行记录、审计

4. 第三步:术语与权威来源

最关键的三条裁决:

  1. 客户以会员系统的会员号为准;小程序编号、来电号码通过绑定关系归并到会员号,无法自动归并的进入人工确认队列。
  2. 售后系统的"已完成"重新定义为售后单状态"退货验收完成",不再对外表述为"已完成";退款完成以支付渠道成功回执为准。
  3. 签收时间以物流系统的签收记录为准,用于计算无理由退货期限:取装有该订单行的正向包裹的签收时间,从签收次日起算 7 天。

5. 第四、五步:对象类型与关系

用一份文本形式的定义保存在版本库里(格式为示意):

ontology: aftersales
version: 1.0.0
object_types:
  Customer:      { key: member_no, source: 会员系统 }
  Order:         { key: order_id,  source: 订单系统 }
  OrderLine:     { key: item_id,   source: 订单系统, props: [quantity, paid_amount], note: 关系体,连接订单与商品 }
  Product:       { key: sku_id,    source: 商品中心, props: [category, is_fresh] }
  Shipment:      { key: waybill_no, source: 物流系统, props: [direction, signed_at], direction_enum: [outbound, return] }
  AfterSalesCase:
    key: apply_id
    source: 售后系统
    note: 关系体,连接客户诉求与订单行
    props: [type, requested_quantity, requested_amount, status, reason]
    status_enum: [待审核, 待退货, 退货验收中, 待退款, 退款中, 已退款, 已关闭]
  Refund:        { key: refund_no, source: 支付系统, props: [amount, status, channel] }
  Payment:       { key: pay_no,    source: 支付系统, props: [amount, channel] }
  Approval:      { key: approval_id, source: 售后系统, props: [action_instance, approver, decision, decided_at] }
  Ticket:        { key: ticket_id, source: 客服工单系统 }
links:
  # from_card:每个 to 对象关联几个 from 对象;to_card:每个 from 对象关联几个 to 对象
  - { name: 下单,     from: Customer,       to: Order,          from_card: 1,    to_card: 0..n }
  - { name: 包含,     from: Order,          to: OrderLine,      from_card: 1,    to_card: 1..n }
  - { name: 对应,     from: OrderLine,      to: Product,        from_card: 0..n, to_card: 1 }
  - { name: 支付,     from: Order,          to: Payment,        from_card: 1,    to_card: 1..n }
  - { name: 装运,     from: Shipment,       to: OrderLine,      from_card: 0..n, to_card: 1..n, props: [quantity], note: 正向发货单;一个订单行可拆到多个包裹,一个包裹可装多个订单行 }
  - { name: 申请人,   from: Customer,       to: AfterSalesCase, from_card: 1,    to_card: 0..n }
  - { name: 针对,     from: AfterSalesCase, to: OrderLine,      from_card: 0..n, to_card: 1 }
  - { name: 退货寄回, from: AfterSalesCase, to: Shipment,       from_card: 0..n, to_card: 0..1, note: 退货包裹,direction = return }
  - { name: 产生,     from: AfterSalesCase, to: Refund,         from_card: 1,    to_card: 0..n }
  - { name: 审批,     from: Approval,       to: AfterSalesCase, from_card: 0..n, to_card: 1 }
  - { name: 关联,     from: Ticket,         to: AfterSalesCase, from_card: 0..n, to_card: 0..n }
functions:
  refundable_amount: OrderLine.paid_amount - sum(已成功退款金额) - sum(在途退款金额:退款中 / 结果未知)
图 10-2:示例商城售后的对象与关系
图 10-2:示例商城售后的对象与关系

演练中被否决的几个初稿设计,也值得记下来:把"VIP 客户"建成子类(改为客户属性"会员等级");直接连"客户退过商品"(改为沿售后单路径查询);把售后系统的大宽表整体建成一个对象(拆成售后单、退款单、审批记录)。

6. 第六步:动作、规则与权限

rules:
  R01: { type: 约束, text: 订单行累计退款不超过实付金额, version: 1 }
  R02: { type: 派生, text: 自正向包裹签收次日起 7 天内具备无理由退货资格(法定底线,平台可放宽、不能收紧), version: 1 }
  R03: { type: 约束, text: 生鲜商品不适用无理由退货, version: 1 }
  R04: { type: 决策, text: 单笔退款超过 500 元需主管审批(示例阈值), version: 2 }
  R05: { type: 约束, text: 同一订单行不能同时有两个进行中的售后单, version: 1 }
actions:
  create_case:
    target: OrderLine
    params: { type: enum, quantity: integer, amount: decimal, reason: enum }
    preconditions: [R01, R02, R03, R05]
    edits: [create AfterSalesCase(status = 待审核)]
    idempotency_key: request_id
  initiate_refund:
    target: AfterSalesCase
    params: { amount: decimal, reason: enum }
    preconditions: [status == 待退款, R01]
    approval: { rule: R04, role: 客服主管, bind: [actor, target, amount, channel], ttl: 24h }
    edits: [create Refund, set AfterSalesCase.status = 退款中]
    writeback: payment_gateway.refund
    side_effects: [notify_customer, audit_log]
    idempotency_key: request_id   # 决定退款时生成一次,所有重试沿用;不含金额和重试次数
    on_timeout: 进入结果未知 → 按同一键查询渠道 → 已成功则前滚 / 确认未受理则同键重试 / 仍无法确认转人工
    compensation: 渠道明确拒绝时,售后单回到待退款并通知客服;重复失败转人工
  approve_action_instance:
    target: 处于待审批的动作实例
    params: { decision: [批准, 驳回], comment: text }
    preconditions: [实例状态 == 待审批, 未过期, 参数未变]
permissions:
  AI客服:   { create_case: 申请, initiate_refund: 建议, approve_action_instance: 无 }
  一线客服: { create_case: 执行, initiate_refund: 执行(阈值内)/ 申请(超阈值) }
  客服主管: { initiate_refund: 执行, approve_action_instance: 执行 }

7. 第七步:数据绑定与质量检查

绑定完成后跑第一轮质量检查,演练中发现了四类问题:

检查项发现(演练数据)处理
售后单必须针对一个订单行少量历史售后单只记录了订单号、没有订单行按订单只含一个订单行的情况自动补齐,其余转人工
售后状态枚举可映射出现系统早期遗留的状态码,无人知道含义裁决人确认后并入"已关闭"
客户身份可归并部分小程序账号未绑定会员号进入人工确认队列,期间 AI 客服提示客户提供订单号
退款金额为正且不超可退金额发现极少数历史超额退款不进入 Agent 可用范围,交财务核查

这一步常常比建模本身更耗时,要在计划里留足时间。

8. 第八步:用五个场景验收

图 10-3:五个验收场景总览
图 10-3:五个验收场景总览

场景 A:阈值内的部分退款

客户:"那件外套有个扣子掉了,退我 50 块就行,不用寄回。"

  1. "小售"调用 resolve_customer,合并客户的两个账号,定位到外套所在的订单行;
  2. 调用 get_case_context,发现没有进行中的售后单,于是"申请"创建一个"仅退款"售后单,客户确认后提交;
  3. 客服审核通过后,"小售"调用 validate_action 试算发起退款 50 元:R01 通过(可退 299 元),R04 未命中;
  4. 按权限,"小售"只有建议权,于是把预填好的退款建议推给客服,客服一键执行;
  5. 渠道回执成功,售后单变为"已退款",客户收到通知。

场景 B:超阈值退款与审批

客户要求退一台 899 元的电动牙刷。售后单 AS-2045 已审核通过、退货验收完成,处于"待退款"。客服小林发起退款,干跑校验命中 R04,提交后动作实例进入"待审批",审批卡片上冻结了执行人、售后单号、金额 899 元、原路退回和 24 小时有效期。主管老周批准后动作执行。如果有人试图把金额改为 799 元,原审批自动失效,需要重新审批;如果改为 989 元,则直接被 R01 拦截,因为超过了实付 899 元。

场景 C:被拦截的请求

场景 D:支付渠道超时

发起退款后支付渠道超时。超时不等于失败,钱可能已经退出去了,所以动作实例进入"结果未知":售后单保持"退款中",这笔金额在可退金额里先冻结,避免再发起一笔。动作引擎随后用同一个幂等键向渠道查询:查到已成功,就前滚,把售后单更新为"已退款";确认渠道未受理,才用同一个键重试;多次查询仍无法确认,就转为"需人工",生成工单给客服。客户在此期间查询时,"小售"调用 get_action_status,如实回答"退款已提交,正在与支付渠道确认结果",而不是说"已退款"或"退款失败"。

图 10-4:场景 D:支付渠道超时之后
图 10-4:场景 D:支付渠道超时之后

场景 E:两个账号、两个包裹,只退一件

客户用小程序登录,说:"我上周买的三件东西,只想退那双运动鞋。"

  1. "小售"调用 resolve_customer:小程序账号已绑定会员号,归并成功;但上周的订单是用另一个会员账号下的,两个会员号之间没有绑定关系,只有手机号相同——这属于候选归并,不能自动合并。
  2. "小售"没有直接回答"您没有这笔订单",而是请客户提供订单号。客户给出订单号后,"小售"向该订单的收货手机发送短信验证码;客户回填正确后,本次会话只处理这一笔订单。两个会员号不在此时合并,归并候选推送给客服确认。
  3. 本体沿关系找到运动鞋所在的订单行:该订单拆成两个包裹,运动鞋在已签收的第一个包裹里;另外两件在途中。
  4. 干跑"创建售后单":R02 通过(签收 2 天),R05 通过(该订单行没有进行中的售后单)。可退金额按该订单行的实付金额计算,订单级优惠已在订单行上分摊。
  5. "小售"以"申请"权提交退货退款售后单,并告诉客户:"已为运动鞋提交退货申请,其余两件仍在配送中,不受影响。"

这个场景检验的是身份归并的边界和关系体的价值:如果没有"订单行"和"包裹"的正确建模,"只退一件、而且在已签收的那个包裹里"根本无法准确表达。

图 10-5:场景 E:两个账号、两个包裹,只退一件
图 10-5:场景 E:两个账号、两个包裹,只退一件

场景覆盖了什么

五个场景不是随便挑的,它们各自对准了前面几篇讲过的一个风险点。把它们放进一张表,可以检查验收是否有盲区:

场景检验的规则或机制防住的反模式(第 08 篇)对应的能力问题
A 阈值内部分退款R01、可退金额函数、建议权8 把工具当动作CQ3、CQ8
B 超阈值审批R04、参数绑定审批10 审批不绑参数CQ6、CQ12
C 被拦截的请求R03、动作白名单9 规则藏在提示词、过度代理CQ5、CQ10
D 渠道超时幂等键、结果未知与查询确认、两层状态第 08 篇事故复盘中的问题CQ2
E 两个账号与多包裹身份归并、关系体、R055 身份不清、6 捷径关系CQ1、CQ5

表中的 CQ2、CQ10 等编号未在第 3 节的节选里列出,完整清单见第 06 篇。如果你的项目里有某个反模式在表中找不到对应的场景,就说明验收还缺一块,应该补一个场景。

每次动作留下的证据

字段场景 B 的记录(演练数据)
动作与实例initiate_refund,实例 ACT-0098
作用对象售后单 AS-2045 → 订单行 L-7781
事实快照实付 899.00 元,已退 0 元,签收于 3 天前
命中规则R01 v1 通过;R04 v2 命中,需审批
发起与批准客服小林发起;主管老周批准,参数未变
执行回执支付渠道回执成功
本体版本aftersales 1.0.0

一次演进演练

上线一个月后,业务提出把 R04 的审批阈值从 500 元调到 800 元(示例)。按第 07 篇 2.3 节的流程走:裁决人确认;影响分析发现引用 R04 的只有"发起退款";在测试环境回归,补上 799、800、801 元等边界用例;设定生效时间,发布 R04 v3;v2 保留,生效前已经处于"待审批"的动作实例仍按 v2 处理。整个过程只改了规则表,没有改动作和代码。

影子模式两周的观察

上线执行权之前,"小售"在影子模式下运行两周,只给建议不执行。团队重点看对象误配率、动作建议与人工处理不一致的比例、审批驳回率和人工接管率,并逐条复盘不一致的案例。演练中最常见的问题来自身份归并和遗留状态码,而不是模型理解——这再次说明数据绑定和质量检查的分量。

9. 检查清单

定范围

名词层

动能层

数据与接入

验收与演进

10. 术语表

术语一句话解释首次详解
本体对业务领域有什么、什么关系、能怎样改变、必须守什么规矩的明确、共享、机器可处理的描述第 01 篇
名词层本体中描述"名词"的部分:对象、属性、关系(Palantir 称为语义元素)第 04 篇
动能层本体中描述"动词"的部分:动作、函数、规则、权限第 04 篇
对象类型 / 对象一类业务事物的定义 / 其中具体的一个第 04 篇
属性对象的特征,有类型、单位、取值范围和来源第 04 篇
派生属性由其他属性计算得出、不直接存储的属性第 04 篇
关系两类对象之间有名字、方向和基数的业务联系第 04 篇
基数关系两端的数量约束,如一对多第 04 篇
关系体自身带有属性和历史、因而被建成对象的关系,如订单行、售后单第 04 篇
接口 / 共享属性多个对象类型共用的特征定义第 04 篇
动作一次完整、受控的业务变更。本体内部的修改要么全部生效、要么全部不生效;涉及外部系统(如支付渠道)时,靠幂等、补偿和"结果未知"处理保证最终一致第 04 篇
函数只计算、不改数据的逻辑(Palantir 的编辑函数能算出一组修改,但要包装成动作执行才生效)第 04 篇
规则必须成立的条件或判断逻辑:约束、前置条件、派生、决策第 04 篇
权限谁能看哪些对象和字段、能执行哪些动作;对 Agent 分查看、建议、申请、执行第 04 篇
状态机列出对象所有状态及允许转换的模型第 04 篇
写回把动作或决策的结果写回业务数据第 02 篇
能力问题本体建成后必须能回答的业务问题清单,也是验收标准第 06 篇
数据绑定把对象类型和属性对应到真实系统的表、字段或接口第 07 篇
幂等同一请求重复提交只生效一次第 07 篇
补偿多步动作中某步失败时的撤销或补救措施第 07 篇
影子模式Agent 只给建议、不执行,用于与人工结果对比的试运行方式第 07 篇
动作实例 / 执行状态某一次具体的动作提交 / 它所处的阶段,如待审批、执行中、结果未知、已完成第 07 篇
结果未知调用外部系统超时、不知道是否成功时的执行状态;要先查询确认,再前滚或同键重试第 07 篇
裁决人对业务定义冲突有最终决定权的业务负责人第 02 篇
派生关系由正式关系路径计算得出、不单独维护的快捷关系第 06 篇
主数据客户、商品等核心实体的标准编号和权威记录第 05 篇
知识图谱用节点和边记录具体事实的网络;本体为它提供结构和规则第 05 篇
指标语义层dbt、Cube 等工具提供的统一指标口径层,管"数怎么算"第 05 篇
公共核心模型客户、商品、订单等跨场景共用的对象定义,各场景复用而不复制第 09 篇
语义中枢型 / 本体自持型本体只做语义和规则权威、事务交给下层系统 / 本体自己持有数据并执行第 09 篇
意图 / 槽位用户想做什么 / 完成这件事需要的参数,如商品、时间、退款方式第 09 篇
开放世界假设 / 封闭世界假设没写的信息算"未知" / 没写就算"不存在"第 04 篇
OWL / SHACLW3C 的本体语言 / 数据形状校验语言第 01 篇
MCP让 AI 应用以统一方式发现和调用外部工具的开放协议第 09 篇
干跑只校验、不产生修改的试执行第 09 篇
RAG先检索文档片段、再交给模型生成回答的方法第 03 篇
AI Agent能理解目标、规划步骤、调用工具完成任务的大模型程序第 03 篇

11. 把这套做法搬到别的场景

退货退款只是起点。想把同样的方法用到换货、价保,甚至采购、仓储、风控,可以按三个问题快速判断复用程度:第一,新场景里的核心对象是否已经存在——换货和售后共用客户、订单行、商品、退货包裹,只需新增"换货单"和"补发包裹";第二,新场景的动作风险有多高——换货涉及库存占用和二次发货,需要新的补偿方案;第三,新场景有没有自己的裁决人——仓储口径往往由物流负责人拍板,而不是客服运营。

公共的对象定义放进公共核心模型,新场景只声明自己要用到的对象、动作和权限。每扩一个场景,都从范围卡和能力问题重新开始,而不是在现有模型上随手加字段。坚持这一点,本体才会越用越稳,而不是越长越乱。

12. 演练复盘:五条经验

  1. 最难的是"认人"。身份归并的问题比任何规则都多。没有主数据系统时,要把归并当成一项独立工作来做,而不是建模的附带品。
  2. 状态码的历史包袱比想象中重。遗留状态码、含义漂移的"已完成",每一个都需要裁决人花时间确认。
  3. 关系体是价值所在。订单行、售后单这两个关系体,支撑了部分退款、分次退款、多包裹等几乎所有"复杂"场景。
  4. 保守的 Agent 更受欢迎。客服和客户都更信任"已提交申请"这样准确的说法,而不是"已为您办理"这种过度承诺。
  5. 测试集是最好的文档。新同事读能力问题和测试用例,比读任何说明都更快理解本体。

13. 常见问题

问:演练里的规则和阈值能直接用到我们公司吗?

不能。它们是演示建模方法用的示例,真实的退货时限、审批阈值、生鲜政策要由你们的业务负责人确定,并且可能因平台、品类、会员等级而不同。

问:没有工程团队,能按这篇的方法做吗?

前四步(范围卡、能力问题、术语裁决、对象与关系)完全可以用文档和表格完成,而且非常有价值——它们本身就能统一团队的语言。第六步之后的动作执行、数据绑定需要工程能力,或者借助本体平台。

问:YAML 一定要这样写吗?

不必。文中的 YAML 只是示意,重点是"本体定义以文本形式放在版本库里"这个做法。具体格式可以用你选定的平台或工具的格式。

问:做完这一篇,下一步做什么?

用第 9 节的检查清单逐项核对自己的项目,然后按第 09 篇的路线图,从只读阶段开始。遇到问题时,回到第 08 篇对照反模式。

本篇要点

参考引用

  1. 《Ontology Development 101: A Guide to Creating Your First Ontology》,Natalya F. Noy、Deborah L. McGuinness,Stanford University。原文
  2. 《Action types: Overview》,Palantir Foundry 官方文档。原文
  3. 《Shapes Constraint Language (SHACL)》,W3C Recommendation,2017-07-20。原文
  4. 《Model Context Protocol Specification: Tools(2025-11-25 版)》,Model Context Protocol 官方规范。原文
  5. 《Ontology MCP (OMCP): Overview》,Palantir Foundry 官方文档。原文
  6. 《Action Ontology:让企业 Agent 从“会调用”到“能负责”》,皓月惊鸿 Chatshouse。Cubox,原文
  7. 《分享一个Ontology本体论的AI实操演示,从实际业务看懂本体价值》,月夜烛峰。Cubox,原文
  8. 《本体建模过程案例:FDE如何根据业务口述建立静态本体?》,基线沉思。Cubox,原文
  9. 《从本体论到本体建模,从本体建模到 AI 原生—我这一年关于本体的系统性复盘》,何明璐 人月聊IT。Cubox,原文
  10. 《LLM Wiki + Ontology:让企业知识从“可检索”走向“可行动”》,划小船。Cubox,原文
  11. 《我做了一套本体Ontology工程系统,让Agent能读懂企业数据》,windom Yu 硅基斥候S01。Cubox,原文
  12. 《别把RAG当架构:Ontology(本体)才是Agent的业务世界》,KK AI应用落地社。Cubox,原文
  13. 《准备上知识图谱和本体(Ontology)?要什么团队、选什么场景、花多少成本 | 人人都是产品经理》,叶小钗。Cubox,原文
  14. 《中华人民共和国消费者权益保护法》第二十五条,国家市场监督管理总局发布文本。原文