让 AI 真正看懂设计图:M2-CODER 如何像人类程序员一样写代码

“如果 AI 只能读文字,却看不懂 UML 图和流程图,它就永远只算半个程序员。”
—— M2-CODER 论文作者


一、为什么“看图写代码”这么难?

今天的程序员已经习惯用 UML 类图流程图 把需求讲清楚,再动手写代码。
但绝大多数大模型(LLM)仍停留在“纯文本”阶段:你给它一段文字描述,它返回一段代码。一旦需求里出现一张图,它就抓瞎。

传统做法 真实场景
文字描述:“设计一个农场里的 Crop 类” 一张 UML 图:状态机显示 Planted→Growing→Harvested
LLM 输出:字段、方法全靠猜 人类开发者:一眼看懂状态流转,一次写对

M2-CODER 的出现,正是为了补上这块拼图。


二、M2-CODER 是什么?

一句话总结:
M2-CODER 是一个能同时阅读文字和 UML/流程图的多语言、多模态代码生成模型。

2.1 三大核心组件

组件 作用 规模/亮点
M2-CODER 模型 看图+读文→生成代码 7 B 参数,跑在 8×A800,训练 3 天
M2C-INSTRUCT 数据集 让模型“见过足够多的图” 1310 万样本,50+ 编程语言
M2EVAL 评测基准 公平测试“看图写代码”能力 300 题×10 语言,开源可复现

三、M2C-INSTRUCT:让模型见过 1310 万张图

3.1 数据来源

  • 阶段 1(1290 万条):GitHub 代码 → 渲染成高亮图片 + 保留原始文本
  • 阶段 2(16.8 万条):精选高质量问题 → 人工画 UML/流程图 → 再写代码

3.2 一张图是怎么诞生的?(三步流水线)

  1. 原型问题
    用 LLM 写 Python 题、解、单元测试,人工多轮校对。
  2. 画图
    用 LLM 把解法转成 PlantUML / Mermaid,再人工精修:

    • 删掉文字里与图重复的信息
    • 把关键细节只留在图里
  3. 多语言翻译
    9 位志愿者 + LLM 辅助,把题、解、测试全翻译成 C#、Java、Kotlin… 一共 10 种语言。

3.3 语言分布

语言 占比(阶段1) 语言 占比(阶段2)
Python 18.7 % Python 55.4 %
JavaScript 12.2 % C++ 6.1 %
Java 11.0 % Java 4.9 %
C++ 11.8 % HTML 4.0 %
C# 11.7 % C# 3.9 %

四、M2EVAL:首个“看图写代码”公开评测

4.1 任务定义

输入:

  • 一段文字需求
  • 一张 UML 或流程图

输出:

  • 可编译、可运行、通过全部单元测试的代码

4.2 300 道题长什么样?

任务类别 代表题 难度 测试用例数
基础类设计 Crop 类 Easy 4
设计模式 抽象工厂+策略 Hard 14
算法 复杂排序 Hard 8
模拟 虚拟农场 Medium 13

每道题都有 10 种语言版本,共 3000 份代码待生成。


五、实验结果:7 B 模型打平 70 B

5.1 平均成绩(Pass@1)

模型 参数量 平均分
GPT-4o 49.7 %
Gemini-2.5-Flash 48.7 %
M2-CODER 7 B 25.3 %
Qwen2-VL-7B 7 B 12.0 %
Llama-4-Scout 109 B 31.0 %

7 B 的 M2-CODER 在 10 门语言上平均成绩超过同量级模型 2 倍以上,逼近百亿参数大模型。

5.2 语言差异

  • 脚本语言更友好:Python、JavaScript、PHP 平均分 > 30 %
  • 静态类型语言更难:C#、Scala、Swift 平均分 < 20 %
  • 根本原因:强类型语言对变量命名、可见性要求更严格,模型容易漏看细节。

六、手把手:如何复现 M2-CODER

6.1 环境准备

# 1. 硬件:8×A800 80 G(或同等显存)
# 2. 镜像:官方 Dockerfile 已开源
docker build -t m2-coder .
docker run --gpus all -it m2-coder

6.2 数据下载

# 阶段 1 完整数据(可选轻量版 4.25 M 条)
git clone https://github.com/MCEVAL/MMCoder
cd MMCoder/data
# 解压后约 1 TB,轻量版约 200 GB

6.3 训练命令(两阶段)

# 阶段 1:全参数微调,3 天
llamafactory-cli train \
  --model_name_or_path Qwen2-VL-7B-base \
  --dataset m2c_stage1 \
  --output_dir checkpoints/stage1 \
  --per_device_train_batch_size 128 \
  --learning_rate 5e-5 \
  --num_train_epochs 1

# 阶段 2:只训 LLM,2 天
llamafactory-cli train \
  --model_name_or_path checkpoints/stage1 \
  --dataset m2c_stage2 \
  --output_dir checkpoints/stage2 \
  --freeze_vision_tower true \
  --num_train_epochs 2

6.4 本地评测

# 运行 M2EVAL 基准
python evaluate.py \
  --model checkpoints/stage2 \
  --benchmark m2eval \
  --languages python java cpp csharp

七、常见疑问 FAQ

Q1:没有图也能做题吗?

A:不能。M2EVAL 故意把关键信息只放在图里,纯文本无法拿到满分。实验里 DeepSeek-V3、Qwen2.5-Coder 去掉图后得分为 0。

Q2:7 B 模型会不会太小?

A:在“看图写代码”任务上,数据质量比参数量更重要。1310 万条图文对齐的数据让 7 B 也能打出 25 % 的成绩,同量级模型只有 10 % 左右。

Q3:商用授权怎么算?

A:M2C-INSTRUCT 数据来自 GitHub 公开仓库,已按 StarCoder 协议过滤;评测基准 M2EVAL 采用 CC-BY-4.0;模型权重遵循 Qwen2-VL 原许可,可商用但需保留版权声明。


八、局限与下一步

当前局限 未来计划
仅支持 10 门语言 扩展到 30+ 语言
仅代码生成 增加代码补全、调试、重构
训练仅用 SFT 引入 RLHF、长思维链

九、结语:把“半个程序员”变成“完整程序员”

M2-CODER 第一次让大模型像人一样,把 UML 图和流程图当作“一等公民”。
如果你厌倦了在提示词里反复用文字描述“那个箭头是什么意思”,不妨让 M2-CODER 直接看图说话。

项目地址:

  • 代码与权重:https://github.com/MCEVAL/MMCoder
  • 数据集:https://huggingface.co/datasets/MCEVAL/M2C-INSTRUCT
  • 评测基准:https://huggingface.co/datasets/MCEVAL/M2EVAL

把图扔给 AI,剩下的让它来。