
最近在AI Agent领域一个名为“Energy”的新项目引起了开发社区的广泛关注。它由前OpenAI工程师Gabriel创建其核心愿景是让AI能够像人类一样直接操作电脑——通过自然语言指令AI可以自动完成打开浏览器、搜索信息、填写表单、操作软件等一系列复杂的桌面任务。这听起来像是科幻电影里的场景但Energy正试图将其变为现实。对于开发者而言这不仅是一个酷炫的新工具更可能彻底改变我们与计算机交互、进行自动化测试乃至构建下一代人机协作应用的方式。本文将深入解析Energy项目的技术原理、核心概念并提供一个从零开始的完整实战教程。我们将一起搭建一个基础的AI桌面操作环境编写指令让AI自动完成一系列网页操作任务。无论你是对AI Agent感兴趣的后端开发者还是希望探索自动化新可能的测试工程师都能从本文中获得可直接复现的代码和清晰的实现思路。1. 背景与核心概念什么是AI驱动的桌面操作在深入代码之前我们有必要厘清几个核心概念理解Energy这类项目试图解决的根本问题。1.1 从RPA到AI Agent自动化的范式转移传统的桌面自动化主要依赖于机器人流程自动化RPA。RPA工具通过录制用户的鼠标点击和键盘输入或者通过识别屏幕上的固定图像、控件ID来执行重复性任务。它的优点是规则明确、执行稳定但缺点同样明显脆弱且缺乏灵活性。一旦软件界面布局发生微小变化如按钮位置移动、颜色改变整个自动化脚本就可能失效需要人工重新调整。Energy所代表的AI Agent路径则尝试利用多模态大模型如GPT-4V、Claude 3的视觉理解和推理能力。AI不再依赖固定的坐标或图像模板而是像人一样“看”屏幕理解屏幕上的文字、图标、布局并根据自然语言指令进行决策和操作。这带来了根本性的改变泛化能力强即使界面变化只要AI能“看懂”就能尝试操作。自然语言交互用户可以用“帮我在电商网站搜索性价比高的无线鼠标并加入购物车”这样的复杂指令而无需编写一步步的脚本。处理不确定性能够应对弹窗、验证码等非预期情况在模型能力范围内。1.2 Energy项目的核心组件拆解根据其公开的设计理念一个完整的AI桌面操作系统通常包含以下几个关键部分屏幕感知Screen Perception这是系统的“眼睛”。它需要实时捕获桌面屏幕图像并将其转化为大模型可以理解的格式。这一步可能涉及截图、窗口聚焦、甚至对UI元素树在支持可访问性的应用中的获取。指令理解与任务规划Task Planning这是系统的“大脑”。它接收用户的自然语言指令如“打开浏览器访问CSDN搜索‘Spring Boot’最新教程”并将其分解成一系列可执行的原子操作步骤Step-by-Step Planning。动作执行Action Execution这是系统的“手”。根据规划出的步骤系统需要模拟人类的输入行为如移动鼠标、点击、滚动、键入文字、快捷键组合等。记忆与反馈循环Memory Feedback系统需要记住当前任务的状态例如已经打开了哪个浏览器标签页并能根据执行后屏幕的新状态来判断操作是否成功从而决定下一步动作形成一个感知-思考-行动的闭环。1.3 相关技术生态Energy并非孤例它处于一个快速发展的技术生态中OpenAI的GPT-4V提供了强大的视觉理解能力是此类项目的基石之一。Microsoft的Autogen Studio专注于多智能体协作可以编排多个AI来共同完成复杂任务。LangChain / LlamaIndex虽然主要用于处理文本但其Agent框架的设计思想工具调用、记忆对此类项目有重要启发。Playwright / Selenium传统的浏览器自动化工具可以作为AI Agent执行网页操作时的底层“执行器”提供稳定可靠的浏览器控制API。理解这些背景后我们就可以着手构建一个简化版的、具备核心思想的“AI桌面操作助手”了。2. 环境准备与版本说明我们的实战目标构建一个Python程序它能接收自然语言指令自动操作浏览器完成信息搜索任务。我们将采用模块化设计便于理解和扩展。环境要求操作系统Windows 10/11, macOS, 或 Linux (本文以Windows为例命令通用)。Python版本 3.8 或更高。建议使用 3.9 以获得更好的兼容性。包管理工具pip。IDEVS Code, PyCharm 或任何你熟悉的编辑器。浏览器Google Chrome 或 Microsoft Edge (用于Playwright自动化)。核心依赖库我们将使用以下库请确保在开始前安装它们。# 创建项目目录并进入 mkdir ai_desktop_agent cd ai_desktop_agent # 创建虚拟环境 (推荐) python -m venv venv # Windows激活 venv\Scripts\activate # macOS/Linux激活 # source venv/bin/activate # 安装核心依赖 pip install openai # 用于调用大模型API进行任务规划和指令理解 pip install playwright # 用于浏览器自动化控制 pip install pillow # 用于图像处理截图 pip install pyautogui # 用于基础的全局鼠标键盘模拟可选用于非浏览器操作 pip install python-dotenv # 用于管理环境变量如API密钥 # 安装Playwright所需的浏览器内核 playwright install chromium项目结构预览在开始编码前我们先规划一下目录结构这有助于保持代码清晰。ai_desktop_agent/ ├── .env # 存储敏感信息如OPENAI_API_KEY ├── main.py # 主程序入口 ├── core/ │ ├── __init__.py │ ├── planner.py # 任务规划模块AI大脑 │ ├── perceiver.py # 屏幕感知模块眼睛 │ └── executor.py # 动作执行模块手 ├── tools/ # 可供AI调用的工具集 │ ├── __init__.py │ ├── browser_tools.py # 浏览器操作工具 │ └── system_tools.py # 系统级操作工具如打开应用 └── utils/ ├── __init__.py └── screenshot.py # 截图工具函数3. 核心模块原理与实现接下来我们逐一实现上述核心模块。我们将采用一种简化的架构重点展示其工作流程。3.1 屏幕感知模块 (core/perceiver.py)这个模块负责获取当前屏幕的“状态”。对于网页操作最直接的状态就是屏幕截图和当前URL。未来可以扩展为获取可访问性树或OCR识别文字。# core/perceiver.py import time from PIL import ImageGrab import io import base64 class ScreenPerceiver: 屏幕感知器负责捕获屏幕信息以供AI分析。 def capture_screen(self, regionNone): 捕获整个屏幕或指定区域的截图。 :param region: 一个四元组 (left, top, width, height)默认为全屏。 :return: PIL.Image 对象 if region: screenshot ImageGrab.grab(bboxregion) else: screenshot ImageGrab.grab() return screenshot def capture_screen_to_base64(self, regionNone): 将屏幕截图转换为base64编码的字符串便于传递给视觉模型。 :return: base64字符串 img self.capture_screen(region) buffered io.BytesIO() img.save(buffered, formatPNG) img_str base64.b64encode(buffered.getvalue()).decode(utf-8) return img_str def get_current_window_info(self): 获取当前活动窗口的信息简化版。 在实际项目中可能需要使用pygetwindow或类似库。 :return: 窗口标题等信息的字典 # 此处为简化实现返回一个模拟信息 # 真实实现可能需要调用系统API return { title: 模拟窗口 - Google Chrome, process: chrome.exe } if __name__ __main__: # 测试截图功能 perceiver ScreenPerceiver() img perceiver.capture_screen() print(f截图尺寸: {img.size}) img.save(test_screenshot.png) print(测试截图已保存为 test_screenshot.png)3.2 任务规划模块 (core/planner.py)这是系统的“大脑”。我们使用OpenAI的Chat Completion API结合思维链Chain-of-Thought提示工程让大模型将用户指令分解为具体的操作步骤。我们设计一个简单的“工具调用”机制。首先定义AI可以使用的工具# tools/__init__.py # 工具描述列表用于提示词中告诉AI有哪些工具可用 TOOL_DESCRIPTIONS [ { name: open_browser, description: 打开指定的浏览器并访问一个网址。, parameters: { url: {type: string, description: 要访问的完整URL例如 https://www.csdn.net}, browser_type: {type: string, description: 浏览器类型如 chrome 或 edge, default: chrome} } }, { name: search_in_browser, description: 在浏览器当前页面的搜索框内输入关键词并进行搜索。, parameters: { search_query: {type: string, description: 要搜索的关键词} } }, { name: click_element, description: 点击屏幕上或页面中指定的元素。需要提供元素的描述或定位信息。, parameters: { element_description: {type: string, description: 对要点击的元素的文字描述例如‘登录按钮’、‘第一个搜索结果链接’} } }, { name: type_text, description: 在当前焦点处输入文本。, parameters: { text: {type: string, description: 要输入的文本内容} } }, { name: wait, description: 等待一段时间让页面加载或操作完成。, parameters: { seconds: {type: number, description: 等待的秒数} } } ]然后实现规划器# core/planner.py import openai import json import os from dotenv import load_dotenv from tools import TOOL_DESCRIPTIONS # 加载环境变量其中应包含 OPENAI_API_KEY load_dotenv() class TaskPlanner: 任务规划器将自然语言指令解析为一系列工具调用。 def __init__(self, modelgpt-3.5-turbo): self.client openai.OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.model model # 将工具描述转换为JSON Schema格式便于模型理解 self.tools_for_api [ { type: function, function: { name: tool[name], description: tool[description], parameters: { type: object, properties: tool[parameters], required: list(tool[parameters].keys()) } } } for tool in TOOL_DESCRIPTIONS ] def plan(self, user_instruction, max_steps10): 根据用户指令生成执行计划。 :param user_instruction: 用户自然语言指令 :param max_steps: 最大规划步骤数 :return: 一个包含工具调用序列的列表 system_prompt f你是一个高级桌面操作AI助手。你的任务是将用户的自然语言指令分解成一系列具体的、可执行的操作步骤。 你可以调用的工具如下 {json.dumps(TOOL_DESCRIPTIONS, indent2, ensure_asciiFalse)} 请严格按照以下格式输出你的思考过程和计划 1. 理解用户意图。 2. 将意图分解为逻辑步骤。 3. 为每个步骤分配合适的工具和参数。 4. 输出一个JSON数组每个元素是一个工具调用对象包含 name 和 args 字段。 用户指令{user_instruction} try: response self.client.chat.completions.create( modelself.model, messages[ {role: system, content: system_prompt}, {role: user, content: 请生成执行计划。} ], temperature0.1, # 低温度保证输出稳定 max_tokens1000 ) content response.choices[0].message.content # 从模型回复中提取JSON部分这是一个简化处理实际应用需要更鲁棒的解析 # 假设模型在最后输出了一个JSON数组 import re json_match re.search(r\[\s*\{.*\}\s*\], content, re.DOTALL) if json_match: plan_json json_match.group() plan json.loads(plan_json) return plan else: # 如果模型没有直接输出JSON尝试另一种方式要求模型进行函数调用 print(未从回复中直接解析出JSON尝试函数调用方式...) # 此处可扩展为使用Chat Completion的function calling功能更规范 # 为简化示例我们返回一个默认计划 return self._generate_fallback_plan(user_instruction) except Exception as e: print(f规划任务时出错: {e}) return [] def _generate_fallback_plan(self, instruction): 生成一个后备的简单计划基于关键词匹配。 plan [] instruction_lower instruction.lower() if 打开浏览器 in instruction_lower or 访问 in instruction_lower: # 简单提取URL非常基础的实现 import re url_match re.search(rhttps?://[^\s], instruction) url url_match.group(0) if url_match else https://www.google.com plan.append({name: open_browser, args: {url: url}}) if 搜索 in instruction_lower: # 简单提取搜索词 search_query instruction.split(搜索)[-1].strip().strip(“”) if search_query and len(search_query) 50: # 简单过滤 plan.append({name: search_in_browser, args: {search_query: search_query}}) if 点击 in instruction_lower: plan.append({name: click_element, args: {element_description: 第一个搜索结果}}) plan.append({name: wait, args: {seconds: 3}}) return plan if plan else [{name: wait, args: {seconds: 5}}] if __name__ __main__: # 测试规划器需要先在项目根目录的.env文件中设置 OPENAI_API_KEYsk-... planner TaskPlanner(modelgpt-3.5-turbo) # 或 gpt-4 test_instruction 打开Chrome浏览器访问CSDN官网在搜索框里搜索‘Python异步编程’然后点击第一篇博客文章。 plan planner.plan(test_instruction) print(生成的执行计划) print(json.dumps(plan, indent2, ensure_asciiFalse))3.3 动作执行模块 (core/executor.py) 与工具实现执行器负责调用具体的工具函数来执行规划出的每一步。我们来实现浏览器操作工具。首先实现浏览器工具# tools/browser_tools.py from playwright.sync_api import sync_playwright import time class BrowserTools: 浏览器操作工具集使用Playwright进行控制。 def __init__(self): self.playwright None self.browser None self.context None self.page None self._is_running False def start_browser(self, browser_typechromium, headlessFalse): 启动浏览器实例。 if self._is_running: print(浏览器已在运行中。) return self.page try: self.playwright sync_playwright().start() self.browser self.playwright.chromium.launch(headlessheadless) # 默认使用Chromium self.context self.browser.new_context(viewport{width: 1280, height: 720}) self.page self.context.new_page() self._is_running True print(f浏览器已启动 (headless{headless})。) return self.page except Exception as e: print(f启动浏览器失败: {e}) return None def open_browser(self, url, browser_typechrome): 打开浏览器并导航到指定URL。 :param url: 要访问的网址 :param browser_type: 浏览器类型目前主要支持chromium系 if not self._is_running: self.start_browser(headlessFalse) # 为了演示使用非无头模式以便观察 try: self.page.goto(url, wait_untilnetworkidle) print(f已导航至: {url}) time.sleep(2) # 等待页面加载 return True except Exception as e: print(f访问URL失败: {e}) return False def search_in_browser(self, search_query): 在浏览器当前页面进行搜索。此函数假设页面有一个可见的搜索框。 这是一个简化实现实际应用中需要更智能的元素定位。 if not self.page: print(没有活动的浏览器页面。) return False try: # 尝试定位常见的搜索框选择器 search_selectors [ input[typesearch], input[nameq], input[title搜索], [rolesearch] input, textarea[aria-label*搜索] ] search_box None for selector in search_selectors: elements self.page.query_selector_all(selector) if elements and len(elements) 0: # 取第一个可见的 for elem in elements: if elem.is_visible(): search_box elem break if search_box: break if search_box: search_box.click() search_box.fill() # 清空可能存在的文本 search_box.fill(search_query) search_box.press(Enter) print(f已搜索: {search_query}) time.sleep(3) # 等待搜索结果加载 return True else: print(未找到明显的搜索框。尝试通过URL直接搜索Google。) # 回退方案使用Google搜索 self.page.goto(fhttps://www.google.com/search?q{search_query}) time.sleep(3) return True except Exception as e: print(f搜索操作失败: {e}) return False def click_element(self, element_description): 根据描述点击元素。这是一个非常简化的实现。 真实场景需要结合OCR、视觉模型或可访问性树来精确定位。 print(f[模拟] 根据描述点击元素: {element_description}) # 此处为模拟真实实现极其复杂 # 可能的实现路径 # 1. 截图并使用视觉模型识别元素位置然后用pyautogui点击。 # 2. 使用Playwright的文本选择器如 page.get_by_text()进行点击。 time.sleep(1) return True def close(self): 关闭浏览器和Playwright资源。 if self.browser: self.browser.close() if self.playwright: self.playwright.stop() self._is_running False print(浏览器已关闭。)然后实现执行器来协调工具调用# core/executor.py from tools.browser_tools import BrowserTools import time class ActionExecutor: 动作执行器负责解析并执行规划器生成的工具调用序列。 def __init__(self): self.browser_tools BrowserTools() self.available_tools { open_browser: self.browser_tools.open_browser, search_in_browser: self.browser_tools.search_in_browser, click_element: self.browser_tools.click_element, type_text: self._type_text, # 示例函数 wait: self._wait } def execute_plan(self, plan): 按顺序执行计划中的每一步。 :param plan: 规划器生成的工具调用列表 :return: 执行是否成功的布尔值列表 results [] for i, step in enumerate(plan): tool_name step.get(name) args step.get(args, {}) print(f\n--- 步骤 {i1}: 执行工具 {tool_name}参数: {args}) if tool_name in self.available_tools: try: # 调用对应的工具函数 success self.available_tools[tool_name](**args) results.append(success) if not success: print(f警告: 步骤 {i1} 执行可能失败。) except Exception as e: print(f执行工具 {tool_name} 时发生异常: {e}) results.append(False) else: print(f错误: 未知工具 {tool_name}) results.append(False) # 每个步骤后短暂暂停 time.sleep(0.5) return results def _type_text(self, text): 模拟键盘输入文本简化版在实际应用中需要定位输入焦点。 print(f[模拟] 输入文本: {text}) # 真实实现可能需要使用 pyautogui.typewrite(text) return True def _wait(self, seconds): 等待指定秒数。 print(f等待 {seconds} 秒...) time.sleep(seconds) return True def cleanup(self): 清理资源。 self.browser_tools.close()4. 完整实战案例构建并运行你的第一个AI桌面助手现在我们将所有模块组合起来创建一个可以运行的主程序。4.1 创建配置文件与环境变量在项目根目录创建.env文件用于安全存储你的OpenAI API密钥。# .env OPENAI_API_KEY你的OpenAI_API密钥_sk-...重要请勿将此文件提交到Git等版本控制系统。应在.gitignore中添加.env。4.2 编写主程序入口 (main.py)# main.py import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from core.planner import TaskPlanner from core.executor import ActionExecutor from dotenv import load_dotenv def main(): # 1. 加载环境变量 load_dotenv() if not os.getenv(OPENAI_API_KEY): print(错误: 请在项目根目录的 .env 文件中设置 OPENAI_API_KEY。) return # 2. 初始化模块 print(初始化AI桌面助手...) planner TaskPlanner(modelgpt-3.5-turbo) # 可根据需要切换为 gpt-4 executor ActionExecutor() # 3. 获取用户指令 print(\n *50) print(欢迎使用AI桌面操作助手演示版) print(*50) print(示例指令) print( - 打开浏览器访问百度搜索今天的天气) print( - 去CSDN搜索Spring Boot教程) print( - 打开GitHub搜索playwright-python项目) print(输入 quit 或 退出 结束程序。) print(-*50) while True: user_input input(\n请输入您的指令: ).strip() if user_input.lower() in [quit, 退出, exit]: print(程序结束。) break if not user_input: continue # 4. 规划任务 print(f\n 正在分析指令: {user_input}) plan planner.plan(user_input) if not plan: print(未能生成有效的执行计划。请尝试更清晰的指令。) continue print(f生成 {len(plan)} 个步骤:) for i, step in enumerate(plan): print(f {i1}. {step[name]}({step.get(args, {})})) # 5. 执行任务 confirm input(是否开始执行(y/n): ).strip().lower() if confirm y: print(\n开始执行...) results executor.execute_plan(plan) success_count sum(results) print(f\n执行完毕。成功步骤: {success_count}/{len(results)}) else: print(执行已取消。) # 6. 清理 executor.cleanup() if __name__ __main__: main()4.3 运行与验证确保环境配置正确在终端中激活虚拟环境并确保所有依赖已安装。设置API密钥将你的OpenAI API密钥填入.env文件。运行程序在项目根目录执行以下命令。python main.py输入指令测试程序启动后会提示你输入指令。尝试输入“打开浏览器访问 https://www.csdn.net”。观察程序行为它会调用规划器生成一个包含open_browser工具调用的计划然后执行器会启动一个真实的Chrome浏览器非无头模式并跳转到CSDN官网。预期输出示例初始化AI桌面助手... 欢迎使用AI桌面操作助手演示版 示例指令 - 打开浏览器访问百度搜索今天的天气 - 去CSDN搜索Spring Boot教程 - 打开GitHub搜索playwright-python项目 输入 quit 或 退出 结束程序。 -------------------------------------------------- 请输入您的指令: 打开浏览器访问CSDN搜索AI Agent 正在分析指令: 打开浏览器访问CSDN搜索AI Agent 生成 2 个步骤: 1. open_browser({url: https://www.csdn.net}) 2. search_in_browser({search_query: AI Agent}) 是否开始执行(y/n): y 开始执行... 浏览器已启动 (headlessFalse)。 已导航至: https://www.csdn.net --- 步骤 2: 执行工具 search_in_browser参数: {search_query: AI Agent} 已搜索: AI Agent 执行完毕。成功步骤: 2/24.4 结果说明如果一切顺利你将看到一个Chrome浏览器窗口自动打开。浏览器自动访问了CSDN官网。浏览器在CSDN的搜索框如果被成功定位或跳转到Google搜索了“AI Agent”。终端中打印出每一步的执行日志。至此你已经成功构建了一个具备Energy项目核心思想自然语言指令 - 任务规划 - 自动执行的简化版AI桌面操作助手原型。5. 常见问题与排查思路在开发和运行此类项目时你可能会遇到以下问题问题现象常见原因解决思路ModuleNotFoundError: No module named openai依赖未安装或虚拟环境未激活。1. 确认已激活虚拟环境 (venv\Scripts\activate)。2. 运行pip install -r requirements.txt或重新安装pip install openai playwright。openai.AuthenticationErrorOpenAI API密钥无效或未设置。1. 检查.env文件是否存在且格式正确 (OPENAI_API_KEYsk-...)。2. 确认密钥有效且有余额。浏览器没有启动或启动后立即关闭Playwright浏览器未正确安装或代码中headlessTrue。1. 运行playwright install chromium。2. 检查browser_tools.py中start_browser(headlessFalse)。规划器返回空计划或错误计划指令过于模糊或模型如gpt-3.5-turbo理解有偏差。1. 尝试使用更清晰、具体的指令。2. 升级到gpt-4模型在planner.py中修改以获得更好的推理能力。3. 优化system_prompt给出更明确的工具使用示例。搜索框定位失败网页结构多样预设的CSS选择器不匹配。1. 手动打开浏览器开发者工具查看目标搜索框的实际选择器。2. 增强search_in_browser函数添加更多备选选择器或使用Playwright的文本定位 (page.get_by_placeholder(“搜索”))。3. 考虑引入视觉模型进行元素定位进阶。程序卡住或无响应网络请求超时或页面加载元素过慢。1. 在open_browser和search_in_browser等函数中增加timeout参数和更完善的异常处理。2. 使用wait工具在关键步骤后添加等待时间。click_element无法点击我们的示例中该函数仅为模拟。这是本示例的最大简化点。真实实现需要1.视觉方案截图 - 调用GPT-4V等模型识别元素坐标 - 用pyautogui点击。2.DOM方案结合Playwright通过文本、角色、标签名等定位元素后点击。6. 最佳实践与工程建议要将这个原型发展为更稳定、可用的项目需要考虑以下工程化实践1. 增强任务规划的可靠性使用Function CallingOpenAI API原生支持函数调用Function Calling它能以结构化JSON格式返回工具调用请求比用正则表达式从文本中解析JSON稳定得多。应重构TaskPlanner来使用此功能。引入验证与重试规划出的步骤在执行前应进行简单验证如URL格式。执行失败后应有重试机制或重新规划的逻辑。多模态输入将屏幕截图base64编码作为上下文的一部分发送给模型让规划基于真实的视觉状态而不是凭空想象。2. 提升动作执行的鲁棒性混合定位策略不要依赖单一的定位方式。结合CSS选择器、XPath、文本内容、视觉特征和可访问性属性来定位元素。等待与状态检查在执行点击、输入等操作前确保目标元素处于可交互状态可见、启用。使用Playwright的wait_for_selector、wait_for_function等方法。错误恢复设计状态恢复机制。例如如果点击后页面跳转失败可以尝试回退到上一步或刷新页面。3. 架构设计与可扩展性工具注册机制设计一个中心化的工具注册表方便动态添加新的操作能力如操作Excel、发送邮件。记忆与状态管理维护一个会话记忆记录已执行的操作、当前的浏览器标签页、登录状态等供后续规划参考。异步执行考虑使用异步编程asyncioplaywright.async_api来提高效率尤其是在需要并行执行多个任务或进行大量IO操作时。4. 安全与权限控制最小权限原则此工具能力强大应运行在受控的沙箱环境或虚拟机中避免对生产系统造成意外影响。指令白名单/黑名单对于不可逆操作如删除文件、发送邮件应设置确认机制或直接禁止。API密钥管理永远不要将API密钥硬编码在代码中。使用.env文件或专业的密钥管理服务。5. 测试与监控单元测试为每个工具函数编写单元测试模拟不同的网页状态。集成测试录制典型的用户操作流程User Journey作为自动化测试用例。日志与审计详细记录AI的每一步决策、调用的工具及参数、执行结果便于问题回溯和效果分析。这个由Energy项目启发而构建的AI桌面助手原型展示了如何将大语言模型与传统的自动化工具相结合创造出能理解自然语言并执行复杂流程的智能体。虽然我们的示例在元素精准定位等环节做了大量简化但它清晰地勾勒出了整个系统的技术框架和数据流。从技术演进的角度看未来的方向将是更强大的视觉理解模型、更鲁棒的任务规划与恢复机制、以及更广泛的操作系统级集成。对于开发者而言现在正是深入探索AI Agent在自动化测试、智能办公助手、无障碍技术等领域应用潜力的好时机。你可以基于本文的代码框架尝试接入更强的视觉模型如GPT-4V或者集成更多的桌面操作工具一步步构建出属于你自己的“Energy”。