
这是一个基于Azure Bot Framework SDK开发聊天机器人的入门文章,根据这篇文章step by step, 配置官方提供的Sample, 相信很快你就可以成为聊天机器人的开发高手:
使用Azure Bot Service开发聊天机器人
手把手教你开发一个简单的聊天机器人
创建一个全功能的聊天机器人项目模板
聊天机器人里的消息和Activity
基于Azure Bot Framework SDK开发的聊天机器人如何管理状态
使用Dialog库控制聊天机器人的会话流程
深入理解Bot Framework SDK Dialog系统
聊天机器人项目中使用Dialog实现分支任务
聊天机器人项目中使用Dialog实现循环任务
聊天机器人项目中将状态管理数据存储到数据库中
开发基于微信公众号的聊天机器人
Have Fun!
基于Azure Bot Framework SDK
开发的聊天机器人如何管理状态
我们之前已经讨论过了Azure Bot Framework SDK
的应用是构建于Web API
的应用之上,同样也是基于Asp.net Core
的框架,这样带来一个问题就是每一个Bot
应用实际上是无状态的应用,因为HTTP
协议天然就是无状态,为了在Web
应用上实现状态的管理,每个开发的框架都有实现自己的会话管理机制(Session
), 大多数Web
应用会基于Cookie
或者是Header
或者是查询字符串在每次请求的时候带上唯一的id
, 用这个ID
来标识每一个会话。基于这样的构想,Azure Bot Framework SDK
也同样使用了类似的原理来管理状态,和Web
应用不同,Bot
的状态管理因为场景的差异,加入了更多的设计。
阅读更多>>
聊天机器人里的消息和Activity
我们之前的文章讨论了一个Bot
应用实际参与的几个组件。
物理组件:
Channel
: 就是一个物理的应用,例如微信,Teams
Bot Service
: 用于和Channel
相连,转发消息到Bot
- 运行
Bot
的资源。
逻辑组件:
Channel endpoint
Adapter
Bot Turn Context Handle
Activity
TurnContext
一个消息的流入路径是:用户 -> Channel
-> Adapter
-> Adapter middleware
-> Bot Turn handle
阅读更多>>
创建一个全功能的聊天机器人项目模板
相比于上一节我们介绍的"简单"
机器人,我们本章先创建一个功能更为全面的机器人模板,后面的文章逐渐完善下述功能:
- 给机器人会话添加上认证的功能。
- 给机器人的会话和用户添加状态跟踪的机制
- 使用卡片丰富
Activity
的通讯。 - 使用
Dialog
系统丰富交互。
Hello, Bot!
我们之前的文章简单的介绍了一下由微软提供的Azure Bot Framework SDK
以及Azure Bot Service
服务,比较不妙的是看起来这个服务真没啥人用,不能排除微软之后就不支持这个服务。但是Azure Bot Framework SDK
是开源的,而且还有一个开源的社区,因此即便微软不支持Azure Bot Service
了,Azure Bot Framework SDK
还会以开源的形式继续存在,如果要做聊天机器人,还是可以继续使用这个框架,也可以考虑参与开源的开发。我为了自己的项目也尝试参与了两个开源的项目,一个是Bot
基于SQL Server
的IStore
实现,另外一个是WeChat
的Adapter
, 这两个项目之前都是有的,但是太老,几年没有更新了,不能支持.Net6
,因此我做的工作就是修改了一下他们,让他们支持.Net6
, IStore
我已经提交了PR
,但是还没有被接受,不过可用了,WeChat
的Adapter
我还在调试,完成后也提交一下PR
, 我PR
估计比较严格,如果大家想用用看,也可以访问:
- https://github.com/hylinux/botbuilder-community-dotnet
- https://github.com/hylinux/BotFramework-WeChat
这个两个都是我的fork
。
阅读更多>>
使用Azure Bot Service
开发聊天机器人
聊天机器人在电商时代有很多的应用,各种自动客服,订单系统,电话语音等。它适用各种重复的,枯燥的工作。在和人的交互过程中,聊天机器人可以通过语音,文字,图片,甚至是视频完成交互工作。同时可以接入自然语言处理模型,问答模型等等各种基于AI
的组件,使得聊天机器人更像人类,更好,更自然的完成交互的工作。
要设计一个聊天机器人的基础框架是繁复的,需要考虑很多场景,例如多场景对话,连续对话,跳跃性对话等都需要认真的考虑,技术上也受制各种技术集成,拔高了难度。推荐大家可以使用微软推出的Azure Bot Service
来简化聊天机器的开发,节省成本,何乐而不为。
我们先看一下Azure Bot Service
的介绍。
阅读更多>>
在MVVM
桌面应用中使用Asp.net Core
的Generic Host
模型
熟悉Asp.net Core
的同行应该都非常了解它的Host
模型,特别是Generic Host
,Host
将一系列的功能全部压缩的这个模型里,这包括依赖注入,配置管理,日志管理,生命周期管理等等。如果你想对Host
多了解一下,您可以参考如下的文档:
- https://www.azuredeveloper.cn/article/asp-net-core-host
- https://www.azuredeveloper.cn/article/what-is-dotnet-host
- https://www.azuredeveloper.cn/article/show-example-for-dotnet-host
- https://www.azuredeveloper.cn/article/dotnet-host-service-introduction
- https://www.azuredeveloper.cn/article/using-dotnet-host-run-long-time-task
- https://www.azuredeveloper.cn/article/how-to-implement-queue-worker-by-host-model
- https://www.azuredeveloper.cn/article/how-to-implement-a-windows-service-by-host-model
- https://www.azuredeveloper.cn/article/how-to-implement-hosted-service-by-yourself
这些文章是对.Net Host
模型介绍比较全面,可以加深一些了解。
阅读更多>>
async/wait
和ConfigureWait(false)
在异步编程中有什么关系?
我喜欢.Net
的最大原因就是.Net
是真的提供了很多工具简化编程的难度,并提供了健壮性。尤其是异步编程模式的提出。
.Net
使用async
和await
两个关键字来简化异步编程,不过需要注意的是:
- 异步编程不是并行编程,和我们提到的多线程编程虽然有联系,但是异步编程不是多线程的那种多任务编程。
- 异步编程要注意编程任务是基于
CPU
计算多,还是基于IO
多,特别是在基于Asp.net Core Genric Host
进行后端服务编程时(例如:写基于Windows或者基于Linux的服务程序,不是指Web
编程),特别需要注意区分你的任务是基于IO
的还是基于CPU
计算的任务。基于CPU
计算的任务都需要Task.Factory.new
放入runtime
的线程池中运行。 - 在基础的编程模型中我们有多进程,多线程分别利用的是CPU的特性,例如分时CPU,多核等等,但是还有一个概念就是可阻塞IO的模型,可以将异步编程模型的基础理念架构在可阻塞IO上。
Azure IoT Edge Runtime
升级到了1.4
今天无意中发现Azure IoT Edge Runtime
升级到了1.4
了,升级速度是蛮快的,其中有一个特性引起了我的兴趣:系统模块在Host
上的Storage
权限终于可以自动管理了。
这里系统模块主要指的是模块EdgeAgent
和EdgeHub
, 这两个模块一个负责整个系统上除它自己所有模块的安装配置,一个负责系统上所有模块和IoT Hub
或者子设备和模块之间的通讯,EdgeHub
就是一个缩小版的IoT Hub
, 所有的SDK
都可以直接把EdgeHub
当成是IoT Hub
就好了。
之前我们所有的文章中一再强调EdgeAgent
和EdgeHub
在生产环境中是非常重要的,因为它们都会有不少数据,在这两个镜像从设备上拉起来之后,如果docker的运行的instance
一直不发生变化还不会出什么问题,但是一旦instance
停止或者删除,那么原有的数据基本都会丢光,这主要包括针对模块的配置,以及EdgeHub
上可能存有的离线数据(注:EdgeHub会在连接不上IoT Hub的时候将数据临时存在storage
里,上线后重发), 这种情况很容易发生,例如你有一个新的部署,这个部署里调整了OnCreate
的值等,都可能会引发这个问题。
Azure IoT Edge
的部署
在Aure IoT
的产品和解决方案中,部署(Deployment
)是一个专有的名词,它是专用于IoT Edge
的名词,只有IoT Edge
有部署(Deployment
)的概念,同时需要注意的是一个IoT Edge
设备只有在应用了一个部署之后才能正常的运作,如果仅仅是将一个IoT Edge
设备通过配置链接到IoT Hub
, 而没有应用一个部署,设备还是会报错。
一个部署在实际应用中体现为一个部署清单(deployment mainfest
), 微软使用Json
文档来描述部署清单的详细内容,这些内容主要包括:
IoT Edge Agent
的孪生模块定义(module twin
:可以理解为逻辑模块, 保存在Azure IoT Hub
服务端), 包括如下的内容:- 应用于
IoT Edge
设备的模块定义, 包括系统模块EdgeAgent
和EdgeHub
。 - 定义用于保存模块的镜像库的地址, 以及可选的认证信息。
- 配置模块的创建和管理规则(
EdgeAgent
模块主要的作用是管理设备上的模块,EdgeHub
模块主要用于管理模块、子设备、IoT Hub
之间的通讯。)
- 应用于
IoT Edge EdgeHub
孪生模块定义,主要定义预期属性(desired property
), 定义模块、子设备,IoT Hub
之间的消息如何传递的。- 其他模块的预期属性的定义。
Azure IoT Edge Hub
模块的消息路由
Azure IoT Edge
两个系统模块Edge Agent
和Edge Hub
, edge Agent
主要是管理模块的安装和监控,Edge Hub
用于模块或者子设备和IoT Hub
之间的通讯。
我们可以把Edge Hub
模块认为是缩小版的IoT Hub
, 它拥有很多的IoT Hub
的特性,在IoT Edge
设备不在线的时候,它可以充当部分的IoT Hub
的功能。 为了将模块或者子设备的消息路由到IoT Hub
, Edge Hub
提供了消息路由的功能。在用户使用部署的时候可以对消息路由进行定义,如果你不熟悉部署,请参考文章:<>
当我们使用Azure Portal
添加部署的时候,无论是标准的自动部署,还是分层部署,都需要配置消息的路由。
Windows Server 2022 Core
迁移记录
开始之前要了解的是:什么是Windows Server Core
,它之前发现的版本有什么不一样。Windows server core
不是一个新鲜的东西,早在windows server 2016
发布的时候,就已经发布了基于core
的版本。Core
和完整的发行版主要的区别就是Core
拿掉了GUI
的部分,但是保留了完整的服务功能,要管理和操作Core
,需要使用很多的命令行工具,之前熟悉的几乎全部的在Windows Server
上的基于GUI
的工具全部没有,这就要求用户必须要熟悉基于Windows
的命令行工具以及PowerShell
。Remote Desktop Service(Terminal Service)
还是保留的(通过3389端口连接),另外其他的远程管理工具和接口都是完全具备的,例如WinRM
等等。
详细的介绍,请参考微软官方文档:https://learn.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
阅读更多>>
在MVVM
项目中使用async/await
- 数据绑定
本篇讨论在WPF & Net MAUI & WinUE3 MVVM
项目中使用Async & await
进行多任务编程,是基于大牛Stephen Cleary
于2014年3月份左右发表的博客。原始页面已经找不到了,进入了微软MSDN
杂志的存档了。
之前在网络上搜索了不少文章,这些文章讨论如何在UI环境中使用多线程时无一例外的都是利用例如wpf
的dispatcher
将长时间运行的线程放置到后台线程中,并通过Dispatcher
来更新UI, UI线程无需等待。看到这些代码我都有一个问题,为什么不可以直接使用async/await
而避免使用dispatcher
来配合多任务编程呢?找了不少方案,自己也尝试设计一些思路,但都不理想,一直到我看到了Stephen
的文章,顿时感觉茅塞顿开,在这里将Stephen
的经验也分享给大家。
Azure翻译服务入门
总结了Azure翻译服务入门的系列的文章,可以通过如下的链接学习:
点解链接:Azure翻译入门系列
Azure入门系列
为了帮助哪些想了解Azure但是对Azure又没有了解的用户,特地整理了一系列的基础文章,希望可以帮助到有需要的用户。
Azure Digital Twins入门
Azure Windows 虚拟机
使用Azure Windows虚拟机部署基于.Net的站点以及优化经历,给需要的用户参考:
安装Web
角色和服务
注意
本章是跟随前一章的内容,请先仔细阅读前一章的内容,前一章的地址在这里:
https://www.azuredeveloper.cn/article/build-web-by-azure-vm-create-azure-resource
可以通过Azure Portal找到我们创建的虚拟机,拿到公网IP, 或者直接运行如下的脚本(上一篇文章我们创建好的)得到公网IP:
$ $public_ip.IpAddress
然后使用Windows
的远程登录登录到虚拟机上,虚拟机默认启动服务器管理器, 如下图:
使用脚本创建Azure资源
我们前一篇讨论我们的工具的选择,这篇开始我们就开始开工了,我们先来创建Azure
的资源,为了契合我们使用Azure
的理念,使云管理人员也参与到整个系统的架构中来, 我们使用脚本工具来帮助管理员创建基于Azure
的资源,这样可以将创建和管理资源的脚本使用github
管理起来,方便未来可以快速部署和快速扩充的需要。
先来看一下我们目标:
- 在本地创建脚本运行环境,并记录成文档。
- 使用脚本创建虚拟机,并设定虚拟机的公网地址为静态地址,方便网站域名的绑定。
- 使用脚本配置
Network Security Group
用来放行我们需要的端口。 - 使用脚本创建
Azure Stoarge
账户和一个用于备份的blob
。 - 使用脚本创建
Azure Cognitive Service
资源,并保留创建的凭据。 - 使用脚本创建
Azure
沉浸式阅读服务。 - 讨论将来的扩展性,如何满足扩展性。
选择创建网站的工具
学习Azure
有长一段时间了,计划使用Azure
来做一些有趣的事情,开始计划之前,我们先可以想想Azure
可以帮我们完成哪些事情?
- 使用
Azure
的虚拟机或者应用服务可以快速搭建各种站点,例如Web
站点,FTP
站点,邮件列表等等传统的互联网项目。 - 使用
Azure
的AI
技术可以快速搭建各种人脸识别,语音识别,以及配音等新兴的项目。 - 使用
Azure
的物联网技术可以快速让自己的设备随时连上自己创建的小型物联网,可以升级自己家里的智能家居。 - 使用
Azure
的Media Service
可以快速搭建直播项目。 - 使用
Azure
的机器人服务创建一个聊天机器人。
......
我们可以在这里列一个很长的单子,为了简便(实际上内容也不少)我们选择先使用Azure
的虚拟机搭建一个功能完备的Web
站点,作为一个博客记录自己学习Azure
的点点滴滴。
实现自己的IHostedService
我们前面使用.Net
的Worker
模板实现.Net Host
的服务模型的时候,都使用了BackgroundService
这个抽象类,如果想对于自己的后端应用有更多的定制,可以从接口IHostedService
直接继承,然后实现更多的细节,我们这个实例直接实现接口IHostedService
以及接口IAsyncDisposable
, 同时向.Net Host
模型注册服务都是使用的相同的扩展方法AddHostedService<T>()
方法。
我们这一节实现使用System.Threading.Timer
来实现一个定时的任务。
创建项目
使用.Net Cli
来创建项目:
dotnet new worker -o CustomHostedService
cd CustomHostedService
code .
使用了Vs Code
打开该目录之后,开始进行编辑。
使用Host
编程模型编写Windows
服务应用
在.Net 5
之前用户如果想编写运行在Windows
上的服务应用,只能通过.Net Framework
来编写,现在可以直接通过.Net
来编写Windows
的服务应用了。我们本章尝试使用.Net 6
的worker
模板来编写Windows
的服务应用。
完成本教程您将了解:
- 如何将基于
.Net
的worker
模板应用发布为一个exe
可执行文件。 - 创建一个
Windows
服务 - 启动和停止
Windows
服务 - 查看该服务的事件日志
- 管理
Windows
服务
创建项目
你可以visual studio
来创建基于Worker
模板的项目,或者是使用.Net cli
工具来创建。
dotnet new worker -o WindowsService
cd WindowsService
要编写Woindows
的服务应用,需要额外添加必须要的包:
使用Host
模型创建一个基于队列的服务
对我们即将创建的类作如下的说明:
- 接口
IBackgroundTaskQueue
: 用于定义后台使用的队列模型,该接口提供两个方法:QueueBackgroundWorkItemAsync
, 用于向队列添加项目,DequeueAsync
,用于从队列中取出项目 - 类
DefaultBackgroundTaskQueue
, 实现了接口IBackgroundTaskQueue
, 同时可以注册到依赖注入容器中,用于向需要队列服务的代码提供队列服务。该服务会被注册为Singleton
模式。 - 类
QueuedHostedService
: 该类从BackgroundService
继承,并且会通过扩展方法注册到Host
里,由Host
开始运行该服务。这个也是用户开发基于Host
模型的入口。 - 类
MonitorLoop
: 该类实现了监听键盘事件,同时注入Queue, 并根据键盘的输入向队列中添加新的task.
接下来我们开始创建这个项目。
创建项目
请使用如下的命令行来创建项目:
dotnet new worker -o QueueService
cd QueueService
code .
至此完成了项目的创建。
Azure IoT Edge问题排查
本节介绍一些常用的Azure IoT Edge
设备问题排查的基本手段和工具。
首先需要说明的是之前微软的文档是有些问题的,之前的文档讨论一个环境变量RuntimeLogLevel
用于设置runtime
的日志级别,实际上应该是设置在模块edgeHub
和edgeAgent
上。对于rumtime
的日志输出建议使用命令sudo iotedge system logs -f
(注意这个命令是用在iotedge runtime 1.2
), 或者直接使用Linux
命令journalctl -fu iotedge
来查看日志。
-
将
edgeAgent
或者edgeHub
模块日志级别设置为debug
使用合适的工具登录到设备所有的系统里,例如
Linux
的ssh
客户端。
编辑文件:/etc/iotedge/config.yaml
或者文件/etc/aziot/config.yaml
(前面这个配置文件适合1.1
版本,后面是1.2
以以上。)agent: name: edgeAgent type: docker env: RuntimeLogLevel: debug config: image: mcr.microsoft.com/azureiotedge-agent:1.1 auth: {}
需要注意的是
阅读更多>>edgeHub
模块也可以设置环境变量RuntimeLogLevel
, 但是建议仅仅在您开发Edge
模块时在EdgeHub
上开启这个选项。