使用AzureAI在Azure容器应用上部署智能应用:第1部分

目录

解决方案架构

了解Azure AI和Azure容器应用

先决条件

设置Azure环境

构建基本应用

添加模型并连接数据库

构建数据库结构并添加产品

创建视图

后续步骤


作为开发人员,我们都敏锐地意识到人工智能(AI)如何改变和彻底改变应用程序开发。机器学习(ML)和自然语言处理(NLP)等AI技术使我们能够创建个性化、自适应的用户体验——智能应用程序。 智能应用程序利用AI算法从用户交互中学习并做出实时决策。

随着对智能应用程序的需求持续飙升,我们将越来越需要将AI组件集成到我们的应用程序中。这项工作可能很复杂且需要大量资源,但并非必须如此。

本文是使用Azure容器应用构建智能应用系列文章的第一篇,我们将探讨如何开始使用Azure AIAzure容器应用。然后,我们将构建一个基本的用户反馈应用程序,我们将在本系列的第二部分中将其智能化。

解决方案架构

下图显示了本文所针对的解决方案的体系结构。

了解Azure AIAzure容器应用

在本教程中,我们将结合使用 Azure OpenAI(一种使用大型语言模型(LLM 创建智能应用的工具)和 Azure容器应用(一个完全托管的基于Kubernetes的平台,可帮助我们从容器和代码进行部署)。这两个动态工具将作为我们应用程序功能的支柱,贯穿这个由四部分组成的系列。

Azure Open AI将通过处理数据的API将智能注入我们的应用程序。具体来说,我们将利用情绪分析API 从客户的反馈和评论中评估客户的情绪。

在前端,我们将使用Azure容器应用来部署基于Kubernetes的应用程序。这种方法使我们不必担心任何基础架构编排,使我们的应用程序能够纵向扩展和缩减以满足负载要求。

最后,我们将使用Azure SQL数据库来存储反馈和情绪数据集。

先决条件

要按照本教程进行操作,您需要:

  • 一个Azure帐户。注册一个免费帐户后,您可以在第一个月获得免费积分,并获得许多基本服务。当您创建新帐户时,您必须提供一张信用卡来验证交易,以防您使用的资源超过分配的资源。对于这些文章,我们将尽可能减少支出。
  • 已安装 Docker Desktop 版本3.5.1或更高版本
  • 已安装 Visual Studio。此演示使用Community Edition 2022。

若要查看项目的实际运行情况,请查看完整的项目代码

设置Azure环境

在设计应用程序之前,我们需要配置Azure环境、Visual Studio和基本应用程序模板。

首先,我们需要一个具有资源组的Azure帐户,以便部署我们的应用程序。首先,我们将创建一个新的资源组来保存所有项目项。登录,单击资源组,然后点击创建

现在,为资源组命名并设置位置。对于此演示,我们将资源组命名为“UserFeedbackApp”,并选择美国东部作为默认区域。接下来,单击查看 + 创建

现在,导航到左侧Azure门户中的资源组部分。打开它并创建新的Azure AI多服务实例。为此,请在Azure市场中搜索“Azure AI”并添加它。

现在,您必须命名和配置实例。在本演示中,我们将使用“UserFeedbackAppAI”,并将其他所有内容保留为默认值。

注意:默认值适用于本教程,但在生产环境中,您可能希望在网络选项卡下配置实例,以便更好地访问。

我们还需要创建一个SQL数据库来存储我们的数据。返回到Azure市场,搜索“Azure SQL”以查找“SQL数据库选项。创建一个数据库和服务器,将其托管在我们刚刚创建的同一资源组中。

此演示使用开发层和基本服务器来降低成本。将SQL数据库命名为“UserFeedbackDatabase”,并使用本地管理员帐户,而不是基于标识的访问选项。

接下来,我们需要为容器应用程序本身创建多个资源。打开Visual Studio,然后选择创建新项目。在本教程中使用新的标准ASP.NET Core Web应用(模型-视图-控制器)选项。找到该模板,为项目命名,然后选择保存位置。

要容器化我们的应用程序,我们需要在下一个屏幕上选择启用Docker。此选项将我们的应用程序与Dockerfile捆绑在一起,这对于构建支持它的基础结构至关重要。为Docker容器选择默认的Linux操作系统。

现在,允许Visual Studio生成模板化项目。

接下来,使用Visual Studio中的Docker运行应用程序。到达那里后,单击播放以构建并运行应用程序,将其推送到本地Docker环境,然后启动Web浏览器以查看静态打开页面。

随着我们的应用程序在本地运行,是时候发布它了。我们这样做是为了创建所需的容器资源,并让Visual Studio将配置保留在我们的发布配置文件中。右键单击项目,选择发布,添加要发布的配置文件,单击“Azure,并将其命名为“Azure容器应用(Linux

容器应用屏幕上,仔细检查是否已登录到Azure帐户,以及是否已填充订阅名称。单击新建。为应用程序和容器命名,确保选择正确的订阅和资源组。还可以通过选择新建来指定/命名容器应用环境。否则,请保留默认名称。

最后,单击创建以完成容器应用设置。

我们还需要指定一个容器注册表来存储应用程序及其配置,我们将发布到容器中。为注册表命名一个名称(例如,“UserFeedbackAppRegistry”),然后单击创建

在容器生成过程中,必须启用容器的管理员权限。单击,然后等待基础结构构建。

现在,可以使用发布配置文件将Azure Web应用推送到Azure上的容器应用。通过打开Azure门户并导航到资源文件夹,查看已创建的基础结构。

构建基本应用

奠定基础后,是时候设计和开发我们的应用程序了。本教程围绕一个简单的用例展开:构建商品店反馈功能。它将允许用户选择产品并使用自由格式文本留下反馈。

接下来,我们会将该反馈保存到我们的数据库中。随后,我们将向Azure AI API发送调用,以对反馈执行情绪分析,然后将结果存储在数据库中。最后,根据这些结果,我们将创建一个报告页面,显示我们的产品情绪。

我们的目标是使用户能够对所选产品留下反馈,以供将来进行情感分析。为了促进这一点,我们需要一个具有数据库读写功能的基本Web应用程序。

添加模型并连接数据库

我们清单上的初始功能是从我们的SQL数据库中检索各种产品的能力。这将使我们能够填充一个下拉菜单,显示我们的产品列表,然后用户可以为其撰写评论。

若要为应用程序配置数据库连接,请使用Visual Studio中的包管理器安装以下包:

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

接下来,通过将以下代码添加到模型文件夹,为数据创建两个模型(ProductReview)。首先,使用以下代码创建一个 Product.cs 文件:

namespace UserFeedbackApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

然后,使用以下代码在models目录中创建一个Review.cs文件:

namespace UserFeedbackApp.Models
{
    public class Review
    {
        public int Id { get; set; }
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public string ReviewText { get; set; }
        public string PostDate { get; set; }

        public string Sentiment { get; set; }
        public float PositiveValue { get; set; }
        public float NeutralValue { get; set; }
        public float NegativeValue { get; set; }
    }
}

为了弥合模型和接口之间的差距,我们需要一个DbContext类。在模型文件夹中创建一个DatabaseContext.cs文件,并按如下方式填充它:

using Microsoft.EntityFrameworkCore;

namespace UserFeedbackApp.Models
{
    public class DatabaseContext : DbContext
    {
        private readonly string _connectionString;

        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
        }

        public DbSet<Product> Products => Set<Product>();
        public DbSet<Review> Reviews => Set<Review>();
    }
}

下一步是配置与刚创建的Azure SQL数据库的连接。双击项目层次结构中的连接服务,然后添加新的服务依赖项。选择Azure SQL数据库,然后找到之前创建的数据库。然后,编辑依赖项详细信息,确保分配数据库连接字符串名称——稍后将使用它。单击完成

此操作为我们的数据库创建连接详细信息。

现在,修改Program.cs文件以使用以下代码建立与数据库的连接:

using Microsoft.EntityFrameworkCore;
using UserFeedbackApp.Models;

var builder = WebApplication.CreateBuilder(args);

// Add Database Context
if (builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<DatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration["userfeedbackdatabaseconnection"]));
}
else
{
    builder.Services.AddDbContext<DatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

此代码使用if语句来检查应用程序的环境,无论是开发环境还是生产环境。根据环境的不同,它会在开发中使用本地连接机密,或者在发布时使用Azure连接字符串。

构建数据库结构并添加产品

配置代码后,我们现在可以使用实体框架工具来构建数据库结构。通过选择查看”>终端,打开Visual Studio底部的开发人员PowerShell“窗口。确保在下拉列表中选择开发人员PowerShell”,然后导航到项目目录。运行以下命令:

dotnet tool install dotnet-ef –global
dotnet ef migrations add Initial
dotnet ef database update

这三个命令将使用先前定义的ProductsReview模型创建我们的基本数据库结构。

接下来,让我们手动预填充一些Product。打开Azure控制台,导航到应用资源组中的数据库,然后在左侧找到查询编辑器。使用以下查询填充我们的Products表:

SET IDENTITY_INSERT Products ON;
INSERT INTO Products (id, name)
VALUES (1, 'Apple Laptops'), (2, 'Camcorders'), (3, 'Cell Phones & Smartphones'), (4, 'Circular Saws'), (5, 'Clippers & Trimmers'), (6, 'Cordless Drills'), (7, 'Digital Cameras'), (8, 'Electric Toothbrushes'), (9, 'Headphones'), (10, 'Headsets'), (11, 'Ink Cartridges'), (12, 'Internal Hard Disk Drives'), (13, 'Keyboards & Keypads'), (14, 'Lenses'), (15, 'Media Streamers'), (16, 'Mens Shavers'), (17, 'Mice, Trackballs & Touchpads'), (18, 'Monitors'), (19, 'Motherboards'), (20, 'Other Automotive Hand Tools'), (21, 'PC Laptops & Netbooks'), (22, 'Power Tool Sets'), (23, 'Prepaid Gaming Cards'), (24, 'Receivers'), (25, 'Reciprocating Saws'), (26, 'Smart Speakers'), (27, 'Smart Watches'), (28, 'Tablets and eBook Readers'), (29, 'Video Game Consoles'), (30, 'Video Games'), (31, 'Wireless Routers');
SET IDENTITY_INSERT Products OFF;

执行此查询后,我们的数据库中有大约30种产品可以在我们的应用程序中使用。

创建视图

配置数据后,让我们创建一个具有视图的基本 MVC控制器。右键单击控制器文件夹,然后选择添加新基架项使用实体框架选择具有视图的MVC控制器,然后单击添加。选择Model类作为Product,为控制器指定名称,然后单击添加。使用Reviews Model重复这个处理。

现在,在本地运行应用程序,并在将其发布到Azure容器应用程序后运行应用程序,以确保一切正常运行。

在本地运行应用程序时,Web浏览器将打开,其中包含基本URL /Products 添加到URL的末尾,以查看手动输入的预填充数据的列表。

建立框架后,可以将URL末尾的/Products替换为/Reviews以查看您拥有的任何评论。或者,您可以使用/Reviews/Create创建新评论。但是,目前,审核与我们提供的模型不一致,因为我们希望我们的产品列表填充产品字段。为了解决这个问题,我们需要调整评论视图,以更好地符合我们的要求。

 ReviewsController 文件中,按如下方式更改GET Create Action

public async Task<IActionResult> Create()
       {
           var products = await _context.Products.ToListAsync<Product>();
           List<SelectListItem> productSelections = new List<SelectListItem>();

           foreach (var product in products)
           {
               productSelections.Add(new SelectListItem { Text = product.Name, Value = product.Id.ToString() });
           }

           ViewBag.Products = productSelections;

           return View();
       }

此代码从数据库中获取产品,并将它们放入Review创建页面上的选择列表或下拉列表中。我们专注于让用户选择单个产品并撰写评论,确保我们稍后执行的情绪分析与每个产品保持一致。因此,让我们也修改Views/Reviews目录中的Create页面:

@model UserFeedbackApp.Models.Review

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>Review</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                @Html.DropDownList("Products", (IEnumerable
                <SelectListItem>)ViewBag.Products)
            </div>
            <div class="form-group">
                <label asp-for="ReviewText" class="control-label"></label>
                <textarea rows="6" asp-for="ReviewText" class="form-control"></textarea>
                <span asp-validation-for="ReviewText" class="text-danger"></span>
            </div>
            <br />
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

这会将页面限制为产品下拉列表和用于输入评论的区域。

最后,让我们调整Reviews控制器中的:POST Create Action以处理两个接收到的值。为我们当前生成的元素添加占位符值

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Id,ProductId,ProductName,ReviewText,PostDate,Sentiment,PositiveValue,NeutralValue,NegativeValue")] Review review)
        {
            var selectedProductId = int.Parse(HttpContext.Request.Form["Products"].ToString());
            var product = await _context.Products.FirstOrDefaultAsync(p => p.Id == selectedProductId);
                   
            review.ProductId = selectedProductId;
            review.ProductName = product.Name;
            review.PostDate = DateTime.Now.ToString("yyyy-MM-dd");
            review.Sentiment = "";
            review.PositiveValue = 0;
            review.NeutralValue = 0;
            review.NegativeValue = 0;

            _context.Add(review);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

现在,运行应用程序并转到/Reviews/Create终结点。您将看到新编写的页面。如果您选择产品并填写评论,数据库将保存评论,不包含任何情绪信息。

最后,将更改发布到Azure实例。

后续步骤

本文介绍了什么是智能应用,以及Azure AIAzure容器应用如何成为构建智能应用的基本工具。你还使用Azure构建了一个基础应用程序,该应用程序已准备好转换为智能、高性能应用。

继续阅读本系列的第二部分,了解如何制作此基本应用程序和智能应用程序,以及如何使用此应用程序来分析用户反馈。

https://www.codeproject.com/Articles/5370387/Deploy-an-Intelligent-App-on-Azure-Container-App-2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值