使用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 ...
随机推荐
- 如何在 PIP 配置文件中设置默认源?
在不同的操作系统中,在 PIP 配置文件中设置默认源的方法如下: Windows 操作系统 打开文件资源管理器,在地址栏输入 %APPDATA% 并回车,进入用户配置目录. 在该目录下创建一个名为 p ...
- Go实现动态开点线段树
1.线段树介绍 线段树是一种用于高效处理区间查询和区间更新的数据结构,当我们需要解决一个频繁更新区间值的问题的时候,就可以采用线段树的结构进行解决.线段树的核心思想是将区间分为多个子区间进行管理,越往 ...
- Linux - 关于yum源 file & ftp & http 的三种配置方式
一.环境准备 1.两台Centos服务器:node1.node2 2.配置ip:node1(192.168.2.111).node2(192.168.2.112) 3.关闭防火墙 systemctl ...
- Scala高阶函数 1
package com.wyh.day01 /** * * 高阶函数 */ object ScalaFun3 { def main(args: Array[String]): Unit = { //定 ...
- Week08_day07(DataX从mysql上读取数据传输到HDFS上)
简介DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.HDFS.Hive.OceanBase.HBase.OTS.ODPS 等各种异构数据源之间高效的 ...
- 使用Express对mysql进行增改查操作(完全代码版本)
使用Express对mysql进行增改查操作(完全代码版本) 今天发的是Express对mysql进行增删改操作的所有代码,这个代码还没有完善好,都是一些基础的增删改查操作,有一些地方也写上了注释方便 ...
- [评测/调研/AIGC/流媒体] 视频内容自动生成摘要工具
概述:视频内容自动生成摘要工具 SolidPoint | 仅支持 简介 SolidPoint 是一款AI驱动的在线视频摘要工具,专注于自动生成YouTube视频的简洁摘要. 通过分析视频内容提取关键点 ...
- 分布式锁—7.Curator的分布式锁
大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphor ...
- 四大AI编程工具组合测评
在当今数字化浪潮中,AI 编程工具如雨后春笋般涌现,极大地提升了编程效率与体验.本文将详细剖析四类 AI 编程工具组合,从开发工具.大模型.插件搭配,到编程能力.费用体系及综合评价,为开发者提供全面 ...
- 无法解析@NotBlank
当碰到无法解析的时候,一般都是地址写错了,找不到相应的路劲 我是全局能搜到这个包@NotBlank,在jakarta.validation-api包里面,但是我网上搜https://www.cnblo ...