返回列表

9th Place Solution - LLM 20 Questions

621. LLM 20 Questions | llm-20-questions

开始: 2024-05-15 结束: 2024-08-29 自然语言处理 AI大模型赛
第 9 名解决方案 - LLM 20 问

第 9 名解决方案 - LLM 20 问

作者: ISAKA Tsuyoshi
发布时间: 2024-08-21
竞赛排名: 第 9 名

1. 引言

首先,我要向组织者、Kaggle 团队和所有参与者表示衷心的感谢。20 问游戏这个熟悉的主题使得这次竞赛特别 enjoyable 去工作!尽管任务的实现复杂度相对较高,但我通过将其拆分为十几个松散耦合的 Python 脚本并创建了近一百个测试用例,有效地开发了它。

该解决方案结合了基于规则的逻辑、关键词匹配和基于 LLM 上下文的响应,以实现高水平的关键词识别准确率。

该解决方案取得了 1023.5 的公共分数(最高),获得第 3 名。该分数是在作为猜测者取得三次胜利(不包括 Agent Alpha 胜利)、零失败和三次平局的情况下取得的。在随后的类似提交中,得分为 982.9,保持在金牌范围内,作为猜测者取得三次胜利(不包括 Agent Alpha 胜利),作为回答者取得一次胜利, consistently 达到金牌范围。

公共榜单第 3 名截图

在与私有关键词集评估期结束前几天,我达到了第 2 名的峰值(与第 1 名仅差 0.7 分,实际上是误差范围)。最终,我获得了第 9 名,但我很满意能获得 solo 金牌!

最终私有榜单截图

2. 回答者 Agent (Answer Agent)

我结合了以下回答者 Agent,优先级顺序为 1、2、3 和 4:

  1. 匹配特定协议时基于规则的是/否响应
    • 该方法负责约 15% 的回答。
    • 从 episodes 中识别出的所有协议都得到了有效管理。
    • 最终包含了 23 种类型的协议。
    • 为了最小化实现错误,我为每个协议创建了多个测试用例。
    • 实现被泛化以处理大写、小写、双引号、单引号 variations 以及缺少引号的情况。
  2. 预定义的关键词 - 问题对
    • 该方法负责约 5% 的回答。
    • 如果关键词 - 问题对匹配预定义矩阵,则认为相应的回答是适当的。
    • 关键词和问题使用 .lower().strip() 进行预处理。
    • 当启用此方法时,大多数关键词的自玩成功率接近 100%。这表明当回答者和提问/猜测 Agent 的值完全一致时,很容易得出正确的关键词。值的差异是导致任务困难的原因。尽管与提问/猜测 Agent 相比,回答者 Agent 被低估了,但每轮的 reduction factor(在此讨论中提出)的 20 次方会产生显著差异。
    Reduction Factor 图表
  3. 基于 LLM + 维基百科上下文的响应
    • 该方法负责约 80% 的回答。
    • 我使用了 llama3.1-8B-IT,参数为:do_sample=False, max_tokens=1, 和 bad_words_ids=["maybe", "Maybe", "none", "None", "Invalid", "invalid", "INVALID", "I", "can", "can't", "Can't", "CAN'T", "I'm", "I'll", "I've"]共享的系统提示相应配置。
    • 将秘密关键词与预准备的维基百科数据集中的标题进行比较以检索相关文本,从而扩展 LLM 的知识库,并将 CV 分数从 17.1% 提高到 31.4%。
    • 维基百科标题仅比较到第一个括号之前。
      • 优先级 1:精确匹配
      • 优先级 2:使用 .lower().strip() 不区分大小写匹配
      • 优先级 3:使用竞赛的 GitHub 比较函数进行标准化匹配
    • 上下文长度限制:
      • 不使用 280 个字符以下的文本。
      • 超过 2048 个字符的文本在自然点截断。
  4. 异常处理
    • 该方法负责约 0% 的回答。
    • 为步骤 1、2 和 3 中的错误或问题添加了异常处理。
    • 如果出现异常,选择"no"作为响应,因为统计上它比"yes"更可能发生。

3. 提问者/猜测者流程 (Asker/Guesser Flow)

在第 1 轮,提出问题'Is it Agent Alpha?'。如果回答是 No,遵循以下步骤:

提问者步骤 (Asker Step)

  1. 设置最高分关键词集。
  2. 计算每个问题的 E(与候选关键词预期减少相关的指标),并选择 E 最高的问题。
  3. 从问题集中移除选定的问题。

猜测者步骤 (Guesser Step)

  1. 获取回答。
  2. 更新关键词集的分数。
  3. 选择分数最高的关键词。
  4. 从关键词集中移除选定的关键词。
    重复直到达到轮次限制。

4. 提问者 Agent (Asker Agent)

4.1. 问题原则:

  1. 清晰度 (Clarity):问题应可靠地 elicited 稳定的 Yes/No 回答,无论回答者是谁。通过向 LLM 询问相同的问题并检查响应的一致性来验证。调整温度和参数以进行进一步的稳定性评估。优先级高于硬语义二分搜索, opting instead 为顶级回答候选者的软搜索。
  2. 独立性 (Independence):首选具有高独立性的问题,由 Yes/No 相关系数确定。通过关注意见分裂的关键词并评估清晰度来排除冗余问题。
  3. 高信息增益 (High Information Gain):像"Is it an Asian country?"这样的问题比"Is it in the Baltic States?"提供更多信息。然而,随着轮次进展和关键词候选者 narrowing,这一原则会调整。通常,p(总 yes 比例)的 reduction factor 是 p^2 + (1-p)^2,在 p=0.5 时最小化。在我的观察中,过去流行的问题如'Is it a place?'的 p 值接近 0.33,而不是预期的 0.25。
    这些原则也应用于旨在从预准备的关键词 - 问题矩阵中选择具有高信息增益问题的算法。即使一个问题具有高信息增益,如果缺乏清晰度,也不会被选中。因此,引入了额外的"Tie"选项,以便在选择问题时考虑清晰度。算法不是简单地选择 p 值接近 0.5 的问题,而是计算 E 并选择 E 最高的问题。
