当前位置: 首页 > news >正文

基于AI视觉的桌面GUI自动化:UI-TARS Desktop原理与实践

1. 项目概述:当AI学会“看”和“点”

如果你和我一样,曾经被那些需要重复点击、填写、验证的桌面软件操作搞得头大,或者为测试一个GUI应用而不得不编写和维护一堆脆弱、易变的脚本,那么“UI-TARS Desktop”这个名字,可能就是你一直在寻找的答案。这不仅仅是一个自动化工具,它更像是一个给你的电脑装上了一双“AI眼睛”和一只“AI手”的智能助手。它的核心能力,是让计算机程序能够像人一样,“看到”屏幕上的窗口、按钮、输入框,理解它们的含义,并“动手”去操作它们,整个过程完全基于视觉识别,无需侵入应用内部代码。

简单来说,UI-TARS Desktop试图解决一个经典难题:如何让自动化脚本摆脱对底层控件ID、坐标的强依赖,变得更加智能、健壮和易于编写。传统的自动化方案,无论是基于坐标点击、图像匹配,还是依赖Windows API或浏览器DOM,都存在各自的痛点:坐标易变、图像受分辨率影响、API接口封闭或复杂。而UI-TARS Desktop的思路是引入AI视觉模型,让程序直接“看懂”界面,识别出“登录按钮”、“用户名输入框”、“提交表单”这些视觉元素,从而实现更接近人类操作逻辑的自动化。

这尤其适合几类场景:一是软件测试工程师,尤其是面对客户端软件、桌面应用、或那些没有开放API的SaaS平台的Web界面时,可以构建更稳定的自动化测试用例;二是日常办公中有大量重复性GUI操作任务的业务人员,比如数据录入、报表生成、跨系统数据搬运;三是开发者,可以用它来为自己的软件制作演示Demo,或者搭建复杂的集成工作流。接下来,我们就深入拆解,如何利用这个工具,真正把AI自动化GUI操作这件事落地。

2. 核心思路:视觉驱动与元素智能定位

要理解UI-TARS Desktop,首先要抛弃传统自动化的“坐标思维”或“控件树思维”,转向“视觉语义思维”。它的工作流程可以概括为“截图-分析-定位-操作”的循环。

2.1 视觉识别引擎的工作原理

UI-TARS Desktop的核心是一个本地运行的AI视觉模型(通常是经过优化的目标检测或OCR模型)。当你启动一个自动化任务时,工具会周期性地捕获当前屏幕或指定窗口的图像。然后,这张截图被送入视觉模型进行分析。模型的任务不是识别具体的像素,而是识别出图像中所有可能的“交互元素”,比如按钮(Button)、文本框(Text Input)、复选框(Checkbox)、下拉列表(ComboBox)等,并为每个识别到的元素生成一个包含类别、位置(边界框)和文本内容(如果可读)的结构化描述。

这个过程的关键在于“泛化能力”。一个训练良好的模型,应该能够识别出不同风格、不同主题、甚至略有变形的同类型控件。例如,一个圆角矩形、带有“Submit”文字的蓝色区域,和一个直角矩形、带有“提交”文字的绿色区域,都应该被识别为“按钮”。这大大降低了脚本对UI细微变化的敏感性。

2.2 元素描述与操作指令

识别出元素后,UI-TARS Desktop会为每个元素创建一个唯一的描述符。这个描述符通常基于元素的视觉特征和上下文,例如“标题为‘登录’的按钮”、“左侧带有‘用户名:’标签的输入框”。在你的自动化脚本中,你不再需要写“在坐标(100,200)点击”,而是写“点击‘登录’按钮”或“在‘用户名’输入框中输入‘admin’”。

工具内部会将你的自然语言式指令,转化为对当前屏幕的实时搜索和匹配。当执行“点击‘登录’按钮”时,它会:

  1. 重新捕获屏幕。
  2. 运行视觉识别,找到所有被识别为按钮的元素。
  3. 在这些按钮中,筛选出文本内容(通过OCR获得)包含“登录”的元素。
  4. 计算该元素边界框的中心坐标。
  5. 将鼠标移动至该坐标并执行点击事件。

这种基于描述而非固定标识的定位方式,是它比传统工具更“智能”和“健壮”的根源。

