news 2026/9/8 2:40:57

AI Agent 桌面自动化:如何构建可信任的屏幕状态闭环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI Agent 桌面自动化:如何构建可信任的屏幕状态闭环

很多人在 Hacker News 上看到《Show HN: I spent 3 months making desktop automation stop lying to AI agents》这个标题时,第一反应可能是:桌面自动化还能“说谎”?

但如果你真的让 AI Agent 去操作电脑,大概率很快就会遇到一个诡异的现象——自动化框架返回给你的是一个“看起来成功的失败”。日志上写着“已点击”,界面却纹丝不动;Agent 相信了这次成功,然后继续编排后面的操作,最终整条任务链越走越偏。问题不在 LLM 的推理能力,而在于桌面自动化工具汇报给 Agent 的状态信息,并不是真实屏幕状态的忠实投影。

我用一篇文章把这个问题的根源和解决方案拆清楚。重点会放在:为什么传统桌面自动化在 AI Agent 场景下会失效、状态信息到底是在哪一层被“污染”的,以及如何通过一套“执行—读取—校验”闭环,让 Agent 拿到真正可信的屏幕状态。文末会给出一个基于 Python 的最小可运行示例,你可以直接照着自己做一遍。

1. 桌面自动化为什么会“骗”AI Agent

先看一个最简单的场景。你让 Agent 自动填写一个表单,填完后点击“提交”。在传统自动化脚本里,这个动作通常是这样写的:

  1. 定位“提交”按钮的坐标。
  2. 执行click(x, y)
  3. 脚本结束,返回“点击成功”。

这套逻辑在普通 RPA 场景里用了很多年,问题不大。但到了 AI Agent 场景,事情发生了变化:Agent 不是一个只能执行单一脚本的机器,它需要根据当前状态不断推理下一步动作。于是自动化框架返回的“点击成功”会被 Agent 当成一条事实,进而影响后续计划。

麻烦在于,传统自动化框架的“成功”是一个很弱的概念。它只代表“鼠标事件已经发到了指定坐标”,不代表“界面上确实产生了预期变化”。可能的情况包括:

  • 点击时窗口不在前台,事件被系统拦截。
  • 目标按钮被弹窗遮住,点击落在遮罩层上。
  • 按钮触发了异步请求,界面要等几秒才刷新,而框架已经返回了结果。
  • 界面字体、DPI 缩放、分辨率变化导致坐标偏移,点到了无关区域。

对于传统 RPA 来说,脚本设计者可以靠肉眼观察结果来修正。但 AI Agent 没有眼睛,或者说它的“眼睛”就是自动化框架提供的状态描述。如果这个描述和真实屏幕不一致,Agent 就会基于错误前提做决策,错误会在下一个循环中被进一步放大。

这也是为什么那个标题用了“lying”(说谎)这个词。工具本身没有意图,它只是盲目地汇报,但从 Agent 的视角看,它确实接收到了与事实不符的信息。

2. 核心概念:Agent 控制闭环与状态表示

要搞清楚问题出在哪,先要理解 AI Agent 操作桌面时的完整循环。无论是直接调用工具,还是通过类似 Computer Use 的模式操作电脑,Agent 的工作方式都可以拆成四个环节:

环节作用失败后果
感知(Perception)获取屏幕截图、UI 元素树、OCR 文本等状态拿到错误输入,后续全部白费
决策(Decision)LLM 根据当前状态规划下一步动作产生不合逻辑的操作序列
行动(Action)执行鼠标点击、键盘输入、拖拽等操作事件未生效或作用在错误目标上
验证(Verification)确认操作是否真的改变了界面状态无法发现错误,错误继续累积

传统桌面自动化和 AI Agent 化桌面自动化,最重要的差别在“感知”和“验证”这两个环节。

传统自动化是“行动中心制”。核心资产是坐标、图片模板、窗口句柄、控件选择器。脚本设计者写自动化用例时,脑子里已经有了完整业务逻辑,工具只是帮他执行固定的动作序列。状态读取只是辅助,很多时候甚至不做。

AI Agent 自动化是“感知中心制”。Agent 每走一步都需要重新读取屏幕状态,判断当前处于什么页面、有什么按钮可用、前一步操作是否生效,然后才决定下一步动作。状态数据的质量直接决定推理质量。

