Semantic Kernel:Process

news/2025/3/4 3:50:49/文章来源:https://www.cnblogs.com/axzxs2001/p/18746174

Process(流程)是为实现特定业务目标而设计的步骤集合,通过提供服务或产品,为客户创造价值。每个流程由一系列有序的活动组成,这些活动共同完成一个整体目标,旨在提升效率、优化决策,并促进跨团队协作。

在Microsoft Semantic Kernel框架中,Process Framework是一种强大的自动化解决方案,用于管理复杂工作流。该框架通过调用用户定义的Kernel Functions,将AI无缝嵌入业务流程,与现有系统和代码紧密集成,显著增强工作流的灵活性和智能化。

该框架采用事件驱动模型,管理流程执行。每个步骤明确定义输入和输出,支持事件与元数据的触发机制,确保高效流转。同时,通过模块化设计,流程和步骤可以跨应用重用,支持扩展性。框架还通过开放遥测(Open Telemetry)实现流程的全面控制与可审计性,确保透明性与可靠性。

关键概念包括:

  1. Process(流程):实现特定客户目标的任务集合。
  2. Step(步骤):流程中的基本活动,具有明确输入与输出。
  3. Pattern(模式):定义步骤的执行顺序,确保流程完整运行。

通过Process Framework,企业能够构建智能、响应迅速的工作流,大幅提升生产力和运营效率,实现业务流程的现代化与智能化。

下面是一个正向的用Mermaid组织的行程流程:

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

具体图像如下:

 如果用SK的Process实现如下:

