有手就行,教你从0到1快速手搓搭建个GUI Agent

华为诺亚方舟新作:GUI Agent综述 然后使用ChatGPT选择下一个操作。这种方法有效地整合了历史操作和用户UI,而无需对底层LLM进行任何修改。此外,Zheng等人(2024)提出了SeeAct,一个基于GPT-4V的通用网络代理。 阅读详情

随着通用大模型向着agentic以及GUI理解增强的方向发展,现在Gemini 3 Flash等通用大模型已经可以直接用来搭建一个效果还不错的GUI Agent,并且实践难度大幅降低,半小时左右就可以从0到1手搓出来。本文详细介绍如何逐步搭建一个GUI Agent,从实践中也可快速了解GUI Agent的原理。

一、前言

什么是GUI Agent?简单来说,就是一个能够"看懂"屏幕(mobile/pc/web)并进行自动操作的AI Agent。比如用户发送指令“整理文件”,PC GUI Agent就可以基于纯GUI界面理解页面内容,进行逐步决策&操作,直到完成用户任务。

图片

随着GUI Agent的应用前景逐渐明朗,GUI Agent在25年的发展很迅猛,其中一个比较明显的新趋势是,通用大模型也在训练GUI上的能力:

图片

因此,搭建一个好用的GUI Agent变得越来越简单。本文介绍如何使用通用大模型API,快速从0到1搭建一个可用性强的PC GUI Agent,可以用于自动完成PC任务操作。

前置准备说明: 我使用的是Gemini 3 Flash,先看效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、GUI Agent基础原理介绍

一个GUI Agent通常包含以下几个部分:

图片

  1. 设备环境(Environment):比如手机、电脑这些用来操作的设备,是交互的 “载体“,本文仅以电脑为示例。

  2. 感知系统(Preceptor):负责 “接收信息“,这主要是针对GUI能力较弱的通用大模型。而Gemini 3 Flash这样本身具备较强GUI页面理解能力的大模型通常不再需要单独设计感知系统。

  3. 大模型(决策器):相当于 “大脑”—— 结合知识系统里存的信息,分析感知到的界面内容,决定要完成任务,下一步应该如何操作。

  4. 交互系统(Operator):相当于“手脚” —— 把大模型的决策结果(操作动作+坐标),转化为具体的操作与设备进行交互。

为了完成一个完整的任务,通常需要进行 “感知->决策->执行” 的多次循环,直到任务完成。下文具体介绍PC GUI Agent的搭建方式。

三、逐步搭建GUI Agent

1. 最简单的模型对话

在开始构建复杂的Agent之前,我们先实现最基础的功能:让AI看懂一张图片。

# utils/model.py

import os
import base64
from openai import OpenAI
from typing import List, Dict, Any

API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("OPENAI_BASE_URL")

