🚀 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},
}