模型简介
模型特点
模型能力
使用案例
🚀 SeaLLM-7B-v2.5 - 面向东南亚的大语言模型
SeaLLM-7B-v2.5是一款面向东南亚地区的先进多语言大语言模型,支持多种东南亚语言,在多语言知识基准测试和数学推理任务中表现出色,为该地区的语言处理需求提供了强大的解决方案。
⚠️ 重要提示
SeaLLM3 已发布,它在各种任务中具有最先进的性能,并且经过特别优化,更加值得信赖。建议使用这个最新的模型版本。
🔥[热门] SeaLLMs项目现在有了专属网站 - damo-nlp-sg.github.io/SeaLLMs
我们推出了 SeaLLM-7B-v2.5,这是一款面向东南亚(SEA)语言 🇬🇧 🇨🇳 🇻🇳 🇮🇩 🇹🇭 🇲🇾 🇰🇭 🇱🇦 🇲🇲 🇵🇭 的最先进多语言大语言模型。它是自 SeaLLM-13B 以来的重大升级,模型大小减半,但在各种多语言任务中表现更优,涵盖世界知识、数学推理、指令遵循等领域。
✨ 主要特性
- SeaLLM-7B-v2.5 性能超越GPT-3.5,在大多数东南亚语言的多语言知识基准测试(MMLU、M3Exam 和 VMLU)中达到了7B模型的最优水平。
- 在GSM8K和MATH基准测试中分别取得了79.0和34.9的成绩,在MATH测试中超越了GPT-3.5。
📦 安装指南
文档中未提及具体安装步骤,故跳过此章节。
💻 使用示例
基础用法
# ! 注意,如果你的代码的分词器默认不添加 <bos>,
# 你必须手动在提示中添加 <bos>,否则将无法正常工作!
prompt = """<|im_start|>system
You are a helpful assistant.<eos>
<|im_start|>user
Hello world<eos>
<|im_start|>assistant
Hi there, how can I help?<eos>"""
# <|im_start|> 不是特殊标记。
# Transformers的聊天模板应与下面的vLLM格式一致。
# ! 确保序列开头只有一个 <bos>
print(tokenizer.convert_ids_to_tokens(tokenizer.encode(prompt)))
高级用法
使用transformers的聊天模板
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # 加载模型的设备
# 使用bfloat16以确保最佳性能。
model = AutoModelForCausalLM.from_pretrained("SeaLLMs/SeaLLM-7B-v2.5", torch_dtype=torch.bfloat16, device_map=device)
tokenizer = AutoTokenizer.from_pretrained("SeaLLMs/SeaLLM-7B-v2.5")
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]))
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}<eos>\n"
TURN_PREFIX = "<|im_start|>{role}\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=['<eos>', '<|im_start|>'])
llm = LLM("SeaLLMs/SeaLLM-7B-v2.5", 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.5
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_v25_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}<eos>\n"
TURN_PREFIX = "<|im_start|>{role}\n"
TURN_SUFFIX = "<eos>\n"
TURN_SUFFIX_TAKE = "<eos>"
sample = None
assistant_prefix_len = None
assistant_suffix_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))
if assistant_suffix_len is None:
assistant_suffix_len = (
len(tokenizer.encode(TURN_SUFFIX.format(role=turn['role']), add_special_tokens=False)) -
len(tokenizer.encode(TURN_SUFFIX_TAKE, add_special_tokens=False))
)
turn_sample['token_type_ids'][assistant_prefix_len:-assistant_suffix_len] = [1] * (len(turn_sample['input_ids']) - assistant_prefix_len - assistant_suffix_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_v25_tokenize_multi_turns(tokenizer, conversations)
tokens = tokenizer.convert_ids_to_tokens(sample['input_ids'])
pairs = [(x, y) for x, y in zip(tokens, sample['token_type_ids'])]
print(pairs)
# 源标记和特殊标记被屏蔽(token_type 0),只有带有 <eos> 的助手回复被训练(token_type 1)
# [('<bos>', 0), ('<', 0), ('|', 0), ..., ('assistant', 0), ('\n', 0), ('Hi', 1), ('▁there', 1), (',', 1), ('▁how', 1), ('▁can', 1), ('▁I', 1), ('▁help', 1), ('?', 1), ('<eos>', 1), ('\n', 0), ('<', 0), ...
📚 详细文档
发布与演示
- 演示:
- SeaLLMs/SeaLLM-7B-v2.5。
- SeaLLMs/SeaLLM-7B | SeaLMMM-7B - 实验性多模态SeaLLM。
- 技术报告:Arxiv: SeaLLMs - Large Language Models for Southeast Asia。
- 模型权重:
- 本地运行:
- LM-studio:
- SeaLLM-7B-v2.5-q4_0-chatml,使用ChatML模板(
<eos>
标记改为<|im_end|>
) - SeaLLM-7B-v2.5-q4_0 - 必须使用SeaLLM-7B-v2.5聊天格式。
- SeaLLM-7B-v2.5-q4_0-chatml,使用ChatML模板(
- MLX for Apple Silicon:SeaLLMs/SeaLLM-7B-v2.5-mlx-quantized
- LM-studio:
- 之前的模型:
使用模型的重要注意事项
<bos>
必须位于提示的开头。如果你的代码的分词器默认不添加<bos>
,你必须手动在提示中添加,否则将无法正常工作!- 重复惩罚(例如在llama.cpp、ollama、LM-studio中)必须设置为 1,否则会导致性能下降!
SeaLLM-7B-v2之后的新特性
SeaLLM-7B-v2.5基于Gemma-7b构建,并进行了大规模的有监督微调(SFT)和精心设计的对齐。
评估
多语言世界知识
我们按照推荐的默认设置在3个基准测试中对模型进行评估:英语使用5-shot MMLU,英语、中文、越南语、印尼语、泰语使用3-shot 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 |
SailorLM | 多语言 | 52.72 | 59.76 | 67.74 | 50.14 | --- | 39.53 | 37.73 |
SeaLLM-7B-v2 | 多语言 | 61.89 | 70.91 | 55.43 | 51.15 | 45.74 | 42.25 | 35.52 |
SeaLLM-7B-v2.5 | 多语言 | 64.05 | 76.87 | 62.54 | 63.11 | 53.30 | 48.64 | 46.86 |
零样本思维链多语言数学推理
模型 | 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.0 |
Vistral-7b-chat | 48.2 | 12.5 | 48.7 | 3.1 | ||||||
Qwen1.5-7B-chat | 56.8 | 15.3 | 40.0 | 2.7 | 37.7 | 9 | 36.9 | 7.7 | 21.9 | 4.7 |
SeaLLM-7B-v2 | 78.2 | 27.5 | 53.7 | 17.6 | 69.9 | 23.8 | 71.5 | 24.4 | 59.6 | 22.4 |
SeaLLM-7B-v2.5 | 78.5 | 34.9 | 51.3 | 22.1 | 72.3 | 30.2 | 71.5 | 30.1 | 62.0 | 28.4 |
基线模型使用各自的聊天模板和系统提示进行评估(Qwen1.5-7B-chat,Vistral)。
零样本MGSM
SeaLLM-7B-v2.5 在泰语的多语言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.5 | 58.0 | 64.8 |
Sea-Bench
🔧 技术细节
文档中未提及具体技术细节内容,故跳过此章节。
📄 许可证
使用我们发布的权重、代码和演示,即表示您同意并遵守我们 SeaLLMs使用条款 中规定的条款和条件。
⚠️ 重要声明
我们必须指出,尽管我们以开放的方式发布了权重、代码和演示,但与其他预训练语言模型类似,即使我们在红队测试、安全微调及执行方面已尽最大努力,我们的模型仍存在潜在风险,包括但不限于不准确、误导性或潜在有害的生成内容。 开发者和相关利益方在部署前应进行自己的红队测试并提供相关安全措施,并且必须遵守当地的管理规定和法规。 在任何情况下,作者均不对因使用发布的权重、代码或演示而产生的任何索赔、损害或其他责任负责。
此标志由DALL-E 3生成。
对语言学家的感谢
我们要特别感谢专业的母语语言学家Tantong Champaiboon、Nguyen Ngoc Yen Nhi和Tara Devina Putri,他们帮助构建、评估和事实核查我们采样的预训练和有监督微调数据集,并从不同方面对我们的模型进行评估,特别是在安全性方面。
引用
如果您觉得我们的项目有用,希望您能给我们的仓库点个星,并按如下方式引用我们的工作:通讯作者:l.bing@alibaba-inc.com
作者列表和顺序可能会改变!
*
和^
表示同等贡献。
@article{damonlpsg2023seallm,
author = {Xuan-Phi Nguyen*, Wenxuan Zhang*, Xin Li*, Mahani Aljunied*, Weiwen Xu, Hou Pong Chan,
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},
}