注意:视觉识别的准确性并非100%。光照变化、界面模糊、字体特殊、元素重叠等情况都可能影响识别。因此,在实际脚本中,通常需要结合多个特征来精确定位元素,例如同时使用元素类型、文本和相对位置关系。

3. 环境搭建与基础脚本编写

理论清楚了,我们开始动手。假设我们已经获取了UI-TARS Desktop的安装包(通常是一个可执行文件或安装程序)。

3.1 安装与初步配置

安装过程通常很简单,一路“下一步”即可。安装完成后首次启动,软件可能会引导你进行一些初始设置:

  1. 屏幕缩放与DPI设置:这是最关键的一步。你必须确保工具识别的屏幕分辨率与实际分辨率一致。如果系统使用了125%、150%的缩放,需要在工具设置中对应调整,否则识别的坐标会全部错位。我通常建议在自动化专用环境中,将显示缩放设置为100%。
  2. AI模型加载:部分版本可能需要在线下载或手动指定预训练模型文件的位置。确保网络通畅,或提前准备好模型文件。
  3. 辅助工具安装:有些工具会依赖或捆绑安装一些运行库,如.NET Framework、VC++ Redistributable等,按照提示安装即可。

安装完成后,你会看到一个主界面,一般包含脚本编辑器、元素探测器、运行日志和屏幕预览区域。

3.2 第一个脚本:自动登录示例

我们以一个经典场景——自动化登录一个桌面客户端为例,来编写第一个脚本。UI-TARS Desktop通常提供图形化脚本录制和代码编辑两种方式。对于学习而言,从代码编辑开始更能理解其原理。

大多数此类工具会提供自己的脚本语言(可能是Python封装库或DSL)或直接支持Python调用。我们假设它支持Python API。

# 示例:使用UI-TARS Desktop的Python API实现自动登录 import uitars_desktop as ui import time # 1. 启动目标应用程序(例如一个模拟的客户端) # 这里假设应用路径为 C:\MyApp\app.exe app_path = r"C:\MyApp\app.exe" ui.start_application(app_path) time.sleep(3) # 等待应用启动 # 2. 定位并操作元素 # 找到“用户名”输入框并输入 username_field = ui.find_element(element_type="TextInput", text_nearby="用户名:") if username_field: ui.click(username_field) # 点击聚焦 ui.type_text("test_user") print("已输入用户名") else: print("未找到用户名输入框") # 找到“密码”输入框并输入 password_field = ui.find_element(element_type="TextInput", text_nearby="密码:") if password_field: ui.click(password_field) ui.type_text("password123") print("已输入密码") else: print("未找到密码输入框") # 找到“登录”按钮并点击 login_button = ui.find_element(element_type="Button", text="登录") if login_button: ui.click(login_button) print("已点击登录按钮") else: print("未找到登录按钮") # 3. 验证登录成功(例如,寻找登录后才会出现的元素) time.sleep(2) welcome_text = ui.find_element(text="欢迎,test_user") if welcome_text: print("登录成功!") else: print("登录可能失败,未找到欢迎信息")

这段代码展示了最基本的流程:启动应用、等待、查找元素、执行操作、验证结果。find_element函数是核心,它通过视觉识别在屏幕上搜索匹配你描述的元素。text_nearby参数非常实用,它表示寻找目标元素附近出现的文本,这对于定位没有内部文本的输入框特别有用。

3.3 使用元素探测器辅助开发

纯手写代码对元素描述符的准确性要求很高。因此,UI-TARS Desktop通常配备一个强大的“元素探测器”(或叫“拾取器”)工具。

它的用法是:

  1. 打开探测器,鼠标会变成一个十字准星。
  2. 将准星移动到你想操作的目标元素(如按钮)上。
  3. 工具会实时显示识别到的元素信息:类型、文本、位置、可能的其他属性。
  4. 你可以直接将这些信息(如element_type: Button, text: ‘登录’)复制到脚本中,或者让工具为你生成对应的代码片段。

实操心得:在编写复杂脚本时,我习惯先用探测器把整个界面关键元素都“侦察”一遍,记录下它们的可靠特征。有时一个元素用text定位不稳,但用text_nearby结合上方的一个固定标签文本就非常牢靠。多花几分钟在探测阶段,能省下大量调试时间。

4. 高级技巧:处理动态内容与等待机制

GUI自动化最大的挑战来自于界面的“动态性”:加载延迟、弹窗出现、元素状态变化。一个健壮的脚本必须能妥善处理这些情况。