#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 });
}
Kernel CreateKernelWithChatCompletion()
{Kernel kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: "gpt-4o",apiKey: File.ReadAllText("c:/gpt/key.txt")).Build();return kernel;
}
public static class TripEvents
{//开始Processpublic static readonly string StartProcess = nameof(StartProcess);public static readonly string GetCustomer = nameof(GetCustomer);public static readonly string TripAirTicketSuccess = nameof(TripAirTicketSuccess);public static readonly string TripAirTicketFail = nameof(TripAirTicketFail);public static readonly string TripHotelSuccess = nameof(TripHotelSuccess);public static readonly string TripHotelFail = nameof(TripHotelFail);public static readonly string TripCarSuccess = nameof(TripCarSuccess);public static readonly string TripCarFail = nameof(TripCarFail);// 邮件服务已发送public static readonly string MailServiceSent = nameof(MailServiceSent);public static readonly string TripCompleted = nameof(TripCompleted);public static readonly string StopProcess = nameof(StopProcess);
}
//public class BaseProcessStep : KernelProcessStep<InputState>
//{
//    public override ValueTask ActivateAsync(KernelProcessStepState<InputState> state)
//    {
//        return base.ActivateAsync(state);
//    }
//}
//public record InputState
//{
//    public string Input { get; init; }
//}
public class GetCustomerStep : KernelProcessStep
{public static class Functions{public const string GetCustomer = nameof(GetCustomer);}[KernelFunction(Functions.GetCustomer)]public async Task GetCustomerStepAsync(KernelProcessStepContext context, int id, Kernel _kernel){Console.WriteLine($"【查询客户】开始,id={id}");var customers = new List<CustomerForm>(){new CustomerForm(){UserFirstName = "",UserLastName = "",UserDateOfBirth = "1990-01-01",UserState = "上海",UserPhoneNumber = "13800000000",UserId = 1,UserEmail = "",State = "1"},new CustomerForm(){UserFirstName = "",UserLastName = "",UserDateOfBirth = "1990-01-01",UserState = "上海",UserPhoneNumber = "13800000000",UserId = 2,UserEmail = "",State = "2"},new CustomerForm(){UserFirstName = "",UserLastName = "",UserDateOfBirth = "1990-01-01",UserState = "上海",UserPhoneNumber = "13800000000",UserId = 3,UserEmail = "",State = "3"},new CustomerForm(){UserFirstName = "",UserLastName = "",UserDateOfBirth = "1990-01-01",UserState = "上海",UserPhoneNumber = "13800000000",UserId = 4,UserEmail = "",State = "4"}};var customer = customers.SingleOrDefault(s => s.UserId == id);Console.WriteLine($"【查询客户】成功:{customer}");     await context.EmitEventAsync(new() { Id = TripEvents.GetCustomer, Data = customer, Visibility = KernelProcessEventVisibility.Public });}
}
public class TripAirTicketProcessStep : KernelProcessStep
{public static class Functions{public const string TripAirTicket = nameof(TripAirTicket);}[KernelFunction(Functions.TripAirTicket)]public async Task TripAirTicketAsync(KernelProcessStepContext context, CustomerForm customer, Kernel _kernel){Console.WriteLine($"【机票预订】开始,姓名:{customer.UserFirstName}{customer.UserLastName}");var chat = _kernel.GetRequiredService<IChatCompletionService>();var chatHistory = new ChatHistory();chatHistory.AddUserMessage("生成一个国际航班的时刻表,标题是“| 航班号 | 出发地 | 目的地 | 出发时间 | 到达时间 | 航空公司 |”,只返回表格,不返回其他任何信息");var chatResult = chat.GetStreamingChatMessageContentsAsync(chatHistory);await foreach (var item in chatResult){Console.Write(item);}Console.WriteLine();if (customer.State == "1"){Console.WriteLine("【机票预订】失败");await context.EmitEventAsync(new(){Id = TripEvents.TripAirTicketFail,Data = "我们遗憾地通知您,机票预订失败!",Visibility = KernelProcessEventVisibility.Public,});return;}Console.WriteLine("【机票预订】成功");await context.EmitEventAsync(new() { Id = TripEvents.TripAirTicketSuccess, Data = customer, Visibility = KernelProcessEventVisibility.Public });}
}
public class TripHotelProcessStep : KernelProcessStep
{public static class Functions{public const string TripHotel = nameof(TripHotel);}[KernelFunction(Functions.TripHotel)]public async Task TripHotelAsync(KernelProcessStepContext context, CustomerForm customer, Kernel _kernel){Console.WriteLine($"【酒店预订】开始,姓名:{customer.UserFirstName}{customer.UserLastName}");if (customer.State == "2"){Console.WriteLine("【酒店预订】失败");await context.EmitEventAsync(new(){Id = TripEvents.TripHotelFail,Data = "我们遗憾地通知您,酒店预订失败!",Visibility = KernelProcessEventVisibility.Public,});return;}Console.WriteLine("【酒店预订】成功");await context.EmitEventAsync(new() { Id = TripEvents.TripHotelSuccess, Data = customer, Visibility = KernelProcessEventVisibility.Public });}
}
public class TripCarProcessStep : KernelProcessStep
{public static class Functions{public const string TripCar = nameof(TripCar);}[KernelFunction(Functions.TripCar)]public async Task TripCarAsync(KernelProcessStepContext context, CustomerForm customer, Kernel _kernel){Console.WriteLine($"【租车预订】开始,姓名:{customer.UserFirstName}{customer.UserLastName}");if (customer.State == "3"){Console.WriteLine("【租车预订】失败");await context.EmitEventAsync(new(){Id = TripEvents.TripCarFail,Data = "我们遗憾地通知您,租车预订失败!",Visibility = KernelProcessEventVisibility.Public,});return;}Console.WriteLine("【租车预订】成功");await context.EmitEventAsync(new() { Id = TripEvents.TripCarSuccess, Data = customer, Visibility = KernelProcessEventVisibility.Public });}
}
public class TripCompleteStep : KernelProcessStep
{public static class Functions{public const string TripComplete = nameof(TripComplete);}[KernelFunction(Functions.TripComplete)]public async Task TripCompleteAsync(KernelProcessStepContext context, CustomerForm customer, Kernel _kernel){Console.WriteLine("【总预订】成功");await context.EmitEventAsync(new() { Id = TripEvents.TripCompleted, Data = true, Visibility = KernelProcessEventVisibility.Public });}
}
public class StopProcessStep : KernelProcessStep
{public static class Functions{public const string StopProcess = nameof(StopProcess);}[KernelFunction(Functions.StopProcess)]public async Task StopProcessAsync(KernelProcessStepContext context, bool result, Kernel _kernel){Console.WriteLine("全部结束");await Task.Delay(10);}
}
public class MailServiceStep : KernelProcessStep
{public static class Functions{public const string SendMailToUserWithDetails = nameof(SendMailToUserWithDetails);}[KernelFunction(Functions.SendMailToUserWithDetails)]public async Task SendMailServiceAsync(KernelProcessStepContext context, string message){Console.WriteLine("======== 邮件服务 ======== ");Console.WriteLine(message);Console.WriteLine("============================== ");await context.EmitEventAsync(new() { Id = TripEvents.StopProcess, Data = false });}
}
public class CustomerForm
{[JsonPropertyName("userFirstName")]public string UserFirstName { get; set; } = string.Empty;[JsonPropertyName("userLastName")]public string UserLastName { get; set; } = string.Empty;[JsonPropertyName("userDateOfBirth")]public string UserDateOfBirth { get; set; } = string.Empty;[JsonPropertyName("userState")]public string UserState { get; set; } = string.Empty;[JsonPropertyName("userPhoneNumber")]public string UserPhoneNumber { get; set; } = string.Empty;[JsonPropertyName("userId")]public int UserId { get; set; }[JsonPropertyName("userEmail")]public string UserEmail { get; set; } = string.Empty;[JsonPropertyName("state")]public string State { get; set; } = string.Empty;public override string ToString(){return $"姓名:{UserFirstName}{UserLastName},生日:{UserDateOfBirth},电话:{UserPhoneNumber},邮箱:{UserEmail},状态:{State}";}
}

