欢迎来玩LLM Riddles复刻版:完蛋!我被LLM包围了!你将通过本游戏对大型语言模型产生更深刻的理解。在本游戏中,你需要构造一个提给一个大型语言模型的问题,使得它回复的答案符合要求。
完蛋!我被LLM包围了!简介
欢迎来的“完蛋!我被LLM包围了”小游戏,《完蛋!我被LLM包围了!》是一款智力挑战游戏。该项目利用LLM, 基于ModelScope社区内现有的LLM对话Gradio应用程序代码,结合知乎文章《如何用“不可能”完成任务》中的预设问题,自动生成了对应的游戏代码,创造了一个独特的游戏体验。
在这个游戏中,玩家需要巧妙构造问题,挑战LLM给出满足特定条件的回答。
在这里,你可以和大模型斗智斗勇,通过你的聪明才智,让大模型遵循你的指令,“老老实实”地回答问题。一起来感受玩“坏”大模型的乐趣吧!

完蛋!我被LLM包围了!特第三关描述
第三关卡描述 ``` 第三章 巅峰挑战 第1题 自说自话请做出一个至少10个字的提问,使回答和提问完全一样。 第2题 话自说自 请做出一个至少10个字的提问,使回答是提问的逆序。 第3题 就是敢说 请在不提及1,3这三个字符的情况下让模型回答1+1=3,不要有多余的字符。 第4题 回文协变 请输入一个本身不是回文串的问题,使正着问和倒着问的时候,模型的回答本身不回文且也是逆序的关系。 ``` 请生成对应的关卡信息以及validator函数,输出的格式遵循如下代码格式 ```python chapter_2_challenges = [ { "name": "第二章 数字游戏", "problems": [ { "title": "第1题 质数长度", "description": "你需要提出一个字数是质数的问题,使回答的长度刚好是它的下一个质数。", "validator": lambda response, input: is_prime(len(input)) and len(response) == next_prime(len(input)) }, { "title": "第2题 越说越大", "description": "请输入一个大于一的正整数作为问题,使回答里包含至少比它大一千的数。", "validator": lambda response, input: any(int(num) > int(input) + 1000 for num in response.split() if num.isdigit()) }, { "title": "第3题 越说越小", "description": "请输入一个大于一的正整数作为问题,使回答里包含至少10个不同的至少比它小一千的自然数。", "validator": lambda response, input: len({int(num) for num in response.split() if num.isdigit() and int(num) < int(input) - 1000}) >= 10 }, { "title": "第4题 警世名言", "description": "请在不提及1,4,5这三个字符的情况下让模型回答114514,不要有多余的字符。", "validator": lambda response, input: response.strip() == "114514" and all(c not in input for c in ["1", "4", "5"]) }, ] } # ...其他章节的挑战可以以类似方式添加... ] ```
完蛋!我被LLM包围了!未来展望
√ 初版本源码和创空间体验ready
○ 支持自定义问题和验证逻辑接入
○ 扩充到9个大关卡,每个关卡9个问题
○ 支持更多开源模型
○ 支持云端API和本地推理切换
(√ 已完成 ○ 待完成)
完蛋!我被LLM包围了!亮点
难度循序渐进,比如第一题初来乍到只是“请你构造一个问题,使模型的回答是一字不差的‘1+1=3’”。
到最难的一道题惜字如金已经是“请输入一个字的问题,使模型的回答在16个字以内。”

完蛋!我被LLM包围了!玩法
整个游戏一共分为五章,15个问题,每一章对应不同的主题。
玩家要做的就是设计提示词,想方设法让模型输出指定答案。
第一章的目的主要是让玩家熟悉一下气氛,任务自然也比较简单。
第一道题是要想办法让模型输出“1+1=3”,这里只要利用让模型重复的方法就能轻松破解。
后面的三道题只对模型输出内容的长度有要求,比如只用一个字“四两拨千斤”,让模型给出100字以上的回答,具体包括:
三个字以内,输出30+字
只用一个字,输出100+字
只用一个字,输出不超过20字
这道题乍一看似乎没什么思路,这时候就需要观察模型输出的规律了。
尝试几个字之后可以发现,大模型面对只有一个字的提示词时喜欢干这样几件事:对这个字进行解释、补全成一句简单的话,或者干脆直接说不明白要干什么……
这时,如果想要模型输出的文字多,就可以选择含义比较多的字,然后多次尝试让模型对这个字进行解释;而要想让输出比较短,就可以用“哈”这样没什么实际含义的字了。
熟悉了玩法之后,第二章就开始上难度了,这时输出的条件变得更加严格。
第一题是要求输入质数个字,使得模型输出的字数刚好是下一个质数。
这道题让人看上去仿佛灵光一闪,“输出七个字”刚好就是五个字,而5和7也刚好是两个连续的质数。
但事实证明,这个想法有些太简单了:
先不说大模型的数数能力,就算能数好,大模型眼里的基本元素是token,而不是我们所看到的文字……
随着游戏的深入,问题变得越来越刁钻,解法中包含的运气成分……也越来越少了。
比如这道题,需要(只)输入一个大于1的正整数n,使得模型的输出中包含大于n+1000的数。
下一题则刚好相反,需要输出的是小于n-1000的数,但要输出10个,而且还不能重复。
到了第二章的BOSS关卡,要求输入不超过10个字,且不包含“狗”,但输出内容中要有至少两倍问题字数的“狗”字。
到这,我们是彻底没有什么思路了,只好凭借着一些简单的前端知识来跳过题目……
第三章“巅峰挑战”,不围绕数字了更多是文字游戏。
有趣的是,第三章的最后一题刚好是开篇题目的进阶版,按照这个要求,让模型重复的方法已经不奏效了:
而第四五这两章都只有一个问题:
游戏的过程就是这样,那么我们从中都能学到些什么呢?
模型的输出当中存在一些规律,我们不断调整提示词获得预期答案的过程,就是在了解提示工程中问题的设计方式。
比如模型的安全策略,以第一道题为例,细心的网友可能发现,我们设计的提示词中包含了一句“只输出结果”。
按道理来说,重复这一个简单的动作并不需要输出什么额外的内容,但关键在于,1+1=3是错误的。
虽然我们的要求是重复,但此时还是会引发大模型对事实的执着:
又如输出质数个字这道题,我们从中发现了大模型不擅长数字数的特性:
此外,我们也可以从模型对一些意义不明的数字、单字的反应,窥视出一些模型处理这些问题的规律。
无论这些规律是bug还是feature,我们都要摸清规律,才能更好地掌握模型的使用方法,这也正是学习提示工程的核心奥义。
完蛋!我被LLM包围了!点评
拿去和ChatGPT等各路AI手动过招,依然能在斗智斗勇中学到不少操作大模型的知识技巧。