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

使用 Fusion 开发来升级 AI 应用(第 2 部分):与 Form Recognizer 集成

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2022 年 5 月 6 日

CPOL

8分钟阅读

viewsIcon

5725

downloadIcon

54

在本文中,我们将创建一个事件中心 (Event Hub),当上传新图像时,Dataverse 可以向其发送事件。

上一篇文章中,我们创建了一个简单的 Power App,允许像公民开发者一样在 Dataverse 中上传(或删除)图像。现在,我们的用户可以上传扫描或拍摄的发票或其他文档,并将其存储在 Dataverse 中。在本文中,我们将作为开发者添加更多高级功能。

我们将使用事件中心 (Event Hubs) 将 Dataverse 中上传的图像发送到 Azure Function。Azure Function 将图像发送到 Azure Form Recognizer,后者将使用 OCR(光学字符识别)提取发票详细信息等数据。

这种方法使 AI 对每个人都易于访问,帮助会计部门自动从文档中提取相关详细信息,从而节省时间。

创建事件中心

我们将从创建事件中心开始。转到 Azure 中的“所有服务”并找到 **事件中心 (Event Hubs)**。创建新的事件中心也会创建一个命名空间。

在 **创建命名空间** 中,首先选择您的订阅和资源组。您可以选择现有的资源组,或在创建命名空间时输入新名称来创建新的资源组。在本教程中,您应该创建一个名为“powerplatform”的新 **资源组**,以便以后可以快速删除它。

同时指定 **命名空间名称**,该名称在所有 Azure 中必须是唯一的,例如“img-file-powerplatform”。选择一个离您较近的 **位置**,例如“西欧”。您可以选择“基本” **定价层**,它以最低的成本满足我们所有的需求。

保留其他默认值,单击 **审阅 + 创建**,然后单击 **创建**。

部署您的事件中心命名空间可能需要几分钟时间。准备就绪后,找到您的命名空间。

创建事件中心很简单。只需转到左侧菜单中的 **事件中心 (Event Hubs)**,单击 **+ 事件中心 (+ Event Hub)**,输入名称(例如“forms”),即可完成。其他值可以保持默认。

在接下来的步骤中,我们将需要一个事件中心的连接字符串。因此,在您的命名空间中,转到 **共享访问策略 (Shared access policies)** 并单击 **RootManageSharedAccessKey**。然后,您可以复制主密钥的连接字符串。

将 Dataverse 连接到事件中心

接下来,我们将使用插件注册工具 (PRT) 将事件中心连接到 Dataverse。

Microsoft 在 NuGet 上发布了 PRT,因此请获取 nupkg 文件。最简单的方法是直接从 NuGet 下载。使用您喜欢的 zip 工具(如 WinZip、7-Zip 或 WinRAR)打开 nupkg 文件,然后解压 **tools** 文件夹。在此文件夹中找到 **PluginRegistration.exe**。

拥有 PRT 后,打开它并单击 **+ 创建新连接 (+ CREATE NEW CONNECTION)** 进行登录。选择“Office 365”作为您的部署类型。您可能希望显示可用组织列表,并选择“显示高级 (Show advanced)”选项,以便输入您的凭据(而不是使用您计算机的凭据)。选择您的区域并输入您的用户名和密码。

登录后,单击 **注册 (Register)**,然后单击 **注册新服务终结点 (Register New Service Endpoint)**。选择 **从 Azure 服务总线门户开始连接字符串... (Let’s Start with the connection string from the Azure Service Bus Portal…)** 并输入您的事件中心连接字符串。在接下来的表单中,将 **目标类型 (Designation Type)** 从“队列 (Queue)”更改为“事件中心 (EventHub)”,并输入“forms”作为事件中心名称。然后,保存终结点注册。

选中服务终结点后,单击 **注册 (Register)**,然后单击 **注册新步骤 (Register New Step)**。在接下来的弹出窗口中,我们将告诉 Dataverse 何时向我们的事件中心发送消息。

