AnyTool/toolbench/tooleval/README_ZH.md
2024-02-23 15:13:06 +08:00

7.8 KiB
Raw Blame History

🛠️Tool Eval🤖

通过在ToolBench上对LLaMA进行微调我们得到了ToolLLaMA。考虑到人工评估非常耗时,我们借鉴AlpacaEval开发了一个高效的机器自动评估ToolEval,其中包含两个评估指标:

  • 通过率计算在有限的OpenAI API调用次数内成功完成指令的比例。

  • 偏好通过比较给定指令的两个答案动作序列来衡量。我们预先定义了一组更好答案的标准这些标准被组织成ChatGPT的提示。我们向评估器提供测试指令和两个候选答案并获得其偏好。我们对每个答案对进行多次评估以提高系统的可靠性。然后我们计算优胜率(被评估器选择为更优的百分比。有关详细信息,请参阅我们的论文。

为了验证ChatGPT评估器在通过率和胜率方面的可靠性我们从四种不同的方法ChatGPT+ReACTChatGPT+DFSDTToolLLaMA+DFSDT和GPT4+DFSDT中进行采样为每种方法的300个测试指令获取解决方案对。然后我们请人类标注ChatGPT+DFSDTToolLLaMA+DFSDT和GPT4+DFSDT的通过率以及ChatGPT+ReACT和ChatGPT+DFSDT之间的胜率。

我们的ChatGPT评估器在通过率方面与人类标注者具有高达**87.1%的一致性,在胜率方面具有80.3%**的一致性。这个结果表明,我们的评估器生成的评估结果与人类非常相似,并且可以视为在通过率和胜率上模拟人类评估的可靠评估器。 有关ToolEval的更多细节请参阅我们的论文。

🚀用法

Install

Install Package (python>=3.9)

pip install -r requirements.txt

Evaluation

若要复现结果,直接通过Google Drive下载我们的reproduction_data.zip,解压后置reproduction_dataToolBench/data/下即可,可以跳过数据准备流程。

  • 数据准备。若要使用 ToolEval 评估您自己的模型和方法,首先需要为六个测试子集准备所有的模型预测。创建一个以您的模型和方法命名的目录,例如 chatgpt_cot,然后将每个测试集的预测放在该目录下。目录的文件结构应如下:
├── /chatgpt_cot/
│  ├── /G1_instruction/
│  │  ├── /10160_CoT@1.json
│  │  └── ...
│  ├── /G1_tool/
│  │  ├── /10221_CoT@1.json
│  │  └── ...
│  ├── ...
│  ├── /G3_instruction/
│  │  ├── /10221_CoT@1.json
│  │  └── ...

然后对模型预测进行预处理:

export RAW_ANSWER_PATH=../../data/reproduction_data/model_predictions/
export CONVERTED_ANSWER_PATH=../../data/reproduction_data/model_predictions_converted/
export MODEL_NAME=chatgpt_cot
export METHOD=CoT
mkdir ${CONVERTED_ANSWER_PATH}/${MODEL_NAME}
for test_set in G1_instruction G1_category G1_tool G2_category G2_instruction G3_instruction
do
    answer_dir=${RAW_ANSWER_PATH}/${MODEL_NAME}/${test_set}
    output_file=${CONVERTED_ANSWER_PATH}/${MODEL_NAME}/${test_set}.json
    python convert_to_answer_format.py\
        --answer_dir ${answer_dir} \
        --method ${METHOD} \
        --output ${output_file}
done

之后,检查${CONVERTED_ANSWER_PATH}/${MODEL_NAME}下是否有测试集的预处理JSON文件。如果有你就可以准备运行以下评估过程了。如果没有请检查模型的预测是否有问题。

  • OpenAI Key 准备您的OpenAI Key来搭建我们的evaluator。Key需要被存储到一个json file中path/to/your/openai_key_json_file.json
[
    {
        "username": "your_user_name",
        "passwd": "your_password",
        "api_key": "your_openai_key",
        "organization": "your_organization"
    },
    ...
]
  • Pass rate.
export CONVERTED_ANSWER_PATH=../../data/reproduction_data/model_predictions_converted/
export SAVE_PATH=pass_rate_results
export CANDIDATE_MODEL=chatgpt_cot
export API_POOL_FILE=path/to/your/openai_key_json_file.json

python eval_pass_rate.py \
    --converted_answer_path ${CONVERTED_ANSWER_PATH} \
    --save_path ${SAVE_PATH} \
    --reference_model ${CANDIDATE_MODEL} \
    --test_ids ../../data/test_query_ids/ \
    --max_eval_threads 20 \
    --evaluate_times 4

结果文件会被存储至${SAVE_PATH}中。

  • Win rate. 以下示例以ChatGPT-ReACT作为参考模型GPT4-ReACT作为候选模型。请注意您首先需要获取两个模型的pass rate结果然后运行以下命令来评估GPT4-ReACT的win rate结果:
export CONVERTED_ANSWER_PATH=../../data/reproduction_data/model_predictions_converted/
export SAVE_PATH=preference_results
export PASS_TARE_PATH=pass_rate_results
export REFERENCE_MODEL=chatgpt_cot
export CANDIDATE_MODEL=gpt-4-0613_cot
export API_POOL_FILE=path/to/your/openai_key_json_file.json

python eval_preference.py \
    --converted_answer_path ${CONVERTED_ANSWER_PATH} \
    --reference_model ${REFERENCE_MODEL} \
    --output_model ${CANDIDATE_MODEL} \
    --test_ids ../../data/test_query_ids/ \
    --save_path ${SAVE_PATH} \
    --pass_rate_result_path ${PASS_TARE_PATH} \
    --max_eval_threads 20 \
    --use_pass_rate true \
    --evaluate_times 4

结果文件会被存储至${SAVE_PATH}中。

评估新方法

要评估除了ReACT和DFSDT之外的方法您需要遵循以上Data preparation的步骤准备您的预处理好的answer数据。预处理好的answer数据需遵循以下json格式:

[
    {
        "method":"method name",
        "total_steps": int, // a integer count total steps in answer details
        "final_answer": "final answer from the method",
        "answer_details":[{
            "role":"node role, can be system, user, assistant and tool",
            "message":"message for the node",
            "next":[//next steps, can have multiple elements if the node have multiple candidates.
                {
                    "role":"",
                    "message":"",
                    "next":[...]
                },
                ...//more candidates
            ]
        }]
    }
    ... // more answers for the give query in the testdata
]

更新排行榜

如果您想将您的模型的结果上传到ToolEval Leaderboard请您将您的结果文件整理成上述格式发送给我们urtoolbench@gmail.com或者开一个pull request。 我们将运行评测脚本更新结果并将您的模型添加到排行榜中。

创建新的自动评估器

如果您想创建新的自动评估器,您需要按下列步骤进行:

  1. 在路径toolbench/tooleval/evaluators下创建一个评测器配置文件目录,命名与你的评测器名一致。在其中添加config.yaml文件与template.txt文件。具体配置方式可参考toolbench/tooleval/evaluators/tooleval_gpt-3.5-turbo_normalized中的实现。
  2. 创建你的evaluator类并实现fn_completions函数在文件夹toolbench/tooleval/evaluators/registered_cls中,或者你可以使用我们预先定义好的类例如OpenAINormalizedEvaluator。 完成后将配置文件中registered_cls_name字段填写为该类的名称。 这里给出一个例子:
from evaluators import register_evaluator,BaseEvaluator
from typing import Dict,List

@register_evaluator
class MyEvaluator(BaseEvaluator):
    def __init__(self,config):
        super().__init__(
            fn_completions=self.fn_completions,
        )
        # set your configures here
    
    def fn_completions(self,query:Dict,answers:List[Dict])->int:
        # implement your evaluator here
        # return the index of the preferred answer
        return 0

其中register_evaluator是一个装饰器用于注册评估器BaseEvaluator是一个基类用于实现评估器的基本功能。 3. 测试评估器的性能,运行脚本evaluators_comparison.py