可以这样理解:传统自动化像一段固定路线的自动驾驶,路线提前画好,只需要执行转向和加速;AI Agent 则像一个实时导航系统,需要不断读取当前位置,遇到封路还要重新规划路线。如果传感器上报的位置是错的,导航自然会给出离谱的路线。

所以,桌面自动化对 AI Agent“说谎”的本质,是状态表示(State Representation)不可靠。自动化框架把世界建模成坐标和事件,而 Agent 需要的是语义级别的状态描述。这两个世界之间存在一条很宽的鸿沟。

3. 问题根源:三种典型的“假状态”

我梳理了一下,桌面自动化向 Agent 传递的“假状态”主要有三种来源。

3.1 坐标型谎言:屏幕物理坐标系一直在变

很多人写自动化是从坐标开始的:按钮在 (500, 400),那就点击 (500, 400)。这在固定分辨率、固定窗口位置的环境下没问题,但真实桌面环境里变化太多了:

  • 用户手动调整了窗口位置或尺寸。
  • 系统切换了显示器分辨率或缩放比例。
  • 外接显示器拔掉后,窗口被挤到屏幕外。
  • 弹窗出现,把原本的内容向下推移。

一旦这些变化发生,脚本里写死的坐标就全部作废。更麻烦的是,点击事件本身不会报错,系统照样把鼠标事件发送出去,框架照样返回“点击成功”。

对 AI Agent 来说,这种“成功”就是一条典型的谎言。

3.2 结构型谎言:元素树不等于视觉渲染

比坐标更高级的方式是读取 UI 元素树。Windows 下有 UIA(UI Automation),macOS 下有 Accessibility API,Linux 下有 AT-SPI。通过这些接口可以拿到按钮、输入框、列表等控件的属性和层级关系,看起来比坐标稳定很多。

但元素树也有自己的问题:

  • 元素树里存在大量不可见节点,Agent 会把“存在”误判为“用户可见”。
  • 有些应用使用自定义绘制,不暴露标准控件属性。
  • 字体渲染、GPU 加速、硬件缩放可能导致视觉呈现和逻辑树不匹配。
  • 有些场景里元素已经存在,但界面仍处于加载动画中,用户实际上还不能点击。

也就是说,即使从系统层面拿到了“真实”的控件信息,它和用户肉眼看到的渲染结果之间仍然可能存在差异。Agent 把元素树当作唯一事实来源时,一样会被误导。

3.3 时间型谎言:异步刷新让快照变成假历史

第三种假状态和“时间”有关。现代桌面应用大量使用异步渲染:点击按钮后,请求发到后端,界面要等网络返回后才刷新。常见情况有三种:

  • 点击后立刻截图,界面还没刷新,看到的是旧状态。
  • 过一会儿再截图,异步任务已经完成,看到的是新状态。
  • 页面有动画,截图恰好捕捉到中间帧,导致 OCR 或图像匹配异常。

自动化框架通常只记录“操作时间”,不会帮你处理“状态稳定时间”。Agent 如果在一个错误的时间点读取状态,读到的就是一个既不是过去、也不是未来的中间快照。

这也是最难排查的一类问题,因为它不是每次必现,而是受网络、机器负载、动画时序影响,带有随机性。写一次脚本可能成功,跑一百次就可能在某个时间点翻车。

4. 工程解法:执行—读取—校验闭环

要解决上面三类“谎言”,核心思路不是提高点击精度,而是让自动化从“操作闭环”转向“状态闭环”

换句话说,Agent 不能只问“我做了操作吗”,而要问“界面真的变成我想要的样子了吗?”

具体做法是给每一次关键操作套上一层校验:

  1. 操作前读取状态,记下当前界面的关键信息(截图、文本、元素树快照)。
  2. 执行操作,发送鼠标或键盘事件。
  3. 操作后重新读取状态,得到新的界面信息。
  4. 对比操作前后的状态差异,判断是否产生了符合预期的变化。
  5. 如果差异不符合预期,重试;重试仍失败,把真实失败原因返回给 Agent,而不是返回一个“成功”。

