ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

符号人工智能与知识表示:AI for Beginners 课程之专家系统与语义网实战指南

2026/10/4 17:19:15 拓冰建站 浏览量
符号人工智能与知识表示:AI for Beginners 课程之专家系统与语义网实战指南 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本文基于 AI for Beginners 开源课程12 周、24 课中「符号人工智能」单元的核心讲义系统讲解符号式 AI 的两大支柱——知识表示Knowledge Representation与推理Reasoning。你将掌握 DIKW 知识层次模型、对象-属性-值三元组、框架表示、产生式规则、专家系统的前向/后向推理机制以及本体论Ontology与语义网Semantic Web的 RDF/OWL 技术栈同时结合仓库内 Animals.ipynb、FamilyOntology.ipynb 等可运行示例从源码级理解知识库与推理引擎的真实实现。课程背景自顶向下的 AI 路线在 AI 发展的早期阶段构建智能系统的主流方式是自顶向下top-down从人类专家身上抽取知识将其转换为某种机器可读的形式再让计算机自动利用这些知识求解问题。这一路线建立在两个核心概念之上知识表示把人类头脑中的知识以数据形式存放在计算机内且能被程序自动使用推理在知识之上执行逻辑演绎得出新的结论。本课lessons/2-Symbolic/目录正是围绕这两点展开并延伸出专家系统、本体论与语义网等经典成果。该单元配有课前/课后测验quiz可在课程配套测验应用见 etc/quiz-app 源码中完成自测。知识表示知识、数据与信息的区分符号 AI 中最重要的概念是知识必须把它与信息和数据严格区分。例如人们常说书里包含知识因为读书可以成为专家但实际上书里承载的是数据只有通过阅读把数据整合进我们的世界模型world model数据才被转化为知识。知识是存放在我们头脑中、代表我们对世界理解的东西它通过主动的学习过程获得即把接收到的信息碎片融入我们对世界的活跃模型。DIKW 金字塔课程使用 DIKW 金字塔 见下数据Data以物理介质呈现的内容如书面文字、口头话语。数据独立于人类存在可在人与人之间传递。信息Information我们在大脑中对数据的解读。例如听到computer一词我们便对它是什么有所理解。知识Knowledge被整合进世界模型的信息。一旦我们知道计算机是什么就进而了解它如何工作、价值几何、有何用途这些相互关联的概念网络构成我们的知识。智慧Wisdom对世界理解的更高一层代表元知识——关于何时、如何运用知识的判断。知识表示的谱系知识表示问题的实质是找到一种有效方式把知识以数据形式放进计算机使其能被自动使用。它可以被视为一条光谱knowledge-spectrum.png光谱左端是最简单、计算机最易有效利用的知识表示——算法式表示即把知识编码为计算机程序。但它不够灵活我们头脑中的知识往往是非算法的。光谱右端是自然语言文本等表示表达力最强却无法直接用于自动推理。计算机知识表示的四大分类1. 网络表示Network Representations其出发点是人类大脑内存在一张相互关联的概念网络。我们可以在计算机中把同样的网络复制为一张图即语义网络Semantic Network。由于图在计算机内可表示为节点与边的列表语义网络可以由一系列对象-属性-值三元组Object-Attribute-Value TripletOAV或属性-值对表示。以编程语言知识为例对象Object属性Attribute值ValuePythonis是Untyped-LanguagePythoninvented-by发明者Guido van RossumPythonblock-syntax块语法indentationUntyped-Languagedoesnt have不具有type definitions想一想三元组还能表示哪些其他类型的知识2. 层次表示Hierarchical Representations人们常在头脑中为对象建立层次结构我们知道金丝雀是鸟而所有鸟都有翅膀还知道金丝雀通常的颜色、飞行速度等。层次表示有两个典型形态框架表示Frame Representation每个对象或对象类被表示为一个框架Frame框架内包含若干槽Slot。槽可以携带默认值、取值限制或存储过程调用即可获得槽值的方法。所有框架构成类似面向对象编程语言中对象层次结构的体系。课程用 Python 作为示例框架槽Slot值Value默认值Default value区间IntervalNamePythonIs-AUntyped-LanguageVariable CaseCamelCaseProgram Length5-5000 linesBlock SyntaxIndent场景Scenarios一种特殊框架用于表示随时间展开的复杂情境。3. 过程式表示Procedural Representations用在特定条件满足时可执行的动作清单来承载知识产生式规则Production Rules即 if-then 语句帮助我们得出结论。医生可以有一条规则如果病人发高烧或血液检查中 C 反应蛋白水平偏高则存在炎症。一旦任一条件被满足就能作出炎症结论并把它用于后续推理。算法可视为过程式表示的另一形态但在基于知识的系统中几乎不直接使用。4. 逻辑Logic逻辑最初由亚里士多德提出作为表示人类普遍知识的方式谓词逻辑Predicate Logic作为数学理论过于丰富、无法完全可计算因此通常只使用其子集例如 Prolog 中采用的Horn 子句Horn Clauses。描述逻辑Descriptive LogicDL一类逻辑系统家族用于表示和推理对象层次及分布式知识表示例如语义网。专家系统Expert Systems系统架构专家系统是符号 AI 早期的成功代表——它被设计为在某个受限问题域内扮演专家角色的计算机系统其基础是从一名或多名人类专家处抽取的知识库Knowledge Base并包含一个在其上执行推理的推理引擎Inference Engine。专家系统模仿人类推理系统的结构人类具有短期记忆与长期记忆对应地基于知识的系统包含三个组件问题记忆Problem Memory保存当前正在求解问题的知识如病人的体温、血压、是否有炎症等。这类知识也称静态知识因为它只是当前问题状态的快照即问题状态problem state。知识库Knowledge Base关于问题域的长期知识。它由人类专家手工抽取在一次次咨询之间保持不变由于它驱动系统从一个问题状态迁移到另一个状态也被称为动态知识。推理引擎Inference Engine编排在整个问题状态空间中的搜索过程必要时向用户提问并负责为每个状态找出应被应用的规则。课程以根据身体特征判定动物的专家系统为例用AND-OR 树图形化表示一组产生式规则AND-OR-Tree.png从专家处抽取知识时先画树是有益的但在计算机内表示知识则更适合使用规则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三元组。工作记忆Working Memory是当前求解问题所对应的 OAV 三元组集合规则引擎Rules Engine找出条件被满足的规则并加以应用向工作记忆中添加新的三元组。尝试就你喜欢的主题画一棵自己的 AND-OR 树前向推理Forward Inference上述过程称为前向推理以工作记忆中的初始问题数据为起点执行如下推理循环如果目标属性已出现在工作记忆中——停止并给出结果找出所有条件当前被满足的规则——得到规则的冲突集Conflict Set执行冲突消解Conflict Resolution从冲突集中选出一条本轮执行的规则。常见策略包括选择知识库中第一条适用的规则随机选择一条规则选择更具体的规则即左侧LHS被满足条件最多的规则应用选中的规则向问题状态插入新知识回到第 1 步重复。后向推理Backward Inference但有时我们希望在对问题一无所知的情况下起步通过提问逐步逼近结论——例如医学诊断中我们通常不会预先做完所有检验而是在需要决策时才执行某项分析。这一过程可用后向推理建模它由目标驱动——即我们试图求出的属性值选出所有能给出目标值的规则即 RHS 中包含目标的规则——构成冲突集如果该属性没有任何规则或存在应向用户询问该值的规则——向用户提问否则继续用冲突消解策略选出一条规则将其作为假设hypothesis尝试证明对该规则 LHS 中的每个属性递归重复上述过程把它们作为子目标去证明若任一步失败——回到第 3 步改用另一条规则。思考什么场景下前向推理更合适什么场景下后向推理更合适专家系统的实现方式直接用高级语言编程实现这不是最佳方案因为基于知识的系统最大优势在于知识与推理分离——领域专家应该能够在不理解推理细节的情况下编写规则。使用专家系统外壳Expert System Shell即一种专门设计的系统通过某种知识表示语言向其填充知识。动手实践动物推理专家系统仓库中的 Animals.ipynb 给出了前向、后向推理专家系统的完整 Python 实现。我们可以把它看作一个极简的专家系统外壳。用 Python 类定义知识表示语言该示例用 Python 类作为关键字来定义产生式规则共三类核心类Ask——需要向用户提出的问题包含候选答案集合If——表示一条规则只是规则内容的语法糖容器AND/OR——表示树中 AND/OR 分支的类仅存储参数列表全部功能在父类Content中定义。class Ask(): def __init__(self,choices[y,n]): self.choices choices def ask(self): if max([len(x) for x in self.choices])1: for i,x in enumerate(self.choices): print({0}. {1}.format(i,x),flushTrue) x int(input()) return self.choices[x] else: print(/.join(self.choices),flushTrue) return input() class Content(): def __init__(self,x): self.xx class If(Content): pass class AND(Content): pass class OR(Content): pass定义动物知识库在该系统中工作记忆保存一组属性-值对形式的事实facts知识库定义为一个大字典键是动作要插入工作记忆的新事实值是以 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]) }注意这里的一个巧妙设计形如animal:tiger的键把中间结论与最终结论编码在一起——get(animal)会依次尝试各候选键一旦某条规则链被证明为真就返回冒号后面的动物名。后向推理引擎KnowledgeBase 类KnowledgeBase类包含两部分工作memory属性到值的字典与上述格式的rules。两个核心方法是get——获取某属性的值必要时执行推理例如get(color)会获得颜色槽的值必要时提问并存入工作记忆供后续复用get(color:blue)则会先问颜色再返回y/n表示是否符合。eval——执行真正的推理遍历 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 vvv else n if name in self.memory.keys(): return self.memory[name] for fld in self.rules.keys(): if fldname or fld.startswith(name:): value y if fldname else fld.split(:)[1] res self.eval(self.rules[fld],fieldname) if res!y and res!n and valuey: self.memory[name] res return res if resy: self.memory[name] value return value # field is not found, using default res self.eval(self.rules[default],fieldname) self.memory[name]res return res def eval(self,expr,fieldNone): 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的语义AND或 Python 列表要求所有子项求值为y才返回y遇到任一n立即短路OR则相反任一子项为y即返回y字符串会递归触发get从而把子目标继续向下分解——这正是后向推理的递归实现。启动一次咨询引擎会逐项提问是/否问题输入y/n多选题输入 0..N 序号示例会话在回答相应特征后得到结论giraffe。用 Experta 实现前向推理Animals.ipynb 还用 Python 库Experta演示了前向推理——它设计为类似经典系统 CLIPS。我们也可以自己实现前向链但朴素实现通常效率不高更高效的模式匹配使用专门的Rete 算法。安装与导入import sys !{sys.executable} -m pip install githttps://github.com/nilp0inter/experta from experta import *系统定义为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), OR(Fact(has hooves),Fact(chews cud))) def hooves(self): self.declare(ungulate) Rule(OR(Fact(feathers),AND(Fact(flies),Fact(lays eggs)))) def bird(self): self.declare(bird) Rule(Fact(mammal),Fact(carnivor), Fact(colorred-brown), Fact(patterndark spots)) def monkey(self): self.declare(Fact(animalmonkey)) Rule(Fact(mammal),Fact(carnivor), Fact(colorred-brown), Fact(patterndark stripes)) def tiger(self): self.declare(Fact(animaltiger)) Rule(Fact(ungulate), Fact(long neck), Fact(long legs), Fact(patterndark spots)) def giraffe(self): self.declare(Fact(animalgiraffe)) Rule(Fact(ungulate), Fact(patterndark stripes)) def zebra(self): self.declare(Fact(animalzebra)) Rule(Fact(bird), Fact(long neck), Fact(cannot fly), Fact(colorblack and white)) def straus(self): self.declare(Fact(animalostrich)) Rule(Fact(bird), Fact(swims), Fact(cannot fly), Fact(colorblack and white)) def pinguin(self): self.declare(Fact(animalpinguin)) Rule(Fact(bird), Fact(flies well)) def albatros(self): self.declare(Fact(animalalbatross)) Rule(Fact(animalMATCH.a)) def print_result(self,a): print(Animal is {}.format(a)) def factz(self,l): for x in l: self.declare(x)向工作记忆注入初始事实后调用run()执行推理ex1 Animals() ex1.reset() ex1.factz([ Fact(colorred-brown), Fact(patterndark stripes), Fact(sharp teeth), Fact(claws), Fact(forward looking eyes), Fact(gives milk)]) ex1.run() ex1.facts运行结果为Animal is tiger且ex1.facts展示了推理产物链Fact(mammal)、Fact(carnivor)被逐步推导出来最终得到Fact(animaltiger)——前向推理数据驱动、规则逐条触发的过程一目了然。注意这个示例相当简单只是给出专家系统的样子。真实系统中通常要积累到 200 条规则才能观察到某种智能行为规则复杂到难以全部记住时你可能会疑惑系统为何作出某些决策。但基于知识的系统最重要特性是任何决策都可以被精确解释——这正是符号方法在需要可解释性的场景中仍被采用的原因。本体论与语义网Ontologies and the Semantic Web20 世纪末人们发起了一项倡议用知识表示来为互联网资源添加标注从而可以按非常具体的查询找到资源。这就是语义网Semantic Web它依赖以下技术一种基于**描述逻辑**DL的特殊知识表示它与框架表示类似构建带属性的对象层次但具有形式化的逻辑语义与推理能力。DL 构成一个庞大的家族各成员在表达力与推理的算法复杂度之间取折中。分布式知识表示所有概念由全局 URI 标识符表示从而可以建立跨越整个互联网的知识层次。一组基于 XML 的知识描述语言RDFResource Description Framework、RDFSRDF Schema、OWLOntology Web Language。语义网的核心概念是本体论Ontology——用某种形式化知识表示对问题域作出的显式说明。最简单的本体可以只是问题域对象的层次结构更复杂的本体还会包含可用于推理的规则。一切皆三元组在语义网中所有表示都基于三元组每个对象和每个关系都由唯一 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 中定义的数据结构RDF 列表来表达。WikiData 与 SPARQL 查询由于搜索引擎与自然语言处理技术的成功可从文本直接抽取结构化数据语义网的建设进程有所放缓但在某些领域仍有大量维护本体与知识库的工作。值得关注的项目有WikiData与 Wikipedia 关联的机器可读知识库集合多数数据从 Wikipedia 页面的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 ?eyeColorLabelDBpedia与 WikiData 类似的另一个项目。若想亲手构建或打开本体论推荐可视化本体编辑器Protégé可下载桌面版或直接在线使用。动手实践家族关系本体论仓库的 FamilyOntology.ipynb 展示了如何用语义网技术推理家族关系取一个以通用GEDCOM格式表示的家族谱系树、一个家族关系本体论再为给定个体集合构建全部家族关系图。配套数据文件位于 data/tsars.ged罗曼诺夫王朝谱系与 data/onto.ttl家族关系本体Turtle 格式。第一步解析 GEDCOM。用python-gedcom库读取谱系树from gedcom.parser import Parser from gedcom.element.individual import IndividualElement from gedcom.element.family import FamilyElement g Parser() g.parse_file(data/tsars.ged) d g.get_element_dictionary()可列出全部 41 位个体如(0, (Mihail Fedorovich, Romanov))以及 15 个家庭每个家庭列出夫妻与子女的指针列表如(41, [0, 1, 2])。第二步家族关系本体。该本体把isUncleOf、isCousinOf等关系用基本谓词isMotherOf、isFatherOf、isBrotherOf、isSisterOf定义。例如isAuntOf是姐姐/妹妹 父/母的组合姑姑是某人的父母之姐妹fhkb:isAuntOf a owl:ObjectProperty ; rdfs:domain fhkb:Woman ; rdfs:range fhkb:Person ; owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .第三步把 GEDCOM 事实转换为三元组并做推理。遍历谱系文件把每个个体的性别、子女、兄弟姐妹以及婚姻关系输出为fhkb:前缀的 OWL 断言追加到onto.ttl然后用 RDFLib 解析、用OWL-RL库计算图的闭包Closure——即把一切可推断出的概念与关系补全import rdflib from owlrl import DeductiveClosure, OWLRL_Extension g rdflib.Graph() g.parse(onto.ttl, formatturtle) print(Triplets found:%d % len(g)) # 669 DeductiveClosure(OWLRL_Extension).expand(g) print(Triplets after inference:%d % len(g)) # 4246从源码可见推理前 669 条三元组执行 OWL-RL 扩展闭包后增至 4246 条——规则与事实结合后自动演绎出大量隐含的亲属关系。第四步用 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)输出示例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你还可以实验其他关系例如递归定义某人全部祖先的isAncestorOf。这也正是本课Challenge挑战的入口在家族本体笔记中尝试发现家族树里个体间的新连接。概念图从非结构化数据挖掘本体多数情况下本体由人工精心构建但也可以从非结构化数据如自然语言文本中**挖掘mine**本体。微软研究院的成果之一是Microsoft Concept Graph——用is-a继承关系聚合的大量实体集合可回答如微软是什么的问题答案是以 0.87 概率是一家公司以 0.75 概率是一个品牌。该图可经 REST API 访问或作为列出全部实体对的大型可下载文本文件获取。需要说明的是仓库中的 MSConceptGraph.ipynb 已注明Microsoft Concept Graph 的原始 API 不再可用笔记改用开源的ConceptNet一个包含IsA、PartOf、UsedFor等关系的大型概念语义网络同时提供数据文件与无需 API key 的 REST API作为替代演示如何把新闻标题归类到若干主题之下调用 ConceptNet 的IsA查询接口返回概念父类及归一化权重——例如查询microsoft得到{company: 0.87, brand: 0.75, ...}形式的概率分布用TextBlob抽取新闻标题的名词短语把每个名词短语替换为其父概念权重 0.1 的项聚合出city、nation、person、economy、organization等主题簇最终可按簇打印新闻例如ECONOMY:下聚合出关于制裁、天然气、坠机等新闻NATION:与PERSON:下聚合出涉及政要的新闻。结语如今AI 常被视为机器学习或神经网络的同义词。但人类同样具有显式推理能力而这正是神经网络目前尚未处理的部分。在真实项目中显式推理仍被用于两类任务需要解释的任务以及需要以受控方式修改系统行为的任务——知识库与推理引擎的分离使改规则即改行为成为可能这是纯学习式模型难以做到的。复习与自学可以在互联网上研究人类试图量化和编码知识的领域查看布卢姆教育目标分类学Blooms Taxonomy回溯历史看人类如何理解世界研究林奈Linnaeus建立的生物分类体系观察门捷列夫Dmitri Mendeleev如何描述与归类化学元素。你还能找到哪些有趣的例子作业构建一个本体论见 assignment.md——构建知识库的全部工作在于对某主题的事实建模并进行分类。挑选一个主题一个人、一个地点或一件物品运用本课介绍的技术与建模策略为之建模。例如为客厅创建本体家具、灯具等客厅与厨房有何不同与浴室呢你如何判断它是客厅而非餐厅建议用 Protégé 完成。相关资源仓库路径索引课程讲义英文原版lessons/2-Symbolic/README.md本课讲义孟加拉语译本translations/bn/lessons/2-Symbolic/README.md动物推理专家系统前后向推理实现Animals.ipynb家族本体论语义网推理实战FamilyOntology.ipynb数据见 data/onto.ttl、data/tsars.ged概念图新闻聚类MSConceptGraph.ipynb课程配套测验应用源码etc/quiz-app赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐知识表示与专家系统AI-For-Beginners 符号人工智能课程第 2 课实战指南知识表示与专家系统AI For Beginners 符号人工智能课程第 2 课实战指南 本文基于 AI For Beginners 课程 2 Symbol教程人工智能机器学习深度学习AI-For-Beginners 符号智能核心课知识表示、专家系统与语义网实战解析AI For Beginners 符号智能核心课知识表示、专家系统与语义网实战解析 符号智能Symbolic AI追求的是让机器像人一样拥有知识并基于知教程人工智能机器学习深度学习知识表示与专家系统AI-For-Beginners 符号人工智能课程深度解析与实战知识表示与专家系统AI For Beginners 符号人工智能课程深度解析与实战 本篇指南围绕 AI For Beginners 课程第 2 课 less教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考