白话智能体编程Word格式文档下载.docx
- 文档编号:17282991
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:11
- 大小:31.68KB
白话智能体编程Word格式文档下载.docx
《白话智能体编程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《白话智能体编程Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
Class发票具有一些数据(日期,金额)和操作(效验,保存),Class员工也具有一些数据(姓名,职位)和操作(上班,下班),从映射的角度来看,任何现实世界的实体都是数据和操作的集合。
但实际上,在现实世界中,发票和员工还是有区别的。
区别在哪里呢?
在于发票是一个物体,而员工是一个有心智的实体。
发票类的方法只能是被动地被调用,如果我们不调用,任何一张发票都不会自动的进行效验或者保存。
而员工的方法调用与否,是由员工自己来决定的。
今天生病了,不高兴上班,上班操作就不会被执行,今天任务重,他就会自动执行加班这个操作。
换句话说员工类的操作不是被动调用的,而是自发完成的。
这种只能被动调用和自发执行的区别,归结一下其原因,是因为员工具有自己的心智,而发票是没有的。
传统的OO并没有引入这个区分,而这种区分的却失所造成的结果就是所有的操作都是被动地等待调用。
虽然我们也可以引入计时器,或者多线程技术来模拟主动操作,但这种并不完全贴合现实世界的设计思路是不是让各位隐约感觉有些不爽呢。
痒处二:
同步和异步被人为地剥离。
上面讲的是OO对有些东东没有区分,这点说的是OO对某些东东又多余地加以了区分。
比如,现实世界中,老师对同学们说:
“请把书翻到78页。
”老师并不需要知道翻书这个操作对于同学们来说是同步操作还是异步操作,他并没有说“请把书同步地/异步地翻到78页。
”换句话说,翻书这个操作是同步还是异步,对于调用者(老师)来说,是不需要知道的,同学们知道就OK了。
但是影射到OO世界中,对于调用者来说,他在调用的时候,就必须知道是同步调用还是异步调用。
归纳起来说,在现实世界中,调用方式这种知识,是被调用方拥有的,而调用方是不需要考虑的,但在OO世界中,这个知识由被调用方转移到了调用方。
Somethingisdifferent。
体会一下,这种差异会带来什么样的问题。
痒处三:
无法自然地模拟现实世界中的感知能力(Sensebility)。
举个烧菜的例子来说明感知能力。
老妈教俺烧菜的时候,常用的语法是:
“当什么什么的时候,就怎么怎么样”。
比如:
当水烧开的时候,把肉放进去;
当鸡块炸至金黄色的时候,捞出锅来。
这就是感知能力的例子。
鸡块作为感知源,它的属性可以发生变化;
俺作为感知器,可以捕捉到鸡块的颜色这个属性的变化。
如果鸡块的颜色由肉色转变至金黄色,俺就必须做出相应的操作/处理:
把鸡块捞出锅来。
这种感知能力在现实世界中是非常普遍地存在的,然而映射到OO世界中来,却显的有些别扭。
如果我们将鸡块和人构造为两个Class,要想人能感知到鸡块上某个属性值的变化,首先想到的是使用观察者(Observer)模式,在.Net平台下呢,则是在鸡块类中构造一个delegate,然后将人的某个操作挂到这个delegate上,当鸡块颜色值发生变化的时候,触发这个delegate。
这种方式至少存在三个让人感觉别扭的地方:
l鸡块就是鸡块,为什么鸡块这个Class里面要包含一个额外的delegate呢,这个delegate的存在对于实现鸡块这个class本身的逻辑来说没有任何意义,对于鸡块的逻辑而言,这个delegate是完全多余的,这还只是颜色属性上的delegate,不难想像,如果外界还有其他Class需要感知鸡块类其他属性上的变化,会有更多的delegate,更多的与鸡块本身逻辑不相干的代码出现。
l注意到一个比较细节的问题。
俺在看到鸡块颜色变为金黄色后,执行的操作是把鸡块捞出锅。
这个“捞出锅”的操作,是由俺的心智来完成的,不是受鸡块的心智指挥,它自己蹦出锅来的。
而在上面提到的使用delegate的解决方案中,我们把“捞出锅”这个操作挂载到delegate上,则“捞出锅”是由鸡块当前占用的线程来执行的,如果将线程理解为心智的话,则意味着是由鸡块的心智控制着人将自己捞出锅。
是不是很诡异J更直白地说法是:
应该有一个线程来处理鸡块颜色的变化,另外再有一个线程来收到颜色变化的通知,并执行“捞出锅”的操作。
这里有同志应该说了:
也好办,把delegate的机制修改为多线程的就OK了!
的确是这样,但需要注意的是要保持多线程机制对鸡块和人的透明性,如果因为需要贴近现实世界而增加Class的复杂性,那也违背了我们的初衷。
l最后一个问题比较有意思。
在现有的delegate解决方案中,我们只能针对实例(Instance)进行注册,而不可以针对类型(Type)进行注册。
什么概念呢?
比如锅里面有十个鸡块,俺得把“捞出锅”这个操作到这十个鸡块上依次注册一遍,才能保证每个鸡块在适当的时机被捞出来。
是不是觉得和现实世界中的实际情况有些出入J如果能够提供针对类型的注册机制,只要将俺的后续操作到鸡块类上注册一次,在感知范围内的所有鸡块,管他是十块还是二十块,都能被俺感知到颜色上的变化并执行正确的后续操作,这样会来的更简洁,更自然。
上面罗罗嗦嗦给OO挑了些毛病。
实际上归纳起来就一句话:
OO并不是对现实世界最贴切地模拟。
而软件世界的终极目标是为了模拟现实世界,既然OO并不是最贴切的模拟,问题也就暴露出来了,改进的余地也就显现出来了。
怎么改进?
轮到Object的接班人Agent出场了。
进入Agent世界-什么是Agent?
在前面的讨论中,说道了一下Object让俺们感觉不是很爽的地方。
总结下来:
OO并不是对现实世界最贴切的模拟。
那么什么东东可以比OO更加贴近地来模拟现实世界呢?
就目前看来,还是Agent可以担当起Object接班人的这个角色。
这里多插一段话。
俺们可以注意到,不论是Object还是Agent,他们都有比较深的理论渊源,同时以指导实际软件开发为其价值导向。
目前在软件开发过程中,俺们大量地使用着Object的概念,所以前面讨论凡是涉及到Object的,俺们都尽量使用开发人员熟悉的语境来描述,比如同步方法,异步方法,.Net平台中特有的delegate等等。
而目前围绕Agent的工作大部分还停留在理论研究或者实验室原型的阶段,所以在下面关于Agent的讨论中,理论学术(白话:
纸上谈兵)的味道会略为浓一些。
俺会尽量结合同志们熟悉的生活中的例子来解释这些理论上的东东。
俺们遇到的第一个问题是Agent的定义是什么?
这其实是一个蛮无聊的问题,能够在纸上默写出Agent的定义并不代表这位同志已经深刻地理解了Agent的含义。
但这里还是罗列一下前辈们给出的若干关于Agent的定义。
从五花八门的定义中俺们也可以体会一下Agent这个概念所包含的内涵的丰富性。
1.TheMuBotAgent"
Thetermagentisusedtorepresenttwoorthogonalconcepts.Thefirstistheagent'
sabilityforautonomousexecution.Thesecondistheagent'
sabilitytoperformdomainorientedreasoning."
这个定义强调了Agent的自动执行能力和推理能力。
2.TheAIMAAgent"
Anagentisanythingthatcanbeviewedasperceivingitsenvironmentthroughsensorsandactinguponthatenvironmentthrougheffectors."
不知道给出这个定义的前辈是不是搞生物学的,怎么看Agent都像是由细胞核和一堆毛须组装成的原始生命体。
3.TheMaesAgent"
Autonomousagentsarecomputationalsystemsthatinhabitsomecomplexdynamicenvironment,senseandactautonomouslyinthisenvironment,andbydoingsorealizeasetofgoalsortasksforwhichtheyaredesigned."
这个定义比较复杂一点,他强调了Agent与外界环境的关系,也就是说Agent的存在是为了某个目的/目标而感知并且改变环境。
在后面会介绍到,这是区分Agent和普通程序的一个重要依据。
4.TheIBMAgent"
Intelligentagentsaresoftwareentitiesthatcarryoutsomesetofoperationsonbehalfofauseroranotherprogramwithsomedegreeofindependenceorautonomy,andinsodoing,employsomeknowledgeorrepresentationoftheuser'
sgoalsordesires."
IBM给出的定义就少了一些学究味,多了些实用至上的气息。
认为能够自动完成某种指定任务的软件体,都可以当做Agent。
5.TheFAQAgent["
ThisFAQwillnotattempttoprovideanauthoritativedefinition..."
老外搞笑起来,也是一流。
6.TheFavoriteAgent“Anautonomousagentisasystemsituatedwithinandapartofanenvironmentthatsensesthatenvironmentandactsonit,overtime,inpursuitofitsownagendaandsoastoeffectwhatitsensesinthefuture.”个人比较欣赏这个定义,纯理论的东西没功夫去搞,纯实践的东西没兴趣去搞,而这个定义试图在理论和实践之间找到一个平衡。
。
沿着探究Agent本源这个话题继续聊下去,眼前会出现好几条不同的脉络/线索。
比较有意思的是那些搞人工智能的同志们,他们热衷于使用Agent的概念来拟合人的行为和思想,他们更愿意从生物/生命的角度来描绘软件世界中的Agent。
所以他们使用了很多心理学上的术语/符号来刻画Agent,比如信仰(Belief),Intention(意图),义务(Obligation)等。
这些同志的精神和境界是值得俺们尊敬和向往的,但作为大规模商业软件开发流水线上一枚微不足道的齿轮,俺更关心的是将Object替换为Agent后,代码量会节约多少行,项目工期会缩短多少天,这类和薪水/年终奖挂钩的实际问题。
基于此考虑,俺决定选择一种相对比较practical的方式继续向同志们介绍Agent的概念。
Michael在他的论文IntelligentAgents:
TheoryandPractice中给出了一个Agent的弱定义(这还只是个弱的!
强的就免了)。
他说满足下面四个条件的东东,就可以称为是Agent:
lautonomy:
agentsoperatewithoutthedirectinterventionofhumansorothers,andhavesomekindofcontrolovertheiractionsandinternalstate;
自治性,也就是下面俺们将要谈到的独立心智。
lsocialability:
agentsinteractwithotheragents(andpossiblyhumans)viasomekindofagent-communicationlanguage;
社会性,这点俺并不认为是Agent的本质特性,一个独立存在的Agent难道就不是Agent了吗。
一位生活在孤岛上的同志难道就不是Human了吗。
之所以拎出这点来,俺估计Michael的考虑是:
单个的Agent的存在是无意义的,只有处于群体中的Agent才能体现它的价值。
lreactivity:
agentsperceivetheirenvironment,(whichmaybethephysicalworld,auserviaagraphicaluserinterface,acollectionofotheragents,theINTERNET,orperhapsallofthesecombined),andrespondinatimelyfashiontochangesthatoccurinit;
反应性,能够接受外界的输入信号,并且做出相应的反应。
lpro-activeness:
agentsdonotsimplyactinresponsetotheirenvironment,theyareabletoexhibitgoal-directedbehaviourbytakingtheinitiative.主动性,或称目标驱动,这是Agent很重要的一个特点。
依据当前的环境和自身的心智,Agent可以主动地执行某种操作或者任务。
举例来说,大家都熟悉的WebService,不论WebService能够提供多少服务,计算能力多么强,它都不是一个Agent,因为它是被动地,而非主动地提供服务。
上面罗列了一堆Agent的定义。
俺们除了敬仰前辈大师之外,还可以尝试着归纳一下Agent的本质。
定义可以传递给俺们的信息是:
什么是Agent;
而本质可以传递给俺们的信息是:
什么不是Agent。
从这两个角度来把握一个概念,基本也就八九不离十了。
Agent的本质是什么?
个人观点:
拥有可以与外界交互的独立心智。
解释一下这句话的含义。
这句话包含了两个层面的内容。
一)独立心智。
心智是什么?
心智就是逻辑,由百万个判断语句组成的复杂逻辑是心智,一个if语句,甚至一个顺序执行语句,本质上来说也是心智。
说到这里有同志会觉得不对劲了,如果心智就是逻辑的话,那么MIS系统中的发票类也是具有心智的啦,发票类里面也包含有逻辑代码嘛,而且还蛮复杂的呢。
对的,发票类是具有逻辑,或者称为心智,但是他不具有独立的心智,什么意思呢?
发票类中的逻辑是否执行,何时执行,不是由发票类自己决定或者控制的,这点很重要。
比如,发票类有个逻辑(Method)可以将自己序列化为一段XML,当外界调用发票的这个Method的时候,发票是不可以说,“俺正烦着呢,待会再给你序列化”,发票的序列化操作会被立即执行,而且是无条件的。
所以说发票类并没有独立心智,因此发票类是不可以视为Agent的。
二)与外界交互。
交互这个词用得涩了点,其实白话就是输入输出,能够捕获/感知到外界环境的变化(输入),并且做出相应的反应(输出),就OK了。
从这个角度来理解,如果一个东东,它慧根再怎么发达,再怎么我行我素,但自我封闭起来,不接收外界的任何信号,也不对外输出任何信号,那它也不可以称为是Agent。
这里有同志也许会说:
“同学,这个定义条件未免太弱智了点吧,你倒是找一个完全封闭的软件出来俺我看看啊”。
俺还真能给你找一个出来。
注意到的是“交互的”,这个相应的意思是根据外界的条件,输出是可以变化的。
写一个简单到只包含一行语句的程序:
(“HelloAgent”);
不管外界是刮风下雨,不管机器是386还是X86,不管内存是256M还是2G,只要这个程序执行,它的输出就是”HelloAgent’。
这个程序的确是有输出,但不是根据输入而得到的“相应的”输出。
所以这个只包含一行代码的程序并不是Agent,它只是一个Program。
关于Agent的本源,其实是仁者见仁,智者见智的一个概念。
俺在这里白话一番,基本上是起个抛砖引玉的功效,并不是讲这就是绝对正确的。
针对不同的背景,环境或者应用场合,俺们可以将Agent的本质理解为不同的东西。
最重要的是,理解深刻了,领悟透彻了,一定要能解决实际问题,一定要在实际开发中派上用场,否则就不是白话,而是白谈。
提供几个有意思的Topic供同志们消遣。
l计算机病毒是Agent吗。
l在以往设计的软件系统中,有没有见到过Agent的影子。
l什么样的软件系统,Agent最能派上用场。
前段时间一直周旋于各种有趣且辛苦,或者无趣且更辛苦的事情当中,虽然其间也切换到其他好些不同的技术领域,但一直没有放弃在AOP方面的关注思考.前面之所以没有能接着AOP这个话题继续和大家聊下去,是因为感觉自己没有足够的精力和空闲来将这些想法沉淀下来,并回锅为简单直白,易于消化和理解,并能引发思考的东西.这几天,出差在外,工作之余免去了灶台内外的忙活.油烟味少了,人也觉得清爽许多;
闲暇多了,就免不了想爬爬格子.OK,闲话到此为止,就让我们继续AOP的白话之旅吧J
简单回顾一下前一段旅程(,,),在前面我们简要介绍了什么是Agent,这个东东的来由,以及与其他重要概念,如Object的区别.如果说前段理论之旅展现的奇异风光令我们心神荡漾,那么接下来的实践之旅就会又把我们拽回到繁杂而精密的软件世界中.
在前面也有介绍过,目前好像还没有一个专门针对AOP的IDE,这对于急于操练一把AOP的同志来说是个不大不小的尴尬.不过好在Agent也是由Object脱胎而来,基于目前的OOP语言,我们也可以来过一把AOP的瘾.这里我们选择的是.Net平台下的C#.为什么要选择C#,,,,因为如果使用Java,文章也就不会发在这里,justjokingJ理论上说,任何OOP语言,Java,Delphi,C++,都可以作为哈里.波特同学手中的魔法棒,点化出妙不可言的Agent.之所以选择C#,是看中他的优雅和简洁(补充一句,直到现在俺依然固执地认为Delphi是最优雅的语言,虽然Borland迫于生计不得不出售整个IDE部门,但俺依然决意守望Delphi,直到Delphi的桅杆没入海平面的最后一刻…)
翻翻讲述Agent理论的书籍就可以查到,一个为理论界所接受的Agent需要具有如下若干特征:
l代理性(ActionOnBehalfOthers)
l自制性(Autonomy)
l主动性(Proactivity)
l反应性(Reactivity)
l社会性(SocialAbility)
l智能性(Intelligence)
l合作性(Callaboration)
l移动性(Mobility)
Mygod!
光把这些名词理解一遍就让人头大了.不多解释了.简单点,Simpleisgood.我们现在不需要迎合理论家挑剔的口味,只需要创造一个具有不完全特性的Agent.女娲同学造人的时候还不是就地取材,捧着坨泥巴就捏上了J另一方面,作为整个AgentWorld的缔造者,我们必需意识到这样一点:
上述这些特性,是分层次的,比如反应性,和自制性,这应该是位于Agent心智(Mind)最底层的特性;
而社会性,智能性,合作性等,则应该属于Agent的高级心智,需要其他心智能力的支持.在由混沌到开天地的最初步骤中,我们只需要实现最低层次的Agent心智即可.
综合以上考虑,在我们捏出的第一个Agent身上,可以看到如下几种心智:
l同步异步的统一和同类群组
l对外界变化的感知
l时间驱动
l移动性
下面我们来逐一审视这些貌似简单,却可能蕴含无限组合及演化能量的心智要素.
同步异步的统一和同类群组
前面聊到说,我们有认识到Object世界存在着”同步和异步被人为地剥离”的尴尬,“同步异步的统一和同类群组”则是Agent世界对这一尴尬的解答.在我们的Agent世界中,AgentA1呼唤AgentA2协助其做某件工作M1,并不需要了解到A2做这件事情是同步在做还是异步在做,这是同步异步的统一;
更进一步,如果这件事情,和A2具有同样能力的好几个Agent都可以来做,那么A1更不需要知道到底是哪一个具体的”A2”在做这件工作.有点抽象噢?
Ok,这好比现实生活中的一个例子:
领导曰”上午10点让司机过来接我去开会”.领导作为一个Agent,他不需要了解司机这种Agent10点开车到楼下是同步行为还是异步行为(当然司机自己要清楚),也不需要了解开车过来的是单位上的哪个司机,小王or小张?
这是领导需要关心的事情吗?
他只需要知道10点下楼,就有个司机在那候着.用程序语言来描述:
Boss的执行代码就是:
(10:
00)
Driver的代码:
classDriver:
Agent_XXX
{
[AgentMethod,]
publicvirtualvoidComeHere(DateTime
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 白话 智能 编程