这个闭环里,最重要的原则是:状态信息只能来自独立读取,不能来自操作日志。一个按钮被点击之前,谁都不能保证它一定被点到了;只有点击后再去读一次屏幕,发现按钮文本变了、下一个页面出现了、某个元素消失了,才能下结论说“操作生效了”。

4.1 用一个状态函数包装所有自动操作

工程上可以把这套逻辑封装成一个通用函数。它的输入是一个“目标操作”和“预期状态”,输出是一个带置信度的验证结果。

比如点击某个按钮后,预期界面上出现“成功”两个字。状态闭环函数的逻辑是:

def operate_and_verify(operation, expected_state): before = capture_screen_state() # 操作前读取 operation() # 执行操作 after_1 = wait_and_capture(timeout=3) # 等待后读取 if state_matches(after_1, expected_state): return success(after_1) retry_operation_with_fallback() # 尝试修复 after_2 = wait_and_capture(timeout=3) return failure(after_2) # 把真实状态返回给上层

这样设计的好处是,失败时系统知道“为什么失败”。是找不到目标按钮,还是点击后页面没变化,还是弹出了异常提示?这些信息可以被结构化成文本,交给 LLM 做下一步决策。

4.2 校验层用什么来判断状态

校验层可以做成两级:

第一级是规则校验,速度快、成本低。例如用 OCR 识别屏幕文本后,检查是否包含指定关键词;或者对屏幕特定区域做像素差异比对,判断弹窗是否出现。

第二级是 LLM 校验,适合复杂语义判断。例如判断“当前页面是否处于可提交状态”、“界面上的错误提示是否意味着任务已失败”。但要注意,LLM 只能解读已经读取到的状态数据,不能让它直接“编造”状态。状态源必须来自前面的独立读取模块。

4.3 给 Agent 一个诚实的反馈接口

最后,所有操作完成后,反馈给 Agent 的内容要带有不确定性和原始证据。不要只说“点击成功”,而要给出:

操作:点击“提交”按钮 结果:未检测到预期状态“提交成功” 当前屏幕文本:表单校验失败,请检查手机号格式 建议:Agent 应修正输入后重试

这种反馈比“点击成功”有用得多。Agent 收到后可以基于真实失败原因调整策略,而不是带着错误认知继续执行下一步。

5. 环境准备与依赖安装

下面进入可运行的部分。这套演示代码用 Python 实现,通过截图加 OCR 的方式读取屏幕状态,并用一套闭环逻辑执行点击操作。不需要真实业务系统,只要有一个普通桌面环境就能跑。

5.1 系统要求

  • Python 3.10 及以上版本。
  • 操作系统不限,Windows、macOS、Linux 均可。
  • 需要准备一个真实的桌面环境,推荐使用一个简单的文本编辑器或者网页应用作为测试对象。

5.2 安装 Python 依赖

建议先创建虚拟环境:

python -m venv .venv source .venv/bin/activate # Windows 使用: .venv\Scripts\activate

然后安装依赖:

pip install pyautogui mss opencv-python pillow pytesseract

各依赖的作用:

用途
pyautogui模拟鼠标点击、键盘输入
mss高性能屏幕截图,比 pyautogui 自带的截图更快更稳
opencv-python图像预处理,辅助 OCR 识别
pillow图像读取和处理
pytesseract调用 Tesseract OCR 引擎提取屏幕文本

5.3 安装 Tesseract OCR

pytesseract 只是一个 Python 封装,真正做 OCR 的是 Tesseract 引擎,需要单独安装。

macOS:

brew install tesseract

Ubuntu / Debian:

sudo apt-get install tesseract-ocr

Windows 用户需要从 Tesseract 官方 GitHub 的发行页面下载安装包,安装后在代码里指定路径:

import pytesseract pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

安装完成后可以验证一下:

tesseract --version

5.4 系统权限设置

在 macOS 上,运行屏幕截图和鼠标控制需要授予相应权限:

  • 屏幕录制权限:终端或 IDE 需要允许录制屏幕,否则截屏会是黑屏。
  • 辅助功能权限:允许控制鼠标和键盘。

在 Windows 和 Linux 上,一般不需要额外权限,但如果运行在远程桌面或服务模式下,需要确保当前会话是活跃的桌面会话。

