知识表示
用机器可操作的结构表达实体、属性、关系与规则。
前置知识
通俗直觉
人可以理解“猫是动物,动物需要呼吸”,机器却需要明确对象、关系和适用范围,才能进行查询和推理。知识表示关心的不只是把句子存起来,而是让系统知道哪些事实能够组合、哪些结论可以推出。
同一句自然语言在不同领域可能有不同含义。“属于”可能表示类别继承、组织隶属或文件夹包含;如果不区分这些关系,程序可能得出看似连贯却无效的结论。
核心原理
实体表示具体对象,类别表示一组对象,属性与关系描述它们的特征和联系。知识图谱可以把事实组织成带方向、带类型的边;模式则约束关系允许连接什么对象,例如“出生日期”的值应是日期而不是另一家企业。
逻辑规则把前提与结论连接起来。若已知某对象是猫,且规则规定猫属于动物,便可推出它是动物;反过来,知道它是动物不能推出它是猫。这是蕴含方向的限制,不是存储格式能自动解决的问题。
类别继承是一种简化推理:沿上位类别寻找属性。它需要说明例外、冲突和循环如何处理;“鸟通常会飞”不是无例外的事实,不能直接作为所有鸟的硬规则。
事实还应包含来源、时间和确定程度。在开放世界假设下,没有记录某关系不等于该关系为假;在明确封闭的数据表中,业务才可能约定缺失即不存在。查询结果必须结合采用的假设解释。
案例:从猫的类别推到需要呼吸
已记录“猫 is_a 动物”与“动物 needs 呼吸”。查询猫的 needs 属性时,先查猫自身,没有该属性,再沿 is_a 到动物,读到“呼吸”后返回。下方代码只实现这种单一父类别的向上查找,不是通用逻辑证明器。
如果再记录“玩具猫 is_a 玩具”,它并不能因为名称中含“猫”就继承呼吸属性。若数据错误地构成猫与动物相互继承的环,查询缺失属性时还需要检测重复节点;表示结构的质量直接约束推理结果。
数学公式
若 x 是猫,则可以推出 x 是动物。
工作流程
- 定义领域实体
- 建立关系和属性
- 编码事实与规则
- 执行查询或逻辑推理
代码示例
Python
example.pyfacts = {"猫": {"is_a": "动物"}, "动物": {"needs": "呼吸"}}
def inherit(entity, relation):
current = entity
visited = set()
while current in facts:
if current in visited:
raise ValueError("cycle in is_a hierarchy")
visited.add(current)
if relation in facts[current]:
return facts[current][relation]
current = facts[current].get("is_a")
return None
print(inherit("猫", "needs"))
print(inherit("猫", "color"))- 沿 is_a 父链继承属性,保留蕴含方向。
- 访问集合检测错误的循环层级;缺失知识显式返回 None。
- 字典仅模拟最小知识结构,没有实现完整的逻辑证明器。
程序沿单一 is_a 父链查询,优先返回当前类别自身记录的属性,再向上查找。visited 用于发现循环,防止查询不存在的属性时永远走不出来。
预期输出为两行:呼吸 与 None。None 仅表示这份小知识库无法给出 color 属性,不能推出猫在现实中没有颜色。示例不支持多重继承、默认规则或冲突消解。
应用场景
- 知识图谱
- 专家系统
- 语义搜索
常见误区
- 把“若是猫则是动物”反过来使用,或让普通包含关系承担类别继承含义。
- 把知识库未记录理解为现实中一定不存在,忽略开放世界与封闭世界的区别。
- 只加入更多事实而不检查冲突、来源、版本和循环,误以为存储规模就是推理能力。
推荐学习资料
CS50’s Introduction to Artificial Intelligence with Python
通过搜索、知识表示、概率、优化、机器学习与语言项目学习 AI 基础。
Brian Yu / David J. Malan · Harvard CS50
资料笔记
Artificial Intelligence: A Modern Approach
以统一框架组织搜索、知识、推理、规划、学习、智能体和机器人等主题。
Stuart Russell / Peter Norvig · AIMA