当您键入至少一个字母时,表单字段将自动完成,因此了解需要输入的内容会很有帮助。对于 **消息 (Message)**,设置为“Create”。您的 **主实体 (Primary Entity)** 是 Dataverse 表的生成名称,格式为 [prefix]_[table name in lower letters],例如“cra6e_form”。您可以选择性地更改 **步骤名称 (Step Name)** 和 **描述 (Description)**。对于 **执行模式 (Execution Mode)**,选择“异步 (Asynchronous)”。然后单击 **注册新步骤 (Register New Step)**。

您可以通过在 Power Apps 应用中添加新表单来测试应用程序,并检查您的事件中心。您应该会看到一些请求进来。

创建表单识别器

到目前为止,我们已经上传了一些随机图像,但目标是使用 OCR 从发票和收据等表单中提取数据。为此,我们将需要 Azure Form Recognizer。

Azure Form Recognizer 使用机器学习从文档中提取键值对、文本和表格。其 API 可以识别发票、收据、身份证(主要是美国驾照和国际护照)、名片和自定义文档的关键数据。我们也可以训练自己的模型,但这超出了本文的范围。

要创建 Form Recognizer,请转到 Azure 并搜索“form recognizer”。单击 **+ 创建 (+ Create)**。选择您的资源组和一个唯一的名称(该名称也将是 API 端点的自定义域名),例如“powerapp-form-recognizer”。

选择免费层,对于此示例来说已足够。保留所有其他默认值,单击 **审阅 + 创建 (Review + Create)**,然后单击 **创建 (Create)**。资源准备就绪后,转到 **密钥和终结点 (Keys and Endpoint)**,获取下一个部分所需的信息。

访问 Dataverse

在我们的 Function 中,首先需要做的是访问 Dataverse。事件中心消息不会包含上传的图片,因此我们需要自行获取图像。

我们将在 Azure Active Directory 中注册一个 Azure Function 应用程序,授予该 Azure Function 应用程序访问 Power Apps 的权限,然后在代码中使用它。因此,转到包含您的 Power Apps 的帐户的 Azure 门户。转到 **Azure Active Directory (Azure AD)**,然后转到 **应用注册 (App registrations)**。

单击 **+ 新建注册 (+ New registration)**。然后,为您的应用程序命名,例如“Dataverse sample app”,然后注册应用程序。接下来,转到 **证书和机密 (Certificates & secrets)** 并创建一个机密。创建后,此机密将不再可见,因此请记下来。

接下来,我们需要授予此应用程序访问 Dataverse 的权限。因此,请转到 Power Platform 管理中心 查看您环境的列表。单击环境旁边的三个点,然后单击 **设置 (Settings)**。

在 **设置 (Settings)** 中,转到 **用户 + 权限 (Users + permissions)**,然后转到 **应用程序用户 (Application users)**。然后,单击 **+ 新建应用用户 (+ New app user)**,找到您刚刚注册的应用程序并选择您的业务部门。我们将授予它“系统管理员 (System Administrator)”角色,该角色赋予应用程序所需的所有(甚至更多)访问权限,这在测试时非常有用。

创建 Azure Function

现在一切就绪,我们将创建一个 Azure Function 来将所有内容整合在一起。

打开 Visual Studio 2019 或 2022 并创建一个新项目。选择具有事件中心触发器的 Azure Functions 模板。

输入连接字符串名称,例如“EventHubConnString”。输入您的事件中心名称“forms”。默认情况下,存储帐户是模拟器,对于此示例来说没问题(我们不必将 Function App 部署到 Azure)。

在脚手架完 Function 后,打开 local.settings.json 文件,并在 Values 节点中添加 EventHubConnString: [your connection string]。通过启动 Function App,向 Power App 添加文件,并确认您的 Function 控制台已记录相关信息来验证一切是否正常。

在代码中访问 Dataverse 之前,我们需要一些信息。我们知道表名,并且可以在 Dataverse 表 ID 中找到表前缀。

我们也可以在 Power Platform 管理中心找到环境 ID。单击环境并查看环境 URL。您需要“.crm”之前的“org[...]”部分。

您还需要您的 Azure 租户 ID,可以在 Azure AD 中找到。此外,您还需要之前生成的机密和客户端 ID,可以在已注册应用程序的概述页面中找到。

