我把一个猜词小游戏做成了 AI Skill
我把一个靠语义接近度来猜词的小游戏,做成了一个可以在 terminal 里玩的 AI skill。这篇文章写的是我为什么觉得它适合交给 LLM 来主持,以及我怎么把模型限制成一个规则稳定的游戏裁判。
我把一个猜词小游戏做成了 AI Skill
前两天我无意间刷到一个很小的猜单词游戏。
玩法很简单。系统先藏一个词,你来猜。每猜一次,它不会直接告诉你答案,只会给你一个百分比,像是“你这个词和答案有 72% 接近”“这个只有 18%”。你就顺着这个百分比,一点点往答案靠。
我当时想到的不是“这游戏挺好玩”,而是:这种东西,是不是很适合用 LLM 来实现?
你仔细想一下,这个游戏最关键的部分,不是界面,不是状态管理,甚至也不是出题。难点只有一个:当用户扔出一个词时,系统要判断“这个词和隐藏答案到底有多接近”。而这个“接近”不是字符串相似,也不是传统规则能轻松写清楚的东西。它更像一种人脑里模糊、但又大致稳定的语义感觉。
比如答案如果是“海洋”,那“鲸鱼”通常会比“宇航员”更近,“沙滩”会比“螺丝刀”更近。人对这种判断几乎是直觉式的,但如果你让普通程序用一堆硬规则去模拟,事情很快就会变得很笨重。
于是我就写了这个玩意。

