65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 CommonKADS 方法的知识系统

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (12投票s)

2009 年 11 月 3 日

GPL3

14分钟阅读

viewsIcon

70124

downloadIcon

1579

在 CommonKADS 中使用 CLIPS 实现专家系统建模,并嵌入 C++。

目录

  1. 基于知识的系统背景
    1. 什么是基于知识的系统?
    2. 编程语言
    3. 它们在哪里使用?
    4. 基于知识的系统结构
    5. 当前趋势
  2. CommonKADS 方法论
    1. 简史
    2. 模型集
    3. 角色
  3. 使用 CommonKADS 开发 KBS
    1. 领域知识
      1. 类图
      2. 表达式关系
      3. 知识库
    2. 推理知识
      1. 推理模式
      2. 领域连接
    3. 任务知识
  4. 实现(示例)
  5. C++ 嵌入
  6. 进一步阅读和参考文献

1. 基于知识的系统背景

1.1 什么是基于知识的系统?

基于知识的系统是人工智能的一个分支,我们可以说它们在当今的系统开发领域已经成为现实。它们通常嵌入到其他应用程序中,执行知识专业化任务。

基于知识的系统是人工智能科学家经过长期研究过程的结果。在 20 世纪 70 年代初,他们开始认识到计算机程序解决问题的能力既不取决于形式化表达,也不取决于推理逻辑模式,而取决于它所拥有的知识。专家是指在某个人的活动领域拥有某种知识和经验的人,他可以有效地将其应用于解决他具体不知道但属于其知识领域内的各种任务。因此,基于知识的系统是一组计算机程序,它们试图模仿,甚至在某些情况下超越人类专家在其领域内的能力。其理念不是用机器取代人类思维,而是取代称职专业人士的专业知识。为了构建 KBS,知识工程师通常会咨询这些专家。在某些领域,这些专家使用规则进行工作,尽管他们并不总是意识到这一点。

当不需要使用直觉或常识时,基于知识的系统就显得非常强大,能够取得成功的结果。

基于知识的系统已经经历了两个世代。在第一代中,知识工程师仅限于编写包含专家知识的规则。这种形式化不足以胜任,因为项目难以维护且成本高昂。除此之外,知识获取严重依赖于专家。在第二代中,艾伦·纽厄尔 (Allen Newell) 提出了知识层概念,其中知识独立于实现,并根据不同的知识层进行结构化。

  • 知识层:主体、知识、目标、动作
  • 符号层:计算机、符号、指令
  • 逻辑层:数字系统、比特、逻辑和算术运算
  • 电路层:电子系统、电流

纽厄尔强调了使用模型的需求。这样,我们就将“知识获取”定义为一个知识工程师创建知识模型,然后将其计算化的过程。

第二代方法目前仍在使用。

1.2 编程语言

KBS 通常使用 Prolog、Lisp、C++ 等语言编程,最近也使用了 CLIPS,下面将对此进行解释。Lisp 是一种函数式语言,传统上用于人工智能领域,效果很好。相比之下,Prolog 是一种声明式语言,与过程式语言不同,它不描述解决问题的顺序算法,而是通过推理引擎断言事实和关系。过程式语言面向“如何”,而声明式语言面向“是什么”。另一方面,C++ 是最有效和最优化的资源语言;但是,它缺乏推理引擎,需要从头开始实现。

1.3 它们在哪里使用?

  • 支持决策制定:基于给定问题,这些系统根据系统中包含的知识确定最合适的解决方案。
  • 配置:它们选择和规划特定流程所需的组件。例如,可以根据给定的组件和需求帮助配置物理设备的系统。
  • 诊断:这些系统确定症状的原因,例如,疾病诊断和故障排除。
  • 解释和分析:它们处理大量信息,进行解释,提供说明性报告并提出要采取的行动。例如,评估建筑物抗震能力的系统。
  • 监控:这是解释和分析的一个特殊案例,非常常用,因此将单独考虑。其目的通常是监控过程并输出控制信号,例如,核电站的控制。
  • 规划:它们确定实现目标的阶段和资源。例如,解决工业物流问题的系统。
  • 智能接口:它们解决复杂设备难以由人员使用的情况,例如,自动驾驶仪。
  • 设计:计算机辅助设计 (CAD) 的建议,例如,电子设计程序中的正确电压。