4.1 智能等待与重试策略

绝对不要使用固定的time.sleep(10)这种“硬等待”。UI-TARS Desktop的API通常提供显式等待和隐式等待功能。

  • 显式等待(推荐):等待某个特定条件成立后再继续。这更高效、更可靠。

    # 等待“登录成功”的提示出现,最多等10秒 success_indicator = ui.wait_for_element(text="登录成功", timeout=10) if success_indicator: print("进入主界面") else: print("等待超时,登录可能失败")
  • 隐式等待:为后续所有的find_element操作设置一个全局的最大查找时间。

    ui.set_implicit_wait(5) # 设置隐式等待5秒 # 接下来所有的find_element都会在5秒内持续查找,找到立即返回,超时则报错

最佳实践:混合使用。设置一个较短的全局隐式等待(如3秒),对于关键步骤(如点击登录后的页面跳转),使用显式等待特定元素。

4.2 处理弹窗与异常流程

自动化过程中,各种弹窗(警告、确认、错误)是无法避免的。你的脚本必须有处理它们的能力。

# 在执行一个可能出错的操作后,检查是否有错误弹窗 try: ui.click(ui.find_element(text="开始处理")) # 等待正常结果 result = ui.wait_for_element(text="处理完成", timeout=30) except ui.ElementNotFoundError: # 如果没等到“处理完成”,可能出错了,检查弹窗 error_popup = ui.find_element(element_type="Window", title_contains="错误") if error_popup: error_msg = ui.get_text(error_popup) # 获取弹窗文本 print(f"操作失败,错误信息:{error_msg}") # 点击弹窗的“确定”按钮关闭它 ui.click(ui.find_element(parent=error_popup, element_type="Button", text="确定")) # 然后执行恢复逻辑...

这里用到了parent参数来限定搜索范围,只在弹窗窗口内查找“确定”按钮,避免了误点主界面上的其他按钮。

4.3 基于图像识别的后备方案

尽管AI视觉识别很强,但在某些极端情况下(如自定义绘制控件、游戏界面),可能无法准确识别为标准控件。这时,可以启用传统的图像匹配作为后备。

UI-TARS Desktop通常也集成或允许调用图像匹配功能。你可以事先截取一个目标按钮的图片作为模板。

# 先尝试用AI视觉定位 submit_btn = ui.find_element(element_type="Button", text="提交") if not submit_btn: # 如果AI定位失败,尝试图像匹配 print("AI定位失败,尝试图像匹配...") template_image_path = r"./templates/submit_button.png" submit_coords = ui.find_image_on_screen(template_image_path, confidence=0.8) if submit_coords: ui.click_at(submit_coords) # 在匹配到的坐标点击

注意事项:图像匹配对分辨率、颜色、缩放极其敏感,且无法“理解”元素语义。应仅作为AI识别失败的补救措施,并尽量使用具有高区分度的模板图片。

5. 复杂项目实战:构建数据搬运机器人

现在,我们综合运用以上知识,设计一个更复杂的实战项目:一个将数据从Excel表格搬运到某个老旧桌面ERP系统录入界面的“数据搬运机器人”。这个ERP系统没有API,界面控件古老,但逻辑规则严格。

5.1 项目分析与设计

目标:读取一个Excel文件(包含客户名、订单号、产品代码、数量),在ERP的“订单录入”模块中,逐行创建新订单。挑战

  1. ERP界面响应慢,控件非标准。
  2. 字段多,且有依赖关系(如选择产品后,单价自动带出)。
  3. 保存操作后有成功/失败提示。
  4. 需要处理大量数据,要求稳定运行。

设计思路

  1. 分层架构:脚本分为数据层(读取Excel)、控制层(主流程逻辑)、操作层(封装对ERP各个界面区域的操作函数)。
  2. 状态机模式:将整个流程划分为“登录”、“进入订单模块”、“新建订单”、“填写表单”、“保存确认”、“处理结果”等状态。每个状态完成后,显式等待进入下一个状态的标志元素出现。
  3. 错误恢复:在每个可能失败的关键步骤后,加入错误检测和恢复逻辑(如重试、记录错误行、跳过继续)。

5.2 核心模块实现详解

数据层:使用pandas库读取Excel。

import pandas as pd def load_order_data(file_path): df = pd.read_excel(file_path) # 假设列名为:Customer, OrderID, ProductCode, Quantity return df.to_dict('records') # 返回字典列表

