Semantic Kernel: プロセス

プロセスは特定のビジネス目標を達成するために設計された手順の集合であり、サービスや製品を提供することにより、顧客に価値を創造します。各プロセスは連続した活動の集合により構成され、全体の目標を達成するように設計されており、効率を高め、意思決定を最適化し、チーム間の協力を促進します。

Microsoft Semantic Kernelフレームワークでは、Process Frameworkは複雑なワークフローを管理するための強力な自動化ソリューションです。このフレームワークは、ユーザーが定義したKernel Functionを呼び出すことで、AIをビジネスプロセスにシームレスに組み込み、既存のシステムやコードに密接に統合することで、ワークフローの柔軟性とインテリジェンスを顕著に向上させます。

このフレームワークはイベント駆動型モデルに基づいてプロセスの実行を管理します。各ステップには明確な入力と出力が定義されており、イベントとメタデータのトリガーメカニズムをサポートし、効率的な流れを保証します。また、モジュール式の設計によってプロセスとステップはアプリケーション間で再利用可能であり、拡張性をサポートします。フレームワークはオープンテレメトリーを通じてプロセスの完全な制御と監査可能性を実現し、透明性と信頼性を保証します。

## 主要な概念には以下が含まれます：

1. **プロセス（Process）：** 特定の顧客目標を実現するタスクの集合。
2. **ステップ（Step）：** プロセス内の基本的な活動で、明確な入力と出力を持つ。
3. **パターン（Pattern）：** ステップの実行順序を定義し、プロセスの完全な実行を確保。

Process Frameworkを用いることで、企業はインテリジェンスを備えた迅速に対応するワークフローを構築し、生産性と運用効率を大幅に向上させ、ビジネスプロセスのモダン化とインテリジェンス化を実現します。

次に示すのは、Mermaidを用いた順方向の旅程プロセスです：

```mermaid
flowchart
    A[Start] --> B[提取用户信息]
    B --> C{预订机票}
    C -- 是 --> D{预订酒店}
    C -- 否 --> E[发邮件提醒]
    D --> F{预订用车}
    D --> G[发邮件提醒]
    F -- 是 --> H[生成行程单]
    F -- 否 --> I[发邮件提醒]
    H --> I[订单完成]
    I --> J[End]
```

具体的な画像は以下の通りです：

![具体的な図](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBFyIN6LkPh9LI5O3eOfb8jBHpSXTV6EbYr1gyjlKYq2cAHlfSCw7ZyoCvVaiba56AkNSicTB8VOybA/640?wx_fmt=png&from=appmsg)

以下のコードスニペットはSKのProcessフレームワークを用いてプロセスを実装した例です：

```csharp
#pragma warning disable SKEXP0080
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.Reflection;
using System.Text.Json.Serialization;

var process = new ProcessBuilder("Trip");
var getCustomerStep = process.AddStepFromType<GetCustomerStep>();
var tripAirStep = process.AddStepFromType<TripAirTicketProcessStep>();
var tripHotelStep = process.AddStepFromType<TripHotelProcessStep>();
var tripCarStep = process.AddStepFromType<TripCarProcessStep>();
var mailServiceStep = process.AddStepFromType<MailServiceStep>();
var tripCompleteStep = process.AddStepFromType<TripCompleteStep>();
var stopProcessStep = process.AddStepFromType<StopProcessStep>();
process.OnInputEvent(TripEvents.StartProcess)
       .SendEventTo(new ProcessFunctionTargetBuilder(getCustomerStep, GetCustomerStep.Functions.GetCustomer));
getCustomerStep
    .OnEvent(TripEvents.GetCustomer)
    .SendEventTo(new ProcessFunctionTargetBuilder(tripAirStep, TripAirTicketProcessStep.Functions.TripAirTicket, parameterName: "customer"));
tripAirStep
    .OnEvent(TripEvents.TripAirTicketSuccess)
    .SendEventTo(new ProcessFunctionTargetBuilder(tripHotelStep, TripHotelProcessStep.Functions.TripHotel));
tripAirStep
    .OnEvent(TripEvents.TripAirTicketFail)
    .SendEventTo(new ProcessFunctionTargetBuilder(mailServiceStep, MailServiceStep.Functions.SendMailToUserWithDetails, parameterName: "message"));
tripHotelStep
    .OnEvent(TripEvents.TripHotelSuccess)
    .SendEventTo(new ProcessFunctionTargetBuilder(tripCarStep, TripCarProcessStep.Functions.TripCar));
tripHotelStep
    .OnEvent(TripEvents.TripHotelFail)
    .SendEventTo(new ProcessFunctionTargetBuilder(mailServiceStep, MailServiceStep.Functions.SendMailToUserWithDetails, parameterName: "message"));
tripCarStep
    .OnEvent(TripEvents.TripCarSuccess)
    .SendEventTo(new ProcessFunctionTargetBuilder(tripCompleteStep, TripCompleteStep.Functions.TripComplete));
tripCarStep
    .OnEvent(TripEvents.TripCarFail)
    .SendEventTo(new ProcessFunctionTargetBuilder(mailServiceStep, MailServiceStep.Functions.SendMailToUserWithDetails, parameterName: "message"));
tripCompleteStep
    .OnEvent(TripEvents.TripCompleted)
    .SendEventTo(new ProcessFunctionTargetBuilder(stopProcessStep, StopProcessStep.Functions.StopProcess));
stopProcessStep
    .OnEvent(TripEvents.StopProcess)
    .StopProcess();
var kernelProcess = process.Build();
Kernel kernel = CreateKernelWithChatCompletion();
while (true)
{
    Console.WriteLine("请输入用户id:");
    var id = int.Parse(Console.ReadLine());
    using var runningProcess = await kernelProcess.StartAsync(kernel, new KernelProcessEvent() { Id = TripEvents.StartProcess, Data = id });
}
```

実行結果は以下の通りです：

![実行結果の画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBFyIN6LkPh9LI5O3eOfb8jtrpOa5EERIUjS8Xfv6CBnKqj4SLyOo7MJtiaMuZpv3Kov4EwIr2X2rQ/640?wx_fmt=png&from=appmsg)

(Translated by GPT)