模型简介
模型特点
模型能力
使用案例
🚀 SeaLLM-7B-v2 - 面向东南亚的大语言模型
SeaLLM-7B-v2是一款面向东南亚语言的先进多语言大语言模型,支持英语、中文、越南语等多种语言。相比前代模型,它规模更小但性能更优,在多语言任务中表现出色,如世界知识、数学推理和指令跟随等方面。
🚀 快速开始
我们推出了 SeaLLM-7B-v2,这是一款面向东南亚(SEA)语言的最先进多语言大语言模型,支持英语、中文、越南语、印尼语、泰语、马来语、高棉语、老挝语、缅甸语和菲律宾语。这是自 SeaLLM-13B 以来最重要的一次升级,模型规模减半,但在各种多语言任务中表现更优,涵盖世界知识、数学推理、指令跟随等领域。
重要消息
🎉 SeaLLM3 已发布,在各种任务中展现出了最先进的性能,并且特别增强了模型的可信度。建议使用这个最新的模型版本。
相关链接
✨ 主要特性
亮点
- SeaLLM-7B-v2 在 零样本思维链(Zero-shot CoT)GSM8K 任务中取得了 78.2 分的成绩,达到了 7B 模型的最优水平(7B-SOTA)。在许多东南亚语言(中文、越南语、印尼语、泰语)翻译后的 GSM8K 任务以及 MGSM(中文、泰语)任务中,表现优于 GPT-3.5。在泰语的 MATH 思维链任务中也超越了 GPT-3.5。
- 在许多零样本思维链常识基准测试中,与 GPT-3.5 竞争激烈,在 Arc-C、Winogrande 和 Hellaswag 测试中分别取得了 82.5、68.3 和 80.9 的分数。
- 在英语 MT-bench 测试中获得了 7.54 分,在 7B 类别排行榜中排名第 3,是表现最出色的多语言模型。
- 在越南语 VMLU 基准测试中获得了 45.74 分,是唯一能与同规模单语言模型(如 Vistral-7B)竞争的开源多语言模型。
发布与演示
- 演示:SeaLLMs/SeaLLM-7B。
- 技术报告:Arxiv: SeaLLMs - Large Language Models for Southeast Asia。
- 模型权重:
- SeaLLM-7B-v2。
- SeaLLM-7B-v2-gguf。
- SeaLLM-7B-v2-GGUF(感谢 Lonestriker)。注意:需使用 seallm.preset.json 才能正常工作。
- 本地运行:
- LM-studio:
- SeaLLM-7B-v2-q4_0 和 SeaLLM-7B-v2-q8_0。
- LM-studio 需要使用 seallm.preset.json 来正确设置聊天模板。
- ollama:
ollama run nxphi47/seallm-7b-v2:q4_0
- 适用于苹果硅芯片的 MLX:mlx-community/SeaLLM-7B-v2-4bit-mlx
- LM-studio:
使用条款和许可
⚠️ 重要提示
使用我们发布的权重、代码和演示,即表示您同意并遵守 SeaLLMs 使用条款 中规定的条款和条件。
免责声明: 我们必须指出,尽管我们以开放的方式发布了权重、代码和演示,但与其他预训练语言模型一样,即使我们在红队测试、安全微调及强化方面已尽最大努力,我们的模型仍存在潜在风险,包括但不限于不准确、误导性或潜在有害的生成内容。 开发者和相关利益方在部署前应进行自己的红队测试并提供相关安全措施,且必须遵守当地的治理和法规。 在任何情况下,作者均不对因使用发布的权重、代码或演示而产生的任何索赔、损害或其他责任负责。
SeaLLM-13B-v1 和 SeaLLM-7B-v1 的更新内容
SeaLLM-7B-v2 基于 Mistral-7B 继续预训练,并经过精心设计的调优,专注于推理能力的提升。
🔧 技术细节
零样本思维链多语言数学推理
SeaLLM-7B-v2 在 GSM8K 零样本思维链推理测试中取得了 78.2 分的成绩,成为 7B 模型领域的 最优模型。在翻译成东南亚语言(中文、越南语、印尼语、泰语)的相同 GSM8K 基准测试中,它也优于 GPT-3.5。在泰语翻译的 MATH 基准测试中,SeaLLM-7B-v2 以 22.4 分的成绩超过了 GPT-3.5 的 18.1 分。
查看英语及翻译后的 GSM8K 和 MATH 零样本推理详情
模型 | GSM8K 英语 |
MATH 英语 |
GSM8K 中文 |
MATH 中文 |
GSM8K 越南语 |
MATH 越南语 |
GSM8K 印尼语 |
MATH 印尼语 |
GSM8K 泰语 |
MATH 泰语 |
---|---|---|---|---|---|---|---|---|---|---|
GPT-3.5 | 80.8 | 34.1 | 48.2 | 21.5 | 55 | 26.5 | 64.3 | 26.4 | 35.8 | 18.1 |
Qwen-14B-chat | 61.4 | 18.4 | 41.6 | 11.8 | 33.6 | 3.6 | 44.7 | 8.6 | 22 | 6 |
Vistral-7b-chat | 48.2 | 12.5 | 48.7 | 3.1 | ||||||
Qwen1.5-7B-chat | 56.8 | 15.3 | 40 | 2.7 | 37.7 | 9 | 36.9 | 7.7 | 21.9 | |
SeaLLM-7B-v2 | 78.2 | 27.5 | 53.7 | 17.6 | 69.9 | 23.8 | 71.5 | 24.4 | 59.6 | 22.4 |
基线模型使用各自的聊天模板和系统提示进行评估(Qwen1.5-7B-chat,Vistral)。
零样本 MGSM
SeaLLM-7B-v2 在中文和泰语的多语言 MGSM 测试中也优于 GPT-3.5 和 Qwen-14B。
模型 | MGSM-中文 | MGSM-泰语 |
---|---|---|
ChatGPT(报告值) | 61.2 | 47.2 |
Qwen-14B-chat | 59.6 | 28 |
SeaLLM-7B-v2 | 64.8 | 62.4 |
零样本常识推理
我们将 SeaLLM-7B-v2 与 ChatGPT 和 Mistral-7B-instruct 在各种零样本常识基准测试(Arc-Challenge、Winogrande 和 Hellaswag)中进行了比较。我们使用 (Kojima et al., 2023) 中的两阶段技术来获取答案。请注意,我们 未 使用 “Let's think step-by-step” 来触发显式思维链。
零样本推理 | Arc-Challenge | Winogrande | Hellaswag |
---|---|---|---|
ChatGPT(报告值) | 84.6* | 66.8* | 72.0* |
ChatGPT(复现) | 84.1 | 63.1 | 79.5 |
Mistral-7B-Instruct | 68.1 | 56.4 | 45.6 |
Qwen1.5-7B-chat | 79.3 | 59.4 | 69.3 |
SeaLLM-7B-v2 | 82.5 | 68.3 | 80.9 |
基线模型使用各自的聊天模板和系统提示进行评估(Qwen1.5-7B-chat,Mistral)。
多语言世界知识
我们按照推荐的默认设置在 3 个基准测试中评估模型:英语的 5 样本 MMLU、英语、中文、越南语、印尼语、泰语的 3 样本 M3Exam(M3e)以及越南语的零样本 VMLU。
模型 | 语言 | 英语 MMLU |
英语 M3e |
中文 M3e |
越南语 M3e |
越南语 VMLU |
印尼语 M3e |
泰语 M3e |
---|---|---|---|---|---|---|---|---|
GPT-3.5 | 多语言 | 68.90 | 75.46 | 60.20 | 58.64 | 46.32 | 49.27 | 37.41 |
Vistral-7B-chat | 单语言 | 56.86 | 67.00 | 44.56 | 54.33 | 50.03 | 36.49 | 25.27 |
Qwen1.5-7B-chat | 多语言 | 61.00 | 52.07 | 81.96 | 43.38 | 45.02 | 24.29 | 20.25 |
SeaLLM-7B-v2 | 多语言 | 61.89 | 70.91 | 55.43 | 51.15 | 45.74 | 42.25 | 35.52 |
VMLU 复现脚本 在此。我们使用 Lm-eval 来评估 MMLU。基线模型的零样本 VMLU 分数使用各自的聊天模板和系统提示进行评估(Qwen1.5-7B-chat)。
MT-Bench
在英语 MT-bench 指标上,SeaLLM-7B-v2 取得了 7.54 分的成绩(在 7B 类别排行榜中排名第 3),优于许多 70B 模型,并且可以说是唯一能处理 10 种东南亚语言的模型。
有关 SeaLLM-7B-v2 的 MT-bench 预测结果,请参考 mt_bench/seallm_7b_v2.jsonl,复现方法 在此。
模型 | 访问方式 | 语言 | MT-Bench |
---|---|---|---|
GPT-4-turbo | 闭源 | 多语言 | 9.32 |
GPT-4-0613 | 闭源 | 多语言 | 9.18 |
Mixtral-8x7b (46B) | 开源 | 多语言 | 8.3 |
Starling-LM-7B-alpha | 开源 | 单语言(英语) | 8.0 |
OpenChat-3.5-7B | 开源 | 单语言(英语) | 7.81 |
SeaLLM-7B-v2 | 开源 | 多语言(10 种以上) | 7.54 |
Qwen-14B | 开源 | 多语言 | 6.96 |
Llama-2-70B | 开源 | 单语言(英语) | 6.86 |
Mistral-7B-instuct | 开源 | 单语言(英语) | 6.84 |
Sea-Bench
与 MT-Bench 类似,Sea-bench 是一组分类指令测试集,用于衡量模型作为助手的能力,特别关注 9 种东南亚语言,包括非拉丁低资源语言。
如图所示,模型在数学推理方面有了巨大的改进,达到了 GPT-3.5 的性能水平。
有关 SeaLLM-7B-v2 的 Sea-bench 预测结果,请参考 sea_bench/seallm_7b_v2.jsonl。
💻 使用示例
指令格式
prompt = """<|im_start|>system
You are a helpful assistant.</s><|im_start|>user
Hello world</s><|im_start|>assistant
Hi there, how can I help?</s>"""
# 注意:之前的提交在 </s> 和 <|im_start|> 之间有 \n,这是不正确的!
# <|im_start|> 不是特殊标记。
# Transformers 的聊天模板应与下面的 vLLM 格式一致。
# 确保序列开头只有 1 个 bos `<s>`
print(tokenizer.convert_ids_to_tokens(tokenizer.encode(prompt)))
'<s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'system', '<0x0A>', 'You', '▁are', '▁a', '▁helpful', '▁assistant', '.', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'user', '<0x0A>', 'Hello', '▁world', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'ass', 'istant', '<0x0A>', 'Hi', '▁there', ',', '▁how', '▁can', '▁I', '▁help', '?', '</s>']
"""
使用 transformers 的聊天模板
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # 加载模型的设备
# 使用 bfloat16 以确保最佳性能。
model = AutoModelForCausalLM.from_pretrained("SeaLLMs/SeaLLM-7B-v2", torch_dtype=torch.bfloat16, device_map=device)
tokenizer = AutoTokenizer.from_pretrained("SeaLLMs/SeaLLM-7B-v2")
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello world"},
{"role": "assistant", "content": "Hi there, how can I help you today?"},
{"role": "user", "content": "Explain general relativity in details."}
]
encodeds = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True)
print(tokenizer.convert_ids_to_tokens(encodeds[0]))
# ['<s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'system', '<0x0A>', 'You', '▁are', '▁a', '▁helpful', '▁assistant', '.', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'user', '<0x0A>', 'Hello', '▁world', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'ass', 'istant', '<0x0A>', 'Hi', '▁there', ',', '▁how', '▁can', '▁I', '▁help', '▁you', '▁today', '?', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'user', '<0x0A>', 'Ex', 'plain', '▁general', '▁rel', 'ativity', '▁in', '▁details', '.', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'ass', 'istant', '<0x0A>']
model_inputs = encodeds.to(device)
model.to(device)
generated_ids = model.generate(model_inputs, max_new_tokens=1000, do_sample=True, pad_token_id=tokenizer.pad_token_id)
decoded = tokenizer.batch_decode(generated_ids)
print(decoded[0])
使用 vLLM
from vllm import LLM, SamplingParams
TURN_TEMPLATE = "<|im_start|>{role}\n{content}</s>"
TURN_PREFIX = "<|im_start|>{role}\n"
# </s> 和 <|im_start|> 之间没有 \n。
def seallm_chat_convo_format(conversations, add_assistant_prefix: bool, system_prompt=None):
# conversations: 包含 `role` 和 `content` 键的字典列表(OpenAI 格式)
if conversations[0]['role'] != 'system' and system_prompt is not None:
conversations = [{"role": "system", "content": system_prompt}] + conversations
text = ''
for turn_id, turn in enumerate(conversations):
prompt = TURN_TEMPLATE.format(role=turn['role'], content=turn['content'])
text += prompt
if add_assistant_prefix:
prompt = TURN_PREFIX.format(role='assistant')
text += prompt
return text
sparams = SamplingParams(temperature=0.1, max_tokens=1024, stop=['</s>', '<|im_start|>'])
llm = LLM("SeaLLMs/SeaLLM-7B-v2", dtype="bfloat16")
message = "Explain general relativity in details."
prompt = seallm_chat_convo_format(message, True)
gen = llm.generate(prompt, sampling_params)
print(gen[0].outputs[0].text)
微调 SeaLLM-7B-v2
应遵循聊天格式并准确屏蔽源标记。以下是一个示例。
conversations = [
{"role": "system", "content": "You are helful assistant."},
{"role": "user", "content": "Hello world."},
{"role": "assistant", "content": "Hi there, how can I help?"},
{"role": "user", "content": "Tell me a joke."},
{"role": "assistant", "content": "Why don't scientists trust atoms? Because they make up everything."},
]
def seallm_7b_v2_tokenize_multi_turns(tokenizer, conversations, add_assistant_prefix=False):
"""
输入:
conversations: 遵循 OpenAI 格式的字典列表,例如
conversations = [
{"role": "system", "content": "You are helful assistant."},
{"role": "user", "content": "Hello world."},
{"role": "assistant", "content": "Hi there, how can I help?"},
{"role": "user", "content": "Tell me a joke."},
{"role": "assistant", "content": "Why don't scientists trust atoms? Because they make up everything."},
]
add_assistant_prefix: 是否添加助手前缀,仅用于推理解码
输出:
tokenize_output_sample, {
"input_ids": ...
"token_type_ids": 1 表示训练,0 表示屏蔽(不训练)
}
在训练期间,需要创建一个标签,将屏蔽的标记设置为 -100 以避免损失计算。
labels = sample['input_ids'].clone()
labels[sample['token_type_ids'] == 0] = -100
"""
TURN_TEMPLATE = "<|im_start|>{role}\n{content}</s>"
TURN_PREFIX = "<|im_start|>{role}\n"
sample = None
assistant_prefix_len = None
for turn_id, turn in enumerate(conversations):
prompt = TURN_TEMPLATE.format(role=turn['role'], content=turn['content'])
turn_sample = tokenizer(
prompt, padding=False, truncation=False, verbose=False, add_special_tokens=False,
return_token_type_ids=True,
)
if turn['role'] == 'assistant':
if assistant_prefix_len is None:
assistant_prefix_len = len(tokenizer.encode(TURN_PREFIX.format(role=turn['role']), add_special_tokens=False))
turn_sample['token_type_ids'][assistant_prefix_len:] = [1] * (len(turn_sample['input_ids']) - assistant_prefix_len)
if sample is None:
sample = turn_sample
else:
for k in turn_sample.keys():
sample[k].extend(turn_sample[k])
if add_assistant_prefix:
assistant_prefix_sample = tokenizer(
TURN_PREFIX.format(role="assistant"), padding=False, truncation=False, verbose=False, add_special_tokens=False,
return_token_type_ids=True,
)
for k in sample.keys():
sample[k].extend(assistant_prefix_sample[k])
if tokenizer.add_bos_token:
sample['input_ids'] = [tokenizer.bos_token_id] + sample['input_ids']
sample['attention_mask'] = [1] + sample['attention_mask']
sample['token_type_ids'] = [sample['token_type_ids'][0]] + sample['token_type_ids']
return sample
# 测试
sample = seallm_7b_v2_tokenize_multi_turns(tokenizer, conversations)
print(tokenizer.convert_ids_to_tokens(sample['input_ids']))
print(sample['token_type_ids'])
# ['<s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'system', '<0x0A>', 'You', '▁are', '▁hel', 'ful', '▁assistant', '.', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'user', '<0x0A>', 'Hello', '▁world', '.', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'ass', 'istant', '<0x0A>', 'Hi', '▁there', ',', '▁how', '▁can', '▁I', '▁help', '?', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'user', '<0x0A>', 'Tell', '▁me', '▁a', '▁joke', '.', '</s>', '▁<', '|', 'im', '_', 'start', '|', '>', 'ass', 'istant', '<0x0A>', 'Why', '▁don', "'", 't', '▁scientists', '▁trust', '▁atoms', '?', '▁Because', '▁they', '▁make', '▁up', '▁everything', '.', '</s>']
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
致谢语言学家
我们要特别感谢我们专业的母语语言学家 Tantong Champaiboon、Nguyen Ngoc Yen Nhi 和 Tara Devina Putri,他们帮助构建、评估和事实核查我们采样的预训练和 SFT 数据集,并从不同方面评估我们的模型,特别是在安全方面。
引用
如果您觉得我们的项目有用,希望您能给我们的仓库点个星,并按以下方式引用我们的工作:通讯作者:l.bing@alibaba-inc.com
作者列表和顺序可能会改变!
*
和^
表示同等贡献。
@article{damonlpsg2023seallm,
author = {Xuan-Phi Nguyen*, Wenxuan Zhang*, Xin Li*, Mahani Aljunied*,
Zhiqiang Hu, Chenhui Shen^, Yew Ken Chia^, Xingxuan Li, Jianyu Wang,
Qingyu Tan, Liying Cheng, Guanzheng Chen, Yue Deng, Sen Yang,
Chaoqun Liu, Hang Zhang, Lidong Bing},
title = {SeaLLMs - Large Language Models for Southeast Asia},
year = 2023,
Eprint = {arXiv:2312.00738},
}
📄 许可证
本项目采用 seallms 许可证。



