运用AI搭建中间服务层(一)

知识点

  • 适用于 AI 的 Visual Studio 工具

  • 微软认知服务(影像服务/实体搜索服务)的使用

  • 商业应用软件的架构设计

  • ASP.NET 核心 Web 应用程序

  • 休息 应用程序接口

  • 服务端的测试技术

  • 软件工程中的需求演进处理

不断演进的应用场景

下面我们会用讲故事的方式来说明这个问题,人物和情节纯属虚构。

初级应用场景—宅在家里

场景:Bob同学有一天在网上看到了一张建筑物的图片,大发感慨:“好漂亮啊!这是哪里?我要去亲眼看看!”Bob同学不想问别人,可笑的自尊心让他觉得这肯定是个著名的建筑,如果自己不知道多丢脸!怎么解决Bob同学的烦恼呢?

我们看看微软认知服务是否能帮助到Bob同学,打开这个链接:

具有 OCR 和 AI 的 Azure AI 视觉 | Microsoft Azure

向下卷滚屏幕,到“识别名人和地标”部分,在“图像URL”编辑框里输入了这张图片的网络地址,然后点击“提交”,一两秒后,就能看到关于这张图片的文字信息了(见下图),原来这个建筑叫做“Space Needle“!但是呢,不太人性化,因为是JSON文件格式的,幸好Bob同学是个程序员,Bob同学想把这个场景做成一个实际的应用,以帮助他人解决类似问题。

Bob同学刚学习了微软认知服务的应用教程,于是打开Windows 10 PC,启动VS2017,安装了Visual Studio Tools for AI后,先在Server Explorer->AI Tools->Azure Cognitive Services上点击鼠标右键,Create New Cognitive Service,API 类型选择ComputerVision (如果已经有了就不需要重复申请了),得到了Key和Endpoint,按照教程所讲述的过程,花了一两个小时,就把应用做好了。

开发技术文档在这个链接里面。

目前Bob的同学的应用架构是这样的:

中级应用场景—出门在外

Bob同学很满意地试着自己的作品,长城,天安门,故宫......但是,Bob同学忽然想到,如果出门在外遇到一个漂亮建筑,没有PC,只有手机怎么办?于是Bob同学又启动了VS2017,创建了一个Xamarin项目,重用了PC上的code,把这个场景搞定了:拿起Android或者iOS手机,对着建筑物一框,几秒后就会有结果返回,告诉用户眼前的这个建筑叫什么名字。太方便啦!

所以,Bob同学的应用架构进化了一些:

高级应用场景—扩展信息

Bob同学用手机给很多同学们安装后显摆了几天,有人问他:“Space Needle是啥?”

"这个......这个......哦!你可以在Bing上搜索一下啊!”

"你的程序能不能顺便帮我们搜索一下呢?"

"嗯......啊......当然啦!“硬着头皮说了这句话后,Bob同学赶紧回去查微软认知服务的网站了。宾果游戏! 在这里了:

https://azure.microsoft.com/zh-cn/services/cognitive-services/bing-entity-search-api/

与前面的教程里描述的类似,申请了搜索服务后,也得到了Endpoint和Key,照猫画虎地把客户端改了一下,增加了搜索服务的功能,衔接到了地标识别逻辑的后面,也就是把地标识别的结果“Space Needle“作为关键字传送给实体搜索服务,然后再把结果展示出来。

注意这里要申请的API在Bing.Search.v7里面,技术文档在这个链接里面。

于是Bob同学的应用架构变成了这个样子:

这个图的连接线看着好奇怪,黄色的线为什么不连接到左侧的客户端上呢?这里特意这样画,为了表示黄色的连接(REST API调用)是接在蓝色的连接之后的,有依赖关系。在下一个场景里,大家会看到更复杂的例子。

终级的应用场景—并发处理

在一阵手忙脚乱的部署之后,所有的同学的手机都可以使用这个新App了,Bob同学很自豪。这时,学习委员走过来了(也是体育课代表),问Bob:"出门旅游的机会不多,我想用这个App做更多的日常的事情,比如扫一张照片,就能知道这个明星的名字和背景资料,或者是照一件衣服就能知道在哪里买,还有看到一个电话号码后,想用手机扫一下就能记录下来......这些能办到吗?"

Bob同学边听边镇静地点头,其实后背都湿透了,嘴上不能服软:"我回去想想办法吧!"

Bob同学翻阅了微软认知服务的所有技能,在纸上画了一个草图,来解决学习委员的问题:

同时有三根蓝线都从同一个客户端连接到不同的认知服务上,是因为客户端程序并不知道要识别的物体是建筑物呢,还是人脸呢,或是电话号码呢?需要一个个的去尝试调用三个API,如果返回有效的结果,就代表识别出了该实体的类型。

画完图后,本来以为会轻松的Bob同学,忽然发现他需要不断更新三个客户端的代码:PC,Android,iOS,来满足更多的学习委员的需要(如同右侧那个上下方向的箭头一样是可扩充的),然后再分别发布出去!并且他意识到了另外一个问题:每个客户端需要访问认知服务四次才能完成这个场景!不但网络速度对用户体验造成了影响,而且流量就是钱啊!如果将来需要支持更多的识别类型,连接线的增长速率将会是几何级别的!

