算法不远,AI就在身边。下面是算法服务生活时间,我是主持人TF男孩。
最近圈里天天刷 Agent、Skills、MCP。名词换得比季节快,我还在自己的工程路径上凿井:数据自己标,模型自己训,脚本自己焊。我从 RNN 一路走到 LLM,重新训练过LLM ,改造过 YOLO 。这不,用本地 OCR 加 Qwen 加 Python,游戏都能自动打。我玩一个游戏,每打一个新地图需要升5级,懒得打,还想看新地图。也没钱找代练,就自己写了一个脚本,模拟鼠标点击操作。每一步都是毫秒级。

照这个技术看,底子还行,还算硬。但是偏偏自己看招聘启事发慌:是不是跟不上时代了?那些个MCP、Skills好学吗?我还能找到新工作吗?
我先给自己吃一颗定心丸,也给跟我一路的人吃一颗。底子没有过时。过时的,往往只是交付方式。看完效果,名词会自己掉下来。
先看效果,别急着听名词。找 NPC、点对话框、瞄准稻草人王、消失后再去找 NPC------这是我桌上那条流水线,眼睛、脑子、手都在转。不是演示文稿里的智能体,是能在 Windows 桌面上真点下去的程序。
听着很新。看着很潮。其实啊,我写这套挂机的时候,已经在 Agent 门口站了好几年。差的不是数学,是一张插头,再加一本用到才翻的手册。
一、圈里在喊的,到底是什么
大模型现在不太像聊天窗口了。更像操作系统的内核:算力在,指令集在,可它自己既没有鼠标,也没有我这行当的 SOP。
Agent,就是给内核配上三样东西:循环、规划、手脚。丢给它一个宏观目标,它拆任务、调工具、报错了再试,直到活干完或者承认干不完。不是问一句答一句。我以前那个自动打游戏,本质上就是一个简易的硬编码 Agent------状态写在 if 里,工具焊在同一个 while True 里。圈里流行的,是把「焊死」改成「可插拔」。
Skills,别被英文吓到。它不是新权重,不是新损失函数。它就是一个文件夹,核心是一份 SKILL.md:这技能叫什么、什么时候用、步骤怎么走、失败了怎么办。亮点叫渐进式加载:平时 AI 只瞟一眼目录上的短描述,真遇到相关活,再把详细手册读进来。以前为了教模型做一件复杂的事,几千字提示词全塞系统提示里,又贵又容易把模型灌迷糊。现在把人类的行业经验打包成模块,用到再翻。跟修电器先看目录、对上型号再翻那一章,是一个道理。听着很正式,其实就这么几行:
markdown
---
name: scarecrow-king
description: 对话框里选挑战稻草人王。打架瞄准不要用。
---
# SOP
点最像「开战」且含稻草人王的一行。
没有挑战项就 Esc。禁止把 FIGHTING 交给大模型。
顺手提一句 MCP。它不是新模型。我把它理解成工具的 USB 口:截图、识别、点击,按同一套契约暴露出去。Cursor 也好,我自己的 Agent 也好,插上就能调。协议而已。同一只手,加个装饰器就挂出去了:
python
@mcp.tool()
def click_xy(x: int, y: int) -> dict:
"""点击屏幕坐标。DRY_RUN 时只记日志。"""
return click(x, y)
所以那两样好学吗?对我这种训过 GLM、写过 OCR、自己转过状态机的人来说,是窗户纸。求职需不需要?需要的是能讲清楚,并且手上有一个真转过圈的项目;不需要的是把框架名词背成喜鹊。市面上不少人会画架构图,未必能让键鼠在游戏窗里点准。我若能把两头接上,反而稀缺。
二、原来那个项目,到底焊在哪
我拿自己这条传奇单机挂机开刀。活很具体:找 NPC,打开对话,认出「稻草人王」那一行并点下去,然后盯着怪物按技能,没了再去找 NPC。周而复始。
眼睛是现成的。桌面截窗口,YOLO 认三类东西:NPC、对话框、稻草人。对话框里的字交给本地 OCR。手也是现成的,键鼠模拟,点中心、按快捷键。脑子呢?脑子是一张状态表:找人、点对话、打架。看到对话框里出现固定那几个字,就进入战斗;看不到稻草人了,就算击杀成功。
听着很牛,一条链路从像素走到按键。拆开看,感知、决策、执行全焊在同一个循环里。
换个程序想用这双眼睛,得把类拆开重写。游戏把「挑战稻草人王」改成「前往试炼」,字符串对不上,流水线直接空转按退出。大模型当时也请到了家里,本地 Qwen 能跑,可它只在单元测试里做阅读理解:三个选项选哪个。主循环根本没叫它。内核买回来了,没接上手脚。
旧主循环抽干了,大概是这样。GUI 我略掉了,骨头就这些:
python
while running:
img = grab_window()
objs = yolo(img) # npc / dialog / scarecrow
if state == "FIND_NPC":
click(center(objs["npc"][0]))
state = "CLICK_DIALOG"
elif state == "CLICK_DIALOG":
for line in ocr(crop(objs["dialog"][0])):
if "稻草人王" in line.text:
click(line.xy); state = "FIGHTING"; break
else:
press("esc"); state = "FIND_NPC"
elif state == "FIGHTING":
if objs["scarecrow"]:
move_to(center(objs["scarecrow"][0])); press("f2")
else:
state = "FIND_NPC" # 认为打完了
这就是很多老工程路径的老实处,也是它的天花板。老实处是快。截图、检测、0.5 秒一刀,中间没有网络、没有「让我想想」。天花板是:流程一变就改源码,能力无法借给别人。
三、改造不换引擎,只换接法
我一听 Agent,也曾动过歪念头:把整条 while True 扔进大模型,每帧截张图问 Qwen 现在点哪。那不叫升级,叫给步枪换上宣纸准星。战斗是 0.05 秒一圈、0.5 秒一刀的活。本地 7B 想一次,往往是秒级。YOLO 已经把稻草人框出来了,再问模型该不该打,纯属耽误事。
正确的改法很土,也因此很稳。我把它叫双速。
快回路:截图、检测、找人、瞄准。继续 Python,继续 YOLO。这是我原来就会的,别扔。慢回路:只有对话框这种「字可能会变、选项可能变多」的地方,才把 OCR 结果交给模型,让它以工具调用的方式选一行去点,或者判断该按退出。模型能调的手就三只:列出选项、点第几项、按 Esc。它看不见、也调不到「朝怪物放技能」。技能手册里写得明白:打架不准交给大模型。
具体就五层皮,皮都不厚。
第一层,把眼睛和手从窗口程序里拽出来,变成普通函数。找窗、截图、检测、识字、点击。这叫 Tool。没有这一步,后面全是空壳。
第二层,愿意的话,把同一批函数挂到 MCP 上,给外人用的插头。我自己的挂机主循环,同进程直接调就行。
第三层,把「如何刷稻草人王」写成 Skill。文案从「稻草人王」变成「挑战试炼」,我改手册,不必改那行字符串判断。
第四层,才是大家嘴里的 Agent:外置状态、工具调用、循环。循环还是我的循环。模型只在点对话时进场。Ollama 挂了,就按退出回到找人。
第五层,LangGraph 之类,是把同一张状态表画成节点和边。面试能画图,协作能看懂。它不是更快的引擎。日常手感,快回路那个循环就够。
双速跑起来,骨架几乎还是原来的 if,只是点对话那一支出去了:
python
while True:
snap = observe() # 截图 + YOLO
if state.phase == "FIND_NPC":
step_find_npc(state, snap) # 快:点 NPC
elif state.phase == "CLICK_DIALOG":
step_dialog(state, snap) # 慢:OCR 后交给 Qwen
elif state.phase == "FIGHTING":
step_fight(state, snap) # 快:瞄准按键
慢回路里,模型返回的不是「请点击左边那个」,而是调函数。这叫 tool calling,形状就这一点:
python
client.chat.completions.create(
model="qwen2.5-coder:7b",
messages=messages, # 里面塞了 SKILL.md 正文
tools=[{
"type": "function",
"function": {
"name": "click_option",
"parameters": {"type": "object",
"properties": {"index": {"type": "integer"}},
"required": ["index"]},
},
}],
)
运行时把 tool_calls 执行掉,点第几项或按 Esc,再把结果填回去。改造完成,打怪的手感应当还在。变的是进战前那一下:以前 OCR 对上字立刻点,现在可能要等模型想一秒到几秒。一轮刷怪里对话框只出现一次,打架仍占大头。我换来的是:选项改名、多出「离开」「活动」,流水线还有机会选对。快的地方继续快,该慢的地方才慢------这才叫架构,不叫把所有齿轮都换成金的。
四、商场卖水,和小卖部卖水
新模式不是一切都好。好不好,主要看项目规模。布置是否恰当,比是不是今年流行更重要。
街边小卖部卖水,柜台伸手就够。进货三箱,回头客叫得出老板小名。非要按大型商场来:扶梯、导视牌、消防分区、会员中台。水还是那瓶水,开张前三个月都在对接系统。这不是先进,这是把小生意按大规范砸贵了。
反过来,要开连锁,十个店员,水、饮料、关东煮一起卖,还要和总部对库存。还只用一个抽屉收钱,账对不清,新人上手全靠口口相传。这不是朴素,这是拒绝长大。
我的旧挂机像小卖部。快,稳,出了问题我知道在哪一行。代价是:只有这一个程序能用这双手;文案一变就得改源码;我和招聘市场上的「Agent 工程师」对不上话,尽管我比很多人更会干活。客人只有一个,SKU 只有三瓶水,这样开店很香。
我这套新接法,像给小店装了一排标准货架和一本店员手册。对话框抗变一点,工具能借给别人,故事能讲给面试官听。代价也清楚:目录变多,概念变多,进战前可能顿一下。若需求永远是「这三个字不变、这条流水线不增加」,上全套 Agent,等于小卖部按商场消防规范装修------能过验收,卖水未必更快。客流上来了,店员换了三茬,还不做导视,也不写手册,那是另一头的错。
还有一笔账,很多人不好意思说。MCP、Skill、图编排,都是工程规范,不是精度魔法。YOLO 框漂了,OCR 认错字,键鼠点偏了,换再新的协议也救不回来。内核再强,摄像头糊成一团,操作系统也帮不了忙。老板们往往不缺名词,缺的是能在脏环境里把闭环跑住的人。高端技术投入也多。两块钱一打的一次性手套,能解决某个特定场景,就先用手套。
五、不追新,也不装看不见
求职要不要 Agent 和 Skills?要能讲,更要能指着一个项目说:哪些是快回路,为什么打架不过模型;哪些是慢回路,Skill 解决的是文案和例外;MCP 是插头,主循环可以不走插头。这样讲,比报三个框架名像人。只会调 API、没碰过检测和桌面自动化的人,缺的恰恰是我手上已经有的那部分。
好学吗?路径很短。会写函数,就会 Tool。会写 README,就会 Skill。对着 OpenAI 的接口发过消息,tool calling 只是让返回值从散文变成「调哪个函数、参数是什么」。图编排可以后放。先把对话框从字符串匹配里解放出来,就完成了最关键的那一跳。
不要盲目追求新事物。一条永远不会变的死流程,while True 加状态表,仍然是优解。不要固守老思维。流程开始分叉、文案开始漂、能力开始要借给第二个程序,还把所有智慧写死在一个类里,那是在用 2018 年的焊法应对 2026 年的接口。窗户纸该捅就捅。无菌手术台不是用来开瓶装水的。布置恰当,小卖部也体面;布置不当,商场也只是贵。
我自己的取舍很简单。打怪的手,留在老路上。认字选路的脑,换成手册加模型。旧窗口程序还留着,对照着用。新的不推翻旧的,旧的也不嘲笑新的。谁合适谁上。技术是手套,场景才是手。手套可以换,手别砍。
好了,这期的AI生活有妙招就到这里。咱们下棋见......下期见。
我是爱生活、爱技术的TF男孩。