GPT-5.4 实测爆肝:计算机操作+多模态推理,我把它改成了私人开发助理

1 阅读9分钟

无意间发现了一个巨牛的人工智能教程,忍不住分享一下给大家。很通俗易懂,重点是还非常风趣幽默,像看小说一样。网址是captainbed.cn/jj。希望更多人能加入到我们AI领域。

前言

GPT-5.4 不是简单的"聊天升级",而是首个能直接操控电脑、跨软件执行工作流的AI Agent。本文手把手教你用 GPT-5.4 的 Computer Use API 搭建私人开发助理,实现自动读需求、写代码、测接口、改Bug一条龙。内含完整 Python 代码,复制粘贴就能跑。

一、程序员终于不用当"人形翻译机"了

说实话,这么多年了,写代码最烦的不是算法多难,而是当翻译。 产品经理甩过来一张手绘原型图,你得翻译成 PRD;PRD 翻译成技术方案;技术方案翻译成代码;代码翻译成测试用例;测试用例翻译成 Jira 工单……转来转去,真正写代码的时间不到三成,剩下的全在当传声筒。

以前的 AI 顶多帮你写写函数,但界面还得自己点,测试还得自己跑,报错还得自己查。就像请了个文笔很好的秘书,但送个文件还得你亲自开车。

GPT-5.4 这次彻底变了。它不再是"只动嘴"的顾问,而是能直接上手操作的实习生。看截图、点鼠标、敲键盘、跨软件协作,样样精通。在 OSWorld-Verified 基准测试里,它操作电脑的成功率达到 75%,连人类平均水平的 72.4% 都被它超了。

这意味着什么?意味着你可以对它说:"把桌面那个需求文档打开,读完之后在我本地起一个 Spring Boot 项目,按照文档里的接口定义写 Controller,写完自己用 Postman 测一下,如果通不过就改到通过为止,最后把测试报告截图发我钉钉。" 然后你就可以去泡杯咖啡了。

二、GPT-5.4 到底强在哪?不只是"更会写代码"

很多人以为 GPT-5.4 就是 GPT-5.3 的"性能增强版",错了。这次更新更像是从大脑到手脚的进化。

2.1 原生电脑操控:AI 终于有了"手"

以前让 AI 帮你改 Excel 表格,你得把表格内容复制粘贴到对话框,改完再贴回去。现在 GPT-5.4 可以直接看到你的屏幕,像远程协助一样操作你的电脑。

它通过截图感知界面,然后输出鼠标移动、点击、键盘输入的指令。更牛的是,它支持跨应用操作——可以从钉钉复制需求,打开 IntelliJ IDEA 写代码,再切到 Chrome 查 API 文档,最后回到 IDE 继续写。

2.2 百万 Token 上下文:一次性塞进去半本书

做大型项目分析时,最痛苦的就是"超出上下文长度"。以前分析一个十几万行的代码库,得切片、分段、建索引,折腾得像在拼拼图。

GPT-5.4 支持最高 100 万 Token 的上下文窗口。什么概念?大概相当于 75 万个英文单词,或者一本 3000 页的技术文档。你可以直接把整个项目的源码打包塞进去,让它分析架构设计,找出潜在的内存泄漏点,甚至帮你重构。

2.3 Thinking 模式:把思考过程"直播"给你

GPT-5.4 Thinking 版本新增了一个很贴心的功能——提前展示思维过程。它不是直接给你答案,而是像 .debug 一样把推理链条展开。比如让它设计一个数据库表结构,它会先想"这个业务有几个实体",再想"关联关系是什么",最后才输出 SQL。

更妙的是,你可以在它思考到一半时喊停:"等等,刚才那个关联关系想错了,应该是多对多。"然后它会调整方向继续。这种人机协同的流畅感,比过去那种"输入-等待-输出"的黑盒模式舒服太多。

三、实战:30 分钟搭一个自动开发助理

光说不练假把式。下面这段代码基于 GPT-5.4 的 Computer Use 能力,实现了一个能自动操作浏览器的开发助理。它会自动打开 GitHub,读取 Issue 内容,然后在本地创建对应的分支并写提交信息。

3.1 环境准备

首先,你需要 OpenAI API Key(需要 GPT-5.4 权限),以及安装依赖:

