使用 StarCoder 创建编码助手 – 摘要
概览
- 目标: 将 StarCoder(一个 16 B 参数的代码生成模型)转换为聊天式编码助手 – StarChat‑α。
- 关键步骤:
- 添加特殊聊天标记 (
<|system|>,<|assistant|>,<|user|>,\n). - 准备对话数据集,通过过滤 Open‑Assistant oasst1 数据集,仅保留英文对话并添加新标记。
- 掩码用户标签,使得损失仅在助手输出上计算。
- 微调模型,使用 DeepSpeed ZeRO‑3(或 LoRA/FSDP 等替代方案),因为模型对单个 GPU 来说太大。
- 添加特殊聊天标记 (
分词器与掩码
special_tokens = {
"additional_special_tokens": ["<|system|>", "<|assistant|>", "<|user|>", "\n"]
}
tokenizer.add_special_tokens(special_tokens)
- 验证
<|assistant|>映射到单个 token ID(49153)。 mask_user_labels将用户回合的 token ID 以及直到下一个助手 token 的所有内容替换为-100,从而在损失计算中被忽略。
使用 DeepSpeed ZeRO‑3 进行训练
git clone https://github.com/bigcode-project/starcoder.git
cd starcoder/chat
conda create -n starchat python=3.10 && conda activate starchat
# install pytorch (see pytorch.org) then:
pip install -r requirements.txt
huggingface-cli login
sudo apt-get install git-lfs
torchrun --nproc_per_node=8 train.py config.yaml \
--deepspeed deepspeed_z3_config_bf16.json
- 使用 8 GPU A100(80 GB)配置;训练约在 45 分钟内完成。
config.yaml定义数据集路径、模型名称、训练超参数等。
示例输出(编码任务)
| 提示 | 模型输出 |
|---|---|
| 条形图 – 绘制字典中身高和年龄 | 生成完整的 pandas/seaborn 脚本,包含两个子图并显示图形。 |
| 世界地图 – 将德国和西班牙涂成红色 | 生成 geopandas 脚本,加载 GeoJSON,提取这两个国家,并使用指定颜色绘制。 |
| 篮球统计 – 绘制得分与篮板的散点图 | 返回 seaborn 散点图,为每位球员添加注释并提供合适的标题/标签。 |
评估
- 标准基准(ARC、HellaSwag、MMLU、TruthfulQA)在指令微调后显示出适度提升:
模型 ARC HellaSwag MMLU TruthfulQA StarCoderBase 0.30 0.46 0.33 0.40 StarChat‑α 0.33 0.49 0.34 0.44 - 人类在环 / AI 在环:使用了 115 条精选的 Python 提示(来源于 ChatGPT 生成的种子),并让 GPT‑4 和 ChatGPT 在 1‑8 评分尺度上对模型的回复进行评分。StarChat‑α 在约 96 % 的情况下胜过基础模型。
限制与风险
- 仍可能出现幻觉和不安全内容(没有 RLHF 或安全过滤)。
- 人口统计偏差反映了大多数训练数据来源的 GitHub 社区。
- 基准测试未能捕捉对话质量;需要人工或基于 LLM 的评估。
未来方向
- 探索 LoRA 或其他 PEFT 方法,以降低微调成本。
- 将以代码为中心的数据与更自然语言的对话相结合,以提升对话能力。
- 部署为开源助手,以供更广泛的社区使用。
资源
- Code: https://github.com/bigcode-project/starcoder/tree/main/chat
- Filtered dataset:
HuggingFaceH4/oasst1_en - Evaluation prompts:
HuggingFaceH4/code_evaluation_prompts - Model: https://huggingface.co/HuggingFaceH4/starchat-alpha
引用
@article{Tunstall2023starchat-alpha,
author = {Tunstall, Lewis and Lambert, Nathan and Rajani, Nazneen and Beeching, Edward and Le Scao, Teven and von Werra, Leandro and Han, Sheon and Schmid, Philipp and Rush, Alexander},
title = {Creating a Coding Assistant with StarCoder},
journal = {Hugging Face Blog},
year = {2023},
note = {https://huggingface.co/blog/starchat-alpha},
}
SUMMARY: 本文描述了 Hugging Face 团队如何将 16 B 参数的 StarCoder 代码生成模型转变为对话式编码助手(StarChat‑α)。通过添加特殊聊天标记、准备过滤后的 Open‑Assistant 对话数据集,并使用 DeepSpeed ZeRO‑3 进行微调,他们训练出能够理解用户提示并生成可运行代码(例如绘图、地图、可视化)的模型。文章还涉及分词器配置、用户回合的损失掩码、训练设置、评估(包括基准测试和基于 LLM 的评估)、局限性以及未来方向。最终模型已在 Hub 上公开发布。