65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Azure AI 在 Azure Container Apps 上部署智能应用(第二部分)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2023 年 10 月 23 日

CPOL

6分钟阅读

viewsIcon

4534

在本四部分系列文章中,您将学习如何使用 Azure 创建智能应用。本教程是第二篇,演示了如何为用户反馈分析应用程序添加智能功能。然后,它将探讨如何使用您新的智能应用来分析用户反馈。

毫无疑问,人工智能 (AI) 和机器学习 (ML) 是现代开发流程的重要组成部分。在这个动态、适应性强的应用程序需求日益增长的时代,将 AI 融入您的开发实践已不再是可选项,而是必需项。

智能应用是指利用 AI 算法分析用户交互并实时做出智能决策的应用。它们能够帮助您创造引人入胜的个性化用户体验。

在本系列文章的第一篇中,我们使用 Azure 容器应用和 Azure AI 创建了一个基本应用程序。在本文中,我们将把这个应用程序转变为一个智能应用程序,并使用这个更新改进后的智能应用来分析用户反馈。

借助 Azure,创建智能应用非常简单。继续阅读,亲自验证!

必备组件

要遵循本教程,您需要

  • 一个 Azure 账户。注册一个免费账户,您将获得第一个月的免费额度和对一系列基本服务的访问权限。创建新账户时,您需要提供信用卡信息,以备您使用的资源超出分配额度时进行验证。在这些文章中,我们将尽量减少开销。
  • 已安装 Docker Desktop 3.5.1 或更高版本
  • 已安装 Visual Studio。本演示使用 Community Edition 2022。

要查看项目运行效果,请查看完整的项目代码

构建智能应用

现在我们已经设置好了基本应用程序,让我们为其添加一些智能功能。我们的初始步骤是添加两个 NuGet 包:Azure.AI.TextAnalytics 用于授予对 Azure AI 的访问权限,以及 Microsoft.Extensions.Azure 用于将 SDK 无缝注入到应用程序中。

Visual Studio package manager shows the Browse tab with "azure.ai" entered in the search bar and the Azure.AI.TextAnalytics package selected.

Visual Studio package manager shows the Browse tab with "microsoft.extensions.azure" entered in the search bar and the Microsoft.Extensions.Azure package selected.

接下来,我们需要注册我们的文本分析客户端,以便将其注入到应用程序的依赖项中。在此之前,文本分析客户端需要两个密钥

  • 一个终结点地址
  • 一个访问密钥

我们需要将这两个项添加到我们的开发和生产环境。在这两个环境中,AI_EndPoint 是终结点变量名,AI_Key 是访问密钥变量名。

要将这两项添加到您的开发环境,请右键单击您的项目并选择“管理用户机密”。接下来,打开您的发布配置文件,单击“托管”旁边的三个点(),然后选择“管理容器应用设置”以验证这些变量是否可以在您的容器中访问。最后,您可以将这些机密添加到您的 Azure 容器中。

现在,打开 Program.cs 文件,修改初始化数据库上下文的部分,以包含文本分析的初始化

if (builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<DatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration["userfeedbackdatabaseconnection"]));

    builder.Services.AddAzureClients(clientBuilder =>
        clientBuilder.AddTextAnalyticsClient(new Uri(builder.Configuration["AI_EndPoint"]),
        new Azure.AzureKeyCredential(builder.Configuration["AI_Key"]))
        );
}
else
{
    builder.Services.AddDbContext<DatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));

    builder.Services.AddAzureClients(clientBuilder =>
        clientBuilder.AddTextAnalyticsClient(new Uri(builder.Configuration["AI_EndPoint"]),
        new Azure.AzureKeyCredential(builder.Configuration["AI_Key"]))
        );
}

最后,让我们配置 Review Create 方法,以从 Azure AI 服务 API 中检索情感分析结果。为此,请将以下内容添加到您的 Review 控制器构造函数中

