🚀 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 リポジトリを参照してください。
💻 使用例
対話テンプレート
対話テンプレートは トークンの結合を伴います。
基本モデルの語彙に加えて、ID が eot_token_id
のターン終了トークン <|end_of_turn|>
が追加されています。
[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},
}