/ChatZoo

Light local website for displaying performances from different chat models.

Primary LanguagePythonApache License 2.0Apache-2.0

ChatZoo

ChatZoo

ChatZoo,一款轻量级的大模型评测工具。

Github Repo Stars GitHub HuggingFace badge GitHub commit activity (branch) GitHub issues

[ 简体中文 ] | [ English ]

新闻

目录

ChatZoo是什么?

ChatZoo是一款轻量级大模型评测工具。作为一名大模型行业的爱好者或从业者,您可以利用ChatZoo来调试和评测各种大模型的表现。它为您提供了一个交互式的环境,让您能够与多个模型同时对话,并评估它们的响应质量、语义准确性和流畅度。

Image

特性

  • 👏 轻松上手

    仅需一行命令即可快速启动整个服务,让您轻松上手。

  • 🎄界面美观

    ChatZoo提供一键换肤和代码渲染等功能,让您能够享受到更加个性化和舒适的体验。

  • 👌方便导出

    会话数据支持一键下载,投票结果以图表的方式呈现,便于分析。

  • 🔒隐私保护

    整个系统支持本地部署,保障聊天数据的隐私安全,确保不会泄露。

  • 🤗开源开放

    您可以获取源代码,并自由地添加新功能,使ChatZoo更符合您的需求。

安装

在安装前,您需要确保:

  • Python3
  • Node.js >= 18.5.0(👉开发者)

您可以直接通过git clone来获取整个工程文件:

git clone https://github.com/OpenLMLab/ChatZoo.git

下载完成后,您只需要在根目录下运行

pip install -r requirements.txt

来安装所有需要的依赖。

使用

pipeline

当您成功安装ChatZoo后,只需要在根目录下运行python main.py --config config.py即可拉起整个服务。

config.py中,您可以自行修改以设定你需要的配置,下面提供一个基础的样例:

# 模型列表:界面打开时出现的模型。(最多4个模型)
model_list = [
    {
        # 模型名称(参考HuggingFace中的名称,必需)
        "model_name_or_path": "THUDM/chatglm2-6b-32k",
        # 模型昵称(给模型的自定义名称,必需且不重复)
        "nickname": "chatglm2-6b-32k",
        # Tokenizer路径(参考HuggingFace中的名称,必需)
        "tokenizer_path": "THUDM/chatglm2-6b-32k",
        # 生成参数(若使用ChatZoo内设模型可不指定并使用默认配置,否则会报错)
        "generate_kwargs": {
            "max_length": 2048
        },
        # GPU
        "devices": "3",
        # 数据类型
        "dtype": "float16",
        # 基础模型(仅在LoRA的情况下可以使用)
        "base_model": None,
        # Prompt(若使用ChatZoo内设模型可不指定并使用默认配置,否则会报错)
        "prompts": {
             "meta_prompt": "",
             "user_prompt": "问: {}\n",
             "bot_prompt": "答: {}\n"
         }
    }
]
# 用户列表
user_list = [
    {
        # 用户名(必需),用于登录ChatZoo
        "username": "admin",
        # 角色(必需),可选annotate(标注者)或者debug(开发者)
        # 开发者权限:模型管理、会话标注、单轮标注
        # 标注者权限:会话标注、单轮标注
        "role": "annotate",
        # 最大会话标注数量
        "session_mark_num": 100, 
        # 最大单轮标注会话数量
        "single_mark_num": 100
     },
]
# 主机名(可选),默认为localhost
host_name = "10.140.0.216"
# 端口(可选),若不指定将自动寻找空闲端口
port = 8080
# 模式(必需),可选debug(调试模式)|arena(竞技场模式)
# 调试模式下,标注者不可进行标注
mode = "debug"
# 是否流式生成(必需)
is_stream = True
# 数据库类型(必需)
database_dtype = "sqlite"
# 数据库地址(必需)
database_path = "./data.db"

支持的模型

ChatZoo提供三种导入模型的方式:本地模型、外部网页接入和预设模型。

本地模型

ChatZoo通过ChatBot类提供了一些模型的实现,您可以直接使用:

添加自己的模型

您也可以添加自己的对话模型,以下提供两种方式:

👉优先推荐(HuggingFace模型) 对于HuggingFace中的模型🤗,您可以通过修改config.py中的部分字段来导入您需要的模型,比如您想添加llama模型,则可以将config.pymodel_list字段修改如下:

model_list = [
    {
        # 模型名称(参考HuggingFace中的名称,必需)
        "model_name_or_path": "decapoda-research/llama-7b-hf",
        # 模型昵称(给模型的自定义名称,必需且不重复)
        "nickname": "llama",
        # Tokenizer路径(参考HuggingFace中的名称,必需)
        "tokenizer_path": "decapoda-research/llama-7b-hf",
        # 生成参数(必须指定)
        "generate_kwargs": {
            "max_length": 2048
        },
        # GPU
        "devices": "3",
        # 数据类型
        "dtype": "float16",
        # 基础模型(仅在LoRA的情况下可以使用)
        "base_model": None,
        # Prompt(必须指定)
        "prompts": {
             "meta_prompt": "",
             "user_prompt": "问: {}\n",
             "bot_prompt": "答: {}\n"
         }
    }
]

👉另一种方式(非HuggingFace模型的情况)

1. 继承 ChatBOT 类

