↑↑↑关注后" 星标 "
kaggle竞赛宝典
kaggle竞赛宝典
作者:Andrew Tratz
LLM 20 Questions 第二名方案
问题描述
这是一个人、地方还是物品?它比面包盒小吗?它比一个70B参数的模型小吗?
20 Questions 是一款古老的推理游戏,你需要在不超过二十个问题的情况下,通过是非问题猜出一个秘密词汇。玩家通过将问题从一般到具体逐步缩小,以期在尽可能少的问题中猜出这个词。
每个团队将由一个猜测者 LLM 组成,负责提问和猜测,另一个是回答者 LLM,负责用“是”或“不是”来回答。通过战略性的提问和回答,猜测者的目标是在尽可能少的回合内正确识别出秘密词汇。
这场比赛将评估 LLM 在推理能力、通过有针对性提问高效收集信息的能力,以及配对代理之间的合作能力等关键技能。它还呈现出一个受限的环境,需要创意和策略,因为猜测次数有限。成功将展示 LLM 不仅能回答问题,还能提出有见地的问题,进行逻辑推理,并迅速缩小可能性范围的能力。
第二名方案
1. 方法概述
-
双字母binary搜索(“alpha”)加上纯在线LLM策略
-
基于单词频率的alpha agent,专注于单个关键词的长尾,使用LLM扩展找到名词短语
-
利用英语频率表快速猜测高概率词汇;
-
通过LLM猜测对知识进行自动摘要,以保持和巩固上下文
-
100%在线LLM提问者/猜测者,没有预处理或离线问题
-
多模态问题类型,以获取不同的信息标签:类别、地点、大小,以及枚举+拆分
-
回答时用关键词替代主题
2. 表现评估
-
Private排行榜#2(alpha + LLM)
-
Public排行榜最高达到#7(仅限LLM)
-
Private排行榜匹配中的关键词找到率为89%(仅限alpha)
-
获得胜利的平均奖励为5.81(仅限alpha)
-
在竞争游戏中作为LLM提问者/猜者的胜率为12%
-
在竞争游戏中作为LLM回答者的胜率为11%
-
按照此处描述的定制指标,在仅限LLM的比赛中排名第七的最佳团队成绩
方案细节
第二名的方案包括:
-
基于LLM增强的alpha二分搜索;
-
一个没有离线预处理的LLM-heavy agent。
起初先试图为“things”类别构建一个基于LLM的解决方案,先解决最棘手的挑战,然后再针对“places”进行构建,但后来发现这部分变得
无关紧要
。在比赛后期很晚才构建了alpha二分搜索,一旦意识到最终排行榜上会有一群高胜率的alpha代理时,这样做是为了保持竞争力。
对于LLM,我使用的是Llama 3.1 8B 8bit版本,没有进行微调,在我的测试中稍微优于Llama 3.0。
1. Alpha asker/guesser
为了关键词数据库,此处只使用单字( unigram )关键词。我使用了这个数据集:https://www.kaggle.com/datasets/rtatman/english-word-frequency 作为起点,通过两个 LLM 查询将 333,333 个 unigram 条目缩减到 120,000 个:“is it a valid English word which is not an acronym or abbreviation?”以及“Is it familiar to a layman?”我试图使用 Llama 来进行词性标注和其他各种过滤,但发现它的可靠性非常差。因此,我的 120,000 个数据集仍然充满了我没有花时间进一步过滤的垃圾词。
我的搜索算法尝试在尝试短语之前找到关键词的第一个单词。在初始搜索中,它会在每个有效范围内使用频率最高的未使用单词作为猜测(试图在其他字母代理之前找到这个词)。
一旦第一个词被明确识别(或所有可能的单词都被排除考虑),算法就会进入第二阶段。在这一阶段,我使用 LLM 来建议以第一个识别的单词开头的可能名词短语。如果第一个词相当普通(例如“金属”、“电”等),这个策略可能会失败。然而,许多第一个词会引出非常有意义的 LLM 提示短语(例如,我的代理能够根据“面料”这个起始词预测“面料胶”。像“豚鼠”这样的高度特定的术语毫无疑问也会导致成功)。
我对公共关键词进行了测试,以确定是否将我的 unigram 列表缩减到 65,000、32,000 等,以留出时间进行更多名词短语猜测,但发现保持 120,000 个 unigram 的长尾提供了最佳性能。由于私人关键词列表似乎偏重于单字,我认为这个设计选择在第一阶段提供了很好的关键词覆盖。
2. Answerer
Answerer分为两步:
1:寻找字母顺序、列表检查或包含字母类型的问题。在这个阶段,我会寻找与单词拼写或列表检查相关的常见提示,因为大型语言模型在回答这些问题类型时往往表现不佳。然后,我使用大型语言模型提取比较词、字母或列表,并进行手动比较。
2:使用大型语言模型来回答问题。一个非常重要的发现是,如果在尝试回答之前将关键词重新代入提示中,大型语言模型的准确性会大幅提高。因此,我的算法首先使用大型语言模型确定句子的主题,然后用关键词替换主题。然后它回答问题。
我的表现指标表明,我的回答者在非字母集事件的回答者中名列前 4%。
3.Online LLM asker
大型语言模型不使用任何离线或预先准备的问题。曾经我做过一个离线提问机器人,但我发现我的在线大型语言模型效果更好,所以我最后只用我的在线机器人提交。大型语言模型在四种不同的模式下运行,这些模式是按顺序处理的。
-
Category
-
Location
-
Size
-
Enumerate+Split
Category modality
在类别模式下(通常是前12个问题),大型语言模型会试图将当前的“category”细分为两个不重叠的空间,首先是“things that are tangible objects”。为此,我使用以下提示:
Divide the category “[prior category] that are [category]" into two broad, clearly-defined, non-overlapping sub-categories, ensuring that all [prior category] that are [category] fall into one category or the other, but not both. Respond with the names of the two sub-categories separated by a comma only. Do NOT repeat the original category. Use common phrasing. Each sub-category must be a noun or noun phrase.
在这个Prompt中,“类别”指的是已知的最具体类别,而“前类别”指的是上一步找到的类别。
这个提示会产生两个子类别候选项。我依次测试这两个。如果其中一个返回“是”的响应,算法就会将其作为当前类别并继续深入。如果两个都没有返回“是”,那么就会用另外两个子类别候选项重复同样的过程。在连续失败四次或总共问了12个问题后,算法会转向下一个模式。
我需要在继续之前得到肯定的确认,并且小心不要假设负面回应意味着相反的情况,因为实际上我的类别划分可能并没有覆盖100%的可能实例。
举个例子,对于关键词“fox”,这种方法通常会确定该关键词是“一种捕食性的陆生哺乳动物”或“a predator that is a forest stalker”。
Location modality
在位置模式中,我列举了关键字可能出现的地点,使用以下提示:
Provide several broad categories of locations where [prior category] that are [category] are most often located. Respond with the category names in comma-separated format only.
然后,算法会使用最多5个问题来询问关键词是否出现在每个列举的位置。一旦得到肯定的回复,这个位置会被存储以供将来参考,然后算法会进入其大小模式。
Size modality
在“size”模式下,LLM 基本上是重新表述这两个问题:它小吗?它大吗?很幸运地这两个问题中能有一个得到肯定的答案。
Enumerate+Split modality
一旦类别、位置和大小的模态都被耗尽,LLM 默认会回到枚举+拆分的模态。这实际上是我在比赛中首次编码的内容,仍然相当擅长提出聪明的问题。它分为两个阶段:列举可能的选择,然后提出一个问题来拆分这些选择。
在列举阶段,我使用以下提示:
Create a list of 30 [prior category] that are [large/small] [category] typically located in or at [location], matching the following description: [summary – see below]. The things must be unique, diverse, [category items] and as different as possible from each other. The [category items] must be common examples of [category items] and representative of a range of different possible options. The things must represent examples of as many different categories of [category items] as possible. The answer should be returned as a comma-separated list with no additional verbose output. None of the [category items] may be repeated. Each item in the list should be as different as possible from the prior item. No words in the list may be repeated. Respond with the comma-separated list only. Order the responses according to the most likely or common choices according to the criteria above.
这个提示通常会产生大约30个代表性的例子,可能是关键词。然后我会尝试找一个问题,将这个列表分成两个相等的部分,如下所示:
Create a simple yes-or-no question, responding with the question only and no introduction or additional verbose details. The question should broadly categorize and divide the following into two equally-sized lists: [output from the prior prompt] Do not include questions similar, equivalent, or directly opposite to the following: [all prior questions] Ensure that the question is simple, unambiguous, clear, and can be answered either yes or no. Do not create compound questions. The question may explore different aspects or characteristics of the list items including size, appearance, function, location, usage, and other defining characteristics. The question should create a general or broad classification of the two categories and should not be overly specific.
有时候这个提示会产生非常巧妙的问题。其他时候它会问一些相对琐碎、重复或抽象的问题。所以这就看运气了。不过,如果我之前的模式效果不错,并且我有一个具体的类别、地点和大小可以参考,这种默认模式通常能提出聪明的问题,进一步缩小选择范围。或者,至少我可以拖延一下时间,尝试在我已知的category/location/size中做更多的猜测。
4.Online guesser
我的猜测器会以段落的形式持续总结对关键词的理解。在每次问答后,它会更新总结,以反映新获取的信息(并丢弃冗余或冲突的数据)。我发现,当给大型语言模型提供一段自然流畅的对象描述时,它的表现比每轮都通过一堆是/否问题来解析要好得多。这个总结既被猜测器使用,也被上面提到的“enumerate+split”模式所使用。
我发现这种自动总结常常能让我的猜测器从不可靠的回答者提供的不正确答案中恢复过来,从而更好地关注一致的信息。在选择答案时,猜测器会使用上述默认模式中的第一个提示来列出30个可能的关键词选项。在排除了已经做出的猜测(或在公共关键词列表中的内容)后,我的算法直接猜测第一个呈现的选项,因为这是大型语言模型认为最可能的答案。
代码
参考文献
-
https://www.kaggle.com/code/jademonk/tricksy-hobbitses-llm-20-questions-solution
-
https://www.kaggle.com/competitions/llm-20-questions/discussion/529643