代码补全模型做到极致之后,下一步是什么?JetBrains 的回答是:把它变成一个能跑在整个 AI 工作流里的通用引擎,然后开源。
Mellum2 是一个 120 亿参数的模型,刚刚在 Apache 2.0 协议下正式开源。它不是又一个"通用大模型"的宣言——它的设计目标非常具体:在生产环境中压低延迟、拉高吞吐、砍掉成本。这三件事听起来平淡,但恰恰是大多数团队把 LLM 从 demo 推到生产时卡住的地方。
从补全到工作流:Mellum 的演进路线
Mellum 最初的角色很单一——JetBrains IDE 里的代码补全。这个场景对模型的要求极其苛刻:用户敲下一个键,补全建议必须在几十毫秒内出现,否则体验就是负面的。在这种压力下,Mellum 被训练成了一个对延迟极度敏感的模型。
但 JetBrains 在实际部署中发现,AI 工作流里远不止补全这一个环节。一个典型的开发辅助流水线可能包含:
- 路由:判断用户意图,决定走代码生成还是文档检索
- 总结:把长上下文压缩成可操作的信息
- 中间推理:在多步 Agent 流程中充当"快速思考"节点
这些环节不需要 GPT-4 级别的深度推理,但需要快、便宜、稳定。Mellum2 正是在这个洞察上扩展了能力边界——从纯代码补全,演进为同时处理自然语言和代码的多功能模型。
12B 参数的取舍:为什么不是更大或更小
120 亿参数是一个刻意的选择。比这大的模型(70B、100B+)推理成本陡增,单请求延迟很难压到生产可接受的范围;比这小的模型(7B、3B)在处理混合语言-代码任务时,容量往往不够,路由和总结的质量会明显下降。
Mellum2 卡在这个中间地带,瞄准的是"够用且够快"。Apache 2.0 协议的选择也传递了信号:JetBrains 不打算靠模型本身收费,而是让社区在工具链和工作流集成上自由发挥。
实际跑起来:本地推理与工作流集成
下面是一个可以直接运行的示例,展示如何用 transformers 加载 Mellum2 并完成一个典型的工作流任务——代码片段总结。假设模型权重已发布到 Hugging Face(以 jetbrains/Mellum2 为例,实际 repo 名称请以官方公告为准)。
# mellum2_summary_demo.py
# 依赖:pip install transformers torch accelerate
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
MODEL_ID = "jetbrains/Mellum2" # 以官方发布为准,发布后替换为实际 repo
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
torch_dtype=torch.bfloat16,
device_map="auto", # 自动分配 GPU/CPU
trust_remote_code=True,
)
def summarize_code(code: str, lang: str = "python") -> str:
"""用 Mellum2 对代码片段做快速总结——典型工作流中间步骤"""
prompt = f"""[INST] 用一到两句话总结以下 {lang} 代码的核心功能,只输出总结,不要复述代码:
```{lang}
{code}
[/INST]"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=128,
temperature=0.3,
do_sample=True,
)
response = tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
return response.strip()
--- 示例:总结一个 FastAPI 路由 ---
snippet = ''' @app.post("/items/{item_id}") async def update_item(item_id: int, item: ItemUpdate, db: Session = Depends(get_db)): existing = db.query(Item).filter(Item.id == item_id).first() if not existing: raise HTTPException(status_code=404, detail="Item not found") for field, value in item.dict(exclude_unset=True).items(): setattr(existing, field, value) db.commit() return existing '''
print(summarize_code(snippet))
预期输出类似:
"该路由根据 item_id 查找数据库中的条目,若不存在则返回 404;否则用请求体中提供的字段部分更新该条目并返回更新后的对象。"
运行前需要确认两件事:
1. **模型权重地址**——JetBrains 公告发布后,到 Hugging Face 搜索 `Mellum2`,把 `MODEL_ID` 替换为实际 repo。
2. **硬件要求**——12B 参数 bfloat16 精度约需 24 GB 显存;如果 GPU 不够,可以改用 `device_map="balanced_low_0"` 或开启 CPU offload,代价是推理速度下降。
如果追求更高吞吐(比如批量处理工作流中的路由请求),用 vLLM 部署会更合适:
```bash
# 安装 vLLM
pip install vllm
# 启动 OpenAI-compatible server(替换 MODEL_ID 为实际地址)
python -m vllm.entrypoints.openai.api_server \
--model jetbrains/Mellum2 \
--dtype bfloat16 \
--max-model-len 4096 \
--gpu-memory-utilization 0.9 \
--port 8000
# 然后用 OpenAI SDK 调用
python -c "
from openai import OpenAI
client = OpenAI(base_url='http://localhost:8000/v1', api_key='empty')
resp = client.chat.completions.create(
model='jetbrains/Mellum2',
messages=[{'role':'user','content':'这段代码在做什么:def foo(x): return x * 2 + 1'}],
max_tokens=64,
)
print(resp.choices[0].message.content)
"
工作流中的定位:不是替代大模型,是替代不必要的调用
Mellum2 在生产架构里的典型角色不是"全能主力",而是快速中间层。一个实际可用的模式是:
| 工作流环节 | 用 Mellum2 | 用大模型(GPT-4 级) |
|---|---|---|
| 意图路由 | ✅ 快速分类,成本极低 | ❌ 过重,延迟高 |
| 上下文压缩/总结 | ✅ 质量够用,吞吐高 | 仅在需要深度理解时使用 |
| 代码补全 | ✅ 原生优势 | ❌ 延迟不可接受 |
| 复杂多步推理 | ❌ 容量有限 | ✅ 必须用大模型 |
这种分层策略的核心收益是成本和延迟的非线性下降。一次路由调用如果用 70B 模型,可能花费 $0.02、耗时 2 秒;用 Mellum2 可能降到 $0.001 以下、耗时 200 毫秒。当你的流水线每天跑十万次路由,差距就是每天 $2000 vs $100。
上手之前需要想清楚的事
- 场景匹配度——如果你的工作流没有"高频低深度"的环节(比如只是偶尔做一次复杂推理),Mellum2 的优势体现不出来,直接用大模型反而更省事。
- 部署成本——12B 模型需要至少一张 24 GB 显存的 GPU(A10G、L4、3090 等)。如果团队没有 GPU 资源,云上推理的成本需要和直接调用 API 大模型做对比。
- 质量边界——Mellum2 在代码补全和短文本任务上经过充分打磨,但在长文档深度理解、复杂数学推理等场景上,12B 参数的天限是客观存在的。不要把它推到超出容量的任务上。
- 协议自由度——Apache 2.0 意味着你可以修改、商用、分发,没有使用限制。这比很多"开源但不可商用"的模型在合规上省心得多。
Mellum2 的开源,与其说是 JetBrains 放出了一个新模型,不如说是他们把过去几年在 IDE 里打磨出来的"生产级快速推理"经验,打包成了一个可复用的组件。对于正在搭建 AI 工作流的团队来说,它提供了一个值得认真评估的中间层选项——不是最聪明的,但可能是最划算的。