- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本文基于 AI-For-Beginners 课程 2-Symbolic 单元 的原始教学内容(阿拉伯语译文见 translations/ar/lessons/2-Symbolic/README.md)编写,并引入该单元三个实战 Notebook 的源码细节作为佐证。本文将系统讲解符号人工智能中两大支柱——知识表示(Knowledge Representation)与推理(Reasoning)——并结合 DIKW 金字塔、知识表示分类、专家系统的前向/后向推理、语义网与本体论等内容,最终落到可直接运行的 Python 代码实验上。读完本文,你将掌握三元组(OAV)与框架(Frame)等经典表示法的建模思路、推理引擎的两种工作模式、以及基于 RDF/OWL 做自动推理与 SPARQL 查询的完整流程。
为什么符号人工智能先要回答"知识如何表示"
人工智能的探索本质上是追寻知识、像人类一样理解世界的过程。在早期 AI 中,自上而下(top-down)地构建智能系统的思路十分流行:把专家的知识抽取出来,转换成机器可读的形式,再用它自动求解问题。这一思路建立在两个核心概念之上:
- 知识表示(Knowledge Representation)
- 推理(Reasoning)
整个 2-Symbolic 单元 围绕这两个概念展开,并进一步延伸到语义网、本体论及其工程实践。
知识、信息与数据:DIKW 金字塔
符号 AI 中最关键的概念是知识(knowledge),它与信息(information)或数据(data)有着严格的区分。比如,说"书本里含有知识"——因为读书能让人成为专家——但书本中真正承载的是数据,只有通过阅读并将数据整合进自己的世界模型,数据才被转化为知识。
✅知识存在于我们头脑中,代表我们对世界的理解。它通过主动的学习过程获得——学习将接收到的信息片段整合进我们活跃的世界模型。
课程用 DIKW 金字塔 将知识与其相邻概念对齐,包含四个层次:
| 层次 | 含义 |
|---|---|
| 数据(Data) | 以物理媒介表示的东西,如书面文字或口头语言;独立于人类存在,可在人与人之间传递 |
| 信息(Information) | 我们在头脑中对数据的解释,例如听到computer一词时的理解 |
| 知识(Knowledge) | 已被整合进世界模型的信息;学懂"电脑是什么"后,我们会对它如何工作、多少钱、能做什么产生想法——这张互相关联的概念网络即知识 |
| 智慧(Wisdom) | 更高一层理解,代表元知识,例如关于"知识应如何与何时被使用"的认知 |
知识表示问题的本质与谱系
由此,知识表示问题就是:找到一种有效方式,把知识以数据形式放进计算机并使其可被自动使用。这可以看作一条谱系(谱系图见 knowledge-spectrum):
- 左侧:非常简单的表示类型,计算机可以高效使用。最简单的是算法式表示——知识由一个计算机程序表示。但这并非最佳方式,因为它不灵活,而我们头脑中的知识往往是非算法的。
- 右侧:自然语言文本等表示。表达能力最强,却无法用于自动推理。
计算机知识表示的四大分类
课程把计算机中不同的知识表示方法归纳为四类,并给出了逐一对应的建模实例。
1. 网络表示:语义网与 OAV 三元组
网络表示(network representations)基于这样一个事实:我们头脑中存在一张互相关联的概念网络。我们可以在计算机内以图(graph)重现同样的网络——即所谓的语义网络(semantic network)。
由于图可以表示为节点与边的列表,语义网络也就被表示为对象-属性-值三元组(OAV triplets)或属性-值对。课程以编程语言为例给出了三元组表:
| 对象(Object) | 属性(Attribute) | 值(Value) |
|---|---|---|
| Python | is | Untyped-Language |
| Python | invented-by | Guido van Rossum |
| Python | block-syntax | indentation |
| Untyped-Language | doesn't have | type definitions |
✅ 想一想,三元组还能用来表示哪些其他类型的知识?
2. 层次表示:框架(Frame)与槽位(Slot)
层次表示(hierarchical representations)强调我们常会在头脑中构建对象层级。例如:我们知道金丝雀是鸟,而所有鸟都有翅膀;我们还对金丝雀通常的颜色、飞行速度有概念。
- 框架表示(frame representation):每个对象或对象类用一个框架(frame)表示,框架内含槽位(slots)。槽位可以带有默认值、取值限制,或用于取值的存储过程。所有框架构成与面向对象语言中对象层级类似的层级结构。
- 脚本/场景(scenarios):一种特殊的框架,表示随事件展开的复杂情境。
课程用"Python"这个对象示范了框架表示:
Python
| 槽位(Slot) | 值(Value) | 默认值(Default value) | 区间(Interval) |
|---|---|---|---|
| Name | Python | ||
| Is-A | Untyped-Language | ||
| Variable Case | CamelCase | ||
| Program Length | 5-5000 lines | ||
| Block Syntax | Indent |
注意:槽位并不总是被显式填充——它可以只有默认值(如变量命名风格 CamelCase),也可以只声明取值区间(如程序长度 5–5000 行),这正体现了框架表示"部分已知、部分可由默认或过程补全"的建模弹性。
3. 过程表示:产生式规则(Production Rules)
过程表示(procedural representations)把知识表示为一系列"当某条件满足时可执行的动作"。
- 产生式规则(production rules)是 if-then 形式的语句,允许我们得出结论。例如医生有规则:IF患者发高烧OR血液检查中 C 反应蛋白水平高THEN患者有炎症。一旦遇到任一条件,即可得到"炎症"结论,并用于后续推理。
- 算法(algorithms)可视为过程表示的另一种形式,不过在基于知识的系统中几乎从不直接使用。
4. 逻辑:谓词逻辑与描述逻辑
逻辑(logic)由亚里士多德最早提出,用于表示全人类普遍知识:
- 谓词逻辑(predicate logic)作为数学理论过于丰富、通常不可计算,因此常使用其子集,例如 Prolog 中使用的Horn 子句(Horn clauses)。
- 描述逻辑(descriptive logic)是一个逻辑系统家族,用于表示与推理对象层级,以及语义网这类分布式知识表示。
专家系统:符号 AI 的最早成功案例
专家系统(expert systems)是符号人工智能最早的成功之一:它是被设计成在某个有限问题领域充当专家的计算机系统,以从一位或多位人类专家处抽取的知识库(knowledge base)为基础,并包含在知识库之上执行推理的推理引擎(inference engine)。
课程以人脑神经系统结构作类比(见 arch-human 与 arch-kbs 两张架构对比图):专家系统像人类推理系统一样,同时具有短期记忆与长期记忆。对应地,基于知识的系统区分如下组件:
| 组件 | 类比 | 说明 |
|---|---|---|
| 问题记忆(Problem memory) | 短期记忆 | 保存当前正在求解问题的知识,如患者的体温、血压、是否发炎等;也叫静态知识(static knowledge),因为它保存的是当前对问题的快照——即问题状态(problem state) |
| 知识库(Knowledge base) | 长期记忆 | 表示问题领域的长期知识,由人类专家手工抽取,不随每次咨询而变化;因为它让我们能从一个问题状态导航到另一个,也叫动态知识(dynamic knowledge) |
| 推理引擎(Inference engine) | 推理中枢 | 编排在问题状态空间中的整个搜索过程,必要时向用户提问;同时负责为每个状态找到应被应用的规则 |
以 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 三元组。工作记忆(working memory)保存与当前问题对应的 OAV 三元组集合;规则引擎(rules engine)寻找条件被满足的规则并应用之,向工作记忆新增一个三元组。
✅ 尝试为你喜欢的主题画一棵自己的 AND-OR 树!
前向推理(Forward Inference)的五步循环
上文描述的过程称为前向推理:从工作记忆中已有的初始数据出发,执行以下推理循环:
- 如果目标属性已存在于工作记忆——停止并给出结果;
- 找出所有当前条件被满足的规则——得到规则冲突集(conflict set);
- 执行冲突消解(conflict resolution)——选择本步将执行的一条规则。不同的冲突消解策略包括:
- 选择知识库中第一条可应用的规则;
- 随机选择一条规则;
- 选择更具体的规则,即左侧(LHS)满足条件最多的那条;
- 应用所选规则,把新的知识片段插入问题状态;
- 从步骤 1 重复。
后向推理(Backward Inference):目标驱动的提问式推理
有些场景下我们希望从关于问题的空白知识出发,通过提问逐步逼近结论。例如医疗诊断:我们通常不会在开始诊断前预先做完所有医学检查,而是希望在需要做决策时才进行检查。
这一过程可用后向推理建模,由**目标(goal)**驱动——目标即我们想找到的属性值:
- 选择所有能给出目标值的规则(即目标出现在右侧 RHS 的规则)——构成冲突集;
- 如果该属性没有规则,或存在"应向用户询问该值"的规则——则询问用户,否则继续;
- 用冲突消解策略选择一条规则作为假设(hypothesis)——我们试图证明它;
- 递归地对规则 LHS 中的每个属性重复该过程,把它们当作子目标去证明;
- 若在任意一步失败——回到步骤 3 使用另一条规则。
✅ 什么情况下前向推理更合适?后向推理呢?
(提示:前向推理适合"已知事实充分、想穷举所有结论"的场景,例如动物识别;后向推理适合"目标明确、事实缺失需按需索取"的场景,例如交互式医疗问诊。)
实现专家系统的两种途径
- 直接用高级语言编程实现:这并不是好主意,因为基于知识的系统最大的优势在于知识与推理相分离——领域专家应该能在不了解推理过程细节的情况下写出规则;
- 使用专家系统外壳(expert systems shell):即为"被知识填充"而专门设计的系统,通过某种知识表示语言装入知识。
✍️ 练习一:动物推理——亲手实现前向与后向推理
课程配套的 Animals.ipynb 演示了如何实现一个同时支持前向、后向推理的动物专家系统,完全对应上文 AND-OR 树。该 Notebook 的关键工程思想可拆成三块:
1. 用 Python 类作为规则语言(后向推理外壳)
Notebook 定义了一种极简的知识表示语言:三个类分别对应规则的不同结构——
class Ask(): def __init__(self,choices=['y','n']): self.choices = choices def ask(self): # 选项长度>1 时打印编号菜单,否则打印 y/n 提示 ... class Content(): def __init__(self,x): self.x=x class If(Content): # 规则:语法糖,仅存储规则内容 pass class AND(Content): # AND 分支:仅存储参数列表 pass class OR(Content): # OR 分支 passAsk表示需要向用户提出的问题,含候选答案集合;If表示一条规则;AND/OR表示树中的与/或分支,逻辑均定义在父类Content中。
2. 把知识库定义为一个"动作→条件"大字典
系统中工作记忆保存事实,即属性-值对列表;知识库则是把"动作(应插入工作记忆的新事实)"映射到"条件(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')时若匹配到animal:tiger,则证明成功返回tiger。
3. KnowledgeBase 类:get与eval实现后向推理
class KnowledgeBase(): def __init__(self,rules): self.rules = rules self.memory = {} def get(self,name): # ':' 分隔时先取属性值再比对 # 已在 memory 中则直接返回 # 遍历规则:命中则 eval 证明并写入 memory # 未命中则按 default 询问用户 ... def eval(self,expr,field=None): # Ask -> 打印字段名并提问 # If -> 递归求值其内容 # AND/list -> 逐项求值,任一为 'n' 即整体 'n' # OR -> 逐项求值,任一为 'y' 即整体 'y' # str -> 递归调用 get() ...运行kb = KnowledgeBase(rules); kb.get('animal')后,Notebook 展示了一次典型问诊:系统按需依次询问hair、sharp teeth、claws、forward-looking eyes、color、has hooves、long neck、long legs、pattern,最终给出结论'giraffe'——这就是后向推理"目标驱动、按需提问"的直观体现。回答方式:是非题输入y/n,多选题输入编号0..N。
4. 用 Experta 库实现前向推理(Rete 算法)
Notebook 后半部分改用Experta实现前向推理。Experta 是 Python 中创建前向推理系统的库,设计上模仿经典系统 CLIPS。课程特别指出:我们自己也能实现前向链接,但朴素实现往往效率不高,更有效的规则匹配需要专门的Rete 算法。
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(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')) @Rule(Fact(animal=MATCH.a)) def print_result(self,a): print('Animal is {}'.format(a)) def factz(self,l): for x in l: self.declare(x)使用方式:子类化KnowledgeEngine,每条规则用@Rule注解(其中Fact(color='red-brown')表示带属性-值对的事实,MATCH.a用于模式匹配变量),规则体内用declare声明新事实。运行:
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输出显示工作记忆逐步累积了新推断出的事实:(6, Fact('gives milk'))→(7, Fact('mammal'))→(8, Fact('carnivor'))→(9, Fact(animal='tiger')),并打印Animal is tiger。这正是前向推理"事实推动、自动级联"的典型运行轨迹。
注意:这个例子相对简单,只给出了专家系统的雏形。一旦你开始构建此类系统就会发现:只有规则数量达到某个规模(大约 200 条以上)后,系统才会显现智能行为;此时规则复杂到难以全部记在心里,你可能会疑惑系统为何做出某些决策。但基于知识的系统最重要的特性是:你总能精确解释任何一条决策是如何做出的。
本体论(Ontology)与语义网(Semantic Web)
20 世纪末出现了一项倡议:用知识表示为互联网资源添加注解,使资源能被非常精确的查询匹配到。这就是语义网(Semantic Web),它依赖几个关键概念:
- 基于**[描述逻辑]**(DL)的特殊知识表示。它与框架表示相似——构建带属性的对象层级——但拥有形式化的逻辑语义与推理能力。整个 DL 家族在表达力与推理的算法复杂度之间取得平衡。
- 分布式知识表示:所有概念用全局 URI 标识符表示,从而可构建跨越互联网的知识层级。
- 一系列基于 XML 的知识描述语言:RDF(资源描述框架)、RDFS(RDF Schema)、OWL(本体论网络语言)。
语义网的核心概念是本体论(Ontology):用某种形式化知识表示对问题领域的显式规范。最简单的本体可以只是问题领域中的对象层级,而更复杂的本体则包含可用于推理的规则。
万物皆三元组:URI 标识的事实
在语义网中,所有表示都基于三元组,每个对象和关系都由 URI 唯一标识。课程以"本 AI 课程由 Dmitry Soshnikov 于 2022 年 1 月 1 日开发"这一事实为例(图示见 triplet):
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✅ 其中
creation-date与creator这两个 URI 是表达"创建者"与"创建日期"概念的知名、通用 URI。
更复杂的情况——比如定义一列创建者——则可以使用 RDF 定义的数据结构(见 triplet-complex 示意图)。
现实中的知识库项目与 SPARQL 查询
语义网的建设进程因搜索引擎和 NLP 技术的成功而有所放缓——这些技术能从文本中抽取结构化数据。但在某些领域仍有大量维护本体和知识库的努力。值得注意的项目包括:
- WikiData:与维基百科关联的机器可读知识库集合,大多数数据从维基百科页面的InfoBoxes(结构化内容片段)挖掘而来。可使用 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é(斯坦福大学出品)可供下载或在线使用(界面截图见 protege)。
✍️ 练习二:家庭本体——用语义网技术推理亲属关系
配套的 FamilyOntology.ipynb 演示了如何用语义网技术推理家庭关系:取一份以通用GEDCOM格式表示的罗曼诺夫皇室家谱、以及一份家庭关系本体,为给定个体集合构建全部亲属关系的图。数据文件就在仓库中:data/tsars.ged 与 data/onto.ttl。
1. 解析 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() # 列出所有个体(如 ('@39@', ('Nikolaj II Aleksandrovich', 'Romanov'))) # 家庭结构:('@41@', ['@0@', '@1@', '@2@']) 表示夫妻@0、@1与子女@22. 合并本体与事实,构建推理用图谱
本体文件onto.ttl用 OWL 定义了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 ) .Notebook 随后遍历 GEDCOM 文件,把每个个体(性别、子女、兄弟姐妹)与每桩婚姻转换为三元组,追加到本体文件末尾,形成"本体规则 + 家谱事实"合一的onto.ttl。
3. RDFLib + OWL-RL:闭包推理
使用 RDFLib 读取 RDF 图,并用 OWL-RL 库对图做**闭包(Closure)**计算——即补充所有可被推断出的概念与关系:
import rdflib from owlrl import DeductiveClosure, OWLRL_Extension g = rdflib.Graph() g.parse("onto.ttl", format="turtle") print("Triplets found:%d" % len(g)) # 669 DeductiveClosure(OWLRL_Extension).expand(g) print("Triplets after inference:%d" % len(g)) # 4246推理前后三元组数量从669 膨胀到 4246,直观展示了本体规则自动推导新关系的威力。
4. 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)输出示例:
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 RomanovaNotebook 鼓励读者自行实验其他亲属关系,例如递归定义"某人的所有祖先"的isAncestorOf关系——这正是课程挑战环节要你探索的内容。
✍️ 练习三:概念图——把非结构化文本挖成本体
大多数本体由手工精心构建;但也可以从非结构化数据(如自然语言文本)中**挖掘(mine)**本体。微软研究院曾发布Microsoft Concept Graph:这是一个用is-a继承关系聚合的海量实体集合,可回答"什么是微软?"这类问题——答案是类似"以 0.87 概率是公司、以 0.75 概率是品牌"的形式。该图以 REST API 或可下载的大文本文件(列出全部实体对)两种形式提供。
配套的 MSConceptGraph.ipynb 演示了如何用概念图把新闻文章归入多个类别。需要特别说明的是(据该 Notebook 的注释):原 Microsoft Concept Graph API 已不可用,Notebook 已改用ConceptNet(一个同样提供is-a概念关系的开源知识图谱)作为替代,支持 REST API(无需密钥)与数据文件下载两种方式,例如查询 URL 形如:
https://api.conceptnet.io/query?start=/c/en/microsoft&rel=/r/IsA&limit=10总结与进阶方向
当今人工智能常被视为机器学习或神经网络的同义词。然而人类同样展现显式推理能力——这正是目前神经网络不擅长的部分。在真实项目中,显式推理仍被用于需要解释性、或需要以受控方式修改系统行为的任务。这也是符号 AI 在神经符号(neuro-symbolic)时代依然有价值的根本原因。
本课配套的课后练习 Build an Ontology(assignment.md) 建议你:选一个主题(人物、地点或事物),用本课介绍的技术与建模策略构建该主题的模型。示例:为"客厅"构建一个包含家具、灯具等的本体——思考客厅与厨房、卫生间有何不同?你凭什么判断那是客厅而非餐厅?并使用 Protégé 完成构建。
复习与自修建议:调研人类历史上试图量化与编码知识的领域——研究布鲁姆分类学(Bloom's Taxonomy);回顾林奈(Linnaeus)如何创建生物分类法;观察门捷列夫(Mendeleev)如何让化学元素可被描述与分组;再寻找更多有趣案例。
挑战:在家庭本体 Notebook 中尝试其他亲属关系,试着在家谱中发掘人与人之间新的联系。整个单元的三个 Notebook(Animals.ipynb、FamilyOntology.ipynb、MSConceptGraph.ipynb)与本课原始英文文档 lessons/2-Symbolic/README.md 一同构成完整的动手学习链路。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
AI-For-Beginners 符号智能核心课:知识表示、专家系统与语义网实战解析
AI For Beginners 符号智能核心课:知识表示、专家系统与语义网实战解析 符号智能(Symbolic AI)追求的是让机器像人一样"拥有知识并基于知
教程人工智能机器学习深度学习Symbolic AI 与专家系统实战:AI-For-Beginners 第 2 课知识表示、推理与本体构建指南
Symbolic AI 与专家系统实战:AI For Beginners 第 2 课知识表示、推理与本体构建指南 本课是 AI For Beginners ht
教程人工智能机器学习深度学习AI-For-Beginners 课程指南:12 周 24 课,从零构建人工智能知识体系
AI For Beginners 课程指南:12 周 24 课,从零构建人工智能知识体系 AI For Beginners 是一套面向零基础学习者的 12 周人
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考