6. 完整示例:基于屏幕状态感知的桌面 Agent

现在把上面的思路落成代码。整个示例由四个文件组成:截图模块、状态读取模块、带校验的操作模块、主流程。

6.1 截图模块capture.py

# capture.py import mss def capture_screen(output="screen.png"): """截取主屏幕并保存为图片,返回图片路径。""" with mss.mss() as sct: monitor = sct.monitors[1] img = sct.grab(monitor) mss.tools.to_png(img.rgb, img.size, output=output) return output if __name__ == "__main__": path = capture_screen("screen.png") print(f"截图已保存到: {path}")

这段代码使用 mss 截取主屏幕,速度快,而且能自动适配当前分辨率。mss 返回的图像是原始 RGB 数据,可以直接传给to_png保存。

6.2 状态读取模块state_reader.py

# state_reader.py from PIL import Image import pytesseract def read_screen_state(image_path="screen.png"): """从截图中读取界面文本状态,返回结构化结果。""" img = Image.open(image_path) data = pytesseract.image_to_data( img, lang="eng", output_type=pytesseract.Output.DICT ) items = [] for i, text in enumerate(data["text"]): text = text.strip() if text: items.append({ "text": text, "x": int(data["left"][i]), "y": int(data["top"][i]), "w": int(data["width"][i]), "h": int(data["height"][i]), "conf": float(data["conf"][i]) }) return items def screen_text(items): """把所有识别出来的文本拼成一句话,方便做关键词校验。""" return " ".join(item["text"] for item in items) def find_text_center(items, keyword): """从 OCR 结果中按关键词定位目标元素中心坐标。""" matched = [it for it in items if keyword.lower() in it["text"].lower()] if not matched: return None target = matched[0] return (target["x"] + target["w"] // 2, target["y"] + target["h"] // 2) if __name__ == "__main__": state = read_screen_state("screen.png") print("识别到", len(state), "个文本块") print(screen_text(state))

read_screen_state把 OCR 结果转换成结构化数据,每个文本块包含内容、坐标、宽高和置信度。这个结构就是后面校验逻辑的数据基础。

find_text_center是“基于状态定位操作目标”的关键函数。它不再依赖固定坐标,而是每次从当前屏幕 OCR 结果里实时查找目标文本,再计算中心点。这比写死坐标要可靠得多。

6.3 带校验的点击操作smart_actions.py

# smart_actions.py import time import pyautogui from state_reader import read_screen_state, screen_text, find_text_center CLICK_SETTLE_SECONDS = 1.5 MAX_RETRY = 3 def smart_click(click_keyword, expect_keywords, retries=MAX_RETRY): """ 带状态闭环的点击操作。 参数: click_keyword: 要在屏幕上查找的按钮文本 expect_keywords: 点击后预期出现的状态文本列表 返回: (success, current_text) """ for attempt in range(1, retries + 1): before_items = read_screen_state() center = find_text_center(before_items, click_keyword) if not center: print(f"[attempt {attempt}] 屏幕上没有找到目标: {click_keyword}") time.sleep(1) continue print(f"[attempt {attempt}] 点击坐标: {center}") pyautogui.click(center) time.sleep(CLICK_SETTLE_SECONDS) after_items = read_screen_state() current_text = screen_text(after_items) for expected in expect_keywords: if expected.lower() in current_text.lower(): print(f"[attempt {attempt}] 操作成功,检测到预期状态: {expected}") return True, current_text print(f"[attempt {attempt}] 点击后未出现预期状态,当前文本: {current_text}") return False, current_text

这个函数的核心价值在于“点击之后必须回读屏幕”。如果 OCR 结果里出现了预期关键词,才认为操作成功;否则即使鼠标事件已经派发出去,也会被标记为失败,并进入重试。

你可能会问:OCR 本身也有误差,用 OCR 结果做校验会不会引入新的“谎言”?会,所以建议在真实项目里把校验源做得更多元一些,比如同时使用 OCR、元素树、像素 diff。本示例用 OCR 是为了让最小实现足够简单。

6.4 主流程demo.py

