让 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 一张图是怎么诞生的?(三步流水线)
-
原型问题
用 LLM 写 Python 题、解、单元测试,人工多轮校对。 -
画图
用 LLM 把解法转成 PlantUML / Mermaid,再人工精修:-
删掉文字里与图重复的信息 -
把关键细节只留在图里
-
-
多语言翻译
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,剩下的让它来。