🚀 OpenChat:开源模型,少即是多
OpenChat 是一系列开源语言模型,在多样化且高质量的多轮对话数据集上进行了微调。仅使用从约 9 万条 ShareGPT 对话中筛选出的约 6000 条 GPT - 4 对话,OpenChat 旨在用有限的数据实现高性能。
✨ 主要特性
通用模型
- OpenChat:基于 LLaMA - 13B(上下文长度 2048)
- 在 Vicuna GPT - 4 评估中,得分达到 ChatGPT 的 105.7%
- 在 AlpacaEval 中的胜率为 80.9%
- 仅使用 6000 条数据进行微调!!!
- OpenChat - 8192:基于 LLaMA - 13B(上下文长度扩展至 8192)
- 在 Vicuna GPT - 4 评估中,得分达到 ChatGPT 的 106.6%
- 在 AlpacaEval 中的胜率为 79.5%
代码模型
- OpenCoderPlus:基于 StarCoderPlus(原生上下文长度 8192)
- 在 Vicuna GPT - 4 评估中,得分达到 ChatGPT 的 102.5%
- 在 AlpacaEval 中的胜率为 78.7%
⚠️ 重要提示
请使用 bfloat16 加载预训练模型。
🚀 快速开始
代码与推理服务器
我们在 OpenChat GitHub 仓库中提供了完整的源代码,包括一个与“ChatCompletions”API 兼容的推理服务器。
Web 界面
OpenChat 还包含一个 Web 界面,以提供更好的用户体验。具体说明请参考 GitHub 仓库。
💻 使用示例
对话模板
对话模板 涉及拼接令牌。
除了基础模型词汇表外,还添加了一个回合结束令牌 <|end_of_turn|>
,其 ID 为 eot_token_id
。
[bos_token_id] + tokenize("Human: ") + tokenize(user_question) + [eot_token_id] + tokenize("Assistant: ")
tokenize("User:") + tokenize(user_question) + [eot_token_id] + tokenize("Assistant:")
💡 使用建议
在字节对编码(BPE)中,tokenize(A) + tokenize(B)
并不总是等于 tokenize(A + B)
。
以下是生成对话模板的代码:
@dataclass
class ModelConfig:
system: Optional[str]
role_prefix: dict
ai_role: str
eot_token: str
bos_token: Optional[str] = None
def generate_conversation_template(self, tokenize_fn, tokenize_special_fn, message_list):
tokens = []
masks = []
if self.bos_token:
t = tokenize_special_fn(self.bos_token)
tokens.append(t)
masks.append(False)
if self.system:
t = tokenize_fn(self.system) + [tokenize_special_fn(self.eot_token)]
tokens.extend(t)
masks.extend([False] * len(t))
for idx, message in enumerate(message_list):
t = tokenize_fn(self.role_prefix[message["from"]])
tokens.extend(t)
masks.extend([False] * len(t))
if "value" in message:
t = tokenize_fn(message["value"]) + [tokenize_special_fn(self.eot_token)]
tokens.extend(t)
masks.extend([message["from"] == self.ai_role] * len(t))
else:
assert idx == len(message_list) - 1, "Empty message for completion must be on the last."
return tokens, masks
MODEL_CONFIG_MAP = {
"openchat": ModelConfig(
system=None,
role_prefix={
"human": "Human: ",
"gpt": "Assistant: "
},
ai_role="gpt",
eot_token="<|end_of_turn|>",
bos_token="<s>",
),
"opencoder": ModelConfig(
system=None,
role_prefix={
"human": "User:",
"gpt": "Assistant:"
},
ai_role="gpt",
eot_token="<|end_of_turn|>",
bos_token=None,
)
}
📄 许可证
我们的模型权重许可证遵循其相应基础模型的规定。例如,OpenChat 和 OpenChat - 8192 与 LLaMA 的模型 许可证 相同,仅用于非商业用途;而 OpenCoderPlus 遵循 StarCoder 的 许可证。此外,我们还需遵守 ShareGPT 的 隐私政策。在 GitHub 上发布的 代码 遵循 Apache License 2.0。
📚 详细文档
引用信息
@software{openllms23,
title = {{OpenLLMs: Less is More for Open-source Models}},
author = {Wang, Guan and Cheng, Sijie and Yu, Qiying and Liu, Changling},
doi = {10.5281/zenodo.8105775},
url = {https://github.com/imoneoi/openchat},
version = {pre-release},
year = {2023},
month = {7},
}