您可以通过在 generator/ 路径下新建一个文件,继承 ChatBOT 来展示您自己的对话模型。而如果您的模型是基于 🤗huggingface 中的模型实现的,那么您可以继承 TransformersChatBOT 类。您需要实现以下函数或属性:

  • load_tokenizer(self):从 config.tokenizer_path 中加载 tokenizer 的函数。如果您继承的是 TransformersChatBOT,那么该函数您无需重写。
  • get_prompt(self, query):从聊天记录 query 中构造模型输入的 prompt。query 是一个列表,每个成员是一个字典,代表一条聊天记录。其格式为:
[
    {"role":"HUMAN", "content":"你好!你是谁?"},
    {"role":"BOT", "content": "你好!我是机器人!"},
    {"role":"HUMAN", "content": "今天天气不错!"}
]
  • get_input(self, prompt):从 prompt 中获取输入的函数。prompt 即为 get_prompt 函数的返回值,您需要在该函数中返回一个字典作为模型生成的输入。比如在 TransformersChatBOT 中,该函数返回的是调用 tokenizer 后得到的字典。如果您继承的是 TransformersChatBOT,那么该函数您无需重写。
  • default_settings(self):配置生成参数的函数,比如 num_beamstop_ktop_p 等决定生成策略的函数。返回一个字典,key 为参数名,value 为默认值,前端界面会根据这些信息来定制生成配置的控件。如果您继承的是 TransformersChatBOT,那么大部分情况下该函数您无需重写。
  • extra_settings(self): 配置其它参数的函数,比如 eos_token_id 等固定的额外参数。返回一个字典,key 为参数名,value 为默认值,该字典会与网页中设置的参数一起作为 gen_kwargs 传入到生成函数中。
  • generate(self, input_dict, gen_kwargs):执行生成步骤的函数。input_dictget_input 返回的字典,gen_kwargs 是生成配置,这一步主要调用模型的生成方法进行生成。比如在 TransformersChatBOT 中,该函数会调用 model.generate 方法,然后将结果返回。如果输入的 token 数目过长,这个函数返回 None。如果您继承的是 TransformersChatBOT,那么大部分情况下该函数您无需重写。
  • get_response(self, output, input_dict):获取模型当轮回复的函数,并返回一个字符串。outputgenerate 函数的返回值,input_dictget_input 函数的返回值。这个函数主要用于提取模型的回复,比如从生成结果中删除前面的历史记录部分并使用 tokenizer 进行解码。如果您继承的是 TransformersChatBOT,那么大部分情况下该函数您无需重写。
  • process_response(self, response):对模型回复进行处理的函数,返回一个字符串。responseget_response 函数的返回值,该函数主要用于替换 response 中的一些特殊字符,比如 <s> <eoh> 等。聊天界面中展示的模型当轮回复就是该函数返回的字符串。如果您不需要对生成的字符串进行特殊处理,那么该函数您无需重写。
  • load_model(self):从 config.pretrained_path 中加载模型的函数。如果您继承的是 TransformersChatBOT,那么该函数您无需重写。
  • model_clsTransformersChatBOT 需要的属性,需要添加 @property 装饰器。用于指定您的模型类。
2. 构建映射关系(可选)

当您定义了您自己的 ChatBOT 后,您就可以通过参数 --type --pretrained_path--tokenizer_path(可选)来使用您自己的聊天机器人了。其中 --type 的值应为您自己的 ChatBOT 所在的文件名,启动时 ChatZoo 会自动根据文件名匹配并导入合适的类。

如果您想一劳永逸,那么您还可以在 config.py 中将您的预训练路径与 ChatBOT 文件名的对应关系添加到 MODEL_NAME_TO_MODEL_DICT 字典中。这样您在启动后端时就不必使用 --type 参数了。

外部网页接入

敬请期待...

预设模型

敬请期待...

模式介绍

针对不同的应用场景,ChatZoo提供两种模式:调试模式竞技场模式。您可以在config.py中修改mode来切换不同的模式。

调试模式

config.py中,

mode = "debug"

调试模式适用于模型的开发者,你可以在模型管理界面修改模型配置、增删模型。

修改模型配置

您可以点击某个模型上方的配置按钮,从而打开修改配置弹窗。 在修改完配置后,点击保存即可成功修改。

新增模型

点击右下角的+,即可在界面中加入新的模型(注意ChatZoo要求最多界面中同时出现4个模型)。ChatZoo提供三种模型导入的方式:

  • 本地模型

    • 模型名称:模型的自定义命名(注意各个模型的名字要求唯一)
    • 模型URL:模型部署的地址(通常在
  • 外部网页接入

    • 模型名称:模型的自定义命名(注意各个模型的名字要求唯一)
    • 模型URL:模型的API接口
  • 预设模型 选择您需要的模型即可。

删除模型

点击某个模型右上角的×,即可将该模型从界面中移除。

竞技场模式

config.py中,

mode = "arena"

竞技场模式适合标注者,在这个模式下,您无法对模型进行修改,只能与模型进行会话并标注。与模型的会话也分为两种模式:会话标注单回复标注

  • 会话标注 在会话标注模式下,您可以自由地与大模型进行聊天,并且在任意时候点击“标注”,为您喜欢的大模型进行投票。当您标注结束后,该会话将被标记为“已标注”状态,将不能再进行标注。

  • 单回复标注 在单回复标注模式下,每一次与大模型聊天后,都需要进行标注,才能进入下一轮对话。

结果分析

当您完成标注后,可以通过命令

python tools/elo_score.py --config config.py

生成统计数据与结果分析。 Result

引用我们

@misc{2023chatzoo,
    title={ChatZoo: Chat with Models to Debug, Evaluate, and Annotate.},
    author={OpenLMLab},
    howpublished = {\url{https://github.com/OpenLMLab/ChatZoo}},
    year={2023}
}