前言
经过前四篇文章的洗礼,通过阅读源码,我们已经从“使用者”进阶为了“理解者”。
但是,开源项目的最大乐趣在于折腾。原版的 UFO 也许只是一个严肃的自动化工具,但在我们手里,它可以变成一个毒舌的二次元管家,或者一个效率极高的办公助手。
今天这篇大结局,我们将实战演示三个级别的源码修改,带你打造一个独一无二的 UFO。
🛠️ Level 1: 换“芯”手术 —— 升级 GPT-4o
UFO 项目发布较早,默认配置可能还是 gpt-4-vision-preview。现在 GPT-4o (Omni) 已经发布,速度更快、更便宜、视觉能力更强。我们第一步就是给它换个更强的心脏。
修改位置:ufo/config/config.toml
不需要改代码,只需要改配置。但这是性价比最高的修改。
Ini, TOML
[Visual_Model]
# 原版可能是 gpt-4-vision-preview
# 修改为 gpt-4o,响应速度将提升 2 倍以上!
VISUAL_MODEL = "gpt-4o-2024-05-13"
[API_KEY]
# 确保你的 Key 支持 GPT-4o
OPENAI_API_KEY = "sk-proj-xxxxxxxx..."
实测效果:
换用 GPT-4o 后,UFO 识别屏幕截图的速度会显著提升,而且对于复杂的 UI 布局(比如 Photoshop 面板)理解能力有明显增强。
🎭 Level 2: 注入灵魂 —— 定制 AI 人格
你是不是觉得 UFO 的回复太像机器人了?“Success involved clicking...”。太无聊了。我们来改改它的 Prompt,让它变成钢铁侠的 Jarvis 或者 二次元傲娇女仆。
修改位置:ufo/prompter/templates/ (具体文件名视版本而定,通常是 host_agent.yaml 或 app_agent.yaml)
找到 system 字段,直接覆盖它的原始人设。
魔改方案:Jarvis 风格
YAML
system: |
You are JARVIS, a highly advanced AI assistant controlling a Windows PC.
Your tone should be concise, professional, and slightly British.
Instead of saying "I will click...", say "Processing request, Sir. Initiating interaction with..."
(保留原有的 JSON 格式要求,这部分不能删!)
魔改方案:傲娇风格
YAML
system: |
你是一个虽然很不情愿但还是会帮忙的桌面助手。
说话语气要带有傲娇属性(Tsundere)。
比如:“哼,既然你诚心诚意地请求了,我就勉为其难帮你点一下这个按钮吧。”
(同样保留 JSON 格式要求)
原理:
我们在第四篇讲过,prompter 会读取这些 YAML 文件构建 System Prompt。修改这里,就是修改 AI 的底层世界观。
🗣️ Level 3: 赋予声音 —— 增加 TTS 语音反馈
只能看文字日志太累了。我们希望 UFO 在操作的时候,能像真人一样开口说话:“正在为您打开微信,请稍候。”
我们将引入 Python 的离线语音库 pyttsx3。
1. 安装依赖
Bash
pip install pyttsx3
2. 编写工具函数
在 ufo/utils 目录下新建一个 speech.py(或者直接加在 utils.py 里):
Python
import pyttsx3
import threading
# 初始化引擎
engine = pyttsx3.init()
def speak(text):
"""
让 UFO 说话的函数
使用线程防止语音播报阻塞鼠标操作
"""
def _run():
try:
# 简单的清洗,去掉 JSON 里的符号
clean_text = text.replace("Action:", "").strip()
engine.say(clean_text)
engine.runAndWait()
except:
pass
# 开一个线程去说话,别卡住主程序
t = threading.Thread(target=_run)
t.start()
3. 植入源码
我们要找到 UFO 思考完毕、准备行动的那一刻。通常在 ufo/ufo_system.py 的主循环里,或者 agent 返回结果的地方。
打开 ufo/ufo_system.py,找到 run() 方法中的循环部分:
Python
# ... 在获取到 response 之后 ...
response_json = agent.message_history[-1]["content"] # 假设这里拿到了 GPT 的回复
thought = response_json.get("Thought", "") # 获取它的思考过程
# === 植入我们的魔改代码 ===
from ufo.utils import speak
print(f"🤖 UFO 正在思考: {thought}")
speak(f"正在执行操作:{thought}")
# ========================
# ... 后面是原来的 execution 逻辑 ...
效果:
现在,当你下达命令“打开浏览器”时,你的电脑会传出声音:“正在执行操作:检测到 Chrome 图标,准备点击。”
这种听觉反馈会让你的 Agent 显得极具科技感!
🛑 进阶挑战:增加“紧急制动”热键
UFO 也是会发疯的(比如无限点击某个无关按钮)。原版代码通常只能 Ctrl+C 强退。我们可以利用 keyboard 库加一个全局热键。
修改位置:ufo/__main__.py 或入口文件
Python
import keyboard
import os
def kill_switch():
print("\n🚨 紧急制动触发!UFO 正在强制着陆...")
os._exit(0)
# 在 main 函数开始前注册热键
# 按下 F12 立即自杀
keyboard.add_hotkey('f12', kill_switch)
这样,当 UFO 开始乱点你的私人文件夹时,你可以优雅地按下 F12 让它瞬间安静,而不是手忙脚乱地去拔电源。
🎉 系列总结
至此,我们的**《Microsoft UFO 源码实战》**五部曲正式完结!
-
环境篇:我们搭建了地基,跑通了 Hello World。
-
视觉篇:我们看透了 Set-of-Marks 技术,明白了它怎么“看”屏幕。
-
动作篇:我们掌握了 Pywinauto,学会了模拟人类的鼠标点击。
-
大脑篇:我们拆解了 Prompt 结构,理解了 RAG 和记忆机制。
-
魔改篇:我们亲手修改了源码,打造了专属助手。
写在最后:
AI Agent 技术日新月异。Microsoft UFO 可能只是这个时代的“原始人”,但它所代表的 "VLM (Vision Language Model) + UI Automation" 的技术路线,绝对是未来操作系统交互的主流方向。
希望这个系列能成为你进入 AI Agent 开发世界的敲门砖。不要停止阅读源码,因为最好的文档,永远是代码本身。

297

被折叠的 条评论
为什么被折叠?



