- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本指南对应 AI-For-Beginners 课程的第 2 课"知识表示与专家系统",是符号人工智能(Symbolic AI)模块的核心内容。与依赖海量数据的自下而上机器学习路线不同,本课讲解的是自上而下的智能系统构建路线:把人类专家头脑中的知识抽取成机器可读的形式,再由推理引擎自动求解问题。读完本指南,你将掌握 DIKW 知识层级模型、四大计算机知识表示范式、专家系统的三组件架构、前向与后向推理流程,并能够在仓库提供的 Animals、FamilyOntology、MSConceptGraph 三个 Notebook 中亲手实现推理系统、语义网查询与概念图谱应用。
知识表示:从数据到智慧
符号人工智能中最重要的概念之一是知识(knowledge)。要理解知识表示,必须先严格区分知识、信息与数据三者的边界:
- 数据(Daten/Data):以物理媒介承载的东西,例如写下的文字或说出的话语。数据独立于人存在,可以在人与人之间传递。一本书本身只包含数据,而非知识。
- 信息(Information):人脑对数据的解释。例如听到"Computer"(计算机)这个词时,我们脑海中会产生关于它是什么的认知。
- 知识(Wissen/Knowledge):被整合进我们世界模型的信息。当我们学会"计算机是什么"之后,就会进一步形成它如何工作、大概多少钱、能用来做什么等一系列相互关联的概念网络,这个概念网络就是知识。
- 智慧(Weisheit/Wisdom):对世界理解的更高一层,代表"元知识"(Meta-Wissen),即关于知识何时、如何被应用的判断力。
这一层级关系通常用DIKW 金字塔(数据-信息-知识-智慧)来形象化表示:
因此,知识表示(Wissensrepräsentation)问题可以表述为:找到一种有效方法,将知识以数据的形式放入计算机,使其能够被自动利用。不同的表示方法构成一个连续谱系(Spektrum):
- 谱系左侧是最简单、计算机能高效利用的表示形式。最基础的是算法式表示——知识直接由一个计算机程序承载。但它不是最佳的知识表示方式,因为缺乏灵活性,而我们头脑中的知识往往是非算法的。
- 谱系右侧是诸如自然语言文本的表示,表达力最强,却无法直接用于自动推理。
知识表示的核心矛盾正是一对永恒的权衡:可计算性与表达力。下面四大分类正是对这一谱系的工程化落地。
计算机知识表示的四大分类
1. 网络表示:对象-属性-值三元组与语义网络
人脑中存在一张相互关联的概念网络,计算机可以把它复现为图结构,即语义网络(semantisches Netzwerk)。图在计算机中可表示为节点与边的列表,因此语义网络可以由一组对象-属性-值(OAV)三元组(也叫属性-值对)来表示。以编程语言知识为例,可以构造如下三元组:
| 对象(Objekt) | 属性(Attribut) | 值(Wert) |
|---|---|---|
| Python | ist(是) | Untyped-Language(非类型化语言) |
| Python | erfunden von(发明者) | Guido van Rossum |
| Python | Blocksyntax(块语法) | Einrückung(缩进) |
| Untyped-Language | hat nicht(不具有) | Typdefinitionen(类型定义) |
OAV 三元组是理解后续所有内容的基础:专家系统中的工作记忆、语义网中的 RDF 三元组,本质上都是这种结构。
2. 层次表示:框架与槽位
我们常在头脑中为对象建立层级:例如"金丝雀是鸟,而所有鸟都有翅膀",同时对金丝雀通常的颜色、飞行速度也有认知。层次化表示有两种典型形态:
- 框架表示(Frame-Repräsentation):将每个对象或对象类表示为一个框架(Frame),其中包含若干槽位(Slots)。槽位可以带有默认值、值域约束,甚至挂载用于获取槽值的过程(存储过程)。所有框架构成一个层级结构,与面向对象编程语言中的对象层级非常相似。以 Python 为例,可构造如下框架:
| 槽位(Slot) | 值(Wert) | 默认值(Standardwert) | 区间(Intervall) |
|---|---|---|---|
| Name(名称) | Python | ||
| Ist-ein(是一个) | Untyped-Language | ||
| VariablenSchreibweise(变量命名法) | CamelCase | ||
| Programmlänge(程序长度) | 5-5000 行 | ||
| Blocksyntax(块语法) | Einrückung |
- 场景(Szenarien):框架的一种特殊类型,用于表示随时间展开的复杂情境。
3. 过程表示:产生式规则
过程表示把知识编码为"当某条件发生时执行的一系列动作"。其中最重要的是产生式规则(Produktionsregeln)——形如"如果-那么(IF-THEN)"的陈述,允许我们据此得出结论。例如医生可以拥有规则:如果病人发高烧或血液检查中 C 反应蛋白水平高,那么他患有炎症。只要条件之一被满足,就能推出"炎症"结论,并在后续推理中继续使用这个新结论。算法可视为过程表示的另一形态,但在基于知识的系统中几乎不会直接使用。
4. 逻辑表示:从亚里士多德到描述逻辑
逻辑最初由亚里士多德提出,作为表示普适性人类知识的手段。两大分支值得关注:
- 谓词逻辑(Prädikatenlogik):作为数学理论过于丰富,无法保证可计算性,因此通常只使用其子集,例如 Prolog 语言采用的Horn 子句。
- 描述逻辑(Beschreibende Logik):一族逻辑系统,用于在分布式知识表示(如语义网)中对对象层级进行表示与推理。
专家系统:架构、推理与实现
专家系统是符号人工智能早期的成功案例——在有限问题域内扮演领域专家的计算机系统。它由从一位或多位人类专家处抽取的**知识库(Wissensbasis)与执行推理的推理机(Inferenzmaschine)**构成。人类专家是"人肉知识库",而专家系统的价值在于将知识物化、可复制、可解释。
|
专家系统与包含短期记忆和长期记忆的人类推理系统相对应,其内部同样区分三部分:
- 问题存储器(Problemspeicher):保存当前待解决问题的知识,如病人的体温、血压、是否发炎等。它是对问题当前认知的快照,因此也称静态知识(statisches Wissen),即所谓问题状态。
- 知识库(Wissensbasis):关于问题域的长期知识,由人类专家手工抽取,在一次次会诊间不发生变化。因为它允许我们在问题状态之间导航,所以也称动态知识(dynamisches Wissen)。
- 推理机(Inferenzmaschine):编排在整个问题状态空间中的搜索过程,必要时向用户提问,并负责为每个状态挑选正确的规则。
AND-OR 树与产生式规则
以"根据物理特征判定动物"的专家系统为例,其规则集可以画成一张AND-OR 树——产生式规则集的图形化表示。向专家抽取知识之初画树非常有用;但在计算机中表示知识,用规则更便利:
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注意规则左侧的每个条件以及动作本质上都是 OAV 三元组。**工作记忆(Arbeitsgedächtnis)**保存与当前问题对应的 OAV 三元组集合;规则引擎查找条件被满足的规则并执行,向工作记忆追加一个新的三元组。
前向推理(Vorwärtsschlussfolgerung)
上述过程即前向推理:从工作记忆中已有的初始数据出发,执行如下推理循环:
- 若目标属性已存在于工作记忆——停止并输出结果;
- 查找所有条件当前被满足的规则,得到规则的冲突集(Konfliktmenge);
- 执行冲突消解(Konfliktauflösung),从冲突集中选择本步执行的规则。常见策略有:选择知识库中第一条可应用的规则;随机选择一条规则;选择更具体的规则,即左侧(LHS)满足条件最多的那条;
- 应用所选规则,向问题状态插入新知识;
- 回到步骤 1 循环。
后向推理(Rückwärtsschlussfolgerung)
有时我们希望从对问题的空白认知出发,通过提问逐步抵达结论——例如医学诊断中,我们不会预先做完全部检查再开始诊断,而是在需要决策时才执行某项检查。这就是后向推理,它由**目标(Ziel)**驱动——即我们想求得的属性值:
- 选出所有能给出目标值(即目标出现在规则右侧 RHS)的规则,构成冲突集;
- 若该属性没有规则可推导,或规则明确要求向用户询问,则直接向用户提问;否则继续;
- 用冲突消解策略选择一条规则作为假设(Hypothese),尝试证明它;
- 对规则左侧(LHS)的每个属性递归地重复上述过程,把它们当作新的目标来证明;
- 若任何一步失败,回到第 3 步换用另一条规则。
思考:什么场景更适合前向推理?什么场景更适合后向推理?前向推理适合"数据充足、目标开放"的监控与配置场景,后向推理适合"目标明确、数据按需获取"的诊断与问答场景。
专家系统的两种实现路线
- 直接用高级编程语言编程:并非好主意,因为知识库系统的核心优势在于知识与推理分离——领域专家应当能够在不懂推理过程细节的情况下编写规则。
- 使用专家系统外壳(Expertensystem-Shell):一种专门设计的、可用某种知识表示语言填充知识的系统,正是下文源码实战的主角。
源码实战(一):用 Python 实现动物推理专家系统
仓库中的 Animals.ipynb(德语翻译版)/ 英文原版 完整演示了前向与后向推理专家系统的实现,核心思路是在 Python 中用类作为"关键字"自定义一门小型知识表示语言:
Ask:表示需要向用户提出的问题,内部保存候选答案集合(默认['y','n']);Content:所有规则成分的父类,只保存内容x;If/AND/OR:分别表示一条规则、与分支、或分支,仅作为存储语法糖。
知识库可以组织为一个把"动作(应插入工作记忆的新事实)"映射到"条件(AND-OR 表达式)"的大字典,部分事实用Ask向用户索取:
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'])]), 'bird': If(OR(['feathers',AND(['flies','lies eggs'])])), 'animal:monkey' : If(['mammal','carnivor','color:red-brown','pattern:dark spots']), 'animal:tiger' : If(['mammal','carnivor','color:red-brown','pattern:dark stripes']), 'animal:giraffe' : If(['ungulate','long neck','long legs','pattern:dark spots']), 'animal:zebra' : If(['ungulate','pattern:dark stripes']), 'animal:ostrich' : If(['bird','long nech','color:black and white','cannot fly']), 'animal:pinguin' : If(['bird','swims','color:black and white','cannot fly']), 'animal:albatross' : If(['bird','flies well']) }注意color:red-brown这类带冒号的"复合键"表示"color 属性取值为 red-brown",是属性-值对在规则语言中的直接体现。接下来定义KnowledgeBase类完成后向推理,它包含工作记忆memory(属性到值的字典)与规则集rules,核心是两个方法:
get(name):获取属性值,必要时执行推理或向用户提问,并把结果缓存进工作记忆;对get('color:blue')这类带冒号的请求,会先求color值再返回y/n;eval(expr):真正执行推理,递归遍历 AND/OR 树并求值子目标。
class KnowledgeBase(): def __init__(self,rules): self.rules = rules self.memory = {} def get(self,name): if ':' in name: k,v = name.split(':') vv = self.get(k) return 'y' if v==vv else 'n' if name in self.memory.keys(): return self.memory[name] for fld in self.rules.keys(): if fld==name or fld.startswith(name+":"): value = 'y' if fld==name else fld.split(':')[1] res = self.eval(self.rules[fld],field=name) if res!='y' and res!='n' and value=='y': self.memory[name] = res return res if res=='y': self.memory[name] = value return value # field is not found, using default res = self.eval(self.rules['default'],field=name) self.memory[name]=res return res def eval(self,expr,field=None): if isinstance(expr,Ask): print(field) return expr.ask() elif isinstance(expr,If): return self.eval(expr.x) elif isinstance(expr,AND) or isinstance(expr,list): expr = expr.x if isinstance(expr,AND) else expr for x in expr: if self.eval(x)=='n': return 'n' return 'y' elif isinstance(expr,OR): for x in expr.x: if self.eval(x)=='y': return 'y' return 'n' elif isinstance(expr,str): return self.get(expr) else: print("Unknown expr: {}".format(expr))从源码结构可以清晰地看到后向推理的递归本质:eval遇到字符串就回调用get,get又反过来求值规则体,形成"目标-子目标"的证明链;Ask分支则对应"没有规则可推导时向用户提问"。启动会诊只需一行:kb.get('animal'),运行时会依次向你提问毛发、食性、颜色、花纹等,最终给出动物结论。
Notebook 的后半部分改用Experta库实现前向推理。Experta 是 Python 的规则引擎库,设计上模仿经典的 CLIPS 系统;朴素的前向链实现通常效率不高,因此成熟引擎会采用Rete 算法加速规则匹配。推理系统被定义为继承KnowledgeEngine的类,每条规则用一个带@Rule注解的函数声明,规则体内用declare向工作记忆追加新事实,从而触发后续规则:
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(OR(Fact('hair'),Fact('gives milk'))) def mammal(self): self.declare(Fact('mammal')) @Rule(Fact('mammal'),Fact('carnivor'), Fact(color='red-brown'), Fact(pattern='dark stripes')) def tiger(self): self.declare(Fact(animal='tiger')) # ... 更多规则运行前先把初始事实灌入工作记忆,再调用run()触发前向推理,最终可以观察工作记忆里逐步新增的被推导事实,直至得出动物结论:
ex1 = Animals() ex1.reset() ex1.factz([ Fact(color='red-brown'), Fact(pattern='dark stripes'), Fact('sharp teeth'), Fact('claws'), Fact('forward looking eyes'), Fact('gives milk')]) ex1.run() ex1.facts提示:这类示例相当简单,只是展示专家系统的样子。只有当规则数达到约 200+ 时,系统才会表现出某种智能行为;规则多到无法在脑中全盘把握时,你可能开始好奇系统为何做出某些决策——而知识库系统的重要特性正是:任何决策都可以精确解释其来龙去脉,这是神经网络目前难以提供的。
本体论与语义网
20 世纪末出现了一项倡议:用知识表示来标注互联网资源,使得人们可以找到对应非常具体查询的资源,这就是语义网(Semantic Web)。它建立在若干核心概念之上:
- 基于描述逻辑的特殊知识表示:与框架表示相似,都构建带属性的对象层级,但描述逻辑具有形式化的逻辑语义与推理能力;存在一整个描述逻辑家族,在表达力与推理的算法复杂度之间取得平衡。
- 分布式知识表示:所有概念都用一个全局 URI 标识,从而可以构建跨越整个互联网的知识层级。
- 一族基于 XML 的知识描述语言:RDF(资源描述框架)、RDFS(RDF Schema)与OWL(本体论网络语言,Ontology Web Language)。
语义网的核心概念是本体论(Ontologie)——用某种形式化知识表示对问题域做出的显式规格说明。最简单的本体可以只是问题域中对象的层级,复杂本体则包含可用于推理的规则。
在语义网中,一切表示都基于三元组,每个对象与每条关系都由 URI 唯一标识。例如声明"这个 AI 课程由 Dmitry Soshnikov 于 2022 年 1 月 1 日开发",可写为如下三元组:
http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date "Jan 1, 2022" http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com其中http://www.example.com/terms/creation-date与http://purl.org/dc/elements/1.1/creator是表达"创建日期"与"创建者"概念的广为人知且被普遍接受的 URI。更复杂的场景(如表示"创建者列表")则可以使用 RDF 中定义的数据结构。项目仓库中的 FamilyOntology.ipynb 正是一份可直接运行的语义网三元组图数据与推理实验。
语义网建设的推进速度在一定程度上被搜索引擎与能从文本抽取结构化数据的 NLP 技术所减缓,但若干领域仍在坚持维护本体与知识库:
- WikiData:与维基百科关联的机器可读知识库集合,大部分数据从维基百科页面内的结构化内容块InfoBox挖掘而来。可以用语义网专用查询语言SPARQL对其进行查询,下面的示例查询展示人类中最流行的眼睛颜色:
#defaultView:BubbleChart SELECT ?eyeColorLabel (COUNT(?human) AS ?count) WHERE { ?human wdt:P31 wd:Q5. # human instance-of homo sapiens ?human wdt:P1340 ?eyeColor. # human eye-color ?eyeColor SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } } GROUP BY ?eyeColorLabel- DBpedia:与 WikiData 类似的另一个项目。
若想实验构建或打开现有本体,推荐可视化本体编辑器Protégé(桌面版与 Web 版均可用)。仓库中 lessons/2-Symbolic/data/onto.ttl 就是一份可直接用 Protégé 打开的 Turtle 格式家族本体,其中定义了Man/Woman/Person/Marriage等类,以及hasFemalePartner、isFatherOf、isAuntOf等对象属性;类定义使用了owl:equivalentClass、owl:intersectionOf、owl:Restriction等 OWL 构造来表达"男人 = 具有男性性别属性的 Person"这类推理规则。
源码实战(二):用家族本体推断亲属关系
FamilyOntology.ipynb 演示了完整的语义网推理流水线,数据是罗曼诺夫沙皇家族的谱系树:
- 获取家谱:家谱采用最通用的GEDCOM格式保存,仓库中的 lessons/2-Symbolic/data/tsars.ged 记录了从 Mihail Fedorovich Romanov(1613 年即位)到安娜·伊万诺夫娜等数十位成员的姓名、性别、生卒年份与家庭(FAMS/FAMC)关联。
- 解析 GEDCOM:使用
python-gedcom库把文件解析为个体(IndividualElement)与家庭(FamilyElement)两级对象,可列出全部成员与家庭信息。 - 引入家族本体:
onto.ttl把isUncleOf、isCousinOf等复杂亲属关系定义为基础谓词isMotherOf、isFatherOf、isBrotherOf、isSisterOf的组合。例如isAuntOf被定义为isSisterOf与isParentOf的复合(姨妈 = 某人的父母的姐妹):
fhkb:isAuntOf a owl:ObjectProperty ; rdfs:domain fhkb:Woman ; rdfs:range fhkb:Person ; owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .- 构造推理图:遍历 GEDCOM 文件,把个体与家庭信息(性别、子女、兄弟姐妹)转换成三元组,追加到
onto.ttl本体文件末尾,得到"本体规则 + 个体事实"合并的单一图。 - 执行推理:用RDFLib读取 Turtle 格式图并统计三元组数量,再用OWL-RL库构建图的闭包(Closure)——即把一切可推导的概念与关系补充进图。对比推理前后三元组数量即可直观感受推理的威力。
- SPARQL 查询:推理闭包建好后,可以用 SPARQL 查询任意亲属关系。下面的查询输出家谱中所有的"叔叔/舅舅":
qres = g.query( """SELECT DISTINCT ?aname ?bname WHERE { ?a fhkb:isUncleOf ?b . ?a rdfs:label ?aname . ?b rdfs:label ?bname . }""") for row in qres: print("%s is uncle of %s" % row)也可以尝试isAncestorOf等递归定义的关系,查询一个人的所有祖先。
源码实战(三):用概念图谱为新闻分类
大多数本体是手工精心构建的,但也存在从非结构化数据(如自然语言文本)中挖掘本体的路线。微软研究院曾发布Microsoft Concept Graph——一个大规模实体集合,实体之间用is-a继承关系分组,可以回答"微软是什么?"这类问题,答案近似为"它是公司(概率 0.87),也是品牌(概率 0.75)"。原图既提供 REST API,也提供可下载的实体对文本文件。
仓库中的 MSConceptGraph.ipynb 因原 Microsoft 概念图 API 已不可用,改用功能类似的开源知识图谱ConceptNet(超过 800 万节点、2100 万条边、覆盖 83 种语言)作为替代,其 REST API 无需 API Key。该 Notebook 的实战流程很有代表性:
- 定义
query(concept)函数,调用 ConceptNet 的IsA关系接口,将返回的若干上位概念按权重归一化为概率分布,得到每个名词短语的"类属概率"; - 用 NewsAPI 抓取美国与英国的头条新闻标题(需自行注册免费开发者计划获取 API Key);
- 用
TextBlob抽取标题中的名词短语——直接按名词聚类得到的主题组零散不成规模; - 对每个名词短语调用
query()换成更上位的概念术语(仅保留概率高于 0.1 的类属),再做聚类,即可得到成规模的 "economy"、"nation"、"person" 等主题组,把新闻标题归入宏观类别。
这条"文本 → 名词短语 → 概念图谱上位概念 → 主题聚类"的流水线,直观展示了知识表示在现代文本挖掘任务中的实际价值。
结语
如今人工智能常被等同于机器学习或神经网络,但人类同样表现出显式的推理能力,而这恰恰是目前神经网络尚未覆盖的。在真实项目中,显式推理仍然用于执行两类任务:需要可解释性的任务,以及需要以受控方式修改系统行为的任务。知识库系统"知识与推理分离、决策可解释"的特性,使其在这些场景中依然不可替代。
挑战
在 Family Ontology Notebook 中,尝试探索其他亲属关系:发现家谱中人与人之间的新连接,例如堂表亲、姻亲等,验证本体推理能否正确推导出复杂关系。
复习与自学
研究人类历史上如何量化和系统化知识:查看布卢姆教育目标分类学(Bloom's Taxonomy);回溯林奈(Linnaeus)对生物的分类学工作;观察门捷列夫如何为化学元素建立描述与分组方法。你还能找到哪些有趣的知识编码案例?
课后作业
作业 构建一个本体(英文原版见 lessons/2-Symbolic/assignment.md):选定一个主题(人、地点或事物),用本课学到的表示与建模策略为它建立知识模型。示例:为"客厅"构建本体(家具、灯具等),思考它与"厨房""浴室"的区别是什么,如何知道一个房间是客厅而非餐厅——并使用 Protégé 完成本体构建。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
知识表示与专家系统:AI-For-Beginners 符号人工智能课程(第 2 课)实战指南
知识表示与专家系统:AI For Beginners 符号人工智能课程(第 2 课)实战指南 本文基于 AI For Beginners 课程 2 Symbol
教程人工智能机器学习深度学习知识表示与专家系统:AI-For-Beginners 符号人工智能课程深度解析与实战
知识表示与专家系统:AI For Beginners 符号人工智能课程深度解析与实战 本篇指南围绕 AI For Beginners 课程第 2 课( less
教程人工智能机器学习深度学习AI-For-Beginners 符号智能核心课:知识表示、专家系统与语义网实战解析
AI For Beginners 符号智能核心课:知识表示、专家系统与语义网实战解析 符号智能(Symbolic AI)追求的是让机器像人一样"拥有知识并基于知
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考