使用PocketFlowSharp创建一个Human_Evaluation示例

效果

image-20250516142423902

image-20250516142438960

实践

有时候AI生成的结果我们并不满意在进入下一步之前,我们需要对AI生成的结果进行人工审核,同意了才能进入下一个流程。

Human_Evaluation就是人工判断的一个简单示例。

 internal class Program{static async Task Main(string[] args){// Load .env fileDotEnv.Load();// Get environment variables from .env filevar 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;}}

看一下整体的流程图:

generate
approve
approve
retry
输入节点
AI回复节点
人工审核节点
结束节点

image-20250516143406016

输入节点:

 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;}}

全部代码在:https://github.com/Ming-jiayou/PocketFlowSharp/tree/main/PocketFlowSharpSamples.Console/Human_Evaluation

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

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

相关文章

【项目】自主实现HTTP服务器:从Socket到CGI全流程解析

00 引言 ​ 在构建高效、可扩展的网络应用时&#xff0c;理解HTTP服务器的底层原理是一项必不可少的技能。现代浏览器与移动应用大量依赖HTTP协议完成前后端通信&#xff0c;而这一过程的背后&#xff0c;是由网络套接字驱动的请求解析、响应构建、数据传输等一系列机制所支撑…

SQL练习(6/81)

目录 1.寻找连续值 方法一&#xff1a;使用自连接&#xff08;Self-Join&#xff09; 方法二&#xff1a;使用窗口函数&#xff08;Window Functions&#xff09; 2.寻找有重复的值 GROUP BY子句 HAVING子句 常用聚合函数&#xff1a; 3.找不存在某属性的值 not in no…

【流程控制结构】

流程控制结构 流程控制结构1、顺序结构2、选择结构if基本选择结构if else语法多重if语法嵌套if语法switch选择结构 3、循环结构循环结构while循环结构程序调试for循环跳转语句区别 流程控制结构 1、顺序结构 流程图 优先级 2、选择结构 if基本选择结构 单if 语法 if&…

【机器人】复现 UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务。 支持 对象类别导航、实例图像目标导航和文本目标导航&#xff0c;而无需针对特定任务进行训练或微调。 本文分享UniGoal复现和模型推理的过程&#xff5e; 查找沙发&#xff0c;模…

python + flask 做一个图床

1. 起因&#xff0c; 目的: 对这个网站&#xff1a;https://img.vdoerig.com/ &#xff0c; 我也想实现这种效果。做一个简单的图床&#xff0c;后面&#xff0c;可以结合到其他项目中。 2. 先看效果 实际效果。 3. 过程: Grok 聊天&#xff1a; https://img.vdoerig.co…

Java生产环境设限参数教学

哈哈&#xff0c;这个问题问得好&#xff01;咱们用开餐厅的比喻来理解生产环境的四大必须设限参数&#xff0c;保证你听完再也不会忘&#xff01;&#xff08;搓手手&#xff09; 1. 堆内存上限&#xff1a;-Xmx&#xff08;厨房的最大容量&#xff09; 问题&#xff1a;想象…

电脑出故障驱动装不上?试试驱动人生的远程服务支持

在日常工作或学习中&#xff0c;驱动问题时常成为电脑用户的一大困扰。尤其是在更换硬件、重装系统、驱动冲突等情况下&#xff0c;许多用户往往手足无措&#xff0c;不知道从何下手。而“驱动人生”作为国内领先的驱动管理工具&#xff0c;一直以高效、便捷、智能著称。现在&a…

JS手写代码篇---手写 instanceof 方法

2、手写 instanceof 方法 instancecof用于检测一个对象是否是某个构造函数的实例。它通常用于检查对象的类型&#xff0c;尤其是在处理继承关系时。 eg: const arr [1,2,3,4,5]console.log(arr instanceof Array); // trueconsole.log(arr instanceof Object); // true那这是…

使用exceljs将excel文件转化为html预览最佳实践(完整源码)

前言 在企业应用中&#xff0c;我们时常会遇到需要上传并展示 Excel 文件的需求&#xff0c;以实现文件内容的在线预览。经过一番探索与尝试&#xff0c;笔者最终借助 exceljs 这一库成功实现了该功能。本文将以 Vue 3 为例&#xff0c;演示如何实现该功能&#xff0c;代码示例…

PMP-第十二章 项目采购管理

项目采购管理核心概念 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程项目组织既可以是买方&#xff08;甲方&#xff09; &#xff0c;也可以是卖方&#xff08;乙 方&#xff09;项目采购管理过程围绕协议来进行&#xff0c;协议是买卖双方之间具…

maven和npm区别是什么

这是一个很容易搞糊涂新手的问题&#xff0c;反正我刚开始从课堂的知识转向项目网站开发时&#xff0c;被这些问题弄得晕头转向&#xff0c;摸不着头脑&#xff0c;学的糊里糊涂&#xff0c;所以&#xff0c;写了这么久代码&#xff0c;也总结一下&#xff0c;为后来者传授下经…

Leetcode76覆盖最小子串

覆盖最小子串 代码来自b站左程云 class Solution {public String minWindow(String str, String tar) {char[] s str.toCharArray();char[] t tar.toCharArray();int[] cnt new int[256];for (char cha : t) { cnt[cha]--;}int len Integer.MAX_VALUE;int debt t.length…

Linux du 命令终极指南:从基础到精通

文章目录 Linux du 命令终极指南&#xff1a;从基础到精通du 命令简介常用参数详解常见用法示例查看当前目录总大小查看当前目录及其子目录占用空间只显示当前目录总占用空间查看目录下每个文件和子目录的大小查看某目录深度为 1 的大小分布查看某目录并排除日志文件查看多个目…

sychronized原理(嚼碎了喂版)

先说一下心得吧&#xff0c;我们知道硬软不分家&#xff0c;在学习底层原理的时候我们不需要死扣到底&#xff0c;没必要把硬件方面全吃透&#xff0c;点到为止&#xff0c;学到能够帮助理解代码即可&#xff0c;我们的目标是写出高性能的代码&#xff0c;而不是创造出硬软一体…

Ngrok 配置:实现 Uniapp 前后端项目内网穿透

文章目录 一、下载并安装 ngrok二、配置 ngrok Authtoken三、启动本地 uniapp 项目四、使用 ngrok 暴露本地服务五、通过公网 URL 访问项目六、后端API项目的穿透问题排查 (uni-app 后端 API 示例)交互流程图示 七、ngrok Web 界面 (本地监控)八、停止 ngrok总结 ngrok 是一款…

k8s灰度发布

基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…

win10-django项目与mysql的基本增删改查

以下都是在win10系统下&#xff0c;django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数&#xff1a;类名.objects.create(字段名值,字段名"值"。。。…

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中&#xff0c;ParameterizedType 和 TypeVariable 是两个不同的类型表示&#xff0c;它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射&#xff08;Reflection&#xff09;中用于描述泛型信息&#xff0c;但用途和含义不同。 &#x1f31f; 一…

PR-2021

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

unity使用ZXing.Net生成二维码

下载链接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用