# Multi-LLM-Agent **Repository Path**: data_factory/Multi-LLM-Agent ## Basic Information - **Project Name**: Multi-LLM-Agent - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-21 - **Last Updated**: 2024-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ✨α-UMi: 多模型协作工具调用agent框架
Weizhou Shen1, Chenliang Li2, Hongzhan Chen1, Ming Yan2*, Xiaojun Quan1*, Hehong Chen2, Ji Zhang2, Fei Huang2
shenwzh3@mail2.sysu.edu.cn, quanxj3@mail.sysu.edu.cn, ym119608@alibaba-inc.com
1中山大学 2阿里巴巴集团
*Corresponding authors
Demo ModelScope
English | 简体中文
传统单LLM代理框架(上)与α-UMi(下)的概念对比。
α-UMi 是一个用于工具学习的多LLM协作智能体。它将单个LLM的能力分解为三个组件,即规划器(planner)、调用器(caller)和总结器(summarizer)。在智能体执行的每一步中,规划器根据系统的状态为当前步骤生成理由,并选择调用器或总结器来生成下游输出。调用器由理由指导,并负责调用特定的工具进行交互。总结器在规划器的指导下,根据执行轨迹制定最终的用户答案。
一个展示 α-UMi 如何完成任务的插图。
一个展示 α-UMi 如何通过反思完成任务的插图。
## 亮点 * 使小型LLMs能够协作,并在工具学习中超越性能强大的闭源大型语言模型。 * 比单LLM智能体系统更灵活的提示设计。 * 两阶段的全局到局部渐进式微调(GLPFT)用于成功训练多模型协作智能体。 ## 更新 * [01.30] 我们发布了✨α-UMi的代码,以及它的模型参数。 ## 模型参数 | Model | 7b | 13b | |-------|----|----| | planner | [huggingface](https://huggingface.co/shenwzh3/alpha-umi-planner-7b) / [modelscope](https://www.modelscope.cn/models/iic/alpha-umi-planner-7b) | [huggingface](https://huggingface.co/shenwzh3/alpha-umi-planner-13b) / [modelscope](https://www.modelscope.cn/models/iic/alpha-umi-planner-13b) | | caller | [huggingface](https://huggingface.co/shenwzh3/alpha-umi-caller-7b) / [modelscope](https://www.modelscope.cn/models/iic/alpha-umi-caller-7b) | [huggingface](https://huggingface.co/shenwzh3/alpha-umi-caller-13b) / [modelscope](https://www.modelscope.cn/models/iic/alpha-umi-caller-13b) | | summarizer | [huggingface](https://huggingface.co/shenwzh3/alpha-umi-summarizer-7b) / [modelscope](https://www.modelscope.cn/models/iic/alpha-umi-summarizer-7b) | [huggingface](https://huggingface.co/shenwzh3/alpha-umi-summarizer-13b) / [modelscope](https://www.modelscope.cn/models/iic/alpha-umi-summarizer-13b) | ## 使用 ### Install Requirements 1. 创建conda环境 ```bash conda create -n multi_llm_agent python=3.10 conda activate multi_llm_agent ``` 2. 安装PyTorch ``` pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 ``` 3. 安装其他环境依赖 ```bash pip install -r requirements.txt ``` ### 数据准备 #### ToolBench 1. 首先从 [Google Drive](https://drive.google.com/drive/folders/1yBUQ732mPu-KclJnuQELEhtKakdXFc3J) 或 [Tsinghua Cloud](https://cloud.tsinghua.edu.cn/f/c9e50625743b40bfbe10/)下载ToolBench的原始数据集,并把数据放到 ```./data``` 路径下. 2. 训练数据预处理 ``` cd ./GLPFT ORI_DATA_DIR="../data/toolbench/data" # your data path to save the toolbench raw data RAW_DATA_OUT_DIR="dataset/toolbench/train/raw_data" TRAIN_DATA_OUT_DIR="dataset/toolbench/train" export PYTHONPATH=./ python process_data/toolbench/prepro_raw_stage_1.py \ --data_dir $ORI_DATA_DIR \ --output_path $RAW_DATA_OUT_DIR python process_data/toolbench/prepro_raw_stage_2.py \ --input_path $RAW_DATA_OUT_DIR/raw_data_stage_1.json \ --output_path $RAW_DATA_OUT_DIR for MODE in 'backbone' 'planner' 'caller' 'summarizer' do python process_data/toolbench/prepro_$MODE.py \ --input_path $RAW_DATA_OUT_DIR/raw_data_stage_2.json \ --output_path $TRAIN_DATA_OUT_DIR/train_$MODE.json \ --prompt_type toolbench_$MODE done ``` 在运行上述脚本后,您将创建用于GLPFT的ToolBench训练数据,这些数据将被存储在```./GLPFT/dataset/toolbench/train```中。 ### GLPFT训练 我们的α-UMi采用了两阶段的GLPFT微调方法,首先对主干大型语言模型(LLM)进行预热,然后分别对planner、caller、summarizer进行微调。 1. 首先,我们对一个LLM底座进行微调,使其学习整个工具调用智能体任务。 ``` cd ./GLPFT LLAMA_PATH="" # your path for initial LLM checkpoint NNODE=8 PORT=12345 BSZ=6 GA=1 EXP_NAME=/toolbench/backbone # path to save model export PYTHONPATH=./ torchrun --nproc_per_node=$NNODE --master_port=$PORT train_mem.py \ --model_name_or_path $LLAMA_PATH \ --data_path dataset/toolbench/train/train_backbone.json\ --output_dir saved_models/$EXP_NAME \ --num_train_epochs 2 \ --per_device_train_batch_size $BSZ \ --per_device_eval_batch_size $BSZ \ --gradient_accumulation_steps $GA \ --evaluation_strategy "no" \ --eval_steps 0 \ --save_strategy "steps" \ --save_steps 500 \ --save_total_limit 8 \ --learning_rate 5e-5 \ --warmup_ratio 0.4 \ --lr_scheduler_type "cosine" \ --gradient_checkpointing True \ --deepspeed ds_configs/stage3-a100.json \ --bf16 \ --logging_steps 2 \ --model_max_length 4096 \ --report_to none \ --lazy_preprocess True ``` 2. 在获得了backbone模型后,我们开始基于这个模型对planner、caller和summarizer进行微调: ``` cd ./GLPFT NNODE=8 PORT=12345 BSZ=6 GA=1 BB_PATH="saved_models/toolbench/backbone" EXP_NAME=/toolbench/planner export PYTHONPATH=./ torchrun --nproc_per_node=$NNODE --master_port=$PORT train_mem.py \ --model_name_or_path $BB_PATH \ --data_path dataset/toolbench/train/train_planner.json \ --output_dir saved_models/$EXP_NAME \ --num_train_epochs 1 \ --per_device_train_batch_size $BSZ \ --per_device_eval_batch_size $BSZ \ --gradient_accumulation_steps $GA \ --evaluation_strategy "no" \ --eval_steps 0 \ --save_strategy "steps" \ --save_steps 500 \ --save_total_limit 8 \ --learning_rate 1e-5 \ --weight_decay 0.01 \ --warmup_ratio 0.2 \ --lr_scheduler_type "cosine" \ --gradient_checkpointing True \ --bf16 \ --logging_steps 2 \ --model_max_length 4096 \ --report_to none \ --lazy_preprocess True EXP_NAME=/toolbench/caller export PYTHONPATH=./ torchrun --nproc_per_node=$NNODE --master_port=$PORT train_mem.py \ --model_name_or_path $BB_PATH \ --data_path dataset/toolbench/train/train_caller.json \ --output_dir saved_models/$EXP_NAME \ --num_train_epochs 1 \ --per_device_train_batch_size $BSZ \ --per_device_eval_batch_size $BSZ \ --gradient_accumulation_steps $GA \ --evaluation_strategy "no" \ --eval_steps 0 \ --save_strategy "steps" \ --save_steps 500 \ --save_total_limit 8 \ --learning_rate 1e-5 \ --weight_decay 0.01 \ --warmup_ratio 0.2 \ --lr_scheduler_type "cosine" \ --gradient_checkpointing True \ --bf16 \ --logging_steps 2 \ --model_max_length 4096 \ --report_to none \ --lazy_preprocess True EXP_NAME=/toolbench/summarizer export PYTHONPATH=./ torchrun --nproc_per_node=$NNODE --master_port=$PORT train_mem.py \ --model_name_or_path $BB_PATH \ --data_path dataset/toolbench/train/train_summarizer.json \ --output_dir saved_models/$EXP_NAME \ --num_train_epochs 2 \ --per_device_train_batch_size $BSZ \ --per_device_eval_batch_size $BSZ \ --gradient_accumulation_steps $GA \ --evaluation_strategy "no" \ --eval_steps 0 \ --save_strategy "steps" \ --save_steps 500 \ --save_total_limit 8 \ --learning_rate 1e-5 \ --weight_decay 0.01 \ --warmup_ratio 0.4 \ --lr_scheduler_type "cosine" \ --gradient_checkpointing True \ --bf16 \ --logging_steps 2 \ --model_max_length 4096 \ --report_to none \ --lazy_preprocess True ``` ### 推理和评估 我们为论文Section 4.1的实验提供了静态测试数据,存放在```./GLPFT/dataset/toolbench/test```目录下,我们可以通过运行以下脚本来进行 α-UMi 系统的推理和评估:: ``` cd ./GLPFT NNODE=8 PORT=12345 PLAN_PATH="saved_models/planner" CAL_PATH="saved_models/caller" SUM_PATH="saved_models/summarizer" LAB_DIR=output_res/toolbench P_TYPE_PLAN=toolbench_planner P_TYPE_CAL=toolbench_caller P_TYPE_SUM=toolbench_summarizer for DOMAIN in 'in_domain' 'out_of_domain' do export PYTHONPATH=./ torchrun --nproc_per_node=$NNODE --master_port=$PORT inference_utils/toolbench/infer_pipeline.py \ --planner_model_name_or_path $PLAN_PATH \ --planner_use_lora False \ --caller_model_name_or_path $CAL_PATH \ --caller_use_lora False \ --summarizer_model_name_or_path $SUM_PATH \ --summarizer_use_lora False \ --per_device_eval_batch_size 1 \ --data_path dataset/toolbench/test/$DOMAIN.json \ --bf16_full_eval \ --assistant_prompt_type $P_TYPE_PLAN \ --caller_prompt_type $P_TYPE_CAL \ --conclusion_prompt_type $P_TYPE_SUM \ --max_input_length 3750 \ --output_dir $LAB_DIR/$DOMAIN python inference_utils/toolbench/evaluate-multi_agent.py \ --input_path $LAB_DIR/$DOMAIN/predictions.json \ --output_path $LAB_DIR/$DOMAIN/metrics.json done ``` ## α-UMi 与 RapidAPI 模拟器 我们支持像ToolBench团队([github](https://github.com/OpenBMB/ToolBench))一样使用真实的RapidAPI环境来运行我们的α-UMi,代码在 ```./ToolBench-multiLLM```目录下。在开始之前,你需要先填写[表格](https://forms.gle/oCHHc8DQzhGfiT9r6)来向ToolBench团队获取一个ToolBench Key. 之后你可以使用训练好的planner, caller和summarizer来运行一个RapidAPI模拟环境: ``` cd ToolBench-multiLLM DATA_DIR="../data/toolbench/data" PLAN_PATH="../GLPFT/saved_models/planner" CAL_PATH="../GLPFT/saved_models/caller" SUM_PATH="../GLPFT/saved_models/summarizer" EXP_NAME="multi-llm-agent" TBKEY="" # your toolbench key for TEST_SET in 'G1_category' 'G1_instruction' 'G1_tool' 'G2_category' 'G2_instruction' 'G3_instruction' do export PYTHONPATH=./ python toolbench/inference/qa_pipeline.py \ --backbone_model collab_agent_v3 \ --tool_root_dir $DATA_DIR/toolenv/tools/ \ --user_agent_collab True \ --planner_model_path $PLAN_PATH \ --planner_use_lora False \ --caller_model_path $CAL_PATH \ --caller_use_lora False \ --summarizer_model_path $SUM_PATH \ --summarizer_use_lora False \ --use_multi_gpu True \ --max_observation_length 1024 \ --observ_compress_method truncate \ --method DFS_woFilter_w2 \ --input_query_file $DATA_DIR/test_instructions/$TEST_SET.json \ --output_answer_file output_res/$EXP_NAME/$TEST_SET \ --toolbench_key $TBKEY done ``` 我们也支持像ToolBench一样使用通过率(pass_rate)和胜率(win_rate)来评估系统. 评估通过率: ``` export PYTHONPATH=./ export ORI_ANSWER_PATH=output_res/multi-llm-agent export CONVERTED_ANSWER_PATH=output_res/converted/multi-llm-agent mkdir ${CONVERTED_ANSWER_PATH} for test_set in "G1_instruction" "G1_category" "G1_tool" "G2_category" "G2_instruction" "G3_instruction" do answer_dir=$ORI_ANSWER_PATH/$test_set output_file=${CONVERTED_ANSWER_PATH}/${test_set}.json python toolbench/tooleval/convert_to_answer_format.py\ --answer_dir ${answer_dir} \ --method DFS_woFilter_w2 \ --output ${output_file} done export SAVE_PATH=pass_rate_results/multi-llm-agent export CANDIDATE_MODEL=multi-llm-agent export DATA_DIR="data/toolbench" export API_POOL_FILE=path/to/your/openai_key_json_file.json export PYTHONPATH=./ python toolbench/tooleval/eval_pass_rate.py \ --converted_answer_path ${CONVERTED_ANSWER_PATH} \ --save_path ${SAVE_PATH} \ --reference_model ${CANDIDATE_MODEL} \ --test_ids $DATA_DIR/test_query_ids \ --max_eval_threads 1 \ --evaluate_times 7 ``` 在评估胜率时,我们使用ToolBench团队发布的chatgpt_cot来作为标准对比模型,我们需要先计算chatgpt_cot的通过率: ``` # to evaluate win rate, we need to first convert the chatgpt_cot results and compute its pass rate export REF_ANSWER_PATH=data/toolbench/reproduction_data/model_predictions/chatgpt_cot export REF_CONVERTED_ANSWER_PATH=data/toolbench/reproduction_data/model_predictions_converted/chatgpt_cot for test_set in "G1_instruction" "G1_category" "G1_tool" "G2_category" "G2_instruction" "G3_instruction" do answer_dir=$ORI_ANSWER_PATH/$test_set output_file=${CONVERTED_ANSWER_PATH}/${test_set}.json python toolbench/tooleval/convert_to_answer_format.py\ --answer_dir ${answer_dir} \ --method DFS_woFilter_w2 \ --output ${output_file} done export SAVE_PATH=pass_rate_results/chatgpt_cot export CANDIDATE_MODEL=chatgpt_cot export DATA_DIR="data/toolbench/data" export API_POOL_FILE=path/to/your/openai_key_json_file.json export PYTHONPATH=./ python toolbench/tooleval/eval_pass_rate.py \ --converted_answer_path ${CONVERTED_ANSWER_PATH} \ --save_path ${SAVE_PATH} \ --reference_model ${CANDIDATE_MODEL} \ --test_ids $DATA_DIR/test_query_ids \ --max_eval_threads 1 \ --evaluate_times 7 ``` 然后我们开始评估胜率: ``` export OUTPUT_CONVERTED_ANSWER_PATH=output_res/converted/multi-llm-agent export SAVE_PATH=win_rate_results export REF_PASS_TARE_PATH=pass_rate_results/chatgpt_cot export OUTPUT_PASS_TARE_PATH=pass_rate_results/v9/multi-llm-agent export REFERENCE_MODEL=chatgpt_cot export CANDIDATE_MODEL=multi-llm-agent # export API_POOL_FILE=path/to/your/openai_key_json_file.json export PYTHONPATH=./ python toolbench/tooleval/eval_preference.py \ --ref_converted_answer_path ${REF_CONVERTED_ANSWER_PATH} \ --output_converted_answer_path ${OUTPUT_CONVERTED_ANSWER_PATH} \ --reference_model ${REFERENCE_MODEL} \ --output_model ${CANDIDATE_MODEL} \ --test_ids data/test_query_ids/ \ --save_path ${SAVE_PATH} \ --ref_pass_rate_result_path ${REF_PASS_TARE_PATH} \ --output_pass_rate_result_path ${OUTPUT_PASS_TARE_PATH} \ --max_eval_threads 1 \ --use_pass_rate true \ --evaluate_times 7 ``` ## 实验结果 静态评估实验结果 (与标注的逐步比较)
真实评估结果 (调用真实api完成用户任务)
## To do - [ ] 发布我们用于ToolAlpaca的模型和代码. - [ ] 发布我们用于 MATH和GSM8K的模型和代码,以及我们的训练数据 (使用TORA (Gou et al., 2023)样式收集) - [ ] 使α-UMi泛化到更多的智能体任务。 ## 引用 ``` @misc{shen2024small, title={Small LLMs Are Weak Tool Learners: A Multi-LLM Agent}, author={Weizhou Shen and Chenliang Li and Hongzhan Chen and Ming Yan and Xiaojun Quan and Hehong Chen and Ji Zhang and Fei Huang}, year={2024}, eprint={2401.07324}, archivePrefix={arXiv}, primaryClass={cs.AI} } ```