我是怎么把这个游戏做成一个 skill 的
我一开始就没打算做一个完整小游戏,也没想先搭什么前端页面。我脑子里的想法很直接:这种奇怪的小东西,能不能直接做成一个 skill,让大家在 terminal 里也能玩。
所以我最后做的是一个 AI skill,名字叫 guess-the-word-game。我还专门为这种东西开了一个仓库,叫 weird-skills-lab。这个名字很应景:就是专门收一些不太正经、但又确实可以在 terminal 里玩起来的奇怪 skill。
我想验证的也很具体:这种玩法能不能直接交给 AI 来主持。如果可以,那它就不一定非得做成网页游戏,一个 skill 就够了。用户只要让模型使用这个 skill 来开始玩,AI 自己选一个词、记住它、接收每一轮输入、给出相似度排序、处理退出和猜中逻辑,整个回合就能跑起来。
这种游戏为什么和 LLM 很搭
如果把这个游戏拆开来看,它至少有四个要求:
- 系统得暗中选一个词,而且整个会话里不能换。
- 用户每次可以猜一个或多个词。
- 猜错以后,系统要给出一个“像人一样”的语义接近度分数。
- 历史猜测要合并、去重、排序,还要维持稳定输出格式。
这里面第 1、2、4 条,传统程序都不难。麻烦的是第 3 条。
“鲸鱼”和“海洋”到底该是 88% 还是 76%?“沙滩”和“港口”谁更近?“自由”这种抽象词和“鸟”到底算不算有关?这不是一个特别适合硬编码的问题。
你当然可以做一套词库,给词做 embedding,再算向量相似度,最后再加一层规则去修正结果。但这里还有个问题:embedding 能解决一部分“词和词接不接近”,却不一定能给出这种游戏真正想要的那种人脑直觉。
比如“宇宙”和“外星人”,人会觉得它们显然有关,放在这种猜词游戏里,分数通常也不会低。但如果你只是把问题交给 embedding,它未必会稳定给出你想要的结果。它算得出相似度,不代表它算得出这种游戏里那种“你是不是猜对方向了”的感觉。
所以如果你只是想先做一个能玩的版本,LLM 直接来当裁判会更顺手。
它很像你找了一个脑子里装了很多常识的朋友来主持游戏。这个朋友不一定每次都绝对客观,但他对“这个词离那个词近不近”通常有一种还不错的直觉。对于这种轻游戏来说,这种直觉已经够用了。
而且这个主持人本来就会说话,所以它不只是在算一个分数,还能顺手处理多语言输入、模糊表达,甚至识别用户是不是想结束游戏。这些如果全自己写规则,也不是不能做,只是很容易从“有趣的小东西”,变成“一个要认真处理很多边角逻辑的小产品”。
难的地方,是把模型管住
这种东西看起来很适合 LLM,但它也有一个明显风险:模型太聪明,往往也太爱发挥。
你如果不给它足够硬的约束,它很容易一边主持,一边开始热心解说,甚至不小心把答案给你喂出来。那游戏就直接废了。
所以我后来做的事情,就是把它关进一个很窄的框里。
我在这个 skill 里写的核心规则,大概长这样:
- Secretly choose one hidden word before the game starts and keep it fixed for the entire session.(在游戏开始前悄悄选一个隐藏词,并在整个会话里保持不变。)
- If none of the guessed words is correct:(如果这一轮猜的词都不对:)
Score each guessed word from 0 to 100 using human-like semantic relatedness.(按照接近人类直觉的语义相关性,给每个猜测打 0 到 100 分。)
- Merge all historical guesses with the current turn.(把历史猜测和当前这一轮合并。)
- Remove duplicates.(去重。)
- Sort all guesses by score descending.(按分数从高到低排序。)
- Show at most the top 10 guesses.(最多只显示前 10 个猜测。)
- Do not explain the reasoning(不要解释为什么这么打分。)
- Do not give hints(不要给提示。)
- Do not reveal the answer(不要泄露答案。)
这段约束比“做一个猜词游戏”还重要。因为这里麻烦的不是把功能堆出来,而是让模型在很多轮对话里始终扮演同一个规则稳定的主持人。你要让它记住隐藏词不能变,又要让它每轮输出格式稳定,还要阻止它话痨。这些都不是传统业务代码里的难点,但在 skill 设计里反而是正题。
写到这里,guess-the-word-game 对我来说也不只是一个小游戏,它也顺手成了一个 prompt engineering 的小实验。
它不一定只能用 LLM 做,但第一版很适合用 LLM 做
如果严格回答最开始那个问题,这种游戏当然不是只能用 LLM 来实现。
你完全可以走一条更传统的路:词库、向量表示、相似度计算、再加一层规则修正。真要把它做成一个公平性要求高、结果可重复的正式产品,这条路可能反而更靠谱。
但我当时想的是,怎么最快验证这个玩法是不是成立,不是先把它做成一个最完整、最工程化的版本。在这个前提下,LLM 的优势就很明显了。它几乎帮我跳过了最麻烦的一层:怎么把“语义接近”这件事,先做出一个接近人类直觉的版本。
所以这种游戏不是“只能”用 LLM 做,但如果目标只是先做出第一版,LLM 会顺手很多。
我后来想到的是,agent 在 terminal 里是不是也能玩这些小东西
我后面越想越觉得,既然 agent 本来就在 terminal 里工作,那这里面是不是也能顺手放一些这种小玩法进去。
以前一提到小游戏,大家第一反应通常还是网页、App,或者至少得有个界面。可放到 agent 这里,事情突然就变简单了。它本来就在对话里,本来就能记住上下文,本来就会回合式地接收输入、给出反馈。像猜词、问答、扮演、甚至一些很轻的互动玩法,天生就能塞进这个壳里。
这样想以后,guess-the-word-game 对我来说就不只是一个单独的小 skill 了。它也在验证另一件事:既然大家已经在 terminal 里和 agent 打交道了,那这里面是不是也可以容纳一些不那么正经、但确实很好玩的东西。
这也是我会专门开 weird-skills-lab 这个仓库的原因。它不是为了做一堆“有用”的工具,而是想试试看,这种环境里到底还能不能放进一些奇怪的小 skill。
我这次也只是先把最小的一版做出来
我这次没有想排行榜、分享功能、漂亮 UI,也没有去想数据库。我先盯着最小的那几件事:
- 固定一个隐藏词,确保多轮对话中不漂移。
- 把输出格式锁死,不给模型自由发挥。
- 准备几个自己能判断好坏的测试词,看看它的语义排序是不是基本像人。
只要这三件事成立,这个玩法大概率就已经能玩了。剩下那些工程化工作,后面再说。我这次写这个 guess-the-word-game,也是这么干的。它足够小,所以我可以很直接地验证这个想法。
最后
这个 skill 做完以后,我留下来的想法很简单。
我只是刚好看到这么一个游戏,然后顺手试了试,看看它能不能被放进 terminal、放进 skill、放进 agent 这种使用场景里。
这次试下来,我会觉得 LLM 游戏是一个挺不错的方向。它不一定都要做成正式产品,有时候就这样做一个小 skill,让人随手玩一下,也已经很有意思了。
如果这篇东西能给别人一点灵感,我觉得就够了。
如果你也想试试,或者想看看这种奇怪的小 skill 还能怎么长,我把项目开源到了 GitHub:https://github.com/zmofei/weird-skills-lab。
如果有任何疑问或者不同意见,欢迎留言一起讨论!