操作层封装:将对ERP单个界面元素的操作封装成函数,提高代码复用性和可读性。

def erp_enter_order_module(): """从主界面进入订单录入模块""" ui.click(ui.wait_for_element(text="销售管理")) ui.click(ui.wait_for_element(text="订单录入")) # 等待订单列表界面加载完成 assert ui.wait_for_element(element_type="Table", timeout=10), "未进入订单模块" def erp_create_new_order(): """在订单列表点击‘新建’按钮""" new_btn = ui.find_element(element_type="Button", text="新建") # 这个按钮可能有时被遮住,尝试滚动或切换视图 if not new_btn: # 备用方案:通过快捷键或菜单 ui.press_keys("{F2}") # 假设F2是新建快捷键 else: ui.click(new_btn) # 等待订单详情表单弹出 ui.wait_for_element(element_type="Window", title="订单详情") def erp_fill_field(field_label, value): """根据字段标签名,填写对应的值""" # 策略:先找到标签文本,然后在其右侧或下方找输入框 label = ui.find_element(text=field_label) if label: # 获取标签位置,计算输入框的大致位置(例如向右偏移200像素) label_pos = ui.get_position(label) input_box = ui.find_element(element_type="TextInput", near_position=(label_pos.x+200, label_pos.y)) if input_box: ui.click(input_box) ui.clear_text() # 清空原有内容 ui.type_text(str(value)) return True print(f"警告:未找到字段 '{field_label}' 的输入位置") return False

控制层主循环

def main(): orders = load_order_data("orders.xlsx") erp_login() # 假设已实现的登录函数 erp_enter_order_module() for idx, order in enumerate(orders): print(f"正在处理第 {idx+1} 条订单: {order['OrderID']}") try: erp_create_new_order() # 填写各个字段 erp_fill_field("客户名称", order['Customer']) erp_fill_field("产品编码", order['ProductCode']) # 数量填写后,等待单价自动加载 erp_fill_field("订购数量", order['Quantity']) time.sleep(1) # 等待系统计算 # 保存订单 save_btn = ui.wait_for_element(element_type="Button", text="保存") ui.click(save_btn) # 处理保存结果 result = ui.wait_for_any_element( [{"text": "保存成功"}, {"text": "保存失败"}], timeout=15 ) if "保存成功" in result['text']: print(f" 订单 {order['OrderID']} 保存成功。") ui.click(ui.find_element(text="确定")) # 关闭成功提示 else: print(f" 订单 {order['OrderID']} 保存失败。") # 记录错误,可能截图 ui.screenshot(f"error_order_{order['OrderID']}.png") error_detail = ui.get_text(result) # 获取失败详情 log_error(order['OrderID'], error_detail) ui.click(ui.find_element(text="关闭")) # 关闭错误窗口 # 可能需要点击‘取消’放弃当前订单 ui.click(ui.find_element(text="取消")) except Exception as e: print(f" 处理订单 {order['OrderID']} 时发生未知异常: {e}") # 尝试恢复到可继续状态,例如强制回到订单列表 recover_to_order_list() # 循环处理下一单

这个例子展示了如何将业务逻辑、UI操作和异常处理编织在一起,构建一个有一定容错能力的生产级自动化脚本。

6. 调试、优化与维护策略

即使脚本编写完成,工作也只完成了一半。调试、优化和长期维护同样重要。

6.1 高效的调试方法

  1. 充分利用日志:UI-TARS Desktop的运行日志会详细记录每个识别和操作步骤。在脚本的关键节点,也加入自己的print日志,输出当前状态和变量值。
  2. 慢速运行与暂停:在调试模式下,可以设置操作之间的延迟加大,或者让脚本在每一步之前暂停,方便你观察屏幕状态是否与预期一致。
  3. 截图取证:在关键步骤前后、尤其是发生异常时,自动截图保存。这是事后分析问题的宝贵证据。
    ui.screenshot(f"debug_step_{step_counter}.png")
  4. 元素高亮:有些工具支持在识别到元素时,在屏幕上用矩形框高亮显示。开启这个功能,可以直观地看到脚本“看”到了什么,定位是否准确。