# demo.py from capture import capture_screen from state_reader import read_screen_state, screen_text from smart_actions import smart_click def main(): print("第一步:截取当前屏幕状态") capture_screen("before.png") before_items = read_screen_state("before.png") print("当前屏幕可见文本:") print(screen_text(before_items)) print("\n第二步:执行带状态闭环的点击任务") success, current_text = smart_click( click_keyword="OK", expect_keywords=["Success", "Done", "成功"] ) print("\n第三步:回读屏幕状态") print(current_text) if not success: print("任务失败,需要人工介入,或者让 Agent 选择其他路径。") raise SystemExit(1) print("任务验证通过。") if __name__ == "__main__": main()

运行前请先打开一个包含“OK”按钮和某种成功提示的界面。对于没有合适界面的情况,可以打开系统自带的记事本,把测试目标改成一个常见菜单项,比如click_keyword="File", expect_keywords=["New", "Open"]

7. 运行验证:如何判断闭环真的生效

运行示例:

python demo.py

如果一切正常,预期的输出大致如下:

第一步:截取当前屏幕状态 当前屏幕可见文本: File Edit View Search Preferences Help OK 第二步:执行带状态闭环的点击任务 [attempt 1] 点击坐标: (631, 420) [attempt 1] 操作成功,检测到预期状态: Success 第三步:回读屏幕状态 Success OK 任务验证通过。

判断成功的关键不是“屏幕上有没有目标按钮”,而是“点击之后是否出现了预期状态”。这正好呼应了文章开头提到的核心观点:操作是否成功的证据,只能来自操作之后的屏幕状态。

7.1 怎么验证代码的“校验逻辑”真的在工作

你可以故意制造一个失败场景,看看闭环是否正确返回失败信息。比如把expect_keywords改成一个肯定不存在的词:

success, current_text = smart_click( click_keyword="OK", expect_keywords=["THIS_NEVER_APPEARS"] )

这次运行应该会看到:

[attempt 1] 点击后未出现预期状态,当前文本: OK ... [attempt 2] 点击后未出现预期状态,当前文本: OK ... [attempt 3] 点击后未出现预期状态,当前文本: OK ... 任务失败,需要人工介入,或者让 Agent 选择其他路径。

这才是正常的。如果代码返回了“成功”,反而说明校验没有真正生效。

7.2 失败时第一步看什么

运行失败时,按以下顺序检查:

  1. 打开before.pngscreen.png,确认截图内容是否正常。如果截图是黑屏,优先检查屏幕录制权限。
  2. 打印 OCR 识别结果,确认目标文本是否被正确识别。OCR 对清晰文本的识别率很高,但如果界面用了艺术字体,可能需要图像预处理。
  3. 确认窗口是否处于前台。pyautogui.click发送的是系统级事件,如果窗口被遮挡,点击会落到别的应用上。
  4. 确认目标按钮点击后确实会有状态变化。有些按钮点击后效果不明显,不适合当一个演示场景。

8. 常见问题与排查方法

在跑桌面自动化时,下面的问题几乎一定会遇到。

问题现象可能原因排查方式解决方案
OCR 识别出来的文本乱码界面字体特殊、分辨率过低保存原图,放大或做灰度化、二值化预处理用 OpenCV 做预处理,或者改用图像模板匹配
截图是黑屏缺少屏幕录制权限查看系统权限设置在系统设置中给终端/IDE 开启屏幕录制权限
点击没有触发任何效果窗口未激活或目标被遮挡点击前打印当前活动窗口信息使用pyautogui.getWindowsWithTitle先激活窗口
坐标偏移,点到了别的按钮高分屏 DPI 缩放打印截图尺寸和屏幕逻辑分辨率计算 DPI 缩放系数,或基于 OCR 坐标动态推断
点击后界面响应太慢,总是校验失败异步任务耗时超过等待时间增加CLICK_SETTLE_SECONDS使用轮询等待,而不是固定 sleep
识别到多个相同文本,点错位置界面里有多个同名按钮打印全部匹配项,检查坐标增加区域过滤条件,只匹配目标区域内的文本
系统提示没有辅助功能权限pyautogui 被系统拦截查看系统安全设置在辅助功能里授权终端或 IDE
OCR 识别速度慢截图尺寸过大、文本块太多统计 OCR 耗时只截取关键区域,缩小 OCR 范围

