因为AlphaGo的出现,过去的2016年可谓人工智能元年。我记得当时我们在苏州做ThePlatform。下班后,我们讨论,人机对战的真正意义不在于技术的突破,而在于对人固有知识的冲击。人工智能的应用将如雨后春笋般涌现。以后没有人工智能软件,你说话都不好意思。大家都在问,他们的工作和人工智能有什么关系,如何在工作中应用人工智能,如何在软件中植入人工智能基因,从哪里开始使用人工智能,如何学习人工智能。从何说起,更深层次的问题是人工智能能否取代人类。作为程序员,人工智能是否会代替人类写程序……这里结合我们团队的实践,介绍一下人工智能在软件中的应用。人工智能(AI)的目标是增强智能(IA),而不是取代人类。人工智能并不是一个新概念。1940年代,维纳的《控制论——关于在动物和机器中控制和通讯的科学》是人工智能。但早年的人工智能受计算能力的限制,在解决模型的计算速度和精度等方面存在诸多问题。近年来,随着云计算技术的发展,计算机的计算能力得到了提升。同时,随着大数据的发展,更复杂的计算问题可以用更多的数据来修正,人工智能的可用性得到了极大的提升。但是,从人工智能应用的现状我们可以看到,人工智能并不能代替人类。比如图像识别、语音识别等技术的突破,只是让机器变得更聪明,还远没有达到人类的水平。人类智能助手更适合。理清人工智能、机器学习、深度学习、统计学等基本概念之间的关系要将人工智能的方法应用到软件中,我们首先梳理一下几个概念之间的关系:人工智能(ArtificialIntelligence)是一个很大的概念机器学习的目的是让机器像人一样思考甚至超越人类;机器学习(MechineLearning)是一种实现人工智能的方法。机器学习最基本的方法是利用算法分析数据,从中学习,然后分析现实世界中的网络事件做出决策和预测;深度学习(Deeplearning)是机器学习的另一种实现方式。它模拟人类神经网络的方式,使用更多的层,更多的神经元,然后给系统输入大量的数据来训练网络;统计学是机器学习和神经网络的基础知识。从传统分工来看,统计学一般是数学、统计学等专业研究的方向,而机器学习则是计算机科学的研究方向。方向,但目前大家的研究成果越来越趋向于同一个目标。一些统计大师认为,统计实际上已经从事过机器学习工作。对于深度学习和统计方面的专家来说,他们更关注模型、算法等,寻找能够普遍解决问题的方案。对于我们的应用,我们不需要过多考虑具体的算法实现,而是要找到合适的场景,合适的模型,匹配的算法。因此,人工智能的应用实际上是计算机、统计学、知识工程、行业知识。的交叉应用。在经常涉及到的应用中,我一般在处理结构化和半结构化数据时优先考虑传统的统计方法,如分类、数据相关、回归等,而在处理非结构化数据(如图像、视频、etc.),text)优先考虑深度学习方法,但这些方法也需要统计学知识。所以需要补课:线性代数,数理统计,Python,我觉得这本书《机器学习实战》是很好的入门,介绍了以上几方面的知识。人工智能的应用实现增强智能的三个层次人们在应用人工智能时,有一个误区,总希望得到意想不到的结果,即探索新知识。经常有人问我,得到的结果没有什么我不知道的,我说没错,因为你是专家,如果电脑得到的结果都是不可知的,你怎么相信他?比如AlphaGo下的棋,大部分都是为人类所熟知的。在极少数的情况下,出异招,已经是顶级明星级别的了。许多人感到失望。这是什么意思?其实意义重大:(1)计算机可以让普通人快速获得过去专家才有的知识。例如,有经验的客户经理必须非常了解客户的情况。谁需要什么产品等等,不需要电脑。但是,通过用户画像等人工智能手段,计算机可以让经验不足的人也有上述体验。这种做法很有价值,毕竟专家少;(2)帮助专家减少医生等重复性工作在做病理检查时,机器可以提醒医生大部分无病病例和典型病理特征病例,节省医生宝贵的时间。从这个角度来看,我们就会明白,人工智能并不是要取代人类,而是要给人类增加一个智能助手,也就是IAIntelligenceAugmentation。计算机作为智能助手,可以在不同层面和方式上为我们提供帮助。我把它分为三个方面:机械智能、实现意图的智能、创造意图的智能:(1)机械智能我们目前从事的主要工作是这个,提前定好规则(代码也是一个规则),让计算机完成大量的重复计算,充分利用计算机的计算能力,代替人的体力劳动。这是一个以规则为核心的模型,这些规则来自已有的知识;(2)实现意图。聪明的人知道最后的结果是什么,但不会告诉计算机用什么规则来计算。他们通过大量数据训练计算机寻找规律,然后让计算机完成大量的重复计算。计算机找到的规则是什么?什么,有可能人看不懂,其实很多时候是不需要看懂的,把计算机当成一个黑盒子;(3)创意智能是让计算机发现人类不知道的新知识,这是我们最向往的场景。从具体实施来看,第一种情况无疑是最多的,需要提炼和总结规则,用好第一种情况非常重要;第二种情况以前比较少见,但恰恰是需要改进的地方。在这两种情况下,我们往往优先使用统计方法来处理结构化和半结构化数据(比如格式化日志),而使用深度学习方法来处理非结构化数据,这就需要我们的团队具备人工智能思维。人工智能应用实践需要新思维。已经不可能通过理解计算机规则实现智能的方式来实践人工智能,需要在思维上进行调整。我们往往习惯于通过制定规则来指挥计算机,输入的计算规则和输出的结果都是已知的,这就是我上面提到的机械智能方式。但后两种模式不是规则方法,因为规则是由计算机发现的,也就是常说的数据训练。这里我会举一个我们自己实现的例子,让大家明白什么是模型、算法和数据训练。先说说背景吧。当我们梳理现有的企业数据结构时,我们需要建立数据之间的关系。用人来整理,费力又费力。我们打算先用电脑自动完成一部分,然后再人工改正。这是一种增强智能(IA)。)的例子。这里有一种情况,如果数据库中没有建立外键,如何找出实际的外键关系,我们将通过这个例子来说明机器智能和意向智能的方法:(1)使用规则来查找建立外键关系,首先要定义规则。外键关联的规则包括字段类型一致、长度一致、数据相同等,然后遍历所有数据进行匹配。这种方法需要完整的数据,判断是否为外键关系的规则往往有些模糊,在没有获取到全量数据时有一定的局限性;(2)利用统计方法寻找外键关系首先,我们定义字段特征(类似用户画像),字段特征是一个向量,是一个一维数组,包括表名,字段名,字段类型,注释,样本数据的最大长度,样本数据的最小长度等,由于表名,字段名不是数字。我们需要把它们变成数字,可以和同一个标准字符串进行比较,也就是通过移位把字符串变成一个标准字符串。移位次数越少,相似度越高。这样就得到了一个真正的一维数组(向量)。其次,我们取出一些已知关系的表和字段作为训练样本,将两个字段之间的相关系数一一计算(相关系数的计算方法是现成的,这里不再介绍,一旦公式给了,我就晕,Python的发行版Anaconda中就有,用过之后你会发现Python是最好的语言),相关系数高说明特性相似,是标识为外键关系。这时候再做人工判断。如果结果很好,那么模型是正确的。如果结果不好,改变相关系数的计算方法,或者改变数据特征,或者对数据特征进行处理。简而言之,外键特征作为客观存在,我们必须能够找到匹配的特征,这就是数据训练。通过数据训练,找到合适的字段特征(模型)和计算方法(算法),也可以交给计算机去找出所有的外键。你看,这里没有定义的规则。处理方法是让计算机通过数据训练自己找出来。我不需要知道相关系数是什么意思。这就是我上面说的,计算机是一个黑盒子。需要说明的是,在上面的例子中,我简化了很多动作。其实很多不是外键关系的字段一开始就找到了,比如createTime。我们还需要训练这个噪声场的特征来消除噪声。这个例子说明了应用人工智能时两种不同的思维模式。简单的说,不再是通过制定规则来指挥计算机,而是训练计算机自己去找出规则。以上我们分析了相应的人工智能基本概念、人工智能的几种模式以及应用人工智能时需要的思维突破。接下来,我们将从软件架构的发展以及面临的挑战来看人工智能应用的切入点。人工智能的火花在哪里更容易爆发。应对软件架构分而治之带来的集成挑战,探索智能连接。什么是软件架构?在InfoQ发表的《聊聊架构》中说的很清楚(感谢老王,总结的很到位)。软件架构是(1)根据问题确定系统边界;(2)按照一定的原则进行分段;(3)建立不同模块之间的通信机制;(4)整体交付软件功能。可见,架构的关键是分而治之的哲学,但分割是为了方便软件开发、运维,软件的目标是整体交付。分与合是矛盾的。这种矛盾是通过整合来解决的,但整合往往很复杂。是的,大家在架构方面的分享,大多是关于如何划分,如何整合的比较少。集成工作的复杂性影响着系统开发的复杂性。Unix的实践无疑对软件架构产生了巨大的影响。做一件事并把它做到最好一直是Unix风格所提倡的,但“在理想的世界里,Unix程序开发人员只愿意手工制作小而完美的软件宝石,每一个都那么小,那么优雅,那么完美。然而,不幸的是,太多的复杂问题需要复杂的解决方案。只有十行程序,再优雅也无法控制喷气客机。设备太多,通路和接口太多,不同的处理器太多,子系统太多由不同的运营商定义,甚至连基本协议都无法达成一致。即使可以成功地优雅地把航空系统的所有单个软件部分优雅化,但组装的结果很可能是一堆庞大、复杂、糟糕的代码...喷气客机的复杂是不可避免的,过去有一个尖锐的观点,不能为了简洁而牺牲功能,因为飞机必须要能飞,这是事实t航空控制系统不会引发关于复杂性的圣战——Unix程序员倾向于远离(来自《Unix编程艺术》)。不幸的是,我们经常面对的是一个复杂的系统,片面的理解Unix风格的分而治之往往会带来更大的集成难度。为了降低集成难度,我们往往采用单体系统架构,统一设计系统,只在系统内部实现模块拆分,利用代码库和规范约束,走上了一条背道而驰的道路Unix风格。当性能和可维护性压力来临时,这样的系统不得不拆分:我曾经看到,当一个软件系统达到百万行代码规模时,人们会觉得很难维护,拆分的欲望会很强烈;当规模达到代码量达到300万行,人们往往再也无法抗拒拆分的欲望;当达到500万行代码的规模时,再保守的组织也会做出拆分的决定。软件架构中复杂的集成工作需要通过人工智能来简化。回顾解决集成问题的历史,我们会发现更早的集成架构模式来自Unix,也就是众所周知的管道(Pipe)模式。Pipe模式将数据传递到任务序列中,pipeline扮演管道的角色,在这里处理数据,然后传递给下一步。流水线模式作为最基本的方式,理论上可以解决所有的集成问题,但涉及到具体问题时,需要根据不同的情况来处理。针对各种复杂的情况,可以归纳出更多的模式,在(EIP)一书中,围绕消息集成总结了多种集成模式,可谓是对消息集成的综合总结。而EIP的集成模式主要是针对系统间后台服务的集成。SOA架构提出了Portal(前端集成)、BPM(流程集成)、ESB(服务集成)、DI(数据集成)和事件/消息集成的多层次方法。整合体系更加系统地为整合工作提供指导。SOA集成方式需要一系列集成基础设施支持,属于集中式集成方式。我们可以称它为MiddleBox方法。微服务架构提出后,我们会把集成逻辑和业务功能一起部署。这种去中心化的集成方式可以称为MiddlePipe模式。积分法一路进化,主要是积分法的不断革新。越来越多的框架和基础设施已经解决了非功能性需求。比如ESB可以解决路由、安全、流控等问题,一定程度上减少了集成的工作量。然而,综合业务仍然存在许多复杂性。这里我列举几个常见的问题:(1)数据搜索问题鉴于业务需求,需要使用现有的数据和服务,但是在企业环境中,系统、服务、数据有那么多(想象一下有10万多个服务和10万多个数据标准),要找到试用服务和数据不是一件容易的事。一般我们要依靠专家在这方面的知识,规定数据的流向,这要靠专家的能力,专家的能力是慢慢积累的。我们需要帮助企业更快地找到数据和服务,帮助专家快速积累,减少重复劳动。(2)数据适配问题是通过服务集成的,原子服务往往需要大量的输入参数。例如,调用一个发送短信的接口,不仅包括收件人的电话号码和短信内容,还有许多具有业务意义的参数,如发件人姓名、单位、发送系统、发信原因、发送渠道等。客户通过其联系客户(客服渠道、网点渠道、网银渠道、自助终端等)的密码、验证码、发送时间等进行安全验证;优先级、发送通道等用于流量控制;序列号、全局业务ID、请求ID、请求时间等用于监控。以上信息来自每条短信的上下文。在实际开发期间,需要进行大量的赋值和转换工作,将上下文信息传递给服务。这种转换就像下图。典型的面是水多,水多加面条。我们需要根据当前的上下文和服务特性自动进行一些适配,避免人工的重复工作。(3)系统联动问题当一个业务事件发生时,有很多相关系统需要做出关联响应。例如航班延误,会涉及机票改期、酒店改期、接机服务改期、会议安排变更、行程变更等。一般我们会设计一个事件中心,为各个系统开发监控程序,判断事件到来时的上下文信息,决定要产生的动作。如果没有预先设定的规则,就不会有联动。我们期待更自动化地建立这种联动关系,让计算机智能地产生动作,而不是仅仅通过人为设置。类似的问题还有很多,期待更多的智能融合。需要集成的部分不仅仅是软件本身,软件过程也是一个复杂的集成/协同工作。分而治之的软件需要通过集成作为一个整体交付。软件生产过程也是一个多人、多组织协作的过程,同样需要集成。如果把软件看成一个产品,这个产品有规划、研发、运营、退出等各个阶段,每个阶段可能由不同的人或组织完成。软件开发阶段是每个项目的实施过程,包括项目立项、实施和完成。这样一个过程被组织成一条软件生产流水线。从早期的瀑布式软件开发,到后来的敏捷开发流程、CMM,再到现在风头正劲的DevOps,都是在解决软件生产线不同阶段的协同问题。敏捷针对软件定义、设计和构建(开发)阶段。协作,持续集成是构建(开发)和测试阶段的协作,持续交付是从定义阶段到部署(交付)阶段的协作。协作面临的问题是整合问题。我们能想到的很多,这里举几个例子:(1)需求、设计和构建(开发)的沟通问题:我们需要映射需求/设计的知识,并且项目能够自动适应开发工作一定程度上,减少从需求/设计到代码的转换工作;(2)构建(开发)与测试的沟通:我们需要自动生成测试用例和测试方法;(3)运维沟通问题:我们需要通过应用画像、资源画像等建立服务与物理资源的联系,快速定位问题,进行容量预测,实现更智能的运维。人工智能在软件架构中的应用目标:通过增强智能,实现软件系统与软件工程的智能连接,应对复杂集成的挑战。我们可以引入人工智能的思想,将人与软件、物与软件、软件与软件、软件生产线的各个环节通过知识赋能的方式进行整合。在完全依赖规则进行集成的传统方法的基础上,采用了一种新的集成方式:以上下文信息为输入,利用专家已有的知识,通过数据训练和强化学习,使计算机理解集成的意图,成为我们的智能助手,帮助我们实现智能连接,进而让计算机探索新的连接知识。在这里,我也把连接分为三个层次:机械连接、知识连接、创造性知识连接。从智能连接开始,探索从哪里开始应用人工智能在软件架构中,探索人工智能在软件中的应用,是大家最关心的话题。让我们做一个介绍。朴元董事长刘亚东博士早年一直从事神经网络的研究。他指出,在并行计算等技术全面发展的今天,算法不再是人工智能的瓶颈。人工智能的应用需要两个突破口:(1)找到人工智能应用的切入点(2)团队有人工智能应用的思维。所以,我们在应用人工智能的时候,并不是成立一个专门的小组来做研究,而是一种百花齐放的方式。了解普源的朋友就会知道,普源的研发分为几个团队:云计算&SOA、大数据、移动、工程效率与技术平台、产品支撑中心。我们让每个团队从数据+连接的方向出发,在各自领域探索人工智能的应用场景,通过寻找切入点和初步实践,逐步建立团队的人工智能思维。其中,云计算&SOA团队的方向是通过服务画像解决微服务的智能运维和智能匹配,大数据团队的方向是通过知识图谱实现数据自助服务,方向移动团队的重中之重是智能化开发UI,提升工程效率。技术平台团队的方向是深度学习在过程和智能制造中的应用。限于篇幅,这里只介绍濮院大数据团队和移动团队所做的工作。案例一:基于知识图谱实现数据自助服务能力首先简单介绍一下背景:你经常听到有人问我们有什么样的数据,数据在哪里,如何获取数据,能不能搭建平台这样我们就可以像百度搜索一样,根据自己的知识(业务术语)找到相关数据,提交申请,获取数据。这是获取数据的自助服务。过去,数据往往是人工整理的。我们希望将其自动化,为专家提供一个智能助手。这里的工作分为三个部分:(1)构建知识图谱。人们通过商业术语(知识)搜索数据。搜索,和知识是相互关联的,比如fruit和tomato有下位关系(后者是前者的具体体现),搜索除了罗列直接的结果外,还需要展示一些相关的知识,这就是要构建一个知识图谱。简单来说,知识图谱就是概念、属性、概念之间的关系。这种关系可以手动建立。我们可以通过使用自然语言处理和其他方法从政策、法规、要求、数据库评论和接口等各种来源来建立它。部分知识图谱辅助专家工作;(2)梳理技术元数据,梳理各系统内部数据及数据之间的关系,形成数据地图。这里的难点是数据之间的关系,比如数据的血缘关系、影响关系、关联关系、主数据关系等。这里结合字段特征的关联、数据处理逻辑的词法/语法分析等用strengthen来完成学习,上面列出的查找外键的例子是其中的一部分;(3)建立知识图谱与技术元数据之间的关系这里,必须通过分析接口/服务与代码之间的关系来建立映射关系。最终效果是使用数据搜索,输入要查找的业务术语,得到相关结果,查看样本数据,如果是需要的数据,提交使用申请,如果不是,根据相关知识继续挖掘数据.提供数据自助服务能力是在应用程序设计者、数据科学家或业务分析师与数据之间建立连接。我们团队从连接的思想出发,找到了人工智能的切入点。事实上,数据自助服务包括查找、获取、使用等多个环节。我这里说的是如何实现查找的链接。这种查找方法不可能100%准确。学习和其他方法也在不断地被修正。可见,人工智能的应用也是一个逐步完善的过程。案例二:通过深度学习实现移动端UI的智能化开发移动端UI的智能化开发是我们移动团队应用人工智能的第一次尝试。现在看来是为了在UI设计师和开发工程师之间建立联系。你会发现,当设计师的设计转化为代码实现时,总会有偏差。即使是一个像素的差异,也会影响界面的效果。过去我们采用不同的业务模板,建立一些规范来约束设计和开发,后来移动团队觉得可以利用深度学习做一些尝试,寻找不同的界面设计效果。首先通过数据标签确定页面的风格,然后通过图像片段学习识别设计稿中的组件。最后,经过多次处理,变成树状结构,将树状结构映射到代码上,生成与设计图一致的代码。在这种情况下,基于图像的神经网络学习是一个关键技术,但是如果单纯使用这个技术,计算量会难以承受,所以我们把处理过程分成几个阶段,每个阶段都进行分类,每个阶段都可以是配合强化学习的方法,手动指定策略来??指导计算机的学习,提高了工程能力(深蓝对战卡斯帕罗夫时也采用了类似的方法,有超级高手会指导深蓝的当前的策略,比如攻击还是防御,具体招数由深蓝决定)。在以上两个案例中,我们首先在各个领域找到了可能的切入点,针对不同的场景使用了不同的解决方案,并不是都使用了深度学习/神经网络的方法。我们不是从Tensorflow等框架学习,而是优先在结构化和半结构化数据中使用统计方法,然后在非结构化数据中使用深度学习。而是以业务驱动的方式逐步推进,有效避免了“深度泛滥”。综上所述,未来的软件一定是人工智能软件,但人工智能是通过技术手段实现智能增强,帮助普通人快速掌握部分专家的技能,帮助专家减少重复劳动,探索新知识,而不是取代人。而这种探索既包括传统规则实现的机械智能,也包括统计和深度学习方法支持的意向智能,以及创造意向/发现新知识的探索,统计方法常被使用在结构化数据和半结构化数据之间,深度学习经常使用非结构化数据。简而言之,人工智能是计算机科学、统计学、知识工程和领域知识的交叉学科。不能从某个角度去理解和尝试,正所谓“君子不器”。
