- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本体(Ontology)是符号主义 AI 中“知识表示”的核心产物:它用形式化的方式把某个领域的事实与概念层级固化下来,从而让计算机能够自动推理。本指南围绕 AI-For-Beginners 课程lessons/2-Symbolic的课后作业 assignment.md,完整讲解“如何选定主题并构建一个本体”,并结合仓库内的 FamilyOntology.ipynb、Animals.ipynb、onto.ttl 等源码级素材,帮助你掌握知识表示、OAV 三元组、产生式规则、AND-OR 树与 Protégé 建模实战。
作业解读:这堂课要你做什么
作业原文的核心任务只有一句话:选择一个人、一个地点或一个事物作为主题,然后为它构建一个模型(本体),并用本课学到的建模技术与策略去实现。为了让任务可落地,作业给出了一个非常具体的示例:
创建一个客厅(living room)的本体,包含家具、灯光等元素。客厅和厨房有何不同?和浴室呢?你凭什么判断这是客厅而不是餐厅?
这三个追问背后,其实对应了本体建模中最重要的三个能力:
- 类别界定(class 与 instance):客厅、厨房、浴室、餐厅不是“事物个体”,而是对空间类型的概念分类,你需要定义这些类并明确它们的区别;
- 属性刻画(slot / property):客厅有“有沙发”“有电视”“有壁炉”等属性,而厨房有“有炉灶”“有水池”——通过属性组合,才能区分不同空间;
- 形式化表达(triplet / OWL):把“客厅–包含–沙发”写成机器可读的三元组,让推理机能够自动回答“这是什么房间”。
课程正文(lessons/2-Symbolic/README.md)在作业之前铺垫了完整的概念体系:知识(knowledge)与数据(data)、信息(information)的区别,DIKW 金字塔,以及网络式、层级式、过程式、逻辑式四类知识表示方法。构建本体正是把这些概念落到实际建模中的练习。
建模前必读:本课的核心知识表示概念
在动手之前,先建立三组关键概念,它们决定了你的本体会被建成什么样。
从三元组到语义网络
知识可以表示为对象-属性-值(OAV)三元组。课程 README 以编程语言为例给出了一个典型表格:
| 对象(Object) | 属性(Attribute) | 值(Value) |
|---|---|---|
| Python | is | Untyped-Language |
| Python | invented-by | Guido van Rossum |
| Python | block-syntax | indentation |
| Untyped-Language | doesn't have | type definitions |
一个三元组就是图的一条边:对象是节点,属性是边标签,值指向另一个节点或字面量。多个三元组拼起来就是一张语义网络(semantic network)。本课作业要求你建模的“客厅/厨房/浴室”就是一张以空间类型为节点、以“包含/具有/区别于”为边的小型语义网络。
框架表示与层级结构
框架(frame)把每个对象或对象类描述为一个带槽位(slot)的模板,槽位可以有默认值、取值约束或求值过程。README 中 Python 的框架示意:
| 槽位(Slot) | 值(Value) | 默认值(Default value) | 取值范围(Interval) |
|---|---|---|---|
| Name | Python | ||
| Is-A | Untyped-Language | ||
| Variable Case | CamelCase | ||
| Program Length | 5-5000 lines | ||
| Block Syntax | Indent |
注意这里“Is-A”槽位让框架自然形成类层级——这正是本体(ontology)最朴素的形态:一个领域内的对象层级树。客厅和餐厅都是“房间”的子类,就是一条Is-A关系。
产生式规则与 AND-OR 树
过程式知识表示把知识写成一串“当条件满足时执行动作”的规则,即 if-then 产生式。课程给出的食肉动物判定规则是经典示例:
IF the animal eats meat OR (animal has sharp teeth AND animal has claws AND animal has forward-looking eyes ) THEN the animal is a carnivore这样的规则可以用AND-OR 树画出来——AND 分支要求所有子条件同时成立,OR 分支只需其一成立。仓库里的 Animals.ipynb 正是用这张 AND-OR 树实现了一个完整的动物识别专家系统(详见下文“源码印证”)。在你自己的客厅本体里,完全可以写一条规则:“IF有沙发AND有茶几AND有电视THEN这是一个客厅”。
使用 Protégé 构建你的本体:分步实战
作业明确要求使用 Protégé):
上图为 Web Protégé 打开罗曼诺夫家族本体的界面(课程 README 原图):左侧
Individuals by Class面板按类展示个体,中间区域展示所选个体Fedor Alekseevich Romanov的 IRI、Annotations、Types 与 Relationships 断言,右侧为备注面板。你可以参照这个布局完成自己的建模。
下面以“客厅本体”为例,给出可复现的完整步骤。
第 1 步:定义类层级(Classes)
在 Protégé 的Classes页签创建层级:
Thing └── Room(房间,父类) ├── LivingRoom(客厅) ├── Kitchen(厨房) ├── Bathroom(浴室) └── DiningRoom(餐厅)这一步对应课程 README 的“层级式表示”:框架通过Is-A槽位形成对象层级。定义好父类后,子类自动继承父类的属性约束。
第 2 步:定义对象属性(Object Properties)
在Object Properties页签声明类与类、个体与个体之间的关系:
| 属性 | 定义域(domain) | 值域(range) | 含义 |
|---|---|---|---|
| contains | Room | Furniture | 房间包含家具 |
| hasLighting | Room | Lighting | 房间有灯光 |
| isDistinguishedBy | Room | Feature | 房间以某特征区分 |
可以给属性添加约束(如contains是反自反的),并为每个属性声明逆属性(如isContainedIn是contains的逆),Protégé 会在Inverse Of栏中维护。
第 3 步:定义个体(Individuals)
切换到Individuals页签,为每个类创建实例:
- LivingRoom 类下:
my_sofa(沙发)、coffee_table(茶几)、floor_lamp(落地灯); - Kitchen 类下:
stove(炉灶)、sink(水池); - Bathroom 类下:
bathtub(浴缸)、shower(淋浴); - DiningRoom 类下:
dining_table(餐桌)、chairs(餐椅)。
然后在Property assertions面板中把个体与属性断言连起来,例如断言my_living_room contains my_sofa。做完这些断言,你就已经把“客厅包含沙发、落地灯”写成了一组机器可读的三元组。
第 4 步:用规则与推理回答作业的追问
作业的追问——“客厅和厨房有什么不同?你凭什么判断这是客厅而不是餐厅?”——可以用两种方式回答:
- 直接断言:为每个房间类添加必要属性(如 LivingRoom 有
contains some Sofa,Kitchen 有contains some Stove),推理机据此区分; - 产生式规则:定义规则“
IF有沙发AND有茶几THEN是客厅”,推理机在遇到新个体时自动归类。
启用 Protégé 的推理机(如 HermiT、Pellet),运行后可以看到推理机自动把满足条件的个体归类到对应房间类型——这就是本课“知识表示 + 推理”两个大概念(见 README 引言)在工具层面的落地。
源码印证:仓库里三个可参考的建模范式
作业虽然只需要一个客厅本体,但仓库lessons/2-Symbolic目录下有三个 notebook 从不同角度演示了本体/知识库的构建与推理,是你扩展作业深度的最佳范本。
范式一:自己写推理机(反向推理)——Animals.ipynb
Animals.ipynb 用 Python 实现了一个专家系统外壳(expert systems shell),核心是三类语法类:
Ask:表示需要向用户提问的叶子节点,包含候选答案(默认['y','n'],多选时打印编号菜单);If:产生式规则的语法糖容器;AND/OR:AND-OR 树分支,仅存放参数列表。
知识库被定义为一个rules字典,把“动作(要写入工作记忆的新事实)”映射到“条件(AND-OR 表达式)”,例如:
rules = { 'default': Ask(['y','n']), 'color' : Ask(['red-brown','black and white','other']), 'pattern' : Ask(['dark stripes','dark spots']), 'mammal': If(OR(['hair','gives milk'])), 'carnivor': If(OR([AND(['sharp teeth','claws','forward-looking eyes']),'eats meat'])), 'ungulate': If(['mammal',OR(['has hooves','chews cud'])]), 'animal:giraffe' : If(['ungulate','long neck','long legs','pattern:dark spots']), 'animal:zebra' : If(['ungulate','pattern:dark stripes']), ... }KnowledgeBase类维护memory(工作记忆,即“属性→值”的字典)并实现两个核心方法:
get(name):获取某属性值,必要时触发推理;对'color:blue'这类带:的形式会递归求值color后返回y/n;eval(expr):递归遍历 AND/OR 表达式求值——AND 任一子条件为n即短路返回n,OR 任一子条件为y即返回y,字符串叶子则回落到get。
运行kb.get('animal')时,系统会按需向你提问(y/n或编号多选),最终根据你的回答推断出动物种类。这一过程演示了 README 中描述的反向推理(backward inference):由目标驱动,只询问与结论相关的条件。
范式二:用 Experta 做正向推理——Animals.ipynb
同一个 notebook 的第二部分使用 Experta(受经典 CLIPS 启发的 Python 正向推理库)实现同一套动物知识库。关键点在于继承KnowledgeEngine,用@Rule装饰器声明规则、用declare在规则体内插入新事实:
from experta import * class Animals(KnowledgeEngine): @Rule(OR( AND(Fact('sharp teeth'),Fact('claws'),Fact('forward looking eyes')), Fact('eats meat'))) def cornivor(self): self.declare(Fact('carnivor')) @Rule(Fact(animal=MATCH.a)) def print_result(self,a): print('Animal is {}'.format(a))初始化事实后调用run(),正向推理引擎会逐条触发规则、不断向工作记忆添加新事实,直到推导出Fact(animal='tiger')这类结论。这也是 README 中**正向推理(forward inference)**的完整实现。值得注意的是 notebook 中说明:Expert 这类库底层使用Rete 算法做高效规则匹配,避免朴素实现带来的性能问题——这正是“专家系统外壳”优于自己手写推理循环的原因之一。
范式三:语义网技术与 SPARQL 推理——FamilyOntology.ipynb
FamilyOntology.ipynb 演示了最贴近“本体”的技术栈:用OWL/RDF 三元组 + 自动推理构建家谱本体。流程分四步:
- 解析家谱数据:用
python-gedcom库读取 tsars.ged(GEDCOM 5.5 格式的罗曼诺夫王朝族谱),得到 41 个个体与 15 个家庭; - 读取本体:加载 onto.ttl(Turtle 格式)。该本体用 OWL 定义了
isFatherOf、isMotherOf、isBrotherOf、isSisterOf等基础谓词,并用owl:propertyChainAxiom(属性链公理)定义复合关系,例如“姑/姨 = 某人的母亲的姐妹”:
fhkb:isAuntOf a owl:ObjectProperty ; rdfs:domain fhkb:Woman ; rdfs:range fhkb:Person ; owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .- 合成三元组:把 GEDCOM 中每个个体按性别转成
isMotherOf/isFatherOf、isSisterOf/isBrotherOf断言,附加到onto.ttl尾部,形成“规则 + 事实”的完整本体文件; - 推理并查询:用
rdflib解析图,用owlrl的DeductiveClosure(OWLRL_Extension).expand(g)计算推理闭包。从原始 669 条三元组扩张到 4246 条,再用SPARQL查询出所有叔伯关系:
SELECT DISTINCT ?aname ?bname WHERE { ?a fhkb:isUncleOf ?b . ?a rdfs:label ?aname . ?b rdfs:label ?bname . }输出:
Fedor Alekseevich Romanov is uncle of Ekaterina Ivanovna Romanova Aleksandr I Pavlovich Romanov is uncle of Aleksandr II Nikolaevich Romanov Fedor Alekseevich Romanov is uncle of Anna Ivanovna Romanova这个 notebook 还特别指出:代码中暂未处理收养家庭(len(parent_families)>1的情况被跳过),这是你可以继续改进的作业扩展点。相关数据结构(onto.ttl 中的hasGrandParent、isFirstCousinOf等属性链定义)完整展示了“用 OWL 公理表达复杂亲属关系”的建模思路,对你的客厅本体设计极具参考价值。
评估与扩展:让作业从“交差”变成“作品”
完成基础本体后,建议按以下梯度自我评估并扩展,这正好呼应 README 课后挑战中“发现新关系”的练习精神:
- 达到合格:类层级清晰、对象属性带 domain/range、至少 5 个个体并完成关系断言;
- 达到良好:引入至少 1 条产生式规则或 OWL 属性链公理,并启用推理机验证自动归类;参考 onto.ttl 中
owl:propertyChainAxiom的写法,例如为客厅本体定义hasSeatingArea由contains some Sofa推出; - 达到优秀:对照 FamilyOntology 的流水线,把自己的客厅本体导出为 Turtle/OWL 文件,用
rdflib解析并用 SPARQL 查询“哪些空间包含落地灯”“哪些空间没有炉灶”,复现“规则 + 事实 → 闭包 → 查询”的完整链路; - 进阶挑战:阅读 README 的 Review & Self Study 建议,研究林奈生物分类、门捷列夫元素周期表这类“人类试图量化与编码知识”的历史案例,思考它们与本体建模的异同——这能帮助你回答作业里“客厅和厨房到底差在哪”这类边界划分问题。
小结
本课作业虽然篇幅很短,但它要求你把整章“知识表示”的理论(OAV 三元组、框架、产生式规则、AND-OR 树、OWL/语义网)落到一个可运行、可推理的具体模型上。本文给出的路径是:先理解三元组与框架两类基础表示 → 用 Protégé 完成类、属性、个体三步建模 → 再用仓库中 Animals.ipynb(自写反向推理 + Experta 正向推理)与 FamilyOntology.ipynb(OWL-RL 推理 + SPARQL 查询)的源码范式为自己的本体注入推理能力。完成这一步,你就真正掌握了一个符号 AI 知识库从抽取、形式化到自动推理的完整闭环。
注:
lessons/2-Symbolic/assignment.md在仓库中另有 希伯来语译本,本文内容以英文原版作业为准。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
用 Protégé 构建领域本体:AI-For-Beginners 符号 AI 第 2 课作业实战指南
用 Protégé 构建领域本体:AI For Beginners 符号 AI 第 2 课作业实战指南 在 AI For Beginners 课程第 2 课《知
教程人工智能机器学习深度学习构建知识本体(Ontology):AI-For-Beginners 符号 AI 课程作业的 Protégé 实战指南
构建知识本体(Ontology):AI For Beginners 符号 AI 课程作业的 Protégé 实战指南 构建知识库的本质,是把关于某个主题的事实提
教程人工智能机器学习深度学习基于 Protégé 构建本体:AI-For-Beginners 符号 AI 课程的知识库建模实战
基于 Protégé 构建本体:AI For Beginners 符号 AI 课程的知识库建模实战 导读 本篇文章围绕 AI For Beginners 课程
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考