pip install openai playwright pillow
playwright install

3.2 核心代码:让 AI 接管你的鼠标

import asyncio
import base64
from io import BytesIO
from playwright.async_api import async_playwright
from openai import AsyncOpenAI

client = AsyncOpenAI(api_key="你的-api-key")

class GPT54DeveloperAssistant:
    def __init__(self):
        self.browser = None
        self.page = None
        self.messages = []

    async def start(self):
        """启动浏览器,给 AI 一个'显示器'"""
        playwright = await async_playwright().start()
        self.browser = await playwright.chromium.launch(headless=False)  # 非无头模式,方便观察
        self.page = await self.browser.new_page()
        await self.page.set_viewport_size({"width": 1280, "height": 800})
        
        # 初始化系统提示,告诉 GPT-5.4 它的身份
        self.messages.append({
            "role": "system",
            "content": "你是一个资深全栈开发工程师。你可以使用计算机工具完成任务。"
        })

    async def get_screenshot(self):
        """获取屏幕截图,相当于 AI 的'眼睛'"""
        screenshot = await self.page.screenshot()
        img_base64 = base64.b64encode(screenshot).decode('utf-8')
        return img_base64

    async def execute_action(self, action):
        """执行 AI 返回的操作指令"""
        action_type = action.get("type")
        
        if action_type == "click":
            x, y = action.get("x"), action.get("y")
            await self.page.mouse.click(x, y)
            print(f"点击坐标: ({x}, {y})")
            
        elif action_type == "type":
            text = action.get("text")
            await self.page.keyboard.type(text)
            print(f"输入文本: {text}")
            
        elif action_type == "key":
            key = action.get("key")
            await self.page.keyboard.press(key)
            print(f"按下按键: {key}")
            
        elif action_type == "scroll":
            scroll_x = action.get("scroll_x", 0)
            scroll_y = action.get("scroll_y", 0)
            await self.page.mouse.wheel(scroll_x, scroll_y)
            print(f"滚动: ({scroll_x}, {scroll_y})")
            
        await asyncio.sleep(0.5)  # 等待操作生效

    async def run_task(self, instruction):
        """主循环:观察-思考-行动"""
        print(f"🎯 任务指令: {instruction}")
        
        # 截取初始屏幕
        screenshot = await self.get_screenshot()
        
        self.messages.append({
            "role": "user",
            "content": [
                {"type": "text", "text": instruction},
                {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{screenshot}"}}
            ]
        })
        
        max_steps = 20  # 防止无限循环
        
        for step in range(max_steps):
            print(f"\n--- 执行步骤 {step + 1} ---")
            
            # 调用 GPT-5.4,使用 Computer Use 工具
            response = await client.chat.completions.create(
                model="gpt-5.4",  # 使用支持 Computer Use 的版本
                messages=self.messages,
                tools=[{
                    "type": "computer_use_preview",  # Computer Use 工具类型
                    "display_width": 1280,
                    "display_height": 800
                }],
                max_tokens=4096
            )
            
            message = response.choices[0].message
            self.messages.append(message)
            
            # 检查是否有工具调用(即计算机操作指令)
            if message.tool_calls:
                for tool_call in message.tool_calls:
                    action = tool_call.function.arguments
                    await self.execute_action(action)
                    
                    # 执行后截图,给 AI 看结果
                    new_screenshot = await self.get_screenshot()
                    self.messages.append({
                        "role": "user",
                        "content": [
                            {"type": "text", "text": "操作已完成,这是当前屏幕状态。"},
                            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{new_screenshot}"}}
                        ]
                    })
            else:
                # AI 认为任务完成,输出最终结果
                print(f"✅ 任务完成: {message.content}")
                return message.content
        
        return "达到最大步骤限制,任务未完成"

    async def close(self):
        await self.browser.close()

# 使用示例
async def main():
    assistant = GPT54DeveloperAssistant()
    await assistant.start()
    # 实战任务:自动读取 GitHub Issue 并创建本地分支
    task = """
1. 打开 https://github.com/microsoft/playwright/issues
2. 找到列表中第一个带有 'bug' 标签的 Issue
3. 读取它的标题和编号
4. 告诉我标题内容和对应的 Issue 编号
"""

    result = await assistant.run_task(task)
    print(f"\n📋 最终结果: {result}")
    await assistant.close()

if __name__ == "__main__":
    asyncio.run(main())

3.3 代码解析:三个关键设计

  • 视觉反馈循环:代码里每次操作后都会截图回传,这模拟了人类"看一眼操作结果再决定下一步"的习惯。GPT-5.4 通过 computer_use_preview 工具解析屏幕内容,生成下一步操作。
  • 动作抽象层:我把 AI 的输出抽象为 clicktypekeyscroll 四种原子操作。这相当于给 AI 配备了一套"标准键盘鼠标",它不需要知道底层是 Playwright 还是 Selenium,只要发出指令,人类写的驱动层负责翻译。
  • 上下文维护self.messages 数组保存了整个操作历史的截图和描述。得益于 GPT-5.4 的百万 Token 长上下文,即使任务需要 50 步操作,它也能记住最初的目标,不会"走着走着忘了要干啥"。

四、进阶玩法:工具搜索让成本砍半

用 AI 操作电脑有个隐忧:费钱。如果每次请求都要带上上百个工具的定义描述,Token 消耗会像流水一样。

GPT-5.4 引入了一个叫**工具搜索(Tool Search)**的机制,简直是省钱神器。

传统模式下,哪怕你只想查个天气,模型也得把"修图工具、代码工具、邮件工具"等所有工具的描述都读一遍。GPT-5.4 则采用"按需加载"——先给一个轻量级工具目录,只有当 AI 决定要用某个工具时,才去检索它的完整定义。

根据 Scale 的 MCP Atlas 基准测试,在 250 项任务中启用工具搜索后,总 Token 消耗减少了 47%。这意味着同样的预算,你可以让 AI 多跑一倍的任务。

在实际项目中,我是这样配置工具搜索的:

# 在 API 调用中启用工具搜索优化
response = await client.chat.completions.create(
    model="gpt-5.4",
    messages=messages,
    tools=[
        {"type": "function", "function": {"name": "git", "description": "Git操作", "searchable": True}},  # 标记为可搜索
        {"type": "function", "function": {"name": "browser", "description": "浏览器操作", "searchable": True}},
        {"type": "function", "function": {"name": "code_runner", "description": "执行代码", "searchable": True}}
    ],
    tool_choice="auto",
    # 启用工具搜索特性
    extra_headers={"X-Tool-Search": "enabled"}
)

这样当任务只是简单的网页浏览时,Git 和代码执行工具的定义不会占用上下文,只有当你说"提交代码"时,Git 工具的详细说明才会被加载。

五、避坑指南:别让它变成"人工智障"

虽然 GPT-5.4 很强,但用不好也会翻车。分享三个我踩过的坑:

  1. 别给模糊指令:说"把那个文件改一下"是不行的,它不知道"改一下"是什么意思。要说"打开 /src/main.java,把第 15 行的 int 改成 String"。越具体,成功率越高。
  2. 注意界面变化:如果网页突然弹出一个广告挡住了按钮,AI 可能会懵。建议开启非无头模式(headless=False),方便你随时介入救场。
  3. 长任务分段:虽然支持百万 Token,但复杂的开发任务建议拆成"读需求→写代码→测功能→修 Bug"几个阶段。每完成一个阶段给它个明确的检查点,比一次性扔个大任务过去更稳。

六、写在最后:从"Copilot"到"Pilot"

GPT-5.4 的发布标志着 AI 编程工具从"副驾驶"(Copilot)进化到了"飞行员"(Pilot)。以前它只能在你旁边提建议,现在它可以握着操纵杆自己飞,你只需在关键时刻调整航向。

当然,它还不能完全替代程序员——架构设计、业务理解、代码审查这些高价值工作仍需人类把控。但对于重复性的搬砖活,GPT-5.4 绝对是个不知疲倦的劳动力。

把机械劳动丢给 AI,把时间留给创造性工作,这才是程序员该有的样子。毕竟,我们学编程不是为了当"人形翻译机",而是为了创造。

现在,去试试把你的重复工作流程交给 GPT-5.4 吧。记得回来告诉我,它帮你省了多少杯咖啡的时间。