1.4 基于知识的系统结构

知识库

KBS 以形式化和结构化的形式存储人类专家的知识;这就是所谓的知识库。一些基于知识的系统包含元知识或关于知识的知识,也就是说,它们能够搜索知识库并以智能的方式找到问题的解决方案,使用不同的解决策略及其特定条件。这意味着定义了一些标准,系统根据这些标准,根据初始数据选择一个或另一个策略。知识库可以表示为谓词逻辑、列表、对象、语义网络和/或生产规则。最常使用规则和对象来实现。

推理引擎

它也称为规则解释器,其目标是在推理过程中搜索和选择要应用的正确规则。

事实库

它就像一个临时的辅助内存,用于存储用户数据、初始问题数据、假设以及推理过程中的中间结果。通过它,我们可以了解系统的当前状态以及如何达到该状态。存储此信息的最佳方式是使用关系数据库,而不是其他粗糙的系统。

用户界面

它允许与 KBS 通信,进行数据输入和输出。

1.5 当前趋势

基于知识的系统的开发尚未标准化。尽管如此,欧洲一项资助的 **ESPRIT** 项目正在开发一种新兴的欧洲方法论来开发基于知识的系统。它被称为 **KADS** (Knowledge Acquisition Design System)。对于 KADS 而言,构建基于知识的系统基本上是一项建模活动。KADS 最重要的特征之一是构建一个独立于实现的完整知识模型。最后,KADS 是一种面向结果的方法论;每次开发活动的产品所获得的结果是项目控制和方向的唯一客观标准。

2. CommonKADS 方法论

2.1 简史

CommonKADS 是支持 KBS 工程的领先方法论。它已在欧洲 ESPRIT 项目的背景下由许多公司和大学开发和测试。它现在是欧洲知识库系统开发的实际标准,并已被欧洲、美国和日本的公司采纳。CommonKADS 还提供了执行知识任务和流程详细分析的方法。下图展示了知识库系统方法论的演变。

CommonKADS 源于 KADS-I 项目,该项目是一个更长、技术和人员更强大的项目,尽管该方法论缺乏形式化。1990 年冬天,开始开发一种新的、具有商业可行性并涵盖整个 KBS 生命周期的方法论。结果是一种名为 CommonKADS 的新方法论。

2.2 模型集

"模型通过细节抽象反映了现实世界中系统的特征。每个模型突出某些系统特征而抽象其他特征"。[DeMarco, 82]。

模型集为知识工程提供了任务分解,从而降低了复杂性。在构建模型时,其他方面可以留待以后处理。CommonKADS 模型显示在下图。

组织模型

它描述和分析一个企业的主要活动。

任务模型

它分析组织的全局子流程方案:输入、输出、前置条件、绩效标准、资源和能力。

主体模型

主体作为任务执行者的特征描述:能力、授权和限制。

通信模型

任务中涉及的主体交易的概念描述。

知识模型

描述任务中使用的知识类型和结构以及这些知识组件在任务解决中的作用,但独立于实现

设计模型

基于之前的模型,这个模型描述了技术规范,如架构、实现平台、软件模块等,以便获得知识模型和通信模型中指定的功能。

根据这些模型,本文将重点介绍具有以下结构的知识模型,显示在下图。

领域知识

它详细说明了应用程序域(知识域)中的实体和概念,独立于它们如何被用于其他知识类型。

推理知识

它处理不同类型的推理(专家在任务解决方案中使用的推理元素)。推理由其输入和输出定义,它们是领域角色。推理不允许后续分解。

任务知识

它指定了任务目标以及解决该任务的方法。

问题解决方法

它描述了一个任务的解决方法,指定了递归分解的子任务以及执行它们的顺序。

