使用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.pswp.cn/diannao/83313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83313.shtml
英文地址,請注明出處:http://en.pswp.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下即可使用