621. LLM 20 Questions | llm-20-questions
首先,我想代表我们团队(我的伟大队友 @raki21 @benbla)向 Kaggle 举办这场有趣的比赛表示真诚的感谢。
我们相对较晚才参加比赛,距离比赛结束仅剩 8 天,当时我们刚完成 LMSYS Chatbot Arena Human Preference Predictions 比赛。我们开始分析游戏和现有方法,发现字母数字二分法(alphanumerical bisection)是在给定正确回答的情况下最大化每次问题信息增益的最佳策略。因此,我们将大部分精力投入到构建一个能覆盖最多私有关键词的关键词列表上,并 experimented 不同的提示工程(prompt engineering)和函数调用(function calling)策略,以便作为回答者(Answerer)和提问者(Questioner)与队友进行稳健的协作。
关于我们关键词列表覆盖私有关键词集的关键统计(1800 个来自此 数据集):
100 万关键词列表覆盖率:86.56% 精确匹配
200 万关键词列表覆盖率:87.28% 精确匹配,如果考虑本比赛的匹配算法则为 88.65%
这意味着,如果回答者对每个问题都给出正确答案,我们的智能体将能够在约 90% 的时间内猜出关键词。
起初,我们采用了优秀的 notebook agent alpha 方法,因为我们看到了统一“协议”的趋势。在本地测试期间,我们发现 LLM 不擅长回答 agent alpha 使用的简单提示下的字母数字二分法问题。因此,我们开始使用各种提示工程,发现以下模板效果最好:
"""
keyword 请遵循以下 2 个步骤来比较字母顺序:
步骤 1:将已知关键词和比较词写出来,每个字符之间加一个空格,全部小写。
步骤 2:现在遍历两个单词的字符,直到找到不匹配项。第一个不匹配项决定字母顺序。
如果一个单词结束了而另一个单词还有更多字母,则较短的单词在字母顺序上排在前面。
最后回答 yes 或 no。
供参考,字符的字母顺序为:a < b < c < d < e < f < g < h < i < j < k < l < m < n < o < p < q < r < s < t < u < v < w < x < y < z。
关键词(小写)在字母顺序上是否先于 {keyword}?
"""
提示中有几个组成部分:
因此,此提示使我们的回答者(由 microsoft/Phi-3-medium-4k-instruct 提供支持)能够在本地测试中以约 80-90% 的准确率回答比较问题。请注意,此提示仍然不能使其他 LLM 在回答此类问题时有显著改善。(包括最常用的模型 meta-llama/Meta-Llama-3.1-8B-Instruct 和 meta-llama/Meta-Llama-3-8B-Instruct)。这也部分解释了为什么在 alpha 握手被拒绝后我们只有 2 场胜利。(此统计数据来自这个优秀的 notebook 中的指标 NWhr)。
为了进一步提高猜测效率,我们使用 GPT40-mini 为每个关键词附加一个层级(从 1 到 10)。在每一轮猜测中,我们总是猜测剩余可能关键词集中层级最高的关键词。
我们的一个智能体跳过了握手轮次,直接进行 agent alpha 提问并使用 200 万大小的关键词列表。另一个使用 100 万关键词列表并保持 agent alpha 握手。它们的性能在比赛期间多次互换位置。第一个的最终得分为 1140.9(第 10 名),另一个为 1108.3(相当于第 12 - 13 名)。
如果我们跳过握手,我们在 20 轮内可以搜索的最大关键词数量是 2^20 -> 104.8 万。考虑到每轮猜测的排除效应,我们可以覆盖 2^(20+1) - 2 = 204.6 万。
编辑: 关于这个数字的经验实验和形式证明,您可以参考讨论 thread 此处。简而言之,二分法保证能覆盖的关键词列表最大大小为 2^(i+1) - 2,其中 i 为游戏轮数。
我们将关键词生成任务 formulat 为一个监督学习任务,对所有公开已知关键词进行 (0.8, 0.2) 训练 - 测试拆分。我们以迭代方式执行此操作,并将它们与 Wikipedia 转储中的一元/二元语法(unigrams/bigrams)相结合。我们还进行了几次过滤。最后,我们使用 GPT40-mini 为 GPT 生成的关键词分配层级,并对 Wikipedia 中的那些关键词使用重新缩放的 n-gram 频率。详情总结如下图:

以下是我们 200 万列表中覆盖的私有关键词的一些可视化(约占 1800 个私有关键词总数的 90%)。



我们团队就是否应该保留公开关键词进行了辩论。我们最终采取了一种更谨慎的方法:我们将 keywords.py 中的关键词包含为层级 1(最低层级),将公开集中抓取的关键词作为层级 4。这使我们能够从比赛开始到结束都保持在 top 15。
如上所述,回答者由 microsoft/Phi-3-medium-4k-instruct 提供支持。需要几种 hack 才能使其在 Kaggle 环境单 GPU 上正常运行。如果有人感兴趣,我们将编写一个公共 notebook 详细说明步骤(我们当前的代码库有点复杂)。
回答者也在系统提示中采用了思维链 (CoT):
"你正在玩 20 个问题游戏。你是 Agent Alpha 回答者。请使用常识思考。当关键词可能涉及 multiple things 时,使用最常见的那个。所有关键词都包含在 **things** 类别中,很少落入 **places** 或 **people** 类别。\n\n当答案不清楚或取决于情况时,请回答 no。对于形式为 \"Is it a A or B?\" 的问题,如果 Is it a A 为真则回答 yes,否则回答 no。请逐步思考并在最后提供 yes 或 no。得出结论后结束你的回答。\n\n"
关键要素:
除了提示工程,我们还编写了大量正则表达式来捕捉大多数类型的常见问题,例如“关键词是否以 xxx 开头”。我们使用函数调用来解决这些提示。
此回答者在本地测试中完美回答了大多数非 alpha 问题。然而,在 alpha 智能体激增后,我们的回答者面对 capable 非 alpha 智能体的机会非常低,所以我们不知道其全部潜力。
遗憾的是,这场比赛以非收敛行为结束,许多优秀的解决方案没有得到奖牌/奖项的认可。我们感到幸运并感谢这枚金牌,希望将来会有后续比赛,届时可以出现更多有趣的解决方案。一如既往,感谢您的阅读,希望您觉得它有趣。我想再次向我的出色队友 @raki21 @benbla 表示真诚的感谢,感谢他们使这次比赛成为一段有趣且有益的旅程!