private readonly TextAnalyticsClient _textClient;

        public ReviewsController(DatabaseContext context, TextAnalyticsClient textClient)
        {
            _context = context;
            _textClient = textClient;
        }

然后,修改 Reviews 控制器中的 POST Create Action,以包含对 Azure AI 服务 API 的调用,用于分析评论文本

        [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);

            var sentimentResult = 
                await _textClient.AnalyzeSentimentAsync(review.ReviewText);
           
            review.ProductId = selectedProductId;
            review.ProductName = product.Name;
            review.PostDate = DateTime.Now.ToString("yyyy-MM-dd");
            review.Sentiment = sentimentResult.Value.Sentiment.ToString();
            review.PositiveValue = (float)sentimentResult.Value.ConfidenceScores.Positive;
            review.NeutralValue = (float)sentimentResult.Value.ConfidenceScores.Neutral;
            review.NegativeValue = (float)sentimentResult.Value.ConfidenceScores.Negative;

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

在本教程中,我们使用了更简单的 AnalyzeSentimentAsync 方法。它接收我们的评论文本,并生成整体情感分析,分配正面、中性和负面分数。

Azure 的文本分析服务还支持观点挖掘,这是一个更高级的用例。观点挖掘超越了基本功能,可以为文本中的特定主题或关键字提供情感分析。

例如,如果一条评论写道:“这真是一个很好的产品,但送货时间太长了。我也很难理解说明书。”,观点挖掘选项可能会将评论分解成不同的主题,并为每个主题提供情感分析

  • “产品”的情感为正面
  • “送货时间”的情感为负面
  • “说明书”的情感为负面

使用您的智能应用分析用户反馈

现在我们已经将 AI 连接到我们的应用程序,让我们创建一个评论,看看 AI 的响应。

运行应用程序,导航到 /Reviews/Create 文件夹以创建评论,然后单击“提交”。从下拉列表中选择“理发器和修剪器”,然后输入:“这是一个很好的修剪器,可以剪我的头发,但它会卡住我的胡子。”

检查您刚发布的评论后,您会发现 Azure AI 将其评为正面,但带有轻微的负面和中性成分。

The feedback app index displays review text for Apple Laptops and Clippers & Trimmers. The Clippers & Trimmers entry features sentiment analysis results reading Positive, with 0.96 PositiveValue, 0.01 NeutralValue, and 0.03 NegativeValue.

现在,尝试另一条评论。这次,从下拉列表中选择“耳机”产品,然后输入以下评论:“这些耳机还可以。外面的泡沫不够厚,会伤到头。价格真的很便宜。”

这次,AI 将评论评为负面,没有正面评分,只有一个轻微的中性评分。

The Headphones entry features sentiment analysis results reading Negative, with 0 PositiveValue, 0.15 NeutralValue, and 0.85 NegativeValue.

通过整合这种基于 AI 的评分,您可以深入了解客户反馈趋势,并可以根据正面或负面反馈启动具体的操作。例如,我们可能想了解我们的产品评论在过去七天内的表现如何。让我们更新我们的评论列表页面,以显示该期间的平均评论。

为此,我们将导航到 ReviewController,并汇总数据以在 Index 页面上显示。然后,我们将从数据库加载产品和评论,遍历它们,并将其平均到八天(包括当天)。最后,我们将把汇总的数据编译成一个列表,并基于该列表创建一个表格。

首先创建一个 SentimentTrends 模型(我们评论数据的精简版),包含以下代码

namespace UserFeedbackApp.Models
{
    public class SentimentTrends
    {
        public int Id { get; set; }
        public string ProductName { get; set; }
        public float PositiveValue { get; set; }
        public float NeutralValue { get; set; }
        public float NegativeValue { get; set; }
        public string PostDate { get; set; }
    }
}

接下来,使用以下代码更新 ReviewController 文件中的 Index 方法

