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

173 lines
7.8 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div align= "center">
<h1> 🛠Tool Eval🤖</h1>
</div>
通过在ToolBench上对LLaMA进行微调我们得到了**ToolLLaMA**。考虑到人工评估非常耗时,我们借鉴[AlpacaEval](https://tatsu-lab.github.io/alpaca_eval/)开发了一个高效的机器自动评估**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)
```bash
pip install -r requirements.txt
```
### Evaluation
*若要复现结果,直接通过[Google Drive](https://drive.google.com/drive/folders/1yBUQ732mPu-KclJnuQELEhtKakdXFc3J)下载我们的`reproduction_data.zip`,解压后置`reproduction_data`于`ToolBench/data/`下即可,可以跳过数据准备流程。*
- 数据准备。若要使用 ToolEval 评估您自己的模型和方法,首先需要为六个测试子集准备所有的模型预测。创建一个以您的模型和方法命名的目录,例如 `chatgpt_cot`,然后将每个测试集的预测放在该目录下。目录的文件结构应如下:
```
├── /chatgpt_cot/
│ ├── /G1_instruction/
│ │ ├── /10160_CoT@1.json
│ │ └── ...
│ ├── /G1_tool/
│ │ ├── /10221_CoT@1.json
│ │ └── ...
│ ├── ...
│ ├── /G3_instruction/
│ │ ├── /10221_CoT@1.json
│ │ └── ...
```
然后对模型预测进行预处理:
```bash
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`
```bash
[
{
"username": "your_user_name",
"passwd": "your_password",
"api_key": "your_openai_key",
"organization": "your_organization"
},
...
]
```
- Pass rate.
```bash
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结果:
```bash
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格式:
```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](https://openbmb.github.io/ToolBench/)请您将您的结果文件整理成上述格式发送给我们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`字段填写为该类的名称。
这里给出一个例子:
```Python
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`。