运行结果如下:

   文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/892227.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Semantic Kernel:新Agent代理

在之前的SemanticKernel中,有一篇关于Agent的文章,不过现在看来其中使用的包过时,所以这篇来更新一下。原文章如下:Semantic Kernel:Agent代理 桂素伟,公众号:桂迹Semantic Kernel:Agent代理原来项目引有的Nuget包如下,版本停留在了1.18.2,2024年9月4日   最新的Agen…

基于uniCloud开发的管理端部署

参考链接: https://doc.dcloud.net.cn/uniCloud/publish.html https://doc.dcloud.net.cn/uniCloud/hosting.html#使用 上传云函数前端网页托管勾选将编译后的资源部署到前端网页托管选项 配置自定义域名配置域名,根据提示在域名管理处添加解析将得到的cname值在域名解析出添…

UnitsNet 库简介

UnitsNet 是一个功能强大的 .NET 库,专为简化物理单位的处理而设计。它提供了丰富的单位类型及其转换功能,使开发人员能够在代码中方便地进行物理单位间的转换、计算和显示。UnitsNet 支持多种领域的物理单位,例如长度、质量、体积、温度、速度、面积等,极大地提高了开发效…

DeepSeek避坑指南:巧用提示词

前言 DeepSeek是国内AI里面的佼佼者,它开源deepseek r1大模型,不仅把AI的使用成本降了下来,同时还撼动了open AI等国际玩家的市场地位。 由于DeepSeek R1是推理模型,在某些时候输出的内容答非所问、甚至会一本正经的胡说八道。今天我们主要聊聊如何能更好的让大模型回答问题…

.NET9里WinForm更新了什么

下面是几个在.NET9中WinForm的新功能!主题Windows Forms 已初步支持暗模式,目标是在 .NET 10 中实现完整支持。应用程序的颜色模式可以设置为以下几种值:SystemColorMode.Classic—(默认)浅色模式,与之前版本的 Windows Forms 相同。 SystemColorMode.System—遵循 Windo…

2019-PTA模拟赛-L1-3 后天(三目表达式-仅代码)

签到题,无解析Code: #include<iostream> using namespace std; int main(){int d;cin >> d;int res = (d + 2) % 7 == 0 ? 7 : (d + 2) % 7;cout << res;return 0; }

SemanticKernel系列,AI系列,SmartFill介绍视频系列

SemanticKernel系列 Semantic Kernel(SK)是微软开发的开源框架,旨在帮助开发者将大型语言模型(LLM)集成到应用程序中。它提供了丰富的工具和功能,支持多种编程语言,简化了LLM的调用和管理过程。通过SK,开发者可以更高效地构建智能应用,实现自然语言处理、对话生成等功…

Python|Windows 系统安装 triton 的方法

若未安装,则在运行调用了该仓库的 Python 脚本时,会报错如下:ModuleNotFoundError: No module named triton在 Windows 系统中,如果直接使用 pip 安装,会报错如下:pip install triton ERROR: Could not find a version that satisfies the requirement triton (from vers…

linux---常见命令

使用的是linux服务器,在这里整理一些linux常见的命令: 1、查看服务器端口命令sudo netstat -tuln打完收工!

国家 - 1

Mi propio escondite.今天说冰岛。 这是冰岛的轮廓:

Semantic Kernel:图片向量化

虽然本节与SK无关,但都是基于AI,所以暂且放在这个系统中Azure AI 视觉的多模式嵌入 API 可以将图像和文本转换为向量,也就是一种数字化的表示方式。这种技术可以让我们实现基于向量的图片搜索功能。通过结合这个 API 和 pgvector(PostgreSQL 中的向量库),我们可以让图片变…

miniconda创建虚拟环境后vscode使用conda时提示无法将“conda”项识别——附使用conda运行python项目简单教程

前提:miniconda已经加入到环境变量 vscode找到setting输入shell: windows改成cmd,重启vscode就好了 跑python项目需要对应的python版本和依赖包,使用anaconda管理python环境是个很好的选择,但是不需要跑深度学习大数据这种比较大的项目或者模型使用miniconda是个不错的选…