Spaces:
Runtime error
Runtime error
dev(hansbug): add names for questions
Browse files- llmriddles/questions/executor.py +4 -0
- llmriddles/questions/level1.py +40 -20
- llmriddles/questions/level2.py +72 -42
- llmriddles/questions/level3.py +41 -18
- llmriddles/questions/level4.py +13 -6
- llmriddles/questions/level5.py +15 -7
- llmriddles/questions/question.py +10 -3
llmriddles/questions/executor.py
CHANGED
|
@@ -15,6 +15,10 @@ class QuestionExecutor:
|
|
| 15 |
def question_text(self):
|
| 16 |
return self.question.texts[self.lang]
|
| 17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
def check(self, qs_text: str) -> Tuple[str, bool, str]:
|
| 19 |
answer_text = get_llm_fn(self.llm)(qs_text, **self.llm_cfgs)
|
| 20 |
correct, explanation = self.check_answer(qs_text, answer_text)
|
|
|
|
| 15 |
def question_text(self):
|
| 16 |
return self.question.texts[self.lang]
|
| 17 |
|
| 18 |
+
@property
|
| 19 |
+
def question_name(self):
|
| 20 |
+
return self.question.names[self.lang]
|
| 21 |
+
|
| 22 |
def check(self, qs_text: str) -> Tuple[str, bool, str]:
|
| 23 |
answer_text = get_llm_fn(self.llm)(qs_text, **self.llm_cfgs)
|
| 24 |
correct, explanation = self.check_answer(qs_text, answer_text)
|
llmriddles/questions/level1.py
CHANGED
|
@@ -1,14 +1,18 @@
|
|
| 1 |
from .question import register_question
|
| 2 |
|
|
|
|
| 3 |
def count_english_words(text: str):
|
| 4 |
return len(text.split(' '))
|
| 5 |
|
|
|
|
| 6 |
def count_chinese_words(text: str):
|
| 7 |
return len(text)
|
| 8 |
|
|
|
|
| 9 |
def check_if_chinese(text: str):
|
| 10 |
return all('\u4e00' <= char <= '\u9fff' for char in text)
|
| 11 |
|
|
|
|
| 12 |
def count_words(text: str, contain_punctuation: bool = False):
|
| 13 |
chinese_words = []
|
| 14 |
english_words = []
|
|
@@ -29,9 +33,9 @@ def count_words(text: str, contain_punctuation: bool = False):
|
|
| 29 |
temp_english_words = []
|
| 30 |
other_words.append(char)
|
| 31 |
if contain_punctuation:
|
| 32 |
-
return len(chinese_words)+len(english_words)+len(other_words)
|
| 33 |
else:
|
| 34 |
-
return len(chinese_words)+len(english_words)
|
| 35 |
|
| 36 |
|
| 37 |
CN_TEXT_1 = """
|
|
@@ -57,11 +61,14 @@ def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
|
| 57 |
return False, None
|
| 58 |
|
| 59 |
|
| 60 |
-
register_question(
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
CN_TEXT_2 = """
|
| 67 |
第一章第二题(小试牛刀),请你输入三个字(及)以内的问题,使模型的回答在30个字以上。
|
|
@@ -89,11 +96,14 @@ def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
|
| 89 |
return True, None
|
| 90 |
|
| 91 |
|
| 92 |
-
register_question(
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
|
|
|
|
|
|
|
|
|
| 97 |
|
| 98 |
CN_TEXT_3 = """
|
| 99 |
第一章第三题(短说长话),请你输入一个字的问题,使模型的回答在100个字以上。
|
|
@@ -107,6 +117,7 @@ For the third question in chapter 1, please enter a one-word question so that th
|
|
| 107 |
Please enter your query below and click the submit button
|
| 108 |
"""
|
| 109 |
|
|
|
|
| 110 |
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 111 |
_ = question_text, lang
|
| 112 |
answer_text = answer_text.strip()
|
|
@@ -119,11 +130,15 @@ def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
|
| 119 |
else:
|
| 120 |
return True, None
|
| 121 |
|
| 122 |
-
register_question({
|
| 123 |
-
'cn': CN_TEXT_3,
|
| 124 |
-
'en': EN_TEXT_3,
|
| 125 |
-
}, _checker_3)
|
| 126 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
CN_TEXT_4 = """
|
| 129 |
第一章第四题(短说短话),请输入一个字的问题,使模型的回答字数小于20个字。
|
|
@@ -137,6 +152,7 @@ For the fourth question in chapter 1, please enter a one-word question so that t
|
|
| 137 |
Please enter your query below and click the submit button
|
| 138 |
"""
|
| 139 |
|
|
|
|
| 140 |
def _checker_4(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 141 |
_ = question_text, lang
|
| 142 |
answer_text = answer_text.strip()
|
|
@@ -149,11 +165,15 @@ def _checker_4(question_text: str, user_text: str, answer_text: str, lang: str):
|
|
| 149 |
else:
|
| 150 |
return True, None
|
| 151 |
|
| 152 |
-
register_question({
|
| 153 |
-
'cn': CN_TEXT_4,
|
| 154 |
-
'en': EN_TEXT_4,
|
| 155 |
-
}, _checker_4)
|
| 156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
|
| 158 |
# CN_TEXT_5 = """
|
| 159 |
# 第一章第五题(回文不变),请输入一个本身不是回文串的问题,使无论正着问还是倒着问,模型的回答是一样的。
|
|
|
|
| 1 |
from .question import register_question
|
| 2 |
|
| 3 |
+
|
| 4 |
def count_english_words(text: str):
|
| 5 |
return len(text.split(' '))
|
| 6 |
|
| 7 |
+
|
| 8 |
def count_chinese_words(text: str):
|
| 9 |
return len(text)
|
| 10 |
|
| 11 |
+
|
| 12 |
def check_if_chinese(text: str):
|
| 13 |
return all('\u4e00' <= char <= '\u9fff' for char in text)
|
| 14 |
|
| 15 |
+
|
| 16 |
def count_words(text: str, contain_punctuation: bool = False):
|
| 17 |
chinese_words = []
|
| 18 |
english_words = []
|
|
|
|
| 33 |
temp_english_words = []
|
| 34 |
other_words.append(char)
|
| 35 |
if contain_punctuation:
|
| 36 |
+
return len(chinese_words) + len(english_words) + len(other_words)
|
| 37 |
else:
|
| 38 |
+
return len(chinese_words) + len(english_words)
|
| 39 |
|
| 40 |
|
| 41 |
CN_TEXT_1 = """
|
|
|
|
| 61 |
return False, None
|
| 62 |
|
| 63 |
|
| 64 |
+
register_question(
|
| 65 |
+
{
|
| 66 |
+
'cn': CN_TEXT_1,
|
| 67 |
+
'en': EN_TEXT_1,
|
| 68 |
+
},
|
| 69 |
+
checkers=_checker_1,
|
| 70 |
+
name={'cn': '1-1 初来乍到', 'en': '1-1'},
|
| 71 |
+
)
|
| 72 |
|
| 73 |
CN_TEXT_2 = """
|
| 74 |
第一章第二题(小试牛刀),请你输入三个字(及)以内的问题,使模型的回答在30个字以上。
|
|
|
|
| 96 |
return True, None
|
| 97 |
|
| 98 |
|
| 99 |
+
register_question(
|
| 100 |
+
{
|
| 101 |
+
'cn': CN_TEXT_2,
|
| 102 |
+
'en': EN_TEXT_2,
|
| 103 |
+
},
|
| 104 |
+
checkers=_checker_2,
|
| 105 |
+
name={'cn': '1-2 小试牛刀', 'en': '1-2'},
|
| 106 |
+
)
|
| 107 |
|
| 108 |
CN_TEXT_3 = """
|
| 109 |
第一章第三题(短说长话),请你输入一个字的问题,使模型的回答在100个字以上。
|
|
|
|
| 117 |
Please enter your query below and click the submit button
|
| 118 |
"""
|
| 119 |
|
| 120 |
+
|
| 121 |
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 122 |
_ = question_text, lang
|
| 123 |
answer_text = answer_text.strip()
|
|
|
|
| 130 |
else:
|
| 131 |
return True, None
|
| 132 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
|
| 134 |
+
register_question(
|
| 135 |
+
{
|
| 136 |
+
'cn': CN_TEXT_3,
|
| 137 |
+
'en': EN_TEXT_3,
|
| 138 |
+
},
|
| 139 |
+
checkers=_checker_3,
|
| 140 |
+
name={'cn': '1-3 短说长话', 'en': '1-3'}
|
| 141 |
+
)
|
| 142 |
|
| 143 |
CN_TEXT_4 = """
|
| 144 |
第一章第四题(短说短话),请输入一个字的问题,使模型的回答字数小于20个字。
|
|
|
|
| 152 |
Please enter your query below and click the submit button
|
| 153 |
"""
|
| 154 |
|
| 155 |
+
|
| 156 |
def _checker_4(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 157 |
_ = question_text, lang
|
| 158 |
answer_text = answer_text.strip()
|
|
|
|
| 165 |
else:
|
| 166 |
return True, None
|
| 167 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
|
| 169 |
+
register_question(
|
| 170 |
+
{
|
| 171 |
+
'cn': CN_TEXT_4,
|
| 172 |
+
'en': EN_TEXT_4,
|
| 173 |
+
},
|
| 174 |
+
checkers=_checker_4,
|
| 175 |
+
name={'cn': '1-4 短说短话', 'en': '1-4'},
|
| 176 |
+
)
|
| 177 |
|
| 178 |
# CN_TEXT_5 = """
|
| 179 |
# 第一章第五题(回文不变),请输入一个本身不是回文串的问题,使无论正着问还是倒着问,模型的回答是一样的。
|
llmriddles/questions/level2.py
CHANGED
|
@@ -54,13 +54,18 @@ def _en_checker_1(question_text: str, user_text: str, answer_text: str) -> Tuple
|
|
| 54 |
return True, None
|
| 55 |
|
| 56 |
|
| 57 |
-
register_question(
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
CN_TEXT_2 = """
|
| 66 |
第二章第二题(越说越大),请输入一个大于一的正整数作为问题,使回答里包含至少比它大一千的数。
|
|
@@ -102,13 +107,18 @@ def _en_checker_2(question_text: str, user_text: str, answer_text: str) -> Tuple
|
|
| 102 |
return False, f'Did not detect a number of at least {value + 1000} in the output'
|
| 103 |
|
| 104 |
|
| 105 |
-
register_question(
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
|
| 113 |
CN_TEXT_3 = """
|
| 114 |
第二章第三题(越说越小),请输入一个大于一的正整数作为问题,使回答里包含至少10个不同的至少比它小一千的自然数。
|
|
@@ -161,13 +171,18 @@ def _en_checker_3(question_text: str, user_text: str, answer_text: str) -> Tuple
|
|
| 161 |
f'but it doesn\'t reach 10: {collected_values!r}'
|
| 162 |
|
| 163 |
|
| 164 |
-
register_question(
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
|
| 172 |
CN_TEXT_4 = """
|
| 173 |
第二章第四题(警世名言),请在不提及1,4,5这三个字符的情况下让模型回答114514,不要有多余的字符。
|
|
@@ -191,13 +206,18 @@ def _en_checker_4(question_text: str, user_text: str, answer_text: str) -> Tuple
|
|
| 191 |
return answer_text.strip() == '114514', None
|
| 192 |
|
| 193 |
|
| 194 |
-
register_question(
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 201 |
|
| 202 |
CN_TEXT_5 = """
|
| 203 |
第二章第五题(开平方数),请输入一个大于一的平方数作为问题,使回答里包含它的平方根对应的数。
|
|
@@ -245,13 +265,18 @@ def _en_checker_5(question_text: str, user_text: str, answer_text: str) -> Tuple
|
|
| 245 |
return False, f'Square root {sq} not detected'
|
| 246 |
|
| 247 |
|
| 248 |
-
register_question(
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
|
| 256 |
CN_TEXT_6 = """
|
| 257 |
第二章第六题(得寸进狗),请提一个不包含“狗”这个字的10个字以内的问题,使回答中“狗”这个字出现的次数至少是问题字数的2倍。
|
|
@@ -290,10 +315,15 @@ def _en_checker_6(question_text: str, user_text: str, answer_text: str) -> Tuple
|
|
| 290 |
f'which is less than {len(q_words) * 2} times.'
|
| 291 |
|
| 292 |
|
| 293 |
-
register_question(
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
return True, None
|
| 55 |
|
| 56 |
|
| 57 |
+
register_question(
|
| 58 |
+
{
|
| 59 |
+
'cn': CN_TEXT_1,
|
| 60 |
+
'en': EN_TEXT_1,
|
| 61 |
+
},
|
| 62 |
+
checkers={
|
| 63 |
+
'cn': _cn_checker_1,
|
| 64 |
+
'en': _en_checker_1,
|
| 65 |
+
},
|
| 66 |
+
name={'cn': '2-1 质数长度', 'en': '2-1'},
|
| 67 |
+
level=2
|
| 68 |
+
)
|
| 69 |
|
| 70 |
CN_TEXT_2 = """
|
| 71 |
第二章第二题(越说越大),请输入一个大于一的正整数作为问题,使回答里包含至少比它大一千的数。
|
|
|
|
| 107 |
return False, f'Did not detect a number of at least {value + 1000} in the output'
|
| 108 |
|
| 109 |
|
| 110 |
+
register_question(
|
| 111 |
+
{
|
| 112 |
+
'cn': CN_TEXT_2,
|
| 113 |
+
'en': EN_TEXT_2,
|
| 114 |
+
},
|
| 115 |
+
checkers={
|
| 116 |
+
'cn': _cn_checker_2,
|
| 117 |
+
'en': _en_checker_2,
|
| 118 |
+
},
|
| 119 |
+
name={'cn': '2-2 越说越大', 'en': '2-2'},
|
| 120 |
+
level=2
|
| 121 |
+
)
|
| 122 |
|
| 123 |
CN_TEXT_3 = """
|
| 124 |
第二章第三题(越说越小),请输入一个大于一的正整数作为问题,使回答里包含至少10个不同的至少比它小一千的自然数。
|
|
|
|
| 171 |
f'but it doesn\'t reach 10: {collected_values!r}'
|
| 172 |
|
| 173 |
|
| 174 |
+
register_question(
|
| 175 |
+
{
|
| 176 |
+
'cn': CN_TEXT_3,
|
| 177 |
+
'en': EN_TEXT_3,
|
| 178 |
+
},
|
| 179 |
+
checkers={
|
| 180 |
+
'cn': _cn_checker_3,
|
| 181 |
+
'en': _en_checker_3,
|
| 182 |
+
},
|
| 183 |
+
name={'cn': '2-3 越说越小', 'en': '2-3'},
|
| 184 |
+
level=2,
|
| 185 |
+
)
|
| 186 |
|
| 187 |
CN_TEXT_4 = """
|
| 188 |
第二章第四题(警世名言),请在不提及1,4,5这三个字符的情况下让模型回答114514,不要有多余的字符。
|
|
|
|
| 206 |
return answer_text.strip() == '114514', None
|
| 207 |
|
| 208 |
|
| 209 |
+
register_question(
|
| 210 |
+
{
|
| 211 |
+
'cn': CN_TEXT_4,
|
| 212 |
+
'en': EN_TEXT_4,
|
| 213 |
+
},
|
| 214 |
+
checkers={
|
| 215 |
+
'cn': _cn_checker_4,
|
| 216 |
+
'en': _en_checker_4,
|
| 217 |
+
},
|
| 218 |
+
name={'cn': '2-4 警世名言', 'en': '2-4'},
|
| 219 |
+
level=2,
|
| 220 |
+
)
|
| 221 |
|
| 222 |
CN_TEXT_5 = """
|
| 223 |
第二章第五题(开平方数),请输入一个大于一的平方数作为问题,使回答里包含它的平方根对应的数。
|
|
|
|
| 265 |
return False, f'Square root {sq} not detected'
|
| 266 |
|
| 267 |
|
| 268 |
+
register_question(
|
| 269 |
+
{
|
| 270 |
+
'cn': CN_TEXT_5,
|
| 271 |
+
'en': EN_TEXT_5,
|
| 272 |
+
},
|
| 273 |
+
checkers={
|
| 274 |
+
'cn': _cn_checker_5,
|
| 275 |
+
'en': _en_checker_5,
|
| 276 |
+
},
|
| 277 |
+
name={'cn': '2-5 开平方数', 'en': '2-5'},
|
| 278 |
+
level=2,
|
| 279 |
+
)
|
| 280 |
|
| 281 |
CN_TEXT_6 = """
|
| 282 |
第二章第六题(得寸进狗),请提一个不包含“狗”这个字的10个字以内的问题,使回答中“狗”这个字出现的次数至少是问题字数的2倍。
|
|
|
|
| 315 |
f'which is less than {len(q_words) * 2} times.'
|
| 316 |
|
| 317 |
|
| 318 |
+
register_question(
|
| 319 |
+
{
|
| 320 |
+
'cn': CN_TEXT_6,
|
| 321 |
+
'en': EN_TEXT_6,
|
| 322 |
+
},
|
| 323 |
+
checkers={
|
| 324 |
+
'cn': _cn_checker_6,
|
| 325 |
+
'en': _en_checker_6,
|
| 326 |
+
},
|
| 327 |
+
name={'cn': '2-6 得寸进狗', 'en': '2-6'},
|
| 328 |
+
level=2
|
| 329 |
+
)
|
llmriddles/questions/level3.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
from .question import register_question
|
| 2 |
|
|
|
|
| 3 |
def count_words(text: str, contain_punctuation: bool = False):
|
| 4 |
chinese_words = []
|
| 5 |
english_words = []
|
|
@@ -20,9 +21,10 @@ def count_words(text: str, contain_punctuation: bool = False):
|
|
| 20 |
temp_english_words = []
|
| 21 |
other_words.append(char)
|
| 22 |
if contain_punctuation:
|
| 23 |
-
return len(chinese_words)+len(english_words)+len(other_words)
|
| 24 |
else:
|
| 25 |
-
return len(chinese_words)+len(english_words)
|
|
|
|
| 26 |
|
| 27 |
CN_TEXT_1 = """
|
| 28 |
第三章第一题(自说自话),请你输入一个至少10个字的提问,使模型的回答和提问完全一样。
|
|
@@ -36,23 +38,30 @@ For the first question in chapter 3, please enter a question of at least ten wor
|
|
| 36 |
Please enter your query below and click the submit button
|
| 37 |
"""
|
| 38 |
|
|
|
|
| 39 |
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 40 |
_ = question_text, lang
|
| 41 |
answer_text = answer_text.strip()
|
| 42 |
user_text = user_text.strip()
|
| 43 |
|
| 44 |
if count_words(user_text) < 10:
|
| 45 |
-
return False, "用户的问题长度应该至少10个字" if lang=='cn' else 'Question should be no less than 10 words.'
|
| 46 |
|
| 47 |
if answer_text == user_text:
|
| 48 |
return True, None
|
| 49 |
else:
|
| 50 |
return False, None
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
CN_TEXT_2 = """
|
| 58 |
第三章第二题(话自说自),请你输入一个至少10个字的提问,使模型的回答是问题的反序。
|
|
@@ -66,15 +75,16 @@ For the second question in chapter 3, please enter a question of at least ten wo
|
|
| 66 |
Please enter your query below and click the submit button
|
| 67 |
"""
|
| 68 |
|
|
|
|
| 69 |
def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 70 |
_ = question_text, lang
|
| 71 |
answer_text = answer_text.strip()
|
| 72 |
user_text = user_text.strip()
|
| 73 |
|
| 74 |
if count_words(user_text) < 10:
|
| 75 |
-
return False, "用户的问题长度应该至少10个字" if lang=='cn' else 'Question should be no less than 10 words.'
|
| 76 |
|
| 77 |
-
if lang=='cn':
|
| 78 |
user_text = user_text[::-1]
|
| 79 |
else:
|
| 80 |
words = user_text.split()
|
|
@@ -86,10 +96,16 @@ def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
|
| 86 |
else:
|
| 87 |
return False, None
|
| 88 |
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
|
| 94 |
CN_TEXT_3 = """
|
| 95 |
第三章第三题(就是敢说),请你输入一个不包含“1”和“3”的提问,使模型的回答是一字不差的“1+1=3”(不需要引号)。
|
|
@@ -103,23 +119,30 @@ For the third question in chapter 3, please enter a question not contain "1" or
|
|
| 103 |
Please enter your query below and click the submit button
|
| 104 |
"""
|
| 105 |
|
|
|
|
| 106 |
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 107 |
_ = question_text, lang
|
| 108 |
answer_text = answer_text.strip()
|
| 109 |
user_text = user_text.strip()
|
| 110 |
|
| 111 |
if '1' in user_text or '3' in user_text:
|
| 112 |
-
return False, "用户的问题不能包含“1”或“3”" if lang=='cn' else 'Question should not contain \"1\" or \"3\".'
|
| 113 |
|
| 114 |
if answer_text == '1+1=3':
|
| 115 |
return True, None
|
| 116 |
else:
|
| 117 |
return False, None
|
| 118 |
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
# CN_TEXT_4 = """
|
| 125 |
# 第三章第四题(回文协变),请你输入一个本身不是回文串的问题,使得正着问和倒着问时,模型的回答本身不是回文且也是逆序。
|
|
|
|
| 1 |
from .question import register_question
|
| 2 |
|
| 3 |
+
|
| 4 |
def count_words(text: str, contain_punctuation: bool = False):
|
| 5 |
chinese_words = []
|
| 6 |
english_words = []
|
|
|
|
| 21 |
temp_english_words = []
|
| 22 |
other_words.append(char)
|
| 23 |
if contain_punctuation:
|
| 24 |
+
return len(chinese_words) + len(english_words) + len(other_words)
|
| 25 |
else:
|
| 26 |
+
return len(chinese_words) + len(english_words)
|
| 27 |
+
|
| 28 |
|
| 29 |
CN_TEXT_1 = """
|
| 30 |
第三章第一题(自说自话),请你输入一个至少10个字的提问,使模型的回答和提问完全一样。
|
|
|
|
| 38 |
Please enter your query below and click the submit button
|
| 39 |
"""
|
| 40 |
|
| 41 |
+
|
| 42 |
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 43 |
_ = question_text, lang
|
| 44 |
answer_text = answer_text.strip()
|
| 45 |
user_text = user_text.strip()
|
| 46 |
|
| 47 |
if count_words(user_text) < 10:
|
| 48 |
+
return False, "用户的问题长度应该至少10个字" if lang == 'cn' else 'Question should be no less than 10 words.'
|
| 49 |
|
| 50 |
if answer_text == user_text:
|
| 51 |
return True, None
|
| 52 |
else:
|
| 53 |
return False, None
|
| 54 |
|
| 55 |
+
|
| 56 |
+
register_question(
|
| 57 |
+
{
|
| 58 |
+
'cn': CN_TEXT_1,
|
| 59 |
+
'en': EN_TEXT_1,
|
| 60 |
+
},
|
| 61 |
+
checkers=_checker_1,
|
| 62 |
+
name={'cn': '3-1 自说自话', 'en': '3-1'},
|
| 63 |
+
level=3,
|
| 64 |
+
)
|
| 65 |
|
| 66 |
CN_TEXT_2 = """
|
| 67 |
第三章第二题(话自说自),请你输入一个至少10个字的提问,使模型的回答是问题的反序。
|
|
|
|
| 75 |
Please enter your query below and click the submit button
|
| 76 |
"""
|
| 77 |
|
| 78 |
+
|
| 79 |
def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 80 |
_ = question_text, lang
|
| 81 |
answer_text = answer_text.strip()
|
| 82 |
user_text = user_text.strip()
|
| 83 |
|
| 84 |
if count_words(user_text) < 10:
|
| 85 |
+
return False, "用户的问题长度应该至少10个字" if lang == 'cn' else 'Question should be no less than 10 words.'
|
| 86 |
|
| 87 |
+
if lang == 'cn':
|
| 88 |
user_text = user_text[::-1]
|
| 89 |
else:
|
| 90 |
words = user_text.split()
|
|
|
|
| 96 |
else:
|
| 97 |
return False, None
|
| 98 |
|
| 99 |
+
|
| 100 |
+
register_question(
|
| 101 |
+
{
|
| 102 |
+
'cn': CN_TEXT_2,
|
| 103 |
+
'en': EN_TEXT_2,
|
| 104 |
+
},
|
| 105 |
+
checkers=_checker_2,
|
| 106 |
+
name={'cn': '3-2 话自说自', 'en': '3-2'},
|
| 107 |
+
level=3,
|
| 108 |
+
)
|
| 109 |
|
| 110 |
CN_TEXT_3 = """
|
| 111 |
第三章第三题(就是敢说),请你输入一个不包含“1”和“3”的提问,使模型的回答是一字不差的“1+1=3”(不需要引号)。
|
|
|
|
| 119 |
Please enter your query below and click the submit button
|
| 120 |
"""
|
| 121 |
|
| 122 |
+
|
| 123 |
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 124 |
_ = question_text, lang
|
| 125 |
answer_text = answer_text.strip()
|
| 126 |
user_text = user_text.strip()
|
| 127 |
|
| 128 |
if '1' in user_text or '3' in user_text:
|
| 129 |
+
return False, "用户的问题不能包含“1”或“3”" if lang == 'cn' else 'Question should not contain \"1\" or \"3\".'
|
| 130 |
|
| 131 |
if answer_text == '1+1=3':
|
| 132 |
return True, None
|
| 133 |
else:
|
| 134 |
return False, None
|
| 135 |
|
| 136 |
+
|
| 137 |
+
register_question(
|
| 138 |
+
{
|
| 139 |
+
'cn': CN_TEXT_3,
|
| 140 |
+
'en': EN_TEXT_3,
|
| 141 |
+
},
|
| 142 |
+
checkers=_checker_3,
|
| 143 |
+
name={'cn': '3-3 就是敢说', 'en': '3-3'},
|
| 144 |
+
level=3,
|
| 145 |
+
)
|
| 146 |
|
| 147 |
# CN_TEXT_4 = """
|
| 148 |
# 第三章第四题(回文协变),请你输入一个本身不是回文串的问题,使得正着问和倒着问时,模型的回答本身不是回文且也是逆序。
|
llmriddles/questions/level4.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
-
from .question import register_question
|
| 2 |
import re
|
| 3 |
|
|
|
|
|
|
|
| 4 |
|
| 5 |
def check_if_is_number(text: str):
|
| 6 |
try:
|
|
@@ -85,13 +86,19 @@ def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
|
| 85 |
return False, "问题应该是一个正整数" if lang == 'cn' else 'Question should be a positive integer.'
|
| 86 |
elif int(question_text) == 1:
|
| 87 |
return False, "问题应该是一个大于1的正整数" if lang == 'cn' else 'Question should be a positive integer greater than 1.'
|
| 88 |
-
elif int(question_text)-1 not in get_all_numbers_in_a_sentence(answer_text) or int(
|
|
|
|
| 89 |
return False, "回答中应该包含一个与问题相差1的数字" if lang == 'cn' else 'Answer should contain a number that is exactly 1 different from the question.'
|
| 90 |
else:
|
| 91 |
return True, None
|
| 92 |
|
| 93 |
|
| 94 |
-
register_question(
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import re
|
| 2 |
|
| 3 |
+
from .question import register_question
|
| 4 |
+
|
| 5 |
|
| 6 |
def check_if_is_number(text: str):
|
| 7 |
try:
|
|
|
|
| 86 |
return False, "问题应该是一个正整数" if lang == 'cn' else 'Question should be a positive integer.'
|
| 87 |
elif int(question_text) == 1:
|
| 88 |
return False, "问题应该是一个大于1的正整数" if lang == 'cn' else 'Question should be a positive integer greater than 1.'
|
| 89 |
+
elif int(question_text) - 1 not in get_all_numbers_in_a_sentence(answer_text) or int(
|
| 90 |
+
question_text) + 1 not in get_all_numbers_in_a_sentence(answer_text):
|
| 91 |
return False, "回答中应该包含一个与问题相差1的数字" if lang == 'cn' else 'Answer should contain a number that is exactly 1 different from the question.'
|
| 92 |
else:
|
| 93 |
return True, None
|
| 94 |
|
| 95 |
|
| 96 |
+
register_question(
|
| 97 |
+
{
|
| 98 |
+
'cn': CN_TEXT_3,
|
| 99 |
+
'en': EN_TEXT_3,
|
| 100 |
+
},
|
| 101 |
+
checkers=_checker_3,
|
| 102 |
+
name={'cn': '4-3 自然之密', 'en': '4-3'},
|
| 103 |
+
level=4,
|
| 104 |
+
)
|
llmriddles/questions/level5.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
from .question import register_question
|
| 2 |
|
|
|
|
| 3 |
def count_words(text: str, contain_punctuation: bool = False):
|
| 4 |
chinese_words = []
|
| 5 |
english_words = []
|
|
@@ -20,9 +21,10 @@ def count_words(text: str, contain_punctuation: bool = False):
|
|
| 20 |
temp_english_words = []
|
| 21 |
other_words.append(char)
|
| 22 |
if contain_punctuation:
|
| 23 |
-
return len(chinese_words)+len(english_words)+len(other_words)
|
| 24 |
else:
|
| 25 |
-
return len(chinese_words)+len(english_words)
|
|
|
|
| 26 |
|
| 27 |
CN_TEXT_1 = """
|
| 28 |
第五章第一题(口是心非)请构造一个不少于十个字的问题,使得回答中不包含问题中的任意字符。
|
|
@@ -36,21 +38,27 @@ For the first question in chapter 5, Please construct a question of no less than
|
|
| 36 |
Please enter your query below and click the submit button
|
| 37 |
"""
|
| 38 |
|
|
|
|
| 39 |
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 40 |
_ = question_text, lang
|
| 41 |
answer_text = answer_text.strip()
|
| 42 |
user_text = user_text.strip()
|
| 43 |
|
| 44 |
if count_words(user_text) < 10:
|
| 45 |
-
return False, "用户的问题长度应该至少10个字" if lang=='cn' else 'Question should be no less than 10 words.'
|
| 46 |
|
| 47 |
if answer_text == user_text:
|
| 48 |
return True, None
|
| 49 |
else:
|
| 50 |
return False, None
|
| 51 |
|
| 52 |
-
register_question({
|
| 53 |
-
'cn': CN_TEXT_1,
|
| 54 |
-
'en': EN_TEXT_1,
|
| 55 |
-
}, _checker_1, level=5)
|
| 56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
from .question import register_question
|
| 2 |
|
| 3 |
+
|
| 4 |
def count_words(text: str, contain_punctuation: bool = False):
|
| 5 |
chinese_words = []
|
| 6 |
english_words = []
|
|
|
|
| 21 |
temp_english_words = []
|
| 22 |
other_words.append(char)
|
| 23 |
if contain_punctuation:
|
| 24 |
+
return len(chinese_words) + len(english_words) + len(other_words)
|
| 25 |
else:
|
| 26 |
+
return len(chinese_words) + len(english_words)
|
| 27 |
+
|
| 28 |
|
| 29 |
CN_TEXT_1 = """
|
| 30 |
第五章第一题(口是心非)请构造一个不少于十个字的问题,使得回答中不包含问题中的任意字符。
|
|
|
|
| 38 |
Please enter your query below and click the submit button
|
| 39 |
"""
|
| 40 |
|
| 41 |
+
|
| 42 |
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
| 43 |
_ = question_text, lang
|
| 44 |
answer_text = answer_text.strip()
|
| 45 |
user_text = user_text.strip()
|
| 46 |
|
| 47 |
if count_words(user_text) < 10:
|
| 48 |
+
return False, "用户的问题长度应该至少10个字" if lang == 'cn' else 'Question should be no less than 10 words.'
|
| 49 |
|
| 50 |
if answer_text == user_text:
|
| 51 |
return True, None
|
| 52 |
else:
|
| 53 |
return False, None
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
|
| 56 |
+
register_question(
|
| 57 |
+
{
|
| 58 |
+
'cn': CN_TEXT_1,
|
| 59 |
+
'en': EN_TEXT_1,
|
| 60 |
+
},
|
| 61 |
+
checkers=_checker_1,
|
| 62 |
+
name={'cn': '5-1 口是心非', 'en': '5-1'},
|
| 63 |
+
level=5,
|
| 64 |
+
)
|
llmriddles/questions/question.py
CHANGED
|
@@ -3,14 +3,15 @@ from dataclasses import dataclass
|
|
| 3 |
from typing import Union, Mapping, Literal, Callable, Tuple, List, Optional
|
| 4 |
|
| 5 |
LangTyping = Literal['en', 'cn']
|
| 6 |
-
MultiLangCheckerTyping = Callable[[str, str, str], Tuple[bool, Optional[str]]]
|
| 7 |
-
SingleLangCheckerTyping = Callable[[str, str], Tuple[bool, Optional[str]]]
|
| 8 |
|
| 9 |
|
| 10 |
@dataclass
|
| 11 |
class Question:
|
| 12 |
texts: Mapping[str, str]
|
| 13 |
checker: MultiLangCheckerTyping
|
|
|
|
| 14 |
level: int
|
| 15 |
|
| 16 |
|
|
@@ -19,6 +20,7 @@ _KNOWN_PROBLEMS = []
|
|
| 19 |
|
| 20 |
def register_question(text: Union[Mapping[str, str], str],
|
| 21 |
checkers: Union[Mapping[str, SingleLangCheckerTyping], MultiLangCheckerTyping],
|
|
|
|
| 22 |
level: int = 1, default_lang='cn'):
|
| 23 |
if isinstance(checkers, collections.abc.Mapping):
|
| 24 |
_origin_checkers = checkers
|
|
@@ -35,7 +37,12 @@ def register_question(text: Union[Mapping[str, str], str],
|
|
| 35 |
else:
|
| 36 |
texts = text
|
| 37 |
|
| 38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
|
| 41 |
def list_ordered_questions() -> List[Question]:
|
|
|
|
| 3 |
from typing import Union, Mapping, Literal, Callable, Tuple, List, Optional
|
| 4 |
|
| 5 |
LangTyping = Literal['en', 'cn']
|
| 6 |
+
MultiLangCheckerTyping = Callable[[str, str, str, str], Tuple[bool, Optional[str]]]
|
| 7 |
+
SingleLangCheckerTyping = Callable[[str, str, str], Tuple[bool, Optional[str]]]
|
| 8 |
|
| 9 |
|
| 10 |
@dataclass
|
| 11 |
class Question:
|
| 12 |
texts: Mapping[str, str]
|
| 13 |
checker: MultiLangCheckerTyping
|
| 14 |
+
names: Mapping[str, str]
|
| 15 |
level: int
|
| 16 |
|
| 17 |
|
|
|
|
| 20 |
|
| 21 |
def register_question(text: Union[Mapping[str, str], str],
|
| 22 |
checkers: Union[Mapping[str, SingleLangCheckerTyping], MultiLangCheckerTyping],
|
| 23 |
+
name=Union[Mapping[str, str], str],
|
| 24 |
level: int = 1, default_lang='cn'):
|
| 25 |
if isinstance(checkers, collections.abc.Mapping):
|
| 26 |
_origin_checkers = checkers
|
|
|
|
| 37 |
else:
|
| 38 |
texts = text
|
| 39 |
|
| 40 |
+
if isinstance(name, str):
|
| 41 |
+
names = {default_lang: name}
|
| 42 |
+
else:
|
| 43 |
+
names = name
|
| 44 |
+
|
| 45 |
+
_KNOWN_PROBLEMS.append(Question(texts, checker, names, level))
|
| 46 |
|
| 47 |
|
| 48 |
def list_ordered_questions() -> List[Question]:
|