公式图表

以下是 E 的解释:

  • y, n, t:这些代表给定问题的'tie'、'no'和'tie'响应的总数。
  • 第一项和第二项对应于具有计数 y、n 和 t 的问题将消除的关键词候选者的预期数量。
  • 第三项和第四项用作 tiebreakers。多亏了这些项,如果预期值相同,将选择具有较少't'响应和较多'y'响应的问题(假设'no'响应通常多于'yes'响应)。

5. 猜测者 Agent (Guesser Agent)

  1. 使用保持关键词与预确定 Yes/No 回答一致性的简单方法通常会在第 10 轮耗尽关键词候选者。这种差异源于预确定回答和实际回答之间的差异。为了缓冲这一点,引入了评分系统。
  2. 为每个关键词计算分数,每轮选择最高分。
  3. 初始分数按层级设置。
  4. 根据与回答的一致性调整分数,Yes/No 匹配将分数增加 1。如果关键词回答是 Tie,其分数不更新,避免不必要的调整。
模拟分数图表

6. 何时 Agent Alpha 有效

如果第 1 轮中"Is it Agent Alpha?"产生 Yes,则回退到使用以下步骤的二分搜索方法:

  1. 准备主要关键词候选者 (2,046) 和补充关键词候选者 (~100,000)。
  2. 步骤:
    • 使用主要关键词进行二分搜索。
    • 使用收集到的信息对补充关键词进行二分搜索。
    • 如果未找到,回退到标准方法,假设配对 bot 是假的 Agent Alpha。
  3. 主要关键词候选者设置为 2046,以便正好在 10 回合内耗尽搜索。
    (2046->1022->510->254->126->62->30->14->6->2->0)
  4. 将关键词分为主要和补充集增加了在针对 Agent Alpha 的镜像匹配中获胜的机会,同时仍然允许在第 17 轮左右针对其他对手取得成功。

顺便说一下,你应该使用 Agent Alpha 吗?

我认为利大于弊。

优点:

  • 识别关键词的成功率高。
  • 不依赖于回答者的是/否观点。
  • 有效用于逃离低评级范围。

缺点:

  • 消耗一回合。
  • 经常遭受针对假 Agent Alpha 配对 bot 的重大损失。
  • 需要准备关键词候选者。

7. 创建数据集

像许多其他 LLM 竞赛一样,数据集创建是本次竞赛的关键因素。我遵循了以下步骤:

关键词收集:

  • 从公共'Things'类别中采样 10 个关键词。使用 LLM 迭代生成 30 个新关键词,直到不再产生新关键词。
  • 添加了讨论中共享的所有关键词数据集。
  • 使用 LLM 确定英语维基百科标题是否属于"Things"类别(由于高假阳性,仅限于二分搜索)。
  • 手动添加了所有想到的关键词。
    以下是公共关键词和 Tier 1 关键词(生成的关键词中质量最高的数据集)的 Embedding 表示。
关键词语义可视化

问题收集:

收集:

  • 从 leaderboard 上顶级 Kagglers 的 episodes 中收集问题。
  • 使用此处共享的数据集。
  • 手动添加似乎缺失类型的问题。
    • 我最喜欢的问题是 len(keyword.split()) == 2? # 关键词长度是否为两个单词?。我认为它在清晰度、独立性和高信息增益方面非常出色。

移除:

  • 移除缺乏清晰度或与其他问题具有高相关性的问题。
  • 最终确定了 521 个问题,认为足以进行预评估。

答案创建:

  • 使用 LLM 创建 Yes/No 回答,包括 Tie 响应。
    • 我最初使用不同的温度来获得多样的回答。然而,我修改了提示以在单次推理中包含"unsure"和"irrelevant"作为 Tie 回答。
  • 生成了包含 15,113 个关键词和 521 个问题的最终数据集。
    • 为 1,497 个公共关键词创建了类似的数据集,用于初始算法开发,用于 CV 和 leaderboard 验证。
      以下是 1,497 个公共关键词(不包括整个问题)的 yes、no 和 tie 响应计数:
响应计数图表

数据集排序:

  • 问题按其初始值中的 E 排序。
  • 关键词数据集分为 Tier 1、2、3 和 4,以避免依赖单一数据集。
    • 您可以此处查看 Tier 的定义
    • Tier1 初始分数 0.0,Tier2 为 -0.5,Tier3 为 -1.0,Tier4 为 -1.5
    • 直到第 11 轮,主要针对 Tier 1 关键词。
    • 后续轮次涉及所有层级中得分最高的关键词之间的动态交换,自然扩展数据集。

最终提交:

我为了多样性选择了最终提交:

  • 提交 ①:Tiers 1, 2, 3, 4
  • 提交 ②:Tiers 1+2 (Tier 2 视为 Tier 1), 和 Tiers 3, 4.
同比赛其他方案