class LVMChat:
    """多模态大模型聊天类"""
    
    def __init__(self, api_key: str = API_KEY, base_url: str = BASE_URL, 
                 model: str = "gemini-3-flash-preview"):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.model = model
    
    def _encode_image(self, image_path: str) -> str:
        """将图片编码为base64"""
        with open(image_path, "rb") as image_file:
            return base64.b64encode(image_file.read()).decode('utf-8')
    
    def get_multimodal_response(self, text: str, image_paths: str) -> str:
        """
        最简单的图文对话
        
        Args:
            text: 你的问题
            image_paths: 图片路径
        
        Returns:
            模型的回答
        """
        # 1. 加载图片
        base64_image = self._encode_image(image_paths)
        
        # 2. 构建消息
        messages = [{
            "role": "user",
            "content": [
                {"type": "image_url", 
                 "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}},
                {"type": "text", "text": text}
            ]
        }]
        
        # 3. 调用API
        response = self.client.chat.completions.create(
            model=self.model,
            messages=messages
        )
        
        return response.choices[0].message.content

测试一下:

chat = LVMChat()
response = chat.get_multimodal_response(
    text="这张图片里输入框坐标?",
    image_paths="image.png"
)
print(response)

注意看这里!模型本身是有定位能力的(也就是说可以直接输出操作对象的坐标位置),所以不需要格外的感知器来锚定具体UI元素。

图片

2. 加入记忆 - 让AI记住上下文

上面的代码有个问题:AI每次都是"失忆"的,不记得之前说过什么。对于GUI Agent来说,这是很致命的。举个简单的例子,任务“在输入框输入‘你好’”,如果Agent没有记忆,那么后序执行不记得自己已经决策过输入操作,就会陷入输入的循环,在输入框中多次输入‘你好’而不会停止。相反,有上文记忆的Agent,知道自己前一次已经决策了输入操作,结合当前页面内容,判断本次应为“finish”指令,就不会陷入输入循环。

为此,我们需要升级 LVMChat 类:

class LVMChat:
    """支持会话记忆的多模态聊天类"""
    
    def __init__(self, api_key: str = API_KEY, base_url: str = BASE_URL, 
                 model: str = "gemini-3-flash-preview"):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.model = model
        # 🔥 核心改动:添加会话历史记录
        self.conversation_history: List[Dict[str, Any]] = []
    
    def get_multimodal_response(self, text: str, image_paths: str, 
                                use_history: bool = False) -> str:
        """
        支持记忆的图文对话
        
        Args:
            text: 你的问题
            image_paths: 图片路径
            use_history: 是否使用会话历史(记住之前的对话)
        """
        # 1. 加载图片并构建当前消息
        base64_image = self._encode_image(image_paths)
        current_message = {
            "role": "user",
            "content": [
                {"type": "image_url", 
                 "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}},
                {"type": "text", "text": text}
            ]
        }
        
        # 2. 🔥 关键:如果启用历史,把之前的对话也带上
        if use_history:
            messages = self.conversation_history + [current_message]
            print(f"📚 使用历史上下文,共 {len(self.conversation_history)} 条")
        else:
            messages = [current_message]
        
        # 3. 调用API
        response = self.client.chat.completions.create(
            model=self.model,
            messages=messages
        )
        
        result = response.choices[0].message.content
        
        # 4. 🔥 更新历史记录
        if use_history:
            self.conversation_history.append(current_message)
            self.conversation_history.append({
                "role": "assistant", 
                "content": result
            })
        
        return result
    
    def clear_history(self):
        """清空记忆"""
        self.conversation_history = []

记忆的原理:

# 第一轮对话
conversation_history = [
    {"role": "user", "content": [图片1, "在输入框输入‘你好’"]},
    {"role": "assistant", "content": "{'Thought': '输入框在页面中间位置,我需要输入文案', 'Action': 'type(content=/'你好/')'}"}
]

# 第二轮对话时,把历史也带上
messages = conversation_history + [
    {"role": "user", "content": [图片2, "在输入框输入‘你好’"]}
]
# 现在AI能看到完整的对话链,知道自己做过什么决策。在第二轮返回:
{'Thought': '上一轮已经完成输入操作并且文案已经正确显示在输入框,任务已经完成', 'Action': 'finished'}
3. 搭建Agent框架

现在组装成一个完整的Agent,我们使用LangGraph来构建工作流。

(1)Agent的核心循环

一个GUI Agent的工作流程是这样的:

图片

(2)执行器Operator

首先,我们需要一个能够真正控制鼠标键盘的工具类。在这里强烈推荐pyautogui, 模拟键鼠操作,非常简单易用。但是有一个坑需要注意,输入操作需要用复制粘贴操作而不是打字,因为 pyautogui.write() 不支持中文!而用剪贴板粘贴可以完美支持中英文、特殊字符

# operator/execute.py - 
import pyautogui
import pyperclip
import mss
import time

# 允许鼠标移动到屏幕角落(默认会触发fail-safe)
pyautogui.FAILSAFE = False

class Operation:
    """GUI操作工具类"""
    
    def click(self, x: int, y: int):
        """点击指定坐标"""
        print(f"🖱️  点击坐标 ({x}, {y})")
        pyautogui.click(x=x, y=y)
    
    def input(self, text: str):
        """输入文本(使用粘贴方式,支持中文)"""
        print(f"⌨️  输入: {text}")
        pyperclip.copy(text)  # 复制到剪贴板
        pyautogui.hotkey('command', 'v')  # Mac用command,Windows用ctrl
    
    def screenshot(self, save_path: str):
        """截图并保存"""
        with mss.mss() as sct:
            sct.shot(output=save_path)
        print(f"📸 截图已保存: {save_path}")
    
    def hotkey(self, *keys):
        """按下组合键(如ctrl+c)"""
        print(f"⌨️  按下组合键: {' + '.join(keys)}")
        pyautogui.hotkey(*keys)
    
    def wait(self, seconds: float = 1.0):
        """等待指定时间"""
        print(f"⏱️  等待 {seconds} 秒...")
        time.sleep(seconds)
(3)Prompt

GUI Agent的提示词告诉AI应该如何"思考"和"行动"的规则,需要定义好操作空间和输出格式,我在UI-TARS官方Prompt的基础上做了很小的改动(增加了Output Example,因为我发现Gemini 3 Flash使用UI-TARS的prompt输出格式不是很稳定)。

# utils/prompts.py
COMPUTER_USE_UITARS = """You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.

## Action Space
click(point='<point>x1 y1</point>')
left_double(point='<point>x1 y1</point>')
right_single(point='<point>x1 y1</point>')
drag(start_point='<point>x1 y1</point>', end_point='<point>x2 y2</point>')
hotkey(key='ctrl c') # Split keys with a space and use lowercase. Also, do not use more than 3 keys in one hotkey action.
type(content='xxx') # Use escape characters //', ///", and //n in content part to ensure we can parse the content in normal python string format. If you want to submit your input, use //n at the end of content. 
scroll(point='<point>x1 y1</point>', direction='down or up or right or left') # Show more information on the `direction` side.
wait() #Sleep for 5s and take a screenshot to check for any changes.
finished(content='xxx') # Use escape characters //', //", and //n in content part to ensure we can parse the content in normal python string format.

## Note
- Use Chinese in `Thought` part.
- Write a small plan and finally summarize your next action (with its target element) in one sentence in `Thought` part.
- One action per turn.

## Output Example
{{
    "Thought": "...",
    "Action": "..."
}}

## User Instruction
{instruction}
"""
(4)坐标归一化

不同电脑屏幕分辨率不同(1920x1080、2560x1440等),GUI Agent往往会采用千归一化坐标的策略进行处理。因此,拿到大模型的返回之后,需要将归一化坐标 (0-1000范围) 还原成实际像素坐标:

# AI返回归一化坐标: (500, 500) - 表示屏幕中心
# 在1920x1080屏幕上: (500, 500) -> (960, 540)
# 在2560x1440屏幕上: (500, 500) -> (1280, 720)

def normalize_coords(self, x: int, y: int) -> tuple[int, int]:
    """将归一化坐标(0-1000)转换为实际像素坐标"""
    actual_x = int(x / 1000.0 * self.screen_width)
    actual_y = int(y / 1000.0 * self.screen_height)
    return actual_x, actual_y
(5)LangGraph

LangGraph是一个用于构建Agent工作流的框架,图(Graph)的方式定义Agent的执行逻辑。

# 传统方式(硬编码)
def run_agent():
    whilenot finished:
        screenshot()
        decision = model_decide()
        execute(decision)
        if check_finished():
            break

# LangGraph方式(声明式)
workflow = StateGraph(AgentState)
workflow.add_node("screenshot", take_screenshot)
workflow.add_node("decide", model_decide)
workflow.add_node("execute", execute_action)
workflow.add_edge("screenshot", "decide")
workflow.add_edge("decide", "execute")
workflow.add_conditional_edges("execute", should_continue, {...})

优势:✅ 逻辑清晰:可视化工作流 ✅ 易于修改:添加节点/改变流程很简单 ✅ 状态管理:自动在节点间传递状态。

图片

AgentState 是整个工作流的"记忆载体",在各个节点间传递:

# Step 1: 截图节点
state = {
    "instruction": "打开浏览器",
    "screenshot_path": "s/step_1.png",
    "step": 1,
    "finished": False
}

# Step 2: 决策节点(接收state,更新后返回)
state = {
    state,  # 保留之前的数据
    "thought": "需要点击Chrome图标",
    "action": "click(point='<point>100 200</point>')"
}

# Step 3: 执行节点
state = {
    state,  # 继续保留
    # 执行点击操作...
}
(6)Agent主程序

现在把所有模块组装起来:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
GUI Agent - 自动化GUI测试Agent
截图 -> 模型决策 -> 解析Action -> 执行 -> 循环,直到finished
"""
import re
import json
from datetime import datetime
from typing import TypedDict
from pathlib import Path

from langgraph.graph import StateGraph, END
from operator.execute import Operation
from utils.model import LVMChat, Model
from utils.prompts import COMPUTER_USE_UITARS

# 定义State
class AgentState(TypedDict):
    instruction: str  # 用户指令
    screenshot_path: str  # 当前截图路径
    step: int  # 当前步骤
    thought: str  # 模型思考
    action: str  # 模型输出的动作
    finished: bool  # 是否完成

class GUIAgent:
    """GUI自动化Agent"""
    
    def __init__(self, instruction: str, model_name: str = Model.GOOGLE_GEMINI_3_FLASH_PREVIEW.value):
        self.instruction = instruction
        self.operation = Operation()
        self.lvm_chat = LVMChat(model=model_name)
        self.s_dir = Path("s")
        self.s_dir.mkdir(exist_ok=True)
        
        # 获取屏幕尺寸用于坐标映射
        import pyautogui
        self.screen_width, self.screen_height = pyautogui.size()
        print(f"🖥️  屏幕尺寸: {self.screen_width}x{self.screen_height}")
    
    def normalize_coords(self, x: int, y: int) -> tuple[int, int]:
        """将归一化坐标(0-1000)转换为实际像素坐标"""
        actual_x = int(x / 1000.0 * self.screen_width)
        actual_y = int(y / 1000.0 * self.screen_height)
        print(f"   归一化坐标 ({x}, {y}) -> 实际坐标 ({actual_x}, {actual_y})")
        return actual_x, actual_y
        
    def take_screenshot(self, state: AgentState) -> AgentState:
        """步骤1: 截图并保存"""
        step = state.get("step", 0) + 1
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        screenshot_path = str(self.s_dir / f"step_{step}_{timestamp}.png")
        
        self.operation.screenshot(screenshot_path)
        
        return {
            state,
            "instruction": self.instruction,
            "screenshot_path": screenshot_path,
            "step": step,
            "finished": False
        }
    
    def model_decide(self, state: AgentState) -> AgentState:
        """步骤2: 模型决策(自动使用会话历史)"""
        prompt = COMPUTER_USE_UITARS.format(instruction=state["instruction"])
        
        # 调用多模态模型(use_history=True 自动保留上下文)
        response = self.lvm_chat.get_multimodal_response(
            text=prompt,
            image_paths=state["screenshot_path"],
            res_format="json",
            use_history=True# 启用会话历史,模型会记住之前的所有交互
        )
        
        print(f"/n📸 Step {state['step']} - 模型响应:/n{response}/n")
        
        # 解析JSON响应
        try:
            result = json.loads(response)
            thought = result.get("Thought", "")
            action = result.get("Action", "")
        except json.JSONDecodeError:
            # 如果不是JSON格式,尝试正则提取
            thought_match = re.search(r'"Thought":/s*"([^"]*)"', response)
            action_match = re.search(r'"Action":/s*"([^"]*)"', response)
            thought = thought_match.group(1) if thought_match else""
            action = action_match.group(1) if action_match else""
        
        return {
            state,
            "thought": thought,
            "action": action
        }
    
    def execute_action(self, state: AgentState) -> AgentState:
        """步骤3: 解析并执行动作"""
        action = state["action"]
        
        ifnot action:
            print("⚠️ 没有可执行的动作")
            return {state, "finished": True}
        
        # 检查是否完成
        if action.startswith("finished("):
            content_match = re.search(r"finished/(content='([^']*)'/)", action)
            content = content_match.group(1) if content_match else"任务完成"
            print(f"✅ 任务完成: {content}")
            return {state, "finished": True}
        
        # 解析并执行动作
        try:
            self._parse_and_execute(action)
        except Exception as e:
            print(f"❌ 执行动作失败: {e}")
            print(f"   动作: {action}")
        
        return state
    
    def _parse_and_execute(self, action: str):
        """解析动作字符串并执行"""
        print(f"🔧 执行动作: {action}")
        
        # click(point='<point>x y</point>') 或 click(point='x y')
        if action.startswith("click("):
            # 尝试带标签的格式
            point_match = re.search(r"<point>(/d+)/s+(/d+)</point>", action)
            ifnot point_match:
                # 尝试不带标签的格式
                point_match = re.search(r"point=['/"](/d+)/s+(/d+)['/"]", action)
            
            if point_match:
                x, y = int(point_match.group(1)), int(point_match.group(2))
                actual_x, actual_y = self.normalize_coords(x, y)
                self.operation.click(actual_x, actual_y)
            else:
                print(f"⚠️ 无法解析点击坐标: {action}")
        
        # left_double(point='<point>x y</point>') 或 double_click(point='x y')
        elif action.startswith("left_double("):
            # 尝试带标签的格式
            point_match = re.search(r"<point>(/d+)/s+(/d+)</point>", action)
            ifnot point_match:
                # 尝试不带标签的格式
                point_match = re.search(r"point=['/"](/d+)/s+(/d+)['/"]", action)
            
            if point_match:
                x, y = int(point_match.group(1)), int(point_match.group(2))
                actual_x, actual_y = self.normalize_coords(x, y)
                self.operation.double_click(actual_x, actual_y)
            else:
                print(f"⚠️ 无法解析双击坐标: {action}")
        
        # type(content='xxx')
        elif action.startswith("type("):
            content_match = re.search(r"content=['/"]([^'/"]*)['/"]", action)
            if content_match:
                text = content_match.group(1)
                # 处理转义字符
                text = text.replace(r"/'", "'").replace(r'/"', '"').replace(r"/n", "/n")
                self.operation.input(text)
        
        # hotkey(key='ctrl c')
        elif action.startswith("hotkey("):
            key_match = re.search(r"key=['/"]([^'/"]*)['/"]", action)
            if key_match:
                keys = key_match.group(1).split()
                self.operation.hotkey(*keys)
        
        # scroll(point='<point>x y</point>', direction='down') 或 scroll(point='x y', direction='down')
        elif action.startswith("scroll("):
            # 尝试带标签的格式
            point_match = re.search(r"<point>(/d+)/s+(/d+)</point>", action)
            ifnot point_match:
                # 尝试不带标签的格式
                point_match = re.search(r"point=['/"](/d+)/s+(/d+)['/"]", action)
            
            direction_match = re.search(r"direction=['/"]([^'/"]*)['/"]", action)
            if point_match and direction_match:
                x, y = int(point_match.group(1)), int(point_match.group(2))
                actual_x, actual_y = self.normalize_coords(x, y)
                direction = direction_match.group(1)
                # 移动到位置并滚动
                import pyautogui
                pyautogui.moveTo(actual_x, actual_y)
                scroll_amount = 3if direction in ["up", "left"] else-3
                pyautogui.scroll(scroll_amount)
        
        # wait()
        elif action.startswith("wait("):
            self.operation.wait(seconds=5)
        
        # drag(start_point='<point>x1 y1</point>', end_point='<point>x2 y2</point>')
        elif action.startswith("drag("):
            # 尝试带标签的格式
            start_match = re.search(r"start_point=['/"]<point>(/d+)/s+(/d+)</point>['/"]", action)
            end_match = re.search(r"end_point=['/"]<point>(/d+)/s+(/d+)</point>['/"]", action)
            
            ifnot start_match:
                # 尝试不带标签的格式
                start_match = re.search(r"start_point=['/"](/d+)/s+(/d+)['/"]", action)
                end_match = re.search(r"end_point=['/"](/d+)/s+(/d+)['/"]", action)
            
            if start_match and end_match:
                x1, y1 = int(start_match.group(1)), int(start_match.group(2))
                x2, y2 = int(end_match.group(1)), int(end_match.group(2))
                actual_x1, actual_y1 = self.normalize_coords(x1, y1)
                actual_x2, actual_y2 = self.normalize_coords(x2, y2)
                import pyautogui
                pyautogui.moveTo(actual_x1, actual_y1)
                pyautogui.drag(actual_x2 - actual_x1, actual_y2 - actual_y1, duration=0.5)
        
        # 等待一下让界面响应
        self.operation.wait(seconds=1)
    
    def should_continue(self, state: AgentState) -> str:
        """判断是否继续循环"""
        return"end"if state.get("finished", False) else"continue"
    
    def run(self):
        """运行Agent"""
        # 构建graph
        workflow = StateGraph(AgentState)
        
        # 添加节点
        workflow.add_node("screenshot", self.take_screenshot)
        workflow.add_node("decide", self.model_decide)
        workflow.add_node("execute", self.execute_action)
        
        # 添加边
        workflow.set_entry_point("screenshot")
        workflow.add_edge("screenshot", "decide")
        workflow.add_edge("decide", "execute")
        workflow.add_conditional_edges(
            "execute",
            self.should_continue,
            {
                "continue": "screenshot",
                "end": END
            }
        )
        
        # 编译并运行
        app = workflow.compile()
        
        print(f"🚀 开始执行任务: {self.instruction}/n")
        
        # 设置递归限制为100步
        config = {"recursion_limit": 100}
        final_state = app.invoke(
            {"instruction": self.instruction, "step": 0},
            config=config
        )
        
        print(f"/n🎉 任务完成! 共执行 {final_state['step']} 步")
        return final_state

if __name__ == "__main__":
    agent = GUIAgent(instruction="""打开浏览器查询GUI, 找到wikipedia的介绍页面进行查看""")
    agent.run()
4. 执行效果

文章前言部分的demo, 模型的部分决策内容如下:

图片

对于中间步骤,模型会利用到上文的内容,与当前页面状态一起作为决策依据:

图片

最后,如果模型判断任务完成,会输出finished指令,程序停止

图片

四、总结

本文采用简洁易用的方案搭建了一个 PC 端的 GUI Agent,该 Agent 不仅能在 Windows 和 macOS 系统上直接运行,还可操作 Web 应用。得益于以 pyautogui(键鼠模拟)作为核心执行器,该 Agent 能够实现跨应用的操作能力。未来可通过补充滑动、拖拽等更多样的交互方式,并结合知识库的构建,进一步强化其针对特定业务场景的适配性,打造功能更强大的 GUI Agent。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

👇👇扫码免费领取全部内容👇👇
在这里插入图片描述

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

在这里插入图片描述

4. 2026行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

7. 资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇
在这里插入图片描述

acp-components:快速搭建生产级Agent GUI应用的工程化方案 Agent GUI应用是大模型落地的关键交互载体,其核心在于解耦通信协议、状态管理与界面渲染。基于ACPSDK标准的acp-components库,通过Transport层(WebSocket/HTTP/stdio/Custom四重适配)、Zustand vanilla Store层(跨环境一致状态)和声明式View层(React组件即插即用),实现了Agent能力与UI表现的彻底分离。该方案显著降低多Agent协同、多Workspace管理、权限弹窗等高频场景的开发复杂度,支持Tauri桌面化、SSR兼容 阅读详情

相关推荐

OpenClaw本地部署全指南:从手搓安装到Agent可控运维

AI Agent 并非开箱即用的黑盒应用,而是需深度工程化构建的智能系统。理解其核心组件(Skill、Memory、Router、Executor)与运行原理,是实现可解释、可审计、可定制Agent的前提。OpenClaw 作为典型的本地化Agent框架,强调环境适配性与配置透明性,技术价值在于将LLM能力解耦为可编排、可监控、可回溯的工作流。典型应用场景包括金融合规对话、企业知识中枢、SaaS自动化工作流等对行为可追溯性要求严苛的领域。本文聚焦 Ubuntu/macOS/WSL2 环境下 OpenClaw

weixin_30664615的博客 487

快速认识GUI Agent及最新进展:像人类一样与GUI交互的AI智能体

GUI Agent是一种基于多模态视觉模型驱动的人工智能系统,能够自动推理并执行UI交互,模拟人类用户的操作,如点击、输入、拖拽、读取界面信息等,以完成人类要求的工作任务。自然语言交互:通过输入的自然语言请求理解任务目标。多模态感知与推理:分析界面截图、UI元素等多模态信息并推理行动。任务自动化:通过应用UI执行行动,如打开应用、批量编辑、数据处理。任务的执行需要借助计算机操作工具,如Selenium、AutoIt等。以下是一个高层的概念场景:1. 用户请求(User Request)

xx_nm98的博客 9619

Hello-Agents:从零手搓AI Native Agent的开源实战教程

Agent(智能体)是AI Native时代的核心系统范式,其本质并非高级Prompt工程,而是具备目标驱动、自主规划、反思迭代与工具调用能力的自治系统。理解Agent需回归基础原理:以ReAct为代表的决策循环范式,强调‘思考-行动-观察’闭环;而MCP协议则定义了多智能体间的标准化通信机制,支撑可扩展、可追溯、跨语言的协作架构。这类技术价值在智能旅行助手、赛博小镇等真实场景中充分显现——涵盖动态任务编排、异常恢复、状态持久化与生产级可观测性。Hello-Agents作为国产高星开源教程,正以‘概念透彻+

weixin_34293911的博客 482

GUI Agent纯视觉 GUI 操作模型

Mano-P 1.0 是一款突破性的纯视觉GUI操作模型,在本地端侧设备即可实现自动化操作。其核心优势包括:1)纯视觉交互不依赖协议,可跨平台操控各类应用;2)支持本地部署,Mac设备即可流畅运行;3)自适应界面变化,大幅降低维护成本。该模型在OSWorld等权威测试中表现优异,支持从开发构建到视频处理等多种场景。用户可通过CLI命令行或Skiko库快速集成,实现"所见即所得"的智能自动化操作。

前端蜗牛君 597

【深度学习新浪潮】什么是GUI Agent?

GUI Agent(图形用户界面智能体)是一种基于多模态大语言模型(LLM)和视觉语言模型(VLM)的智能系统,能够通过自然语言指令理解用户需求,并自主分析GUI界面(如屏幕截图、UI结构),生成点击、输入、拖拽等操作序列以完成复杂任务。例如,用户只需说“整理桌面上的文件并生成报告”,GUI Agent就能自动识别文件图标、拖拽分类,并调用办公软件生成报告。

专注:太空算力、AI infra、异构调度、大模型成本工程 1584

GUI Agent:定义、进展与未来展望

尽管面临技术瓶颈与伦理挑战,其在自动化、智能化领域的潜力已得到广泛认可。未来,随着多模态技术、自主决策能力的突破,以及开源生态的成熟,GUI Agent有望成为推动AI普及的核心引擎,真正实现“让机器理解人类意图”的终极目标。是一种基于视觉语言模型(Visual Language Model, VLM)的人工智能代理,能够通过图形用户界面(如屏幕截图)感知环境,并模拟人类操作完成跨平台任务。其核心在于无需依赖HTML、API等结构化数据输入,直接通过视觉信息理解界面元素并执行点击、输入、跳转等交互动作。

专注:太空算力、AI infra、异构调度、大模型成本工程 1478

【AI爆点】手搓GUI Agent全攻略!Gemini 3 Flash带你半小时入门自动化操作,代码全奉送!

文章介绍了如何使用Gemini 3 Flash等通用大模型快速搭建PC端GUI Agent,从基础原理到具体实现步骤。通过构建感知系统、记忆功能、决策器和交互系统,实现了AI对屏幕的理解和自动操作。文章提供了完整代码示例,包括模型对话、记忆功能、Agent框架搭建、执行器设计等,最终实现了一个能够自动完成PC任务的GUI Agent,可在Windows和macOS系统上运行。

m0_59163425的博客 758

3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模

非地面网络覆盖广,对物理攻击和自然灾害有一定的抵抗性。本文根据3GPP协议对NTN网络的背景、应用场景和信道模型进行了整理。

JCMLSY的博客 4932

UI-TARS-desktop实战:5分钟搭建GUI Agent环境

本文介绍了基于星图GPU平台自动化部署UI-TARS-desktop镜像的完整流程。该平台支持一键启动集成Qwen3-4B-Instruct-2507模型与vLLM推理引擎的GUI Agent环境,适用于模型微调、AI应用开发等场景,用户可在5分钟内完成部署并实现如自动浏览网页、文件管理等典型任务,显著提升开发效率。

weixin_42418754的博客 1156

OpenClaw 核心命令深度解析:/think high、/reasoning on、/verbose on 功能与实战指南

本文深入解析OpenClaw框架的三大核心命令:/think high实现极限深度推理,突破常规思考瓶颈;/reasoning on提供透明化推理过程,增强决策可信度;/verbose on控制详细输出级别。文章从技术架构、实现原理、配置方法和典型场景四个维度,详细阐述了各命令的功能特性与实战应用,包括法律分析、代码调试和商业决策等复杂场景的最佳实践。同时提供了多级配置方案和资源消耗参考,帮助用户根据任务复杂度灵活调配AI资源,实现效率与深度的最优平衡。

qq_43344878的博客 947

7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决

本文针对7系列ZYNQ开发中Vitis无法识别ARM DAP的典型硬件调试问题,提供了系统性的排查与解决方案。文章深入剖析了问题本质,指出ARM DAP无法访问的核心原因在于PS部分的电源、时钟或复位等硬件基础条件未满足,并重点强调了PS参考时钟(如33.333MHz晶振)的完整性是关键排查点。通过从电源完整性、时钟与复位信号到JTAG连接与焊接的逐步硬件排查,并结合软件配置交叉验证,为开发者提供了清晰的故障定位思路与实战指南。

weixin_29280657的博客 629

躺平神器!GUI Agent 直接模拟人类操作鼠标键盘

GUI Agent的核心价值在于“无接口自动化”,解决了90%中小企业的跨系统业务痛点。它不用你懂复杂的AI算法,只要会点基础Python,跟着本文的步骤就能搭建出实用工具。不管是给自己公司提效,还是做副业接定制化项目,GUI Agent都是低门槛、高回报的选择。现在AI落地的窗口期已经到了,早动手就能早抢占红利。如果在搭建过程中遇到环境配置、元素识别、流程优化等问题,欢迎在评论区留言,我会一一回复解答!也可以分享你的业务场景,一起探讨如何用GUI Agent实现自动化~

人工智能AI技术 1598

最大似然估计、梯度下降、EM算法、坐标上升

主要讲解的是机器学习中参数学习算法之间的区别,以及应用的场景。 最大似然估计: 其中目标函数是对数似然函数。为了求目标函数取最大值时的theta。有两个关机键步骤,第一个是对目标函数进行求导,第二个是另导数等于0,求解后直接得到最优theta。两个步骤缺一不可。 梯度下降: 对目标函数进行求导,利用导函数提供的梯度信息,使参数往梯度下降最快的方向移动一小步,来更新参数。为什

tzl2093的博客 5141

《开拓者:正义之怒》主角Build完全指南:免费抄作业,从开卡到满级面板一册查全

如果你正站在《开拓者:正义之怒》的开卡界面,面对38个职业、上百个专长相对发愁,不知道属性往哪加、道途选哪个,那这份**"正义之怒Wotr主角BD搜集"(Wotr-BD-LR)**仓库就是为你准备的。它是一份完全免费、由老玩家 aaathl 持续维护多年的开源资料库,收录了剑圣、魔能射手、圣职杀手、僧兵、法师等几十套成型主角Build的完整加点方案,把"属性怎么加、装备穿什么、道途配哪个"三个核心

gitblog_00534的博客 1096

深入解析EDID中Display Descriptor Block的配置技巧与实战应用

本文深入解析EDID中Display Descriptor Block的配置技巧与实战应用。通过剖析像素时钟、有效像素、消隐区与同步脉冲等核心参数,并结合1280x720@60Hz的实战配置案例,指导开发者如何正确为定制硬件或非标准显示器编写“身份证”,避免黑屏、分辨率异常等问题,确保显示设备完美点亮。

1a2s3d4f5g的博客 879

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 770

【收藏必备】半小时从零搭建GUI Agent:通用大模型赋能的自动化操作实战指南

什么是GUI Agent?简单来说,就是一个能够"看懂"屏幕(mobile/pc/web)并进行自动操作的AI Agent。比如用户发送指令“整理文件”,PC GUI Agent就可以基于纯GUI界面理解页面内容,进行逐步决策&操作,直到完成用户任务。随着GUI Agent的应用前景逐渐明朗,GUI Agent在25年的发展很迅猛,其中一个比较明显的新趋势是,通用大模型也在训练GUI上的能力:因此,搭建一个好用的GUI Agent变得越来越简单。

优快云_224022的博客 1281

第5课 SQL入门之高级数据过滤

如何用AND和OR操作符组合成WHERE子句;如何明确地管理求值顺序,如何使用IN和NOT操作符

warlack007的博客 867

收藏!30分钟从零打造GUI Agent:大模型自动化操作完全指南

什么是GUI Agent?简单来说,就是一个能够"看懂"屏幕(mobile/pc/web)并进行自动操作的AI Agent。比如用户发送指令“整理文件”,PC GUI Agent就可以基于纯GUI界面理解页面内容,进行逐步决策&操作,直到完成用户任务。随着GUI Agent的应用前景逐渐明朗,GUI Agent在25年的发展很迅猛,其中一个比较明显的新趋势是,通用大模型也在训练GUI上的能力:因此,搭建一个好用的GUI Agent变得越来越简单。

xxue345678的博客 1545

系统学习Pytorch笔记一:Pytorch的数据载体张量与线性回归

Pytorch官方英文文档:https://pytorch.org/docs/stable/torch.html? Pytorch中文文档:https://pytorch-cn.readthedocs.io/zh/latest/ 1. 写在前面 疫情在家的这段时间,想系统的学习一遍Pytorch基础知识,因为我发现虽然直接Pytorch实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这样...

Miracle8070 9096

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

GUI Agent 2.0 独立工程快速接入指南:在 Node.js 中运行 AIO 混合操作器与 Doubao 多模态 Agent

`examples/gui-agent-2.0` 是一个基于 `@gui-agent/agent-sdk`、`@gui-agent/operator-aio` 与火山引擎 Doubao(豆包)模型的极简可运行示例,展示了用几十行 TypeScript 初始化一个能“看屏幕截图、执行鼠标键盘动作”的 GUI Agent 完整流程。本文依据 [quick-start-for-agent.md](htt

gitblog_00103的博客 465

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

AndroidWorld 环境实战指南:在 MobileAgent 仓库中运行 Android GUI Agent 基准评测

AndroidWorld 是一套运行在真实 Android 模拟器上的自主 GUI Agent 构建与评测环境,本指南以 [Mobile-Agent-v3/android_world_v3/README.md](https://link.gitcode.com/i/7c3285e6851d0a0cd1db2261cf8288d5) 为骨架,结合该目录下的 `minimal_task_runner.

gitblog_00842的博客 1163

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

GUI-Owl 1.5 Web Agent 实战指南:Mobile-Agent v3.5 浏览器自动化任务的运行、配置与评估

> 本指南以 [Mobile-Agent-v3.5/browser_use/README.md](https://link.gitcode.com/i/370666522abf9e1c2d93276f71aef341) 为骨架,围绕 `browser_use` 模块(GUI-Owl 1.5 的 Web Agent)展开,覆盖环境搭建、环境变量配置、命令行运行、全部参数参考以及源码级的执行与评估原理

gitblog_00600的博客 958
上一篇: 别再盲目追 AI Agent 协议:真正该部署的只有这几层
下一篇: 你还没掉队:手把手教你构建首个 AI Agent(完整指南)
AI_小站
博客等级 码龄3年 6255粉丝 1154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值