战略知识

它指定了任务计划。战略知识的考虑允许更灵活的系统设计。

2.3 角色

与任何其他软件项目一样,必须有一个人类结构来组织、管理和开发基于知识的系统。在 KBS 开发中,有六个相关角色参与系统构建。最具代表性的角色显示在下图,并在以下几行中进行解释。

知识提供者/专家

这是人类“知识”的所有者。它通常是应用程序领域的专家,但也可能是组织中不具有专家身份的其他人。

知识工程师/分析师

知识工程师面临的一个重要问题是找到前面提到的真正专家。术语“知识工程师”通常保留用于系统分析工作。它们也可以称为“知识分析师”,因此这两个术语可以互换使用。CommonKADS 为知识工程师提供了一系列方法和工具,使标准知识密集型任务的分析相对简单。

知识系统开发者

知识系统开发者负责设计和实现。开发者必须具备分析方法的基础。在知识系统开发中,主要的知识问题已由知识分析师解决。因此,这个角色必须具备一些软件设计者的技能。

知识用户

知识用户直接或间接使用知识系统。他与 KBS 的互动对于项目开发和验证很重要。

项目经理

负责管理项目,特别是知识工程师和知识系统开发者。

知识经理

他处于等级制度的顶端,扮演着项目经理的角色,但级别更高。他就像一个知识策略师,协作、定义和分发知识以协调所有其他角色。

3. 使用 CommonKADS 开发 KBS

为了说明前面的概念,我选择开发一个小型文学助手应用程序,其中包含一个专家系统。助手的基本思想是根据读者的年龄、教育程度和兴趣为他们分配一本书。该应用程序并不旨在成为一个真实世界的系统,但它可以是一个有限版本。因此,它可以(大规模地)在图书馆或书店中用于建议读者阅读哪本书。

3.1 领域知识

它描述了一个领域(机械、医学等)中的概念和概念关系。概念是领域知识中代表性的中心实体。概念由其名称标识,并指代抽象实体(患者)或具体实体(患者 John)。它就像 C++ 或 Java 中的类概念。概念由其属性或特性描述,这些属性由其类型和名称定义。属性是领域知识表示的基本单元。领域知识由三个元素组成,它们如下:

3.1.1 类图

我们使用 UML 等工具来定义概念和属性,尽管我们也可以使用其他 AI 建模语言,如 KIF、Ontolingua 等。

绘制图后,我们将使用 CML(CommonKADS 概念建模语言)编写它们。

Concept Person; 
ATTRIBUTES: 
Name: String; 
Age: Int; 
Stage: String; 
Interests: String;
Education: String; 
END CONCEPT Person;
CONCEPT Reading-type; 
ATTRIBUTES:
Genre: String;
END CONCEPT;
CONCEPT Reader-type;
ATTRIBUTES:
Level: String;
END CONCEPT;
CONCEPT Book;
ATTRIBUTES:
Title: String;
Author: String;
END CONCEPT;

3.1.2 表达式关系

它们以if..then规则的形式表示关系:条件表达式作为前提,赋值表达式作为结果。它们假设了因果关系。在示例中,关系如下:

RULE-TYPE Abstraction-rules;
DESCRIPTION: Abstract the age of a person
ANTECEDENT: Person;
CARDINALITY: 1;
CONSEQUENT: Stage;
CARDINALITY: 1;
CONNECTION-SYMBOL: Abstracts;
END-RULE-TYPE Abstraction-rules;

RULE-TYPE Genre-preferences;
DESCRIPTION: Genre selection starting from the interests
ANTECEDENT: Interests;
CARDINALITY: 1;
CONSEQUENT: Genre;
CARDINALITY: *;
CONNECTION-SYMBOL: Prefers;
END-RULE-TYPE Genre-preferences;

RULE-TYPE Level-assignation;
DESCRIPTION: Assigns a level according the education
ANTECEDENT: Education;
CARDINALITY: 1;
CONSEQUENT: Level;
CARDINALITY: 1;
CONNECTION-SYMBOL: Assigns;
END-RULE-TYPE Level-assignation;

