說明:本文是Knowledge-based systems with thecommonKADS method文章的翻譯。
一、知識庫系統的背景
1. 什么是知識庫系統(KBS)
知識庫系統是人工智能的一個分支,可以真正地應用于現今的系統開發領域。他們通常內嵌于其他的應用中,來執行特定知識的任務。
知識庫系統是AI科學家長期研究的成果。從上個世紀70年代開始,科學家們開始理解計算機程序解決問題的關鍵不在于規整的表達式或者推理邏輯的模式,而是在于這些問題本身擁有的知識。擁有豐富知識和經驗的人類專家可以高效地解決不同種類的問題----即使他們對這些問題的描述并不是十分明確----只要是這些問題處于專家的研究領域。因此,知識庫系統是一組計算機程序,用來仿真(在某些情況下甚至超越)人類專家解決問題的能力。當然,知識庫系統的目標并不是用機器來代替人類的思考,而是發揮出計算機強大的計算能力。為了打造一個知識庫系統,工程師們需要接受來自專家的大量的建議。在一些領域,這些專家都是基于規則進行建議的,盡管他們自身并沒有意識到這一點。
知識庫系統在不基于直覺或者常識而獲得有效的結果方面是非常強大的。
知識庫系統的發展過程經歷了兩代:在第一代系統中,工程師們局限于根據專家定義的規則進行編碼實現,這種形式并不是十分有效的,因為項目難以維護并且修改代價十分巨大。除此之外,知識獲取的過程嚴重依賴專家的輸出;在第二代系統中,Allen Newel提出了‘知識等級’的概念,知識不依賴于具體的實現,而是根據不同種類的知識等級進行結構化表示:
l 知識等級:Agent,Knowledge,Goal,Actions
l 表示等級:Computer,Symbols,Instructions
l 邏輯等級:Digital System,Bits,Logic and Arithmetic Operations
l 鏈路等級:Electronic System, Current
Newel提出了使用模型的必要性,這樣,我們把‘知識獲取’定義成一個過程,在這個過程中,工程師們先創建‘知識模型’,隨后把它們編碼成計算機可運行的形式。
現在通常使用第二代知識庫系統。
2. 編程語言
知識庫系統通常基于Prolog,Lisp,C++和CLIPS語言來實現,其中CLIPS是本文介紹的重點。Lisp是一種函數式編程語言,一直以來都應用于AI領域并且取得了不錯的效果。與此相對,Prolog是一種聲明式語言,與面向過程的編程語言通過實現一個算法來解決問題的模式不同,它通過推理引擎來論證事實和關系。過程式語言面向‘How’,聲明式語言面向‘What’。另外,C++是一種非常高效并且高度優化的編程語言,但是它缺少推理引擎,需要從零開始實現。
3. 應用領域
- Support system decision-making:給定一個問題,系統根據系統內已有的知識決策出最優的方案。
- Configuration:在一個特定的過程中選擇和計劃可能需要的組件。例如,從給定的組件和需求開始,系統幫助配置物理裝備。
- Diagnosis:系統根據癥狀來確定問題的根源,例如,疾病診斷和問題排查。
- Interpretation and analysis:通過分析、處理大量的信息,給出一個顯示的報告并建議采取行動的步驟,其中一個例子就是評估建筑物結構抗震等級。
- Monitoring:它是Interpretation and analysis的一個經常使用的特殊的案例,所以在這里單獨劃分開來。它的目標通常是通過監控一個過程來給出控制結果的輸出,例如:核電站的控制系統。
- Planning:通過建立階段和資源來獲取目標輸出,其中一個例子就是解決工業物流問題。
- Intelligence interfaces:通常應用在人們很難去使用復雜裝備的情況下,例如自動駕駛。
- Design:在Computer Aided Design領域給出建議,例如在電子設計程序中給出正確的工作電壓。
4. 知識庫系統的結構
- 知識庫:KBS以形式化和結構化的方式來存儲人類專家的知識,通常稱為知識庫。一些知識庫系統擁有‘元知識’或者‘關于知識的知識’,也就是說他們可以根據不同的情況,采取不同的策略,以智能的方式來搜索知識庫并找到問題解決方案。這就意味著在具體實現的過程中,系統會根據定義的標準或者條件來決定使用哪種策略。知識庫可以被表示成謂詞演算、列表、對象、語義網絡和產品規則,大多數情況下,通常基于規則和對象進行實現。
- 推理引擎:也稱為規則解釋器,目標是在推理過程中搜索和選擇正確的規則。
- 事實庫:它就像一個臨時的大內存,來存儲在推理過程中使用的用戶數據、初始問題、假設條件和臨時結果。通過事實庫,我們可以洞悉系統當前的狀態和它是如果工作的。最好將這些信息存儲在關系型數據庫中,不要選擇其它的持久化方式。
- 用戶接口:允許和KBS進行通信,包括數據的輸入和輸出。
5. 目前的趨勢
知識庫系統的開發并沒有統一的標準,盡管如此,ESPRIT項目提供了一套方法論來開發知識庫系統,簡稱CADS(Knowledge Acquisition Design System)。在KADS中,構造知識庫系統基本上就是一種基于模型的活動,其中一個最重要的特性就是構造一個與具體實現無關的、完備的知識模型。KADS是面向結果的方法論,產品中每個開發活動產生的結果是整個項目控制和方向的唯一檢驗標準。
二、CommonKADS方法論
1. 歷史簡介
CommonKADS是KBS工程中領先的方法論,已經被許多公司和高校基于歐洲ESPRIT項目集進行開發和測試過。現在是知識庫系統開發的事實標準,并且被歐洲、美國和日本的很多公司所采納、使用。CommonKADS同時也提供方法來進行知識任務和進程的詳細分析,下圖展示了知識庫系統方法論的演進過程:
CommonKADS起源于KADS-I項目----一個擁有悠久歷史和眾多技術人員參與的項目----盡管這套方法論缺少形式標準。從1990年冬季開始,一個新的方法論具有商業可行性并且覆蓋了KBS整個生命周期,它就是CommonKADS。
2. 模型套件
模型套件在知識工程中提供任務分解,來減少復雜性。當考慮構造一個模型的時候,其他方面可以延后考慮。CommonKADS涉及的模型如下圖所示:
- Organization Model:描述和分析一個公司的主要活動。
- Task Model:分析一個組織的全局子過程的模式:輸入、輸出、前置條件、性能標準、資源和能力要求等。
- Agent Model:任務執行的特征描述:能力要求、授權流程和限制條件等。
- Communication Model:一個任務中涉及到的Agent事務流的概念性描述。
- Knowledge Model:一個任務使用的知識類型、結構的描述,或者一個任務解決過程中涉及的知識組件的角色的描述----它們不依賴于具體的實現。
- Design Model:描述了技術規格,例如架構、實現平臺、軟件模塊等等,目的是得到Knowledge Model和Communication Model中涉及的功能。
在這些模型中,本篇文章將重點關注Knowledge Model,其結構如下圖所示。
² Domain knowledge:描述了關于應用領域的實體和內容,和其他知識類型的使用無關。
² Inference knowledge:處理不同類型的推理(在任務解決過程中被專家使用的論據)。一個推薦由輸入和輸出定義----也就是它們的領域角色。推理不允許進一步的分解。
² Task knowledge:指明了任務的目標以及解決方法。
² Problem solving methods:描述了任務解決方法,確定遞歸分解的子任務以及它們的執行順序。
² Strategic knowledge:說明了任務執行計劃,為了設計更加靈活的系統而加以考量。
3. 角色
和其他的軟件項目一樣,需要人員來組織、管理和開發知識庫系統。在KBS的開發中,一共存在6種相關的角色,如下圖所示。
- Knowledge provider/ specialist:人類知識的擁有者,通常是應用領域內典型的專家,也可以是組織內沒有專家頭銜的人員。
- Knowledge engineer/ analyst:知識工程師的一個重要問題就是要找到之前提到的真正的專家,‘知識工程師’的頭銜通常專指進行‘系統分析工作’的人員,所以也可以稱他們為‘知識分析師’,因此,這兩種稱呼是等價的。CommonKADS向知識工程師們提供一整套的方法和工具,使得標準任務分析工作簡單明了。
- Knowledge system developer:知識系統開發員主要負責設計和實現,他們必須有數據分析的基本背景知識。在知識系統開發的過程中,主要的知識問題都被知識分析師解決掉了,因此,此角色應該具備軟件設計師的一些技能。
- Knowledge user:主要負責知識系統的使用----直接或者間接地。他們與KBS的交互對于項目開發和驗證來說是非常重要的。
- Project manager:負責項目的管理以及知識工程師和知識系統開發員的管理。
- Knowledge manager:在整個層級的最上面,在宏觀上把握項目,就像一個策略家,協作、定義和分發知識給其他的角色。
三、使用CommonKADS開發KBS
為了理解以上說明的內容,我們開發了一個用來展示專家系統特性的小型的圖書輔助應用。此應用的基本想法是根據讀者的年齡、受教育程度和興趣來推薦一本特定的圖書。此應用不是真正可應用的系統,但是加以修改可以展示最基本的功能。因此,它可以應用在圖書館或者書店中,來推薦讀者應該讀什么類型的書籍。
1. 領域知識
描述了一個領域中的內容以及內容之間的關系,內容可以表示成知識領域中的中心實體,我們通過名字來識別內容,包括抽象的實體和具體的實體對象。它很像C++或者Java中的Class的概念。這些內容被表示成他們的屬性或者特性,通過類型和名字來識別;屬性是知識領域內容的原子表示。領域知識由下面三種元素組成:
1) 類圖
我們使用UML語言來定義內容和屬性,也可以使用其他AI建模語言,如KIF,Ontolingua等。
完成建模之后,使用CML(CommonKADS Conceptual Modeling Language)語言進行編寫代碼。

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;
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) 知識庫
知識庫通過之前定義的通用規則來獲取表達式對,下面展示了知識庫的一個樣本實例:

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;
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;
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. 任務知識
任務代表著一個總體目標,為了達到這個目標,我們使用‘method’來對基本任務進行子任務分解,使用‘control’對子任務在運行時進行排序。在對任務進行遞歸分解的時候,我們把不能繼續分解的、位于葉子節點的子任務稱為‘inferences’。‘control method’知識是最終實現一個任務的必要條件,它清晰地、精確地、明確地指明了鏈接到各個‘inferences’的過程。下圖展示了任務、子任務分解和最終的‘inferences’:

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;
四、一個簡單的實現
我們選擇使用CLIPS來實現一個例子,CLIPS是起源于1985年的一個專家系統,具有以下的特性:
- 知識表現:CLIPS內置了一個工具來處理各種各樣的知識,支持三種不同的編程范式:基于規則的、基于對象的、過程式的。
- 可移植性:為了高可移植性和運行速度,CLIPS使用C來實現,不需要任何程序的變化就可以安裝在各種不同的操作系統上,已經經過測試的系統有:Windows XP, MacOS X和Unix。理論上,CLIPS可以被移植到任何有ANSI C和C++編譯器的操作系統上面。CLIPS是完全開源的,可以進行修改或者裁剪來滿足用戶特殊的需求。
- 集成/可擴展性:CLIPS能被內嵌在過程代碼中,叫做子程序。支持的嵌入語言有:C、C++、Java、FORTAN和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歲但是受教育程度是‘幼兒園’時,系統將不會給你推薦任何的圖書。
五、內嵌C++
下面的代碼展示了如何將CLIPS內嵌到C++的項目中。

#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; }
六、進一步閱讀和引用
- Knowledge engineering and management: the CommonKADS methodology. [Guus Schreiber][ Hans Akkermans][Anjo Anjewierden][Robert de Hoog][Nigel Shadbolt] et al. Massachusetts Institute of Technology.
- http://www.csae.map.es/csi/silice/Sgexpt.html. [Consejo Superior de Administración Electrónica - Government of Spain]
- Basic aspects of Artificial Intelligence. [J. Mira][A.E. Delgado][ J.G. Boticario][ F.J. Diez]. UNED - National University for Distance Education.
- Methodological aspects of KBS development. [J. Mira][R. Martínez Tomás]. UNED - National University for Distance Education.
- CLIPS: a tool for building expert systems. http://clipsrules.sourceforge.net/.
文章列表