使用 Azure AI 在 Azure Container Apps 上部署智能应用(第二部分)
在本四部分系列文章中,您将学习如何使用 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 无缝注入到应用程序中。
接下来,我们需要注册我们的文本分析客户端,以便将其注入到应用程序的依赖项中。在此之前,文本分析客户端需要两个密钥
- 一个终结点地址
- 一个访问密钥
我们需要将这两个项添加到我们的开发和生产环境。在这两个环境中,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 将其评为正面,但带有轻微的负面和中性成分。
现在,尝试另一条评论。这次,从下拉列表中选择“耳机”产品,然后输入以下评论:“这些耳机还可以。外面的泡沫不够厚,会伤到头。价格真的很便宜。”
这次,AI 将评论评为负面,没有正面评分,只有一个轻微的中性评分。
通过整合这种基于 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>
这将我们的数据以简单的表格形式显示在我们的评论页面上。如果我们现在运行代码并导航到评论页面,我们将在页面顶部看到表格。以这种方式平均产品情感,可以根据真实的客户反馈深入了解潜在的产品问题。
结论
智能应用可以为您的应用程序增加更多数据和洞察,从而带来更多功能。
在本文中,我们使用 Azure 容器应用构建了一个简单的 Web 应用程序。然后,我们通过 Azure AI 集成了情感分析,扩展了应用程序分析用户反馈的能力。Azure 上的这种应用程序架构能够实现应用程序和 AI 组件的无缝扩展。这种自动扩展确保您的应用程序能够高效地满足不断增长的需求,并在需求下降时缩减规模。
然而,情感分析只是整个 Azure AI 套件中一个很小的组成部分。Azure AI 包含多个利用预构建模型的 AI 驱动 API,例如
- 语言理解,用于翻译、问答或对话语言理解
- 图像处理,用于图像识别或图像和视频分析
- 语音处理,包括语音转文本、文本转语音或语音翻译
- 异常检测、冒犯性内容检测和个性化
开始您的 Azure 智能应用之旅,然后深入了解本系列第三部分,学习如何进一步提升您的智能应用。