RULE-TYPE Assign-book;
DESCRIPTION: Assign books
ANTECEDENT: Genre and Level;
CARDINALITY: *;
CONSEQUENT: Book;
CARDINALITY: *;
CONNECTION-SYMBOL: Final assignation;
END-RULE-TYPE Assign-book;

3.1.3 知识库

知识库通过先前定义的各种通用规则获取配对。下面显示了知识库的样本实例。

KNOWLEDGE-BASE Literary-assistant-base
USES
Abstraction-rules FROM literary-assistant-scheme;
Genre-preferences FROM literary-assistant-scheme;
Level-assignation FROM literary-assistant-scheme;
Assign-book FROM literary-assistant-scheme;
 
EXPRESSIONS
 
/* Select stage */
 
Person.age <= 13 
ABSTRACT Person.stage = CHILD
 
Person.age > 13 AND Person.age <= 19 
ABSTRACT Person.stage = TEENAGER
 
Person.age > 19 AND Person.age <= 40
ABSTRACT Person.stage = YOUNG
 
Person.age > 40
ABSTRACT Person.stage = ADULT
 
/* Discriminate interests */
 
Person.interests = "Music" OR Person.interests = "Painting" OR 
Person.interests = "Cinema" OR Person.interests = "Sculpture" 
PREFER reading-type.genre = ART
.
.
.
 
/* Adjust reader level */
 
Person.education = SECONDARY AND Person.stage = YOUNG
SELECT-LEVEL reader-type.level = ADVANCED
 
Person.education = SECONDARY AND Person.stage = ADULT 
SELECT-LEVEL reader-type.level = ADVANCED
 
Person.education = UNIVERSITARY 
SELECT-LEVEL reader-type.level = ADVANCED
.
.
.
/* Science section */
 
reader-type.level = CHILD AND reading-type.genre = SCIENCE
SELECT-BOOK Book.title = "Arithmetics handouts"
 
reader-type.level = BASIC AND reading-type.genre = SCIENCE
SELECT-BOOK Book.title = "Basic arithmetics and geometry "
 
reader-type.level = INTERMEDIATE AND reading-type.genre = SCIENCE
SELECT-BOOK Book.title = "Derivatives and integrals"
 
reader-type.level = ADVANCED AND reading-type.genre = SCIENCE
SELECT-BOOK Book.title = "Differential equations"
.
.
.
 
END KNOWLEDGE-BASE Literary-assistant-base;

3.2 推理知识

推理知识是指不需要后续分解的子任务集。它们是用于任务解决的推理原语和基本推理步骤。通过指定执行的功能及其输入和输出来描述它们。重要的是要注意,推理描述并不意味着如何执行,因为它在很大程度上取决于具体的应用程序和领域。

3.2.1 推理模式

如前所述,推理是基本的推理步骤,但它取决于领域角色。

  • 静态角色:它们是用于推理过程但不受推理影响的领域元素。
  • 动态角色:它们是推理的输入和输出,标志着将在推理过程中使用的领域元素。

INFERENCE Abstract
ROLES
INPUT: Person;
OUTPUT: Stage;
STATIC: Abstraction-model;
SPECIFICATION:
"Abstracts the age of a person"
END INFERENCE Abstract;

INFERENCE Select-genre
ROLES
INPUT: Interest;
OUTPUT: Genre;
STATIC: Preferences-model;
SPECIFICATION:
"Selects a genre according the user's interests"
END INFERENCE Abstract;

INFERENCE Select-level
ROLES
INPUT: Education,Stage;
OUTPUT: Level;
STATIC: Level-model;
SPECIFICATION:
"Selects a level according the user's education and stage"
END INFERENCE Abstract;

INFERENCE Select-book
ROLES
INPUT: Genre, Level;
OUTPUT: Book;
STATIC: Book-selection-model;
SPECIFICATION:
"Assigns a book according the user's level and selected genres"
END INFERENCE Abstract;

