目录
毫无疑问,人工智能(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 CreateAction以合并对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文件夹以创建审阅,然后单击“提交”。从下拉列表中选择Clippers&Trimmers,然后写下:“这是一个非常好的修剪器,可以剪掉我的头发,但它被我的胡须卡住了。
在检查你刚刚发布的评论时,你会注意到Azure AI将其评分为正面,尽管有一些负面和中立的成分。
现在,尝试另一篇评论。这一次,从下拉列表中选择耳机产品并写下以下评论:“这些耳机还算过得去。外面的泡沫不够厚,会伤到你的头。价格真的很便宜。
这一次,AI 将评论评分为负面,没有正面评分,评分略为中性。
通过结合这种基于AI的评分,您可以深入了解客户反馈趋势,并可以根据正面或负面反馈启动特定操作。例如,我们可能想了解我们的商品评论在过去7天的表现。让我们更新我们的评论列表页面,以显示该期间的平均评论。
为此,我们将导航到ReviewController并汇总要显示在“索引”页面上的数据。然后,我们将从数据库中加载我们的产品和评论,遍历它们,并在八天(包括当天)内对它们进行平均。最后,我们将汇总的数据编译成一个列表,并基于列表创建一个表。
首先使用以下代码创建一个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中的视图之前创建列表。若要显示此数据,请使用以下代码更新“视图/评论”文件夹中的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开始智能应用之旅,然后深入了解本系列的第三部分,了解如何升级智能应用。
https://www.codeproject.com/Articles/5370509/Deploy-an-Intelligent-App-on-Azure-Container-Apps