使用PocketFlowSharp创建一个Human_Evaluation示例
效果



实践
有时候AI生成的结果我们并不满意在进入下一步之前,我们需要对AI生成的结果进行人工审核,同意了才能进入下一个流程。
Human_Evaluation就是人工判断的一个简单示例。
internal class Program
{
static async Task Main(string[] args)
{
// Load .env file
DotEnv.Load();
// Get environment variables from .env file
var envVars = DotEnv.Read();
string ModelName = envVars["ModelName"];
string EndPoint = envVars["EndPoint"];
string ApiKey = envVars["ApiKey"];
Utils.ModelName = ModelName;
Utils.EndPoint = EndPoint;
Utils.ApiKey = ApiKey;
// 创建共享数据字典
var shared = new Dictionary<string, object>();
// 创建并运行流程
var humanEvalFlow = CreateFlow();
Console.WriteLine("\n欢迎使用人工判断示例!");
Console.WriteLine("------------------------");
await humanEvalFlow.RunAsync(shared);
Console.WriteLine("\n感谢使用人工判断示例!");
}
static AsyncFlow CreateFlow()
{
// 创建节点实例
var inputNode = new TaskInputNode();
var aiResponseNode = new AIResponseNode();
var humanApprovalNode = new HumanApprovalNode();
var endNode = new NoOpNode();
// 创建从输入节点开始的流程
var flow = new AsyncFlow(inputNode);
// 连接节点
_ = inputNode - "generate" - aiResponseNode;
_ = aiResponseNode - "approve" - humanApprovalNode;
_ = humanApprovalNode - "retry" - aiResponseNode; // 不接受时重新生成
_ = humanApprovalNode - "accept" - endNode; // 接受时结束流程
return flow;
}
}
看一下整体的流程图:
A[输入节点] -->|"generate"| B[AI回复节点]
B -->|"approve"| C[人工审核节点]
C -->|"approve"| D[结束节点]
C -->|"retry"| B
输入节点:
public class TaskInputNode : AsyncNode
{
protected override async Task<object> PrepAsync(Dictionary<string, object> shared)
{
Console.WriteLine("\n请输入需要AI处理的任务:");
string task = Console.ReadLine();
return task;
}
protected override async Task<object> ExecAsync(object prepResult)
{
string task = (string)prepResult;
Console.WriteLine($"\n已收到任务:{task}");
return task;
}
protected override async Task<object> PostAsync(Dictionary<string, object> shared, object prepResult, object execResult)
{
string task = (string)execResult;
shared["task"] = task;
return "generate";
}
}
AI回复节点:
public class AIResponseNode : AsyncNode
{
private static int attemptCount = 0;
protected override async Task<object> PrepAsync(Dictionary<string, object> shared)
{
return shared["task"];
}
protected override async Task<object> ExecAsync(object prepResult)
{
string task = (string)prepResult;
attemptCount++;
Console.WriteLine("AI正在生成回复...\n");
Console.WriteLine($"任务:{task}\n");
Console.WriteLine($"这是第 {attemptCount} 次生成的AI回复:\n");
var result = await Utils.CallLLMStreamingAsync(task);
string response="";
Console.ForegroundColor = ConsoleColor.Green;
await foreach (StreamingChatCompletionUpdate completionUpdate in result)
{
if (completionUpdate.ContentUpdate.Count > 0)
{
Console.Write(completionUpdate.ContentUpdate[0].Text);
response += completionUpdate.ContentUpdate[0].Text.ToString();
}
}
Console.ForegroundColor = ConsoleColor.White;
return response;
}
protected override async Task<object> PostAsync(Dictionary<string, object> shared, object prepResult, object execResult)
{
string response = (string)execResult;
shared["response"] = response;
return "approve";
}
}
人工审核节点:
public class HumanApprovalNode : AsyncNode
{
protected override async Task<object> PrepAsync(Dictionary<string, object> shared)
{
return shared["response"];
}
protected override async Task<object> ExecAsync(object prepResult)
{
Console.Write("\n您接受这个AI回复吗?(y/n): ");
string answer = Console.ReadLine()?.ToLower() ?? "n";
return answer;
}
protected override async Task<object> PostAsync(Dictionary<string, object> shared, object prepResult, object execResult)
{
string answer = (string)execResult;
if (answer == "y")
{
Console.WriteLine($"已接受的回复:\n{shared["response"]}");
return "accept";
}
else
{
Console.WriteLine("\n好的,让AI重新生成回复...");
return "retry";
}
}
}
结束节点:
public class NoOpNode : AsyncNode
{
protected override async Task<object> PrepAsync(Dictionary<string, object> shared) => null;
protected override async Task<object> ExecAsync(object prepResult) => null;
protected override async Task<object> PostAsync(Dictionary<string, object> shared, object prepResult, object execResult) => null;
}
帮助类:
public static class Utils
{
public static string ModelName { get; set; }
public static string EndPoint { get; set; }
public static string ApiKey { get; set; }
public static async Task<string> CallLLMAsync(string prompt)
{
ApiKeyCredential apiKeyCredential = new ApiKeyCredential(ApiKey);
OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
openAIClientOptions.Endpoint = new Uri(EndPoint);
ChatClient client = new(model: ModelName, apiKeyCredential, openAIClientOptions);
ChatCompletion completion = await client.CompleteChatAsync(prompt);
return completion.Content[0].Text;
}
public static async Task<AsyncCollectionResult<StreamingChatCompletionUpdate>> CallLLMStreamingAsync(string prompt)
{
ApiKeyCredential apiKeyCredential = new ApiKeyCredential(ApiKey);
OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
openAIClientOptions.Endpoint = new Uri(EndPoint);
ChatClient client = new(model: ModelName, apiKeyCredential, openAIClientOptions);
var completion = client.CompleteChatStreamingAsync(prompt);
return completion;
}
}
使用PocketFlowSharp创建一个Human_Evaluation示例的更多相关文章
- 使用Express创建一个简单的示例
1.安装Express 使用npm包安装工具来安装Express安装包,打开npm命令行,输入: npm install -g express 2.创建一个工程 本示例是在windows下创建的,项目 ...
- Cordova之如何用命令行创建一个项目(完整示例)
原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...
- 创建一个RAS 非对称 公私密钥示例
static void Main(string[] args) { RSAParameters pub; RSAParameters priv; using (var rsa = new RSACry ...
- Angular CLI 创建你的第一个 Angular 示例程序
第一步:安装 Angular CLI 你要使用 Angular CLI 来创建项目.创建应用和库代码,并执行多种开发任务,比如测试.打包和发布. 全局安装 Angular CLI. 要想使用 npm ...
- 快速创建一个 spring mvc 示例
1. 创建一个 servlet 项目 参考 http://www.cnblogs.com/zno2/p/5908589.html 2. 引入 spring mvc 依赖 <dependency& ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- 如何创建一个简单的Visual Studio Code扩展
注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一款轻量级的代码编辑器,免费,开源,支持多种 ...
- 如何用Unity创建一个的简单的HoloLens 3D程序
注:本文提到的代码示例下载地址>How to create a Hello World 3D holographic app with Unity 之前我们有讲过一次如何在HoloLens中创建 ...
- 如何在HoloLens中创建一个2D的Hello World程序
注:本文提及到的代码示例下载地址 > How to build an "Hello World" 2D app in HololLens. HoloLens 是微软的一款MR ...
- 利用django创建一个投票网站(三)
创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Dj ...
随机推荐
- 使用vscode开发微信小程序
1. 安装插件 2. 文件-打开文件夹-将新建的微信小程序导入,代码会有高亮的效果 3. 编辑内容,查看效果,如果有就说明插件引入成功.
- webgpu学习问题,遇到了create graphics pipeline state failed错误
在学习webgpu并渲染图像时发生create graphics pipeline state failed with E_INVALIDARG (0x80070057)错误,图像无法成功渲染. ht ...
- Spark core 总结
Spark RDD五大特性 1.RDD由一组partition组成 2.每一个分区由一个task来处理 3.RDD之间有一些列依赖关系 4.分区类算子必须作用在kv格式得RDD上 5.spark为ta ...
- 百万架构师第四十五课:并发编程的基础|JavaGuide
课程目标 1. 多线程的发展历史 2. 线程的应用 3. 并发编程的基础 4. 线程安全的问题 特定的指令,计算机不会存储指令,把指令写下来,一次性读取指令,批处理. 然后我们需要把批处理进行隔离.保 ...
- 详解nginx配置url重定向-反向代理
https://www.jb51.net/article/99996.htm 本文系统:Centos6.5_x64 三台主机:nginx主机,hostname: master.lansgg.com ...
- 异步编程——CompletableFuture详解
Future JDK5 新增了Future接口,用于描述一个异步计算的结果. 虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,我们必须使用Future.g ...
- 【MATLAB习题】铰链四杆机构的运动学分析
铰链四杆机构题目&已知数据 matlab 代码 主程序文件: function main %输入已知数据 clear; i1=101.6; i2=254; i3=177.8; i4=304.8 ...
- 基于近红外与可见光双目摄像头的活体人脸检测,文末附Demo
基于近红外与可见光双目摄像头的活体人脸检测原理 人脸活体检测(Face Anti-Spoofing)是人脸识别系统中的重要一环,它负责验证捕捉到的人脸是否为真实活体,以抵御各种伪造攻击,如彩色纸张打印 ...
- Java的数据类型详解
java的为强类型语言,所以要求变量的使用要严格符合规定,所有的变量都必须先定义后在使用: 什么是变量? 变量顾名思义,就是可变的量:是程序中最基本的存储单元,其要素要包括:变量名.变量类型和作用域: ...
- Pydantic配置继承抽象基类模式
title: Pydantic配置继承抽象基类模式 date: 2025/3/21 updated: 2025/3/21 author: cmdragon excerpt: Pydantic模型配置系 ...