3.2.2 领域连接

在对推理知识进行建模后,有必要描述它与知识领域的元素的连接。在示例中,结果如下:

KNOWLEDGE-ROLE Person;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Person;
END KNOWLEDGE-ROLE Person;

KNOWLEDGE-ROLE Abstraction-model;
TYPE: STATIC;
DOMAIN-MAPPING:Abstraction-rules 
  FROM literary-assistant-scheme; ;
END KNOWLEDGE-ROLE Abstraction-model;
KNOWLEDGE-ROLE Stage;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Stage;
END KNOWLEDGE-ROLE Stage;

KNOWLEDGE-ROLE Interest;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Interest;
END KNOWLEDGE-ROLE Interest;

KNOWLEDGE-ROLE Preferences-model;
TYPE: STATIC;
DOMAIN-MAPPING:Genre preferences 
   FROM literary-assistant-scheme; ;
END KNOWLEDGE-ROLE Preferences-model;
KNOWLEDGE-ROLE Genre;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Genre;
END KNOWLEDGE-ROLE Genre;

KNOWLEDGE-ROLE Education;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Education;
END KNOWLEDGE-ROLE Education;
KNOWLEDGE-ROLE Stage;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Education;
END KNOWLEDGE-ROLE Education;
KNOWLEDGE-ROLE Level-model;
TYPE: STATIC;
DOMAIN-MAPPING:Level-assignation 
   FROM literary-assistant-scheme; 
END KNOWLEDGE-ROLE Level-model;
KNOWLEDGE-ROLE Level;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Level;
END KNOWLEDGE-ROLE Level;

KNOWLEDGE-ROLE Genre;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Genre-and-Level;
END KNOWLEDGE-ROLE Genre;
KNOWLEDGE-ROLE Level;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Genre-and-Level;
END KNOWLEDGE-ROLE Level;
KNOWLEDGE-ROLE Book-selection-model;
TYPE: STATIC;
DOMAIN-MAPPING:Assign-book 
   FROM literary-assistant-scheme;
END KNOWLEDGE-ROLE Book-selection-model;
KNOWLEDGE-ROLE Book;
TYPE: DYNAMIC;
DOMAIN-MAPPING: Book;
END KNOWLEDGE-ROLE Book;

3.3 任务知识

任务是通用目标(诊断、规划等),为了实现它,使用方法,该方法涉及将任务分解为更基本任务,以及在任务运行时进行排序的控制。通过递归地划分子任务,我们得到最后级别的基本任务,这些任务不再可分解,它们被称为推理。控制方法知识对于任务的最终实现至关重要。它指定了一个清晰、精确和明确的程序来链接推理。在下图,我们可以看到任务图及其子任务在推理中的分解。

TASK Literary-assistant
    GOAL:
        "Advice a book to a reader";
    ROLES:
        INPUT:
            Person: "A person who wants to read a book";
        OUTPUT:
            Book: "Some books to read"; 
 
    SPEC:
    "Assign a book to a person according to its education and age";
END TASK Literary-assistant; 
 
TASK-METHOD Literary-assistant-sequential;
    REALIZES:
        "Literary assistant";
    DECOMPOSITION:
    INFERENCES: Abstract, Select-genre, Select-level, Select-book;
    TRANSFER-FUNCTIONS:;
    ROLES:
    INTERMEDIATE:
        Abstraction-model: 
        Preferences-model: 
        Level-model: 
        Book-selection-model:
    CONTROL-STRUCTURE:
        Abstract(+Stage,-Person,-Abstraction-model);
        Select-genre(+Genre,-Interest,-Preferences-model);
        Select-level(+Level,-Education,-Stage,-Level-model);
        Select-Book(+Book,-Genre,-Level,-Book-selection-model);
END-TASK-METHOD Literary-assistant-sequential;

4. 实现(示例)