public async Task<IActionResult> Index()
{
    var reviewList = await _context.Reviews.ToListAsync();
    var productList = await _context.Products.ToListAsync();

    List<SentimentTrends> trends = new List<SentimentTrends>();

    foreach(var product in productList)
    {
         var productReviews = reviewList
        .Where(d => d.ProductId == product.Id)
        .Where(d => DateTime.ParseExact(d.PostDate, "yyyy-MM-dd", 
                    CultureInfo.InvariantCulture) >= (DateTime.Now.AddDays(-8)))
        .ToList();

        if (productReviews.Count() > 0)
        {
            float positiveValue = 0;
            float neutralValue = 0;
            float negativeValue = 0;
            foreach (var review in productReviews)
            {
                 positiveValue += review.PositiveValue;
                 neutralValue += review.NeutralValue;
                 negativeValue += review.NegativeValue;
             }

             positiveValue = (float)Math.Round(positiveValue / productReviews.Count(), 2);
             neutralValue = (float)Math.Round(neutralValue / productReviews.Count(), 2);
             negativeValue = (float)Math.Round(negativeValue / productReviews.Count(), 2);

             SentimentTrends trend = new SentimentTrends();

             trend.Id = productReviews.First().ProductId;
             trend.ProductName = productReviews.First().ProductName;
             trend.PostDate = DateTime.Now.AddDays(-8).ToString("yyyy-MM-dd");
             trend.PositiveValue = positiveValue;
             trend.NeutralValue = neutralValue;
             trend.NegativeValue = negativeValue;

             trends.Add(trend);
        }
    }

    ViewBag.Trends = trends;
    return reviewList != null ?
            View(reviewList) :
            Problem("Entity set 'DatabaseContext.Reviews'  is null.");
}

此代码过滤了我们的近期评论,按收到的评论数量对其进行了平均,并创建了列表,然后通过 ViewBag 传递给视图。要显示这些数据,请更新Views/Reviews 文件夹中的 Index.cshtml 文件,使用以下代码

<h2>Seven Day Trend</h2>
<table class="table">
    <thead>
        <tr>
            <th>Product ID</th>
            <th>Product Name</th>
            <th>Positive</th>
            <th>Neutral</th>
            <th>Negative</th>
        </tr>
    </thead>
    <tbody>
        @foreach (SentimentTrends item in ViewBag.trends)
        {
        <tr>
                <td>@item.Id</td>
                <td>@item.ProductName</td>
                <td>@item.PositiveValue</td>
                <td>@item.NeutralValue</td>
                <td>@item.NegativeValue</td>
        </tr>
        }
    </tbody>
</table>

这将我们的数据以简单的表格形式显示在我们的评论页面上。如果我们现在运行代码并导航到评论页面,我们将在页面顶部看到表格。以这种方式平均产品情感,可以根据真实的客户反馈深入了解潜在的产品问题。

The Index page shows the Seven Day Trend for Apple Laptops reviews, with 0.69 positive, 0.01 Neutral, and 0.3 Negative.

结论

智能应用可以为您的应用程序增加更多数据和洞察,从而带来更多功能。

在本文中,我们使用 Azure 容器应用构建了一个简单的 Web 应用程序。然后,我们通过 Azure AI 集成了情感分析,扩展了应用程序分析用户反馈的能力。Azure 上的这种应用程序架构能够实现应用程序和 AI 组件的无缝扩展。这种自动扩展确保您的应用程序能够高效地满足不断增长的需求,并在需求下降时缩减规模。

然而,情感分析只是整个 Azure AI 套件中一个很小的组成部分。Azure AI 包含多个利用预构建模型的 AI 驱动 API,例如

  • 语言理解,用于翻译、问答或对话语言理解
  • 图像处理,用于图像识别或图像和视频分析
  • 语音处理,包括语音转文本、文本转语音或语音翻译
  • 异常检测、冒犯性内容检测和个性化

开始您的 Azure 智能应用之旅,然后深入了解本系列第三部分,学习如何进一步提升您的智能应用。

© . All rights reserved.