Инженерия знаний (knowledge engineering) – одно из важных направлений современного программирования, занимающееся развитием языков, методов и систем представления и обработки знаний на компьютерах. Оно возникло в 1950-х гг. как один из разделов искусственного интеллекта, в связи с тем, что при решении задач творческого характера с помощью компьютеров оказалось необходимым не только разрабатывать алгоритмы и программы, реализующие те или иные методы (например, стратегию поиска решения сначала в глубину), но и явным образом (отдельно от программ) хранить, изменять и пополнять базы знаний, содержащие в обобщенном виде необходимую для решения задач информацию о предметной области.
Как выяснилось, знания, необходимые для решения многих нетривиальных практических задач с использованием компьютеров, носят гибридный характер, то есть, требуются не только процедурные знания (алгоритмы, их программные реализации и типовые процедуры решения задач – т.е. те формы знаний, которые фактически всегда неявно используются для компьютерного решения любой задачи, но в виде, жестко “зашитом” в исходный текст программы), но также концептуальные знания (определения концепций проблемной области и отношений между ними), фактуальные знания (конкретные факты и их связи между собой) и эвристические знания (неформальные правила рассуждений, отражающие практический опыт решения задач в проблемной области).
Соответственно, основными методами представления знаний на компьютерах, сложившимися в течение нескольких десятилетий, являются:
- продукции, или правила (rules) – конструкции вида ЕСЛИ условие ТО действие, используемые для продукционного вывода, при котором на каждом шаге, при истинности условия некоторого выбранного правила, активизируется его действие; оно может заключаться в добавлении в рабочее множество гипотез некоторого утверждения. Правила удобны для представления эвристических знаний и структурируются в виде наборов правил (rule sets), каждый из которых применяется для вывода некоторого целевого утверждения (goal);
- фреймы (frames) – иерархические структуры, удобные для представления знаний о концепциях и их взаимосвязи; фрейм состоит из имени и слотов (slots), каждый из которых имеет свое имя и значение (как правило, ссылку на другой фрейм); в соответствии с оригинальным подходом автора данной концепции M.Minsky (США), фреймы могут использоваться не только для представления структур знаний, но и для сопоставления с объектами исследуемой проблемной области, с целью их анализа и классификации;
- семантические сети (semantic nets) – нагруженные ориентированные мультиграфы, которые, как и фреймы, удобны для представления концепций и их взаимоотношений и являются, по-видимому, наиболее общей формой представления знаний.
Методы представления знаний получили особенно широкое распространение, начиная с 1970-х гг., когда весьма популярным направлением искусственного интеллекта стали экспертные системы (expert systems) - интеллектуальные программы, основанные на использовании отдельно хранимой, пополняемой базы знаний о предметной области, и играющие в данной области роль эксперта, умеющего решать в ней, как правило, достаточно узкий, ограниченный применимостью конкретных, представленными в базе знаний, круг задач диагностики, планирования, прогнозирования и т.д.
В настоящее время развитие методов и инструментов представления знаний приобрело особую актуальность, в связи с необходимостью улучшения качества информационного поиска в Интернете.
Проблема интеграции методов инженерии знаний и программной инженерии
По мере развития методов инженерии знаний, их теоретические, методологические и технологические основы все более отдалялись от основ инженерии программ (software engineering) – методов спецификации, проектирования, реализации, тестирования и сопровождения программ и программных продуктов.
Исторически сложилось так, что инженерия знаний, начиная с 1960-х гг. (создание языка ЛИСП для символьной обработки) и с 1970-х гг. (создание языка Пролог, основанного на идее использования метода резолюций для эффективного логического вывода в исчислении предикатов первого порядка, в качестве основы для систем искусственного интеллекта), развивалась на основе совершенно иных вычислительных моделей и парадигм, нежели традиционная программная инженерия (ФОРТРАН, АЛГОЛ, Паскаль, структурное и модульное программирование, абстрактные типы данных, объектно-ориентированное программирование и т.д.).
Для инженерии знаний использовались методы математической логики, теории продукций, системы преобразований термов (term-rewriting systems), а опыт и результаты в данной области накапливались, главным образом, усилиями специалистов в указанных теоретических областях, программирующих на языках ЛИСП, Пролог и их диалектах, применение которых требует иных методов мышления, принципиально отличных от тех, которые используются при программировании на процедурных или объектно-ориентированных языках.
Напротив, в инженерии программ использовались и развивались языки, методы и инструменты, основанные на более традиционных вычислительных моделях, с точки зрения которых, использование языков ЛИСП или Пролог выглядело “экзотикой”.
Таким образом, за десятилетия развития обеих дисциплин сложился серьезный разрыв между ними.
Специалисты по инженерии знаний мыслят в терминах, подобных следующим: “концепт”, “факт”, “гипотеза”, “атом”, “список”, “условие”, “заключение”, “целевое утверждение”, “граф”, “логическая связка”, “фрейм”, “демон”, “противоречие”, “возврат (back-tracking)”, “нечеткость”, “коэффициент уверенности”, “степень истинности”..
Характерный перечень терминов, используемый специалистом по инженерии программ, следующий: “программа”, “описание”, “оператор”, “переменная”, “ячейка памяти”, “значение”, “присваивание”, “массив”, “структура”, “процедура”, “параметр”, “программный модуль”, “класс”, “объект”, “метод”, “исключительная ситуация”, “стек”, “куча”.
Налицо, к сожалению, практически полное взаимное непонимание между специалистами обеих категорий; пересечение множеств самих таких специалистов, увы, практически пусто.
Этот феномен нашел отражение и в языках и инструментах программирования, используемых в обеих областях. Не встретишь, например, специалиста по объектно-ориентированному программированию, использующего современные платформы Java и .NET, который в то же время был бы фанатиком логического программирования и разрабатывал бы многие свои программы в системах Turbo Prolog или Visual Prolog.
Однако, на практике, для решения очень многих реальных задач должно использоваться именно сочетание методов программной инженерии и методов инженерии знаний. Например, для решения задачи планирования развития сложных технических систем, которая была поставлена перед нами одним из заказчиков уже почти 20 лет назад, характерно сочетание алгоритмических методов дискретного программирования (для решения крупных частей задачи) с методами искуственного интеллекта (например, основанными на наборах эвристических правил), которые необходимо использовать для оценки результатов применения этих алгоритмических методов решения.
Увы, ни одна из известных, широко используемых платформ “традиционного” программирования (Java, .NET, Eiffel, Active Oberon и др.) не содержит адекватных средств представления знаний, которые были бы включены в эту систему в качестве основных понятий и конструкций базовых языков.
И наоборот, ни одна из известных систем инженерии знаний (Common LISP, Turbo Prolog,Visual Prolog, KEE, Ontolingua, Prot?g? и др.) не содержит адекватных, современных, удобных и эффективно реализованных средств “традиционного” программирования. Семантика конструкций подобных систем, как правило, формулируется в терминах их реализации на одном из диалектов Лиспа. Ни один специалист не станет, например, на ЛИСПе или Прологе реализовывать алгоритмы численного решения задач. Возможности же использования в системах инженерии знаний программных модулей на традиционных языках либо отсутствуют, либо ограничены, например, возможностью запустить из набора правил целое приложение для Windows (.exe) и использовать его результат, записанный в некоторый файл.
Описанный семантический разрыв между методами инженерии программ и инженерии знаний все более препятствует успешному решению многих реальных практических задач с помощью компьтеров и, по нашему мнению, должен быть преодолен в будущих системах.
В связи с этим, в Санкт-Петербургском университете, в лаборатории проф. В.О. Сафонова (до 2001 г. – лаборатории технологии программирования и экспертных систем, с 2001 г. – лаборатории Java-технологии НИИ математики и механики), начиная с 1980-х – 1990-х гг., разрабатываются методы интеграции инженерии знаний и инженерии программ. Они уже реализованы в языке представления знаний Турбо-Эксперт (1991 г.) – расширении Турбо-Паскаля средствами представления гибридных знаний, и в экспериментальных версиях языков и систем Java Expert (расширения Java средствами представления знаний) и C# Expert – расширения языка C# средствами представления фреймовых и продукционных знаний).
В основе всех этих языков и систем, как и в основе описанных в данной работе языка и системы Knowledge.NET, лежит принцип расширения современных языков и систем программирования средствами (концепциями, языковыми конструкциями, библиотеками и др.) инженерии знаний.
На наш взгляд, только такое сочетание методов и конструкций “традиционного” программирования (т.е. инженерии программ) с методами и конструкциями инженерии знаний в одной системе программирования (платформе для разработки программ) позволит, наконец, создавать с их помощью гибкие, удобные, эффективные, понятные пользователю и адекватные для сопровождения и развития интеллектуальные решения (intelligent solutions) для реальных практических задач.
Как это выглядит на практике с точки зрения пользователя такой системы программирования?
Инженер знаний и программ, проектировщик и разработчик такого интеллектуального решения, использует весь арсенал методов представления гибридных знаний (онтологии, фреймы, наборы правил и др.) для формализованного описания предметной области. Для реализации же более традиционных “алгоритмических” компонент он использует конструкции современного, эффективно реализуемого, базового языка программирования (Java, C# и др.), расширением которого является инструментальный язык данной гибридной системы.
Для реализации расширений, предназначенных для представления знаний, используется конвертирование – перевод этих расширений в программу на базовом языке (Java, C# и др.), содержащую вызовы методов специализированной библиотеки (API), также являющейся частью данной системы и обеспечивающей поддержку реализации наиболее сложных по семантике конструкций для представления и обработки знаний.
Для компиляции в исполняемый объектный код полученных в результате конвертирования исходных текстов на базовом языке используется его “штатный” компилятор; например, для Java – компилятор javac, входящий в состав Java Developer’s Kit (JDK) фирмы Sun Microsystems; для C# - компилятор фирмы Microsoft, входящий в состав Microsoft.NET Framework.
Отметим, что идеи и принципы интеграции методов инженерии знаний и инженерии программ получили в последние годы распространение и среди западных специалистов.
Архитектура системы Knowledge.NET
Как уже отмечалось в одной из наших предыдущих работ, опубликованных в журнале, одной из наиболее перспективных платформ для разработки программного обеспечения в настоящее время является платформа Microsoft.NET. Естественно, в нашем коллективе возникла идея разработки современной системы представления знаний на базе данной платформы – системы Knowledge.NET. При ее разработке использован опыт другого нашего проекта для Microsoft.NET – системы аспектно-ориентированного программирования Aspect.NET.
Система Knowledge.NET базируется на одноименном языке, который является расширением языка C# - наиболее современного и развитого языка программирования в настоящее время - концепциями и конструкциями для инженерии знаний.
Система предназначена для разработки и использования библиотек (баз) знаний из разнообразных предметных областей, которые могут проектироваться и реализовываться непосредственно на языке Knowledge.NET (средствами специализированного редактора и визуализатора знаний), а также могут автоматически извлекаться из WWW. В системе предусмотрено конвертирование полученных, сформулированных на языке Knowledge.NET знаний в общеупотребительный формат представления знаний – KIF (Knowledge Interchange Format).
В соответствии с современными идеями и тенденциями, на основе успешного опыта разработки системы Aspect.NET, система Knowledge.NET реализована как расширение (add-in) одной из наиболее современных интегрированных сред современного программирования – Microsoft Visual Studio.NET 2005 (Whidbey). Этот важнейший принцип архитектуры Knowledge.NET обеспечивает возможность применения при разработке баз знаний в системе Knowledge.NET всего широкого спектра возможностей проектирования, разработки и отладки программ, предоставляемых Microsoft Visual Studio.NET.
Система Knowledge.NET состоит из следующих основных программных компонент:
- конвертора с языка Knowledge.NET в базовый язык C# платформы Microsoft.NET (последующая компиляция программ на C#, полученных в результате конвертирования, обеспечивается штатными средствами интегрированной среды Visual Studio.NET);
- редактора и визуализатора знаний Knowledge Editor, обеспечивающего визуализацию, проектирование, реализацию и модификацию в интерактивном режиме исходных текстов баз знаний на языке Knowledge.NET;
- системы Knowledge Prospector извлечения знаний в формате Knowledge.NET из текстов на естественном языке (ориентированную на извлечение знаний из Интернета);
- конвертора KIF Converter знаний из формата Knowledge.NET в общеупотребительный формат KIF.
Язык представление знаний Knowledge.NET
Язык Knowledge.NET является расширением языка C# средствами представления гибридных знаний, основанными на концепции онтологии, предложенной в начале 1990-х гг. в работах Стэнфордского университета (США). Онтология – это разновидность спецификации предметной области, выраженной в терминах ее концептов (понятий) и их взаимосвязей В качестве основы языка представления знаний Knowledge .NET используется фреймовые языки С# Expert и Turbo Expert. Однако, в отличие от обычных фреймовых языков, Knowledge.NET расширен языковыми конструкциями для представления онтологических знаний. Семантика онтологии Knowledge .NET схожа с концепцией языка представления знаний OWL, разработанного W3C консорциумом. Также следует отметить, что в Knowledge .NET используется терминология, принятая в онтологических системах (Concept-Property-Individual), вместо терминологии фреймовых систем (Frame-Slot-Instance).
|