为了实现这个例子,我选择使用 CLIPS,这是一个专家系统工具,创建于 1985 年,具有以下特点:

  • 知识表示:CLIPS 提供了一个统一的工具来处理各种知识,并支持三种不同的编程范式:基于规则、面向对象和过程式。
  • 可移植性:CLIPS 用 C 语言编写,以实现可移植性和速度,并且无需更改代码即可安装在许多不同的操作系统上。CLIPS 已在 **Windows XP**、**MacOS X** 和 **Unix** 等操作系统上进行了测试。CLIPS 可以移植到任何拥有符合 ANSI 标准的 C 或 C++ 编译器的系统。CLIPS 附带完整的源代码,可以进行修改或定制以满足用户特定需求。
  • 集成/可扩展性:CLIPS 可以嵌入到过程代码中,作为子程序调用,并与 **C**、**C++**、**Java**、**FORTRAN** 和 **ADA** 等语言集成。
  • 验证/确认:CLIPS 包含许多支持专家系统验证和确认的功能,包括支持模块化设计和知识库分区、槽值和函数参数的静态和动态约束检查,以及规则模式的语义分析,以确定不一致是否会导致规则无法触发或产生错误。
  • 文档齐全。
  • 低成本:CLIPS 作为公共领域软件进行维护。

下面是本文包含的完整源代码的一个示例,用 CLIPS 编写。

; Select level according to education

(defrule select_level
    ?f1<-(start_level)
    (person (education ?edu)(stage ?stg))
    (level (education ?edu)(stage ?stg)(level ?lev))
    =>
    (assert (reader-type (level ?lev)))
    (retract ?f1)
)
 
; Find interests in interest list
 
(deffunction has_person (?mat $?interests)
    (return (member$ ?mat $?interests))
)
 
; Select genre according to interests
 
(defrule select_genre
    (interests)
    (person (interests $?interests))
    (matter (interest $?cat)(genre ?genre))
    =>
    (bind ?i 1)
    (while (<= ?i (length$ $?interests))
        (bind ?mat (nth$ ?i $?interests))
        (if (has_person ?mat $?cat) then
            (assert (reading-type (genre ?genre)))
        )
    (bind ?i (+ ?i 1))
    )
)
 
; Select book according to interests
 
(defrule recommend_book
    (reader-type (level ?level))
    (reading-type (genre ?genre))
    (category (level ?level)(genre ?genre)(book ?book))
    =>
    (printout t "According to this data, you should read: " ?book crlf)
)

上图展示了应用程序在 CLIPS 中的执行。请注意,如果您输入的年龄和教育程度不匹配,系统将不会返回任何结果。例如,如果您输入年龄 50 且教育程度为儿童,系统将不会返回任何建议。

5. C++ 嵌入

将 CLIPS 源代码嵌入 C++ 的最简单方法是通过项目中的 extern 关键字包含头文件 "clips.h"。接下来,我们将调用 InitializeEnvironment 来运行 CLIPS 引擎,并调用 Load 来加载包含源代码的 .clp 文件。最后,调用 resetrun 来启动应用程序。以下是执行此操作的代码片段:

#include <iostream>
 
extern "C"
{
    #include "clips.h"
}
 
using namespace std;
 
int main(int argc, char* argv[])
{
    InitializeEnvironment();
    Load("literary assistant.clp");
    // Insert the CLIPS source code here

    Reset();
    Run(-1L);
    cin.get();
    return 0;
}

6. 进一步阅读和参考文献

  • 知识工程与管理:CommonKADS 方法论。[Guus Schreiber][ Hans Akkermans][Anjo Anjewierden][Robert de Hoog][Nigel Shadbolt] 等。麻省理工学院。
  • http://www.csae.map.es/csi/silice/Sgexpt.html。 [西班牙政府电子行政高级委员会]
  • 人工智能基础。[J. Mira][A.E. Delgado][ J.G. Boticario][ F.J. Diez]。UNED - 国家远程教育大学。
  • KBS 开发的方法论方面。[J. Mira][R. Martínez Tomás]。UNED - 国家远程教育大学。
  • CLIPS:构建专家系统的工具http://clipsrules.sourceforge.net/
© . All rights reserved.