6.2 性能与稳定性优化

  1. 减少不必要的屏幕捕获:屏幕捕获和AI推理是耗时的。如果连续操作都在同一个窗口内,可以指定只捕获该窗口区域,而不是全屏。
    app_window = ui.find_window(title="我的应用") ui.set_capture_region(app_window.rect) # 只捕获应用窗口区域
  2. 缓存元素信息:对于界面中固定不变的元素(如菜单栏、导航按钮),可以在脚本开始时识别一次并缓存起来,后续直接使用缓存的对象进行操作,避免重复识别。
  3. 设置合理的超时与重试:根据网络和系统响应速度,为不同的操作设置不同的超时时间。对于重要的点击操作,可以加入重试逻辑。
    def robust_click(element_description, retries=3): for i in range(retries): try: element = ui.wait_for_element(**element_description, timeout=5) ui.click(element) return True except ui.ElementNotFoundError: print(f"第{i+1}次点击尝试失败,重试...") time.sleep(1) return False

6.3 脚本维护与版本控制

UI是易变的。当你的目标应用升级、界面改版时,脚本可能需要调整。

  1. 模块化与注释:如前所述,将操作封装成函数,并给函数和复杂逻辑添加清晰注释。当“客户名称”输入框的位置变了,你只需要修改erp_fill_field函数中定位该字段的逻辑,而不是搜索整个脚本。
  2. 使用版本控制(如Git):像管理代码一样管理你的自动化脚本。每次界面变化导致脚本更新时,都进行提交,并写好变更日志(如“适配ERP系统V2.5.0登录页改版”)。
  3. 建立元素特征库:对于大型项目,可以维护一个JSON或YAML文件,存储所有重要元素的特征描述(如{“login_button”: {“type”: “Button”, “text”: “登录”}})。脚本引用这个库。当界面变化,你只需更新这个特征库文件,而不是所有脚本文件。
  4. 定期冒烟测试:建立一个最简单的“健康检查”脚本(例如只完成登录和打开主页面),每天或每周自动运行一次。一旦失败,就能提前预警界面发生了破坏性变更。

7. 常见问题排查与实战避坑指南

在实际使用中,你一定会遇到各种各样的问题。下面是我总结的一些典型问题及其排查思路。

问题现象可能原因排查步骤与解决方案
元素找不到 (ElementNotFound)1. 界面未加载完成。
2. 元素描述不准确(文本有空格、符号)。
3. 屏幕缩放/分辨率设置错误。
4. 目标窗口未激活或最小化。
5. AI模型未识别出该元素类型。
1. 增加显式等待,确保目标元素出现。
2. 使用元素探测器重新拾取,检查识别的文本是否完全匹配(注意首尾空格)。
3. 检查工具和系统的显示缩放设置是否均为100%。
4. 使用ui.activate_window()激活目标窗口。
5. 尝试使用更宽泛的类型(如“Component”)或结合图像匹配。
点击位置偏移1. 元素定位的边界框中心计算不准。
2. 窗口有边框、标题栏,坐标未换算。
3. 系统主题/字体大小影响。
1. 使用元素探测器查看识别出的边界框是否准确覆盖元素。可尝试用click_at指定相对偏移量(如center_x, center_y+5)。
2. 确保工具捕获的是客户区坐标。有些API需要手动减去窗口边框偏移。
3. 在标准化环境(统一主题、字体)下运行自动化。
输入文本乱码或错误1. 输入法干扰。
2. 焦点未正确切换到输入框。
3. 目标应用对快速输入有限制。
1. 在脚本开始前,强制切换系统输入法到英文状态。
2. 在type_text前,确保执行了clickfocus操作。对于某些顽固控件,可以模拟Tab键切换焦点。
3. 在关键输入后加入短暂time.sleep(0.5),或使用type_text的慢速模式(如每个字符间隔0.1秒)。
脚本运行时快时慢1. AI模型推理速度受系统负载影响。
2. 网络请求(如果模型在线)延迟。
3. 目标应用自身响应不稳定。
1. 关闭不必要的后台程序,为自动化任务分配更多资源。
2. 如果支持,使用本地离线模型。
3. 在脚本中增加更多状态检查的等待,而不是固定延时,避免“空等”。
在虚拟机中运行不稳定1. 虚拟机显卡加速不足,屏幕捕获帧率低。
2. 虚拟机与主机鼠标/键盘事件同步问题。
3. 分辨率动态变化。
1. 为虚拟机分配更多显存,并启用3D加速。
2. 尝试在虚拟机内部直接运行自动化工具,而非通过远程连接。
3. 将虚拟机分辨率固定,并禁用自动调整大小功能。