在代码中访问 Dataverse

我们应该已经有一些 Visual Studio 在上一步生成的代码了,我们将对其进行添加。首先,我们将从事件中心消息中获取上传表单的实体 ID。

现在,填写上一节中的值

string messageBody = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
string primaryEntityId = JsonConvert.DeserializeObject<dynamic>(messageBody).PrimaryEntityId;

// Dataverse table
var environmentId = "<...>";
var prefix = "<...>";
var tableName = "forms";
var imageColumnName = "image";
var resource = $"https://{environmentId}.api.crm4.dynamics.com";
var apiVersion = "9.2";

// Azure app
var tenantId = "<...>";
var clientId = "<...>";
var clientSecret = "<...>";

var authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId);
var credential = new ClientCredential(clientId, clientSecret);
var authResult = await authContext.AcquireTokenAsync(resource, credential);
var accessToken = authResult.AccessToken;

// Get the uploaded image from Dataverse.
var client = new HttpClient
{
    BaseAddress = new Uri($"{resource}/api/data/v{apiVersion}/")
};
var headers = client.DefaultRequestHeaders;
headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
headers.Add("OData-MaxVersion", "4.0");
headers.Add("OData-Version", "4.0");
headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var response = await client.GetAsync($"{prefix}_{tableName}({primaryEntityId})?$select={prefix}_{imageColumnName},{prefix}_name");
var content = await response.Content.ReadAsStringAsync();
string image = JsonConvert.DeserializeObject<dynamic>(content)[$"{prefix}_{imageColumnName}"];
var bytes = Convert.FromBase64String(image);

首先,此代码使用 AuthenticationContext,使用我们注册的应用程序从 Azure 获取令牌。该令牌应具有访问我们 Dataverse 环境的权限。

之后,它创建一个 HttpClient,添加一些默认标头,并使用令牌和 Bearer 方案添加授权标头。

然后,代码可以使用 OData 语法 Get 我们的图像。返回的图像将是 base64 编码的,因此我们将其解码为可以与 Form Recognizer 一起使用的字节数组。

从 Form Recognizer 获取数据

最后,我们需要将图像发送到 Form Recognizer 并获取结果。我们可以使用 Azure.AI.FormRecognizer NuGet 包。转到 Azure 中的 Form Recognizer,并在概述页面上找到密钥,因为您接下来需要它。

然后,将此代码放入您的应用程序代码中

// Form recognizer
var formRecognizerName = "powerapp-form-recognizer";
var formRecognizerKey = "ced734f796c7406cbe2cad5ec9c044e6";

// Send the image to Form Recognizer.
var endpoint = $"https://{formRecognizerName}.cognitiveservices.azure.com/";
var recognizer = new FormRecognizerClient(new Uri(endpoint), new AzureKeyCredential(formRecognizerKey));
using var stream = new MemoryStream(bytes);
var operation = await recognizer.StartRecognizeContentAsync(stream);
var result = await operation.WaitForCompletionAsync();

我们可以简单地将从 Dataverse 获取的字节传递给 StartRecognizeContentAsync 函数,然后我们会得到一个结果。结果将包含 Form Recognizer 识别的所有单词。我们将在下一篇文章中使用这些单词。

您可以在 GitHub 上找到完整的代码。

后续步骤

在本文中,我们创建了 Azure 环境和 Azure Function。我们还安排了对 Dataverse 的访问以及从 Dataverse 的访问。

我们使用 Form Recognizer 来智能地从文档中提取数据,使强大的人工智能解决方案对每个人都易于访问。这种基于 AI 的方法为会计部门节省了他们原本会花费在手动从发票和其他文档中复制信息上的时间。现在,该部门可以专注于更高价值的工作。

继续阅读最后一篇文章,届时我们将把 Form Recognizer 的结果发送回 Dataverse,以便在我们的 Power App 中使用它们。

要详细了解如何构建一个结合了 Power Apps 和 Azure 服务的复杂、功能齐全的解决方案,请参阅电子书 使用 Power Apps 构建应用的融合开发方法

© . All rights reserved.