Demo · 落地示例

本体语义层落地示例

关系库(系统记录) → 本体语义层 → API / MCP / skill → AI Agent

这是一个能落地、能跑、能接进 AI agent 的最小完整例子(对应课程 0010)。它把「供应链计划」的数据库事实映射成本体,再暴露成 API、MCP 工具和 skill,让大语言模型基于真实事实回答,而不是靠猜。整仓库源码见 demo/。


01架构:四层各司其职

系统记录
PostgreSQL(闭世界、事务、权威数据)
映射
R2RML / OBDA 对齐本体
本体语义层
类/属性/公理 + 推理(sc-planning.ttl)
Agent 接入
API / MCP / skill
AI
大语言模型取事实回答

关键:不是替换数据库,而是让语义层"虚拟地"坐在它上面;AI 从语义层取确定的事实来回答。

02本体(语义层)

本体定义"世界里有哪些类、怎么关联、有哪些规则"(ontology/sc-planning.ttl):

# 类层次 :FinishedGood rdfs:subClassOf :Product . :CapacityAllocation rdfs:subClassOf :SupplyChainObject . # 再化类 # 对象属性(连个体)+ domain/range :requiresProduct a owl:ObjectProperty ; rdfs:domain :Order ; rdfs:range :Product . # 数据属性(连值) :hasLeadTime a owl:DatatypeProperty ; rdfs:domain :Product ; rdfs:range xsd:integer . # 公理 :FinishedGood owl:disjointWith :RawMaterial .

03数据库(系统记录)+ 打通

关系库仍是权威记录(db/schema.sql);用 R2RML 把列对准本体(db/mapping.r2rml):

# R2RML 片段:product 表 → :Product 个体 :ProductMapping rr:logicalTable [ rr:tableName "product" ] ; rr:subjectMap [ rr:template "http://example.org/sc#product-{product_id}" ; rr:class :Product ] ; rr:predicateObjectMap [ rr:predicate :hasLeadTime ; rr:objectMap [ rr:column "lead_time_days" ] ] .

生产级"数据不搬家"用 Ontop(本体数据访问)把 SPARQL 改写成 SQL,数据留在库里。

04真实运行:语义层 + 推理

纯 Python、零依赖(semantic_core.py),本机直接跑。这是真实输出:

================================================================== 本体语义层 DEMO —— 供应链计划(sc-planning) ================================================================== [1] 产品 447 的本体化事实: product-447 a FinishedGood product-447 :hasLeadTime 14 [3] 意图推理:「7 号线下个月能满足订单 1042 吗?」 (事实) order-1042 a Order (事实) order-1042 :requiresProduct product-447 (事实) order-1042 :hasQuantity 5000 (事实) product-447 :isProducedOn line-7 (事实) capacity-7-2026-06 a CapacityAllocation (事实) capacity-7-2026-06 :hasCapacityValue 1200 (推理) order-1042 需要 447 × 5000; line-7 在 2026-06 产能 1200 ⇒ 不足,排不下 => can_fulfill: False | 缺口: 3800

看,大语言模型不必猜:它拿到的是"订单需要 5000、产能只有 1200"这些确定事实 + 推理,于是给出有依据的结论"排不下,缺 3800"。

05接进 AI Agent(API / MCP / skill)

三种组件,把同一套语义层暴露给 agent:

组件是什么怎么用
APIFastAPI 把语义层暴露成 RESTuvicorn api.server:app;GET /facts/product/447、/answer/can-fulfill?order_id=1042&period=2026-06
MCP把语义层封装成 agent 可调用的工具python3 mcp/server.py;agent 调用 product_facts / order_facts / can_fulfill / query_triples
skill教 agent 领域词汇 + 什么时候调用把 skill/sc-planning-agent.md 交给 agent
两种位置,别搞混

语义层(API/MCP)= 确定的事实+推理服务,无大语言模型;真正组装上下文、调用大语言模型 的是它上面的编排层(agent_orchestration.py)——听懂问题→选工具→拿事实→组装 prompt→调大语言模型。agent 正是通过 MCP 拿到本体化的确定事实,再据此回答,这才是"本体驱动的检索增强生成"的最小落地(课程 0009/0010 正解)。

06怎么在本地跑

# 1) 立刻看语义层 + 推理(无需数据库) cd demo python3 semantic_core.py # 2) 接进 agent(MCP,需 pip install mcp) python3 mcp/server.py # 3) 起 REST API(需 pip install fastapi uvicorn) uvicorn api.server:app --reload # 4) 接真实 PostgreSQL docker compose up -d db # 自动建表 + 灌数据

源码

所有文件在仓库 demo/:semantic_core.py(语义层)、agent_orchestration.py(编排层:组上下文+调大语言模型)、api/server.py、mcp/server.py、skill/sc-planning-agent.md、ontology/sc-planning.ttl、db/schema.sql、db/mapping.r2rml。有任何卡点或想把真实业务表接进来,直接问 agent。