怎么办?

重构

Bob同学想起了刚买到的《构建之法》第三版,仔细阅读了第9,10,11三章,明白了一些基本的概念:

  1. 需求是不断演进的,任何一个软件都需要不断迭代

  2. 定位典型用户(学习委员)和常用场景(出门旅游还是宅在家里)

  3. 在需求分析阶段,要搞清楚在现实世界里,都有哪些实体,如何抽象出我们真正关心的属性和方法

  4. PM/用户提出的需求,程序员需要认真理解,深入到实际问题中进行抽象,找到实体和属性/方法在软件系统中的表现,构建框架,然后再编码(想明白了再动手,不能头疼医头,脚疼医脚)

“我要重构!”房间里响起了Bob同学的呐喊声。

小提示:需求的"演进"与"变化"是两回事儿,不要混为一谈来掩盖项目经理对需求的分析与把握的不足。简单地举例来说,当项目经理说"地标识别看上去很少有人用,废掉吧,咱们做个名人识别",这个属于需求变化。

认知服务应用构建方式

两种构建方式的比较

微软认知服务应用方式有两大类:

  • 用客户端直接访问认知服务

  • 客户端通过中间服务层访问认知服务

第一种模式很好理解:微软认知服务7x24小时在云端提供服务,开发者在智能手机或者PC上编写客户端应用程序,调用REST API直接访问云端。但是这种模式有一些潜在的问题,如:

  • 客户端代码量大逻辑复杂

  • 客户端需要密集发布并持续维护

  • 客户端与服务器端耦合度高

  • 客户端多次访问服务器

  • 网络安全性低

无论客户端有多少,依赖的认知服务有多少,其实还是下图所示的模式:

目前Bob同学就是使用这种方式,来不断演进他的应用,终于遇到了棘手的问题。

为什么呢?因为客户端一旦发布到用户手里,对发布者来说就比较被动了,需要非常小心地维护升级,每次都要全面测试,测试点多而复杂。即使有应用商店可以帮助发布,但要把所有用户都升级到最新版本,还是需要很长时间的,这意味着你还需要向后兼容。

第二种模式可以用简单的图来表示:

有规模的商业化应用,一般都采用这种模式搭建应用架构,以便得到以下好处:

  • 客户端代码量小逻辑简单

  • 客户端不需要密集发布和维护

  • 客户端与认知服务的耦合度低

  • 客户端单次访问服务器

  • 网络安全性高

拉个表格,一目了然:

直接访问模式中间服务层模式
客户端代码量大,逻辑复杂量小,逻辑简单
发布与维护密集,改一点儿东西都需要重新发布新版本中间层服务能屏蔽大量逻辑,不需要在客户端代码中体现
客户端与认知服务的耦合度极高很低
客户端与认知服务的通信量频繁,多次单次
对认知服务密钥的保护低,用Fiddler就可以“看到”认知服务密钥高,把费德勒叫来也不行
服务器端代码
多种客户端支持复杂简单

如果有了中间服务层,客户端的工作就简化到只做与中间服务层通信,提交请求,接收数据,用户交互等等,而复杂的商业逻辑,可以在中间服务层实现。而且在更新业务逻辑的时候,大多数情况下,只需要修改中间服务层的代码,无需更新客户端。

对于多种客户端的支持问题,用微软VS2017提供的跨平台Xamarin架构可以解决,开发者只需要写C#程序,就可以把应用部署在Windows/Android/iOS设备上,一套代码搞定。

另外一种分类方式

如果关注于对认知服务的使用,也可以用另外一种分类方式:

  • 单独使用某个服务

  • 串行使用两个以上的服务

  • 并行使用两个以上的服务

  • 串并行混合使用三个以上的服务

比如上面的最后的场景,实际上是第四种方式:先并行使用了地标识别、名人识别、OCR,然后又串行使用了实体搜索服务。

合理的应用架构

我们来帮助Bob同学重新设计一下他的应用架构:

上图只是个粗略的架构,中间服务层具体如何实现呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/310530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PR-视频去水印

文章目录 前言PR-视频去水印实现示例 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! PR-视频…

Unity组件开发--短连接HTTP

1.网络请求管理器 using LitJson; using Cysharp.Threading.Tasks; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Events;using System.Web; using System.Text; using Sy…

企业的 Android 移动设备管理 (MDM) 解决方案

移动设备管理可帮助您在不影响最终用户体验的情况下,通过无线方式管理和保护组织的移动设备群,现代 MDM 解决方案还可以控制 App、内容和安全性,因此员工可以毫无顾虑地在托管设备上工作。移动设备管理软件可有效管理个人设备上的公司空间。M…

刷题第十五天-存在重复元素Ⅲ