有一个通用建议:任何校验逻辑都要能独立验证。如果你不确定 OCR 是否可靠,可以先把截图保存下来,人工看一遍图,再对比 OCR 输出。只有当你信任状态读取模块时,后面基于状态做的决策才有意义。

9. 工程落地建议与总结

演示代码证明了“执行—读取—校验”闭环的可行性,但真实项目里要解决的问题会更多。如果你要把这套方案落地到业务系统里,下面这些建议值得提前考虑。

9.1 把状态读取做成独立服务

不要把截图、OCR、元素树读取逻辑散落在每个脚本里。建议封装成一个统一的状态读取服务,所有的 Agent 操作都只通过这个服务获取状态。这样做的好处是,当你想从 OCR 切换到多模态模型,或者加入元素树信息时,只需要改这一个模块,不影响上层决策逻辑。

9.2 保存每一轮的原始证据

Agent 运行过程中,每一轮的截图、OCR 文本、操作记录、校验结果都应该持久化保存。出了一个线上事故,如果只有“Agent 执行了下载操作”这句话,排查起来会很困难;如果有一组 before/after 截图,问题定位会快得多。

9.3 LLM 只做解读,不做状态源

这是最容易犯的错误:为了让 Agent 理解复杂界面,直接把截图丢给多模态 LLM,然后让 LLM 判断“当前界面是什么状态”。这确实很通用,但 LLM 的幻觉问题会让状态描述变得不稳定。

更稳妥的架构是:

  • OCR、元素树、像素 diff 提供可验证的原始状态。
  • LLM 负责把原始状态翻译成适合 Agent 决策的语义描述。
  • 原始状态和 LLM 解读一起传给 Agent。

这样即使 LLM 解读错了,上层至少还能看到原始状态,有机会发现偏差。

9.4 操作幂等化

同一个操作被执行了两次,结果应该是一样的。最典型的例子是按钮点击:如果 Agent 已经点击了“提交”,但因为网络延迟没有看到反馈,它可能会再点一次,结果产生了重复订单。解决办法是操作前先检查当前状态:如果已经处于“提交成功”页面,就不要再次点击提交。

9.5 安全边界与最小权限

桌面自动化涉及真实系统操作,风险远比调用 API 高。生产环境至少要遵守几条底线:

  • 自动化进程不要用管理员或 root 权限运行。
  • 涉及删除、清空、转账、发布等不可逆操作,必须经过人工确认。
  • 给每轮操作设置重试上限,防止 Agent 陷入死循环。
  • 设置全局“停止开关”,一键终止所有自动化操作。
  • 不要自动操作包含敏感信息的窗口,确需操作时提前脱敏。

9.6 回到那个标题

“让桌面自动化停止对 AI Agent 说谎”,听起来像是一个很新的问题,但本质上是计算机系统里一个古老原则的回归:不要相信日志,要相信状态

传统自动化框架的视角是“把动作做出去”,而 AI Agent 时代需要的是“把状态读回来”。谁能把状态管道做得更可靠、更透明,谁就能让 Agent 在真实桌面环境里走得更远。

建议你先用上面这几十行代码,挑一个真实应用跑一遍,把一个按钮变成带校验的闭环操作。然后就会明白,真正难的不是点击,而是如何诚实地回答一个问题:你怎么知道它真的点对了?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 2:40:30

整车在环ViL测试:智能驾驶验证的关键拼图

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 2:38:46

开源Wi-Fi基带芯片openwifi:基于FPGA的完整实现与实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 2:38:13

大模型算法岗面试必备:Transformer六阶段学习路线与实战

很多准备大模型算法岗面试的同学,第一个遇到的问题往往不是“算法太难”,而是“考点太散”。今天翻到一篇讲自注意力的文章,明天刷到一个多卡训练的视频,后天看到一个 LoRA 微调的教程,每份材料都只覆盖一个点&#xf…

作者头像 李华
网站建设 2026/9/8 2:36:33

从零搭建私有音乐镜像系统:Nginx+PHP+MySQL完整实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 2:36:30

3D模型组件耦合问题解析:从材质分离到资源优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华