遇到新问题,先找一个解过的类似问题,再类比着想

背景

人类程序员解决新问题时,通常会先回忆有没有见过类似的题目。见过类似的,就拿过来参考,调整细节;没见过,才从头推导。这个过程依赖经验和记忆,也是有经验的程序员比新手快的原因之一。

MapCoder(Islam et al., 2024)把这个思路引入了多 Agent 代码生成框架:先检索类似问题,再类比解法,再生成代码。


四个 Agent 的分工

MapCoder 的工作流由四个 Agent 顺序执行:

1. 检索 Agent(Retrieval Agent)

从一个预先构建的问题库里,找出和当前问题最相似的几个已解决问题。相似度可以用语义向量检索,也可以用关键词匹配。

检索的结果是一组"参考问题 + 参考解法"对:

当前问题:给定数组,找出所有乘积为负数的子数组数量

参考问题 1:给定数组,找出所有和为正数的子数组数量
参考解法 1:前缀和 + 哈希表,时间复杂度 O(n)

参考问题 2:给定数组,找出乘积最大的子数组
参考解法 2:动态规划,维护当前最大值和最小值

2. 类比 Agent(Analogy Agent)

把检索到的参考解法和当前问题放在一起,让 LLM 分析:这些解法里有哪些思路可以迁移到当前问题?

[类比 Agent 的分析]
参考问题 2 用动态规划维护乘积的最大值和最小值,
这个思路可以迁移:对于乘积的正负性,同样需要同时追踪
当前子数组的最大正乘积和最大负乘积(绝对值最大的负数),
因为负数乘以负数会变正。

这一步的目的是把参考解法的核心思想提炼出来,而不是直接复制代码。

3. 规划 Agent(Planning Agent)

根据类比 Agent 提炼的思路,制定当前问题的解题计划,用伪代码或自然语言描述算法步骤:

解题计划:
1. 初始化 max_prod = 1, min_prod = 1, count = 0
2. 遍历数组每个元素 x:
   a. 更新 max_prod = max(x, max_prod * x, min_prod * x)
   b. 更新 min_prod = min(x, max_prod * x, min_prod * x)
   c. 如果 max_prod < 0,说明当前子数组乘积为负,count += 1
3. 返回 count
注意:步骤 2a 和 2b 需要用临时变量避免提前覆盖

4. 编码 Agent(Coding Agent)

根据规划 Agent 的计划,生成最终的代码:

def count_negative_product_subarrays(nums):
    max_prod = 1
    min_prod = 1
    count = 0
    for x in nums:
        candidates = (x, max_prod * x, min_prod * x)
        new_max = max(candidates)
        new_min = min(candidates)
        max_prod, min_prod = new_max, new_min
        if max_prod < 0:
            count += 1
    return count

检索库的构建

MapCoder 的检索库通常来自:

  • 已有的代码题目数据集(LeetCode、Codeforces 等)
  • 训练集里的例题
  • 人工整理的算法模板库

库的质量对结果影响很大。如果检索到的参考问题和当前问题相关性低,类比 Agent 生成的分析就没有意义,后续的规划和编码也容易偏离。


实验结果

论文在 HumanEval、MBPP 和 CodeContests 上的对比:

方法HumanEvalMBPPCodeContests
GPT-4 直接生成86.6%80.1%6.4%
AlphaCodium85.7%
MapCoder(GPT-4)93.9%83.1%11.5%

在竞赛级别的编程题(CodeContests)上,MapCoder 比直接生成提升明显。这类题目往往需要特定的算法技巧,检索到类似题目并类比解法,比从零推导更稳定。


类比机制的实际价值

MapCoder 的核心假设是:相似问题的解法可以迁移。这个假设在某些情况下成立,在另一些情况下不成立。

成立的情况:问题涉及已知的算法模式(动态规划、图搜索、双指针等),检索到同类型题目后,解法的结构可以直接复用。

不成立的情况:题目有独特的约束条件,看起来和某个已知问题相似,但核心难点完全不同。这时候错误的类比会把 Agent 引向错误的方向,比硬想还差。

这也是为什么 MapCoder 在 HumanEval 这种相对标准的题目上提升明显,但在更新颖的竞赛题上提升幅度有限——题越新,越难找到真正相关的参考。


和其他多 Agent 方法的对比

方法角色分工依据外部知识适合场景
AgentCoder代码 vs 测试有测试标准的任务
MapCoder检索→类比→规划→编码题目库有参考题目可检索的场景
AlphaCodium理解→测试→迭代有明确输入输出的任务

MapCoder 对外部知识库有依赖,这是它和其他方法的主要区别。有好的题目库时效果好,没有时就退化成普通的多步骤生成。

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:12. MapCoder:用类比和检索辅助代码生成

本文链接:https://www.sshipanoo.com/blog/ai/code-agent-harness/12-MapCoder/

本文最后一次更新为 天前,文章中的某些内容可能已过时!