存在重复元素Ⅲ 题目要求 解题思路 主要使用滑动窗口方法,让滑动窗口代销固定为t。 本题最大的难点在于快速地找到滑动窗口内的最大值和最小值,以及删除指定元素。 如果遍历求滑动窗口内的最大值和最小值,时间复杂度是O(K&#…

自动化测试框架搭建全过程

前段时间写了一系列自动化测试相关的文章,当然更多的是方法和解决问题的思路角度去阐述我的一些观点。这篇文章来聊聊新手如何从零到一落地实践接口自动化测试。 为什么要做接口测试 测试理念的演变 早些时候,软件研发交付流程大多遵循V型或W型的瀑布模…

vue 公众号开发,调用jssdk封装

vue 公众号开发,经常会使用到 转发朋友,朋友圈,调用扫一扫等功能,这时就要使用微信的 jssdk 微信jssdk传送门 1. 安装jssdk 插件 (jweixin-module) npm install jweixin-module --save 2. 封装方法 utils/jwx.js let jweixin…

Hello,World!

“Hello, world”的由来可以追溯到 The C Programming Language 。在这门编程语言中,它被用作第一个演示程序,向人们展示了在计算机屏幕上输出“Hello world”这行字符串的计算机程序。由于这个演示程序的简洁性和直观性,它成为了许多初学者学…

qt图形化界面开发DAY3

作业: 1> 思维导图 2> 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转…

Android 输入系统介绍

文章目录 一、目的二、环境三、相关概念3.1 输入设备3.2 UEVENT机制3.3 JNI3.4 EPOLL机制3.5 INotify 四、详细设计4.1 结构图4.2 代码结构4.3 InputManagerService模块4.3.1 IMS服务入口4.3.2 IMS初始化4.3.3 IMS启动4.3.4 IMS消息监听 4.4 NativeInputManager模块4.4.1 nativ…

解决Windows 11/10共享打印机无法连接问题0x00000709错误

在解决共享打印机连接问题之前,请确保满足以下几个条件: 确保Windows 11设备和共享打印机的电脑连接到同一个网络。检查网络连接是否稳定。确保共享打印机所连接的计算机处于开机状态。检查共享设置,确保共享打印机在Windows 7计算机上正确设…

Docker安装Nacos2.2.3并鉴权、Prometheus监听Nacos、Grafana监控Nacos【亲测可用】

1、Docker 拉取镜像:docker pull nacos/nacos-server:v2.2.3 2、docker run --env MODEstandalone --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos/nacos-server:v2.2.3 3、复制镜像中的配置文件 mkdir -vp /home/nacos/logs mkdir -vp /home/n…

Transformer详解【学习笔记】

文章目录 1、Transformer绪论2、Encoders和Decoder2.1 Encoders2.1.1 输入部分2.1.2 多头注意力机制2.1.3 残差2.1.4 LayNorm(Layer Normalization)2.1.5 前馈神经网路 2.2 Decoder2.2.1 多头注意力机制2.2.2 交互层 1、Transformer绪论 Transformer在做…

使用PyTorch实现去噪扩散模型

在深入研究去噪扩散概率模型(DDPM)如何工作的细节之前,让我们先看看生成式人工智能的一些发展,也就是DDPM的一些基础研究。 VAE VAE 采用了编码器、概率潜在空间和解码器。在训练过程中,编码器预测每个图像的均值和方差。然后从高斯分布中对…

【Spring Boot】项目端口号冲突解决方法,一步到位

启动项目遇到以下问题: Description: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port. Process finished with …

「Vue3面试系列」Vue 3.0中Treeshaking特性有哪些?举例说明一下?

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination 简单来讲,就是在保持代码运行结果不变的前提下,去除…

OpenCV入门04:调整图像对比度和亮度

教程开源 本教程开源,地址:https://gitee.com/zccbbg/opencv_study 图像的亮度和对比度说明 亮度: 亮度是指图像中像素的整体明亮程度。在数字图像中,每个像素都有一个灰度值,表示其亮度水平。亮度越高,像…

上海晋名室外暂存柜助力石墨烯材料行业气瓶储存安全

近日上海晋名又有一台室外气瓶暂存柜项目通过验收,此次项目主要用于石墨烯材料行业气瓶的室外暂存。 用户单位创立于2017年,是一家从事石墨烯等新材料技术的科技型高新技术企业。 上海晋名作为一家专注工业安全防护领域,危险化学品安全储存…

基于 Spring Boot 支付宝沙箱支付(Java 版本)

基于 Spring Boot 支付宝沙箱支付(Java 版本) 步骤第一步:使用支付宝账户登录,打开控制台,进入沙箱环境第二步:配置内网穿透账号第三步:引入支付宝 SDK第四步: 配置 SpringBoot第五步…

Prometheus实战篇:Alertmanager配置概述及告警规则

Prometheus实战篇:Alertmanager配置概述及告警规则 在此之前,环境准备和安装我就不在重复一遍了.可以看之前的博客,这里我们直接步入正题. Alertmanager配置概述 Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在Alertmanager配置中一般会包含以下几个主要部分…

网安入门14-文件包含(file:// )

​ 什么是文件包含漏洞——来自ChatGPT4 文件包含漏洞是指应用程序在加载文件时,允许用户控制被加载文件的名称,从而导致恶意代码的执行或敏感信息的泄露。文件包含漏洞主要分为两种: 本地文件包含漏洞(LFI) &#…