这是一个非常经典且强大的 AI Agent 应用场景。将截图、历史步骤和当前目标结合起来,让 Gemini 进行“观察-思考-行动”的循环,是实现复杂任务自动化的关键。
这完全可行,其核心思想就是创建一个“观察-思考-行动”(Observe-Think-Act)的循环。您的 C# 程序将作为这个循环的执行者(Orchestrator)。
下面,我将为您详细分解实现这个任务的架构、关键代码和最佳实践。
架构设计:观察-思考-行动循环
观察 (Observe): C# 程序负责截取当前整个屏幕或特定应用窗口的图像。
思考 (Think): C# 程序将截图数据、任务的最终目标、以及一个记录了所有已执行操作的历史列表,一同发送给 Gemini 1.5 Pro(这个任务必须使用支持图像输入的多模态模型)。
行动 (Act): Gemini API 会分析这些信息,并返回一个结构化的 JSON 对象,其中包含下一个具体的操作指令(例如,点击坐标 (x,y) 或者输入文本)。C# 程序解析这个 JSON,并使用 UI 自动化库(如 FlaUI)来执行该操作。
这个循环会一直持续,直到 Gemini 返回一个特殊的“任务完成”指令。
1. 定义详细的 JSON 操作指令
首先,我们需要和 Gemini “约定”好一个详细的 JSON 通信格式。这个格式越清晰,Gemini 的输出就越可靠。我们可以在 C# 中创建一个对应的类来方便地进行序列化和反序列化。
C# ActionCommand 类:
public class ActionCommand { // 操作类型:click, double_click, right_click, type, key_combo, finish public string Action { get; set; } // 操作的X坐标 (对于点击类操作) public int? X { get; set; } // 操作的Y坐标 (对于点击类操作) // 为什么用坐标?因为模型直接从图片中识别位置比识别控件ID更直观 public int? Y { get; set; } // 要输入的文本 (对于 type 操作) public string Text { get; set; } // 键盘组合键,例如 ["CONTROL", "S"] (对于 key_combo 操作) public List<string> Keys { get; set; } // 模型对当前操作的思考或解释,便于调试 public string Commentary { get; set; } }
2. 构建强大的提示词 (Prompt Engineering)
这是整个系统的“灵魂”。一个好的提示词能够清晰地指导 Gemini 如何行动。
提示词模板:
你是一个专业的 Windows 操作系统自动化助手。你的任务是根据用户的总体目标,逐步完成任务。 我会为你提供三部分信息: 1. **[总体目标]**: 任务的最终目的是什么。 2. **[历史步骤]**: 已经执行过的操作列表,用于给你上下文。 3. **[当前屏幕截图]**: 当前电脑屏幕的实时画面。 你的工作是: - 分析屏幕截图,结合总体目标和历史步骤。 - 决定出【下一个】最合理、最精确的【单步操作】。 - 必须以严格的 JSON 格式返回你的决定,不要包含任何额外的解释或 markdown 标记。 JSON 格式定义如下: { "action": "操作类型", // 必须是 'click', 'double_click', 'right_click', 'type', 'key_combo', 'finish' 中的一个 "x": X坐标, // 对于点击操作,提供精确的整数X坐标 "y": Y坐标, // 对于点击操作,提供精确的整数Y坐标 "text": "要输入的文本", // 仅用于 'type' 操作 "keys": ["键1", "键2"], // 仅用于 'key_combo' 操作,有效键包括 'CONTROL', 'ALT', 'SHIFT', 'WIN', 'ENTER', 'ESC', 以及单个字母或数字 "commentary": "你为什么做出这个决定的简短说明" } 重要规则: - 每一次只返回一个操作。 - 如果你认为总体目标已经全部完成,请将 action 设置为 'finish'。 - 在进行 'type' 操作前,请确保已经 'click' 了一个输入框。 --- 现在,请根据以下信息执行任务: **[总体目标]**: {overall_goal} **[历史步骤]**: {history_steps} **[当前屏幕截图]**: [这里将附上图片数据]
3. C# 实现自动化主控程序
下面是一个结合了截图、调用 Gemini API 和 FlaUI 执行操作的示例代码框架。
所需 NuGet 包:
Google.Cloud.AIPlatform.V1
FlaUI.UIA3
System.Drawing.Common (用于截图)
System.Text.Json (内置)
using FlaUI.Core; using FlaUI.Core.Input; using FlaUI.UIA3; using Google.Cloud.AIPlatform.V1; using Google.Protobuf.WellKnownTypes; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using System.Windows.Forms; // 需要引用 System.Windows.Forms.dll public class GeminiAgentOrchestrator { private readonly PredictionServiceClient _client; private readonly string _endpoint; private readonly List<string> _history = new List<string>(); public GeminiAgentOrchestrator(string projectId, string location, string model = "gemini-1.5-pro-001") { _endpoint = $"projects/{projectId}/locations/{location}/publishers/google/models/{model}"; _client = new PredictionServiceClientBuilder { Endpoint = $"{location}-aiplatform.googleapis.com" }.Build(); } public async Task RunTask(string overallGoal) { while (true) { // 1. 观察 (Observe) - 截取屏幕 Console.WriteLine("
网友回复