一个典型的排查案例:脚本在白天运行正常,晚上总是失败。经过日志分析,发现失败发生在识别一个图标按钮时。最终发现,晚上我开启了操作系统的“夜间模式”或更换了深色主题,导致按钮颜色反转,AI模型无法准确识别。解决方案是在脚本开始时,强制检查并设置系统为指定的视觉主题,或者为深色/浅色主题分别训练或准备两套元素识别特征。

最后,我想分享一点个人体会:UI-TARS Desktop这类工具,将自动化从“精确但脆弱”的坐标/代码绑定,推向“模糊但健壮”的视觉语义理解,是一个巨大的进步。但它并非银弹,其成功严重依赖于脚本设计者对目标UI的理解和良好的异常处理设计。把它想象成一个能力很强但需要清晰指令的新人,你的脚本就是给它的操作规程。规程越能涵盖各种边界情况,它就越可靠。从简单的登录开始,逐步扩展到包含分支、循环、错误处理的复杂流程,你会逐渐掌握设计“鲁棒性自动化”的思维模式,这才是这项技术带来的最大价值。

http://www.jsqmd.com/news/1050109/

相关文章:

  • 思源宋体终极使用指南:7种字重免费开源宋体的完整配置方案
  • 如何高效管理音乐歌词:MusicLyricApp的完整解决方案
  • 走访河源128家黄金奢侈品回收店,这份靠谱商家清单出手前必看 - 生活测评小能手
  • LPC213x UART0寄存器配置、波特率计算与自动波特功能实战解析
  • 2026佛山白蚁防治避坑实测!5大主流平台横向对比本地人防御优选攻略 - 博客万
  • LPC210x ADC与定时器实战:寄存器级配置、避坑指南与协同应用
  • 线段树算法总结
  • 如何高效解决B站缓存视频播放难题:m4s-converter的5个实用技巧
  • 量化特征工程实战:构建工业级Alpha因子生态体系
  • 2026 马鞍山市|全市中考一两百分初三统一招生,淮南职业技术学校公办中职简章公示,联系方式 15756001370 - 我叫小周
  • 电瓶车托运保价别踩坑!2026避坑指南+正确买法 - 快递物流资讯
  • SCF5250微控制器:嵌入式音频系统核心架构与驱动开发实战
  • 2026年杭州本地生活GEO技术革新:如何精准提升用户定位体验
  • 免费网盘直链下载助手终极指南:告别限速,轻松获取高速下载链接
  • YOLO26涨点改进| Arxiv 2026 | 独家频域创新改进篇 | 引入PRM相位校正模块,通过从频率域增强目标表征,助力红外小目标检测、遥感目标检测、图像分割任务高效涨点
  • TSN时间敏感网络实战:基于SJA1105的PTP同步与802.1Qbv调度配置
  • Mac本地大模型部署指南:Codex+Codex Desktop保姆级实战
  • ComfyUI精准控制:理解steps/cfg/denoise三参数协同机制
  • Python毕业设计-基于 Python 的题库资源综合管理系统的设计与实现 基于 Python 的教育题集处理与管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 深入解析8位PIC单片机DCO与时钟切换:从原理到低功耗实战
  • 2026年AI学习机推荐:对比四类产品,奇多多通过了启蒙考验 - 新闻快传
  • 2026年想找扬州靠谱毛坯房装修?这几家技术过硬实力值得参考 - 资讯速览
  • 2026年散热器铝型材开模定制:4家诚信厂家深度对比评测 - 资讯速览
  • 嵌入式GUI开发实战:emWin模拟触摸屏驱动与校准全解析
  • 飞思卡尔PQ-MDS-QOC3模块硬件配置实战:从跳线到光纤链路建立
  • 一人AI公司实战指南:从需求切片到首笔收款的14个关键动作
  • 工业 RAG + 微调混合系统【左扬精讲】—— R1 系列收官之作:从 Prompt → RAG → 微调 选型决策树
  • 2026 淮南市|本地中考一两百分公办中职招生,淮南职业技术学校公办院校 2026 完整版简章,联系窦老师 15756001370 - 我叫小周
  • 3步学会用Video2X:免费AI视频无损放大到4K的终极指南
  • 二手平台哪个更靠谱?不看广告看机制,四大平台实测对比 - 新闻快传