해당 글에서는 대규모 언어 모델에 대한 API 사용을 향상시키는 새로운 프레임워크인 ToolLLM을 소개드리고자 합니다. LLaMA는 instruct tuning 데이터셋 ToolBench에서 미세 조정되었으며, 획득한 ToolLLaMA는 ChatGPT와 동일한 성능을 가집니다.
핵심아이디어
이 논문의 핵심 아이디어는 “ToolLLM”이라는 프레임워크를 통해 오픈 소스 대형 언어 모델이 사람의 지시를 따라 외부 도구(APIs)를 더 효과적으로 사용할 수 있도록 하는 것입니다. 이를 위해, 저자들은 데이터 구성, 모델 훈련, 평가를 포함하는 일련의 과정을 개발하였습니다.
요약
이 논문은 “ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs”라는 제목으로, 오픈 소스 대형 언어 모델(LLMs)과 그 변형들이 고수준 작업을 수행하는 데에 상당한 한계가 있다는 것을 지적하고 있습니다. 특히, 사람의 지시를 따라 외부 도구(APIs)를 사용하는 것이 어렵다는 점을 지적하며, 이는 현재의 지시 튜닝이 기본 언어 작업에 초점을 맞추고 있기 때문입니다.
이와 대조적으로, 최첨단 LLMs인 ChatGPT는 탁월한 도구 사용 능력을 보여주었지만, 불행히도 이는 폐쇄 소스입니다. 이러한 문제를 해결하기 위해, 저자들은 ToolLLM이라는 일반적인 도구 사용 프레임워크를 소개하고 있습니다. 이 프레임워크는 데이터 구성, 모델 훈련, 평가를 포함하고 있습니다.
먼저, 저자들은 ToolBench라는 도구 사용에 대한 지시 튜닝 데이터셋을 제시합니다. 이 데이터셋은 ChatGPT를 사용하여 자동으로 생성되었습니다. 구체적으로는, RapidAPI Hub에서 49개의 카테고리에 걸쳐 16,464개의 실제 RESTful API를 수집하고, 이 API들을 포함하는 다양한 인간의 지시를 ChatGPT에게 생성하도록 요청합니다. 이는 단일 도구와 다중 도구 시나리오를 모두 포함합니다.
마지막으로, 각 지시에 대한 유효한 해결 방법 경로(API 호출의 연쇄)를 찾기 위해 ChatGPT를 사용합니다. 검색 과정을 더 효율적으로 만들기 위해, 저자들은 새로운 깊이 우선 탐색 기반 결정 트리(DFSDT)를 개발하였습니다. 이를 통해 LLMs가 여러 추론 흔적을 평가하고 검색 공간을 확장할 수 있게 되었습니다.
도구 사용 평가를 효율적으로 하기 위해, 저자들은 자동 평가기인 ToolEval을 개발하였습니다. LLaMA를 ToolBench에서 미세 조정하여 ToolLLaMA를 얻었습니다. ToolEval에 따르면, ToolLLaMA는 복잡한 지시를 실행하고 보이지 않는 API에 일반화하는 놀라운 능력을 보여주며, ChatGPT와 비교할 수 있는 성능을 보여줍니다.
파이프라인을 더 실용적으로 만들기 위해, 저자들은 각 지시에 대해 적절한 API를 추천하는 신경 API 검색기를 개발하였습니다. 이를 통해 수동 API 선택의 필요성이 없어졌습니다.
소개
오픈 소스 대규모 언어 모델(LLM)과 그 변형(예: LLaMA 및 Vicuna)이 다양한 작업에서 놀라운 발전을 이룬 것을 모든 사람이 보았을 것이라고 생각합니다.
그러나 LLM은 강력하지만 사람의 지시에 따라 LLM이 외부 도구(API)를 사용하도록 만드는 것과 같은 고급 작업을 수행하는 데는 여전히 매우 제한적이며 이는 많은 오픈 소스 LLM에서 어려운 일입니다.
그 이유는 현재 LLM의 명령어 튜닝 기술은 주로 기본 언어 작업에 초점을 맞추고 도구 사용에 대한 탐색이 부족하기 때문입니다. 이것은 뛰어난 도구 사용을 입증한 ChatGPT와 같은 최첨단 폐쇄 소스 모델과 극명한 대조를 이룹니다.
오픈 소스 LLM이 외부 도구를 더 잘 사용하도록 하기 위해 중국 칭화 대학교, 중국 인민 대학교, 예일, 텐센트, Zhihu 및 기타 기관의 연구원들이 공동으로 논문을 작성했습니다. 그들은 데이터 구성, 모델을 포함하는 일반적인 도구 사용 프레임워크 ToolLLM을 도입했습니다. 여러 기능에 대한 교육 및 평가.
이 연구가 RapidAPI Hub에서 49개 범주를 다루는 16464개의 실제 RESTful API를 수집했다는 점을 언급할 가치가 있습니다.
이 연구는 ToolBench(명령 튜닝 데이터 세트)에서 LLaMA를 미세 조정하고 ToolLLaMA를 획득했습니다. ToolEval(자동 평가기) 평가에 따르면 ToolLLaMA는 복잡한 명령을 실행하고 알 수 없는 API로 일반화하는 탁월한 기능을 나타내며 도구 사용 측면에서 성능은 ChatGPT와 비슷합니다.
- 종이 주소 : https://arxiv.org/pdf/2307.16789.pdf
- 프로젝트 주소 : https://github.com/OpenBMB/ToolBench
ToolLLM 란?
이 백서는 먼저 ChatGPT에 의해 자동으로 생성되는 도구 사용을 위한 명령 튜닝 데이터 세트인 ToolBench를 소개합니다. 구체적으로 연구팀은 RapidAPI Hub에서 49개 범주를 포괄하는 16,464개의 실제 RESTful API를 수집한 다음 ChatGPT가 단일 도구 및 다중 도구 시나리오를 모두 다루는 이러한 API와 관련된 다양한 인간 지침을 생성하도록 했습니다. 마지막으로 ChatGPT를 사용하여 각 명령에 대한 유효한 솔루션 경로(일련의 API 호출)를 검색합니다. 검색 프로세스를 보다 효율적으로 만들기 위해 LLM이 여러 추론 궤적을 평가하고 검색 공간을 확장할 수 있는 새로운 DFSDT(깊이 우선 검색 기반 결정 트리)를 개발했습니다.
데이터 세트 측면에서. 그림 1에서 볼 수 있듯이 연구원들은 먼저 일부 고품질 명령 튜닝 데이터 세트인 ToolBench를 수집했습니다. 이 데이터 세트는 최신 ChatGPT(gpt-3.5-turbo-16k)를 사용하여 자동으로 구성됩니다.
구체적으로 ToolBench의 구성은 API 수집, 명령 생성 및 솔루션 경로 주석의 세 단계로 구성됩니다.
API 수집
연구팀은 RapidAPI에서 16464개의 REST(representational state transfer) API를 수집했다. 이러한 API는 소셜 미디어, 전자 상거래 및 날씨와 같은 49가지 범주를 다룹니다. 각 API에 대해 연구팀은 기능 설명, 필수 매개변수, API 호출을 위한 코드 스니펫 등을 포함하여 RapidAPI에서 자세한 API 문서를 스크랩합니다. 그들은 LLM이 이러한 문서를 이해함으로써 API를 사용하는 방법을 배울 수 있기를 바랍니다. 그러면 모델이 훈련 중에 볼 수 없었던 API로 일반화될 수 있습니다.
참고: RapidAPI는 개발자를 수천 개의 실제 API와 연결하는 선도적인 API 마켓플레이스입니다. 이 플랫폼에서 개발자는 RapidAPI 키를 등록하기만 하면 다양한 API를 검색, 테스트 및 연결할 수 있습니다.
RapidAPI의 계층 구조(왼쪽)와 명령 생성 프로세스(오른쪽)는 아래 그림과 같습니다. 각 도구에 대해 연구원은 다음 정보를 크롤링했습니다: 도구의 이름과 설명, 호스트의 URL, 도구에 속하는 모든 사용 가능한 API, 각 API에 대해 연구원은 이름, 설명, HTTP 메서드, 필요한 정보를 기록했습니다. 매개변수, 선택적 매개변수, API 호출을 위한 실행 가능한 코드 스니펫 등
그 과정에서 API 필터링도 필요했습니다. 처음에 이 연구는 RapidAPI에서 10,853개의 도구(53,190개의 API)를 수집했습니다. 그러나 이러한 API의 품질과 안정성은 크게 다를 수 있습니다. 이를 위해 그들은 ToolBench의 최종 도구 집합이 신뢰할 수 있고 기능적인지 확인하기 위해 엄격한 심사 프로세스를 수행했습니다. 결국 3451개의 고품질 도구(16464 API)만 남았습니다.
명령 생성
연구팀은 먼저 전체 프로그램에서 API를 샘플링한 다음 ChatGPT에 이러한 API에 대한 다양한 지침을 생성하도록 요청했습니다. 현실적인 시나리오를 다루기 위해 단일 도구 및 다중 도구 시나리오와 관련된 지침을 큐레이팅하여 모델이 개별 도구와 상호 작용하는 방법뿐만 아니라 이를 결합하여 복잡한 작업을 수행하는 방법도 학습하도록 했습니다.
고품질 지침을 생성하려면 두 가지 중요한 속성이 필요합니다. LLM이 광범위한 API 사용 시나리오를 처리하고 종종 상호 작용하기 위해 여러 도구가 필요한 실제 상황을 반영하여 LLM의 실제 적용을 개선할 수 있도록 다양성 및 다중 도구 사용 섹스와 유연성. 이를 위해 연구팀은 명령어 생성에 상향식 접근 방식을 채택했다. API 수집부터 시작하여 이러한 API를 터치하는 다양한 명령어를 만드는 것이다.
모든 API 및 조합에 대한 명령 생성 프로세스는 다음과 같으며 특정 프로세스는 원본 텍스트를 참조하십시오.
솔루션 경로 주석
연구팀은 이러한 명령에 대한 고품질 응답에 주석을 추가합니다. 각 응답에는 최종 응답에 도달하기 위한 여러 라운드의 모델 추론 및 실시간 API 호출이 포함될 수 있습니다. 도구 학습 자체의 어려움으로 인해 가장 복잡한 LLM(예: GPT-4)도 복잡한 명령에 대한 통과율이 낮아 비효율적인 데이터 수집이 발생합니다. 이를 위해 연구팀은 LLM의 계획 및 추론 기능을 향상시키기 위해 새로운 DFSDT(깊이 우선 검색 기반 결정 트리)를 개발했습니다. 기존의 사고 사슬(CoT) 및 ReACT와 비교할 때 DFSDT는 LLM이 여러 추론 경로를 평가하고 단계를 철회하거나 유망한 경로를 따라 앞으로 나아가도록 의도적인 결정을 내릴 수 있도록 합니다. 실험에서 DFSDT는 주석 효율성을 크게 개선하고 CoT 또는 ReACT로 답변할 수 없는 복잡한 명령을 성공적으로 완료합니다.
아래 그림은 모델 추론 중 DFSDT와 기존 CoT 또는 ReACT를 비교한 것입니다(왼쪽).
아래 표는 ToolBench를 다른 연구와 비교한 것입니다.
실험 및 결과
이 논문은 실험을 통해 ToolLLaMa의 성능을 조사하고, ToolLLaMa의 평가 지표, API 검색기 및 DFSDT의 효율성, 실험 및 분석 결과를 보고합니다.
API의 시간적 가변성을 고려할 때 각 테스트 명령에 대해 고정된 실제 솔루션 경로에 주석을 추가하는 것은 불가능합니다. 또한 서로 다른 모델이 평가 중에 동일한 버전의 API를 사용하는지 확인하는 것이 중요합니다. 수동 평가에 많은 시간이 소요될 수 있다는 점을 고려하여 이 연구는 AlpacaEval의 예를 따라 효율적인 기계 평가 도구 ToolEval을 개발했습니다. 이 도구는 ChatGPT의 지원에 의존하고 두 가지 주요 평가 지표를 포함합니다. 제한된 예산 내에서 평가의 품질을 측정하기 위해 에서 명령을 성공적으로 실행하는 능력 및 (2) 두 가지 솔루션 경로의 품질과 유용성을 비교하는 데 사용되는 승률. 이 논문은 ToolEval이 사람의 평가와 높은 상관관계가 있음을 보여주고 도구 학습을 위한 강력하고 확장 가능하며 신뢰할 수 있는 평가 방법을 제공합니다.
표 2에서 볼 수 있듯이 연구팀의 API 검색기는 여러 유형의 명령 중에서 BM25 및 Ada Embedding보다 지속적으로 우수한 성능을 보입니다. 높은 NDCG 점수는 API 검색의 효율성을 나타냅니다. 또한 I1의 NDCG 점수는 I2 및 I3보다 훨씬 높기 때문에 API 검색 측면에서 단일 도구 지침이 다중 도구 지침보다 상대적으로 간단합니다.
표 3에서 우리는 DFSDT가 모든 경우에 나머지 두 가지 기본 방법보다 성능이 훨씬 뛰어나다는 것을 알 수 있습니다. 이는 DFSDT가 경로 주석을 해결하는 비용을 절약하는 더 효과적인 방법임을 나타냅니다. 그리고 DFSDT의 성능 향상은 더 간단한 명령어(I1)보다 더 어려운 명령어(즉, I2 및 I3)에서 더 두드러집니다. 이것은 DFSDT가 효율성 외에도 일반 ReACT가 몇 번을 실행해도 응답할 수 없는 어렵고 복잡한 명령도 해결할 수 있음을 보여줍니다. 이러한 “어려운 예”를 데이터 세트에 통합하면 이러한 복잡한 상황에서 도구를 사용할 수 있는 능력을 충분히 발휘할 수 있습니다.
표 4에서 다음을 확인할 수 있습니다.
- ToolLLaMA는 통과율과 승률 모두에서 전통적인 도구 사용 방법인 ChatGPT-ReACT보다 월등히 뛰어나며 우수한 일반화 능력을 보여줍니다. 또한 ToolLLaMA를 DFSDT와 결합하면 Text-Dainci-003보다 성능도 뛰어납니다.
- 연구팀이 신속한 엔지니어링을 광범위하게 연구하는 동안 Vicuna와 Alpaca 모두 지침에 실패하지 않았습니다. 즉, 지침을 따르는 기능이 도구 사용 시나리오로 확장되지 않았습니다. 이것은 주로 언어 기술 향상에 초점을 맞춘 현재의 교수 조정 방법이 부적절함을 강조합니다.
전반적으로 ToolLLaMA는 모든 시나리오에서 경쟁력이 있으며 ChatGPT+DFSDT보다 통과율이 약간 낮습니다. 승률 측면에서 ToolLLaMA는 ChatGPT+DFSDT의 기능과 거의 비슷하며 I2-Cat 설정에서 후자를 능가합니다.
전체적으로 이러한 결과는 ToolBench가 LLM의 도구 사용 능력을 완전히 동기 부여하여 다양한 명령의 알려지지 않은 API를 마스터할 수 있음을 보여줍니다.
실험에서 연구팀은 LLaMA의 모든 매개변수를 미세 조정하여 ToolLLaMA를 얻었다. 파라미터 효율을 높이기 위해 대표적인 파라미터 효율 튜닝 방법인 LoRA를 추가로 적용해 성능에 미치는 영향을 연구했다. 아래 표 5의 결과는 매개변수 효율성의 증가가 성능 절충을 통해 달성됨을 보여줍니다. 그들은 성능을 희생하지 않고 매개변수 효율성을 달성하기 위한 방법을 고안하려는 미래의 시도를 기대합니다.
모델
멀티태스킹 방식으로 출시된 데이터 세트에서 훈련된 ToolLLaMA-7b 및 ToolLLaMA-7b-LoRA 모델을 사용하였습니다. 또한 실험 설정에서 훈련된 도구 검색기를 사용합니다.
Fine-Tuning
설치
이 리포지토리를 복제하고 ToolBench 폴더로 이동합니다.
git clone [email protected]:OpenBMB/ToolBench.git cd ToolBench
패키지 설치(python>=3.9)
pip install -r requirements.txt
데이터 및 도구 환경 준비:
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1Vis-RxBstXLKC1W1agIQUJNuumPJrrw0&confirm=yes' -O data.zip unzip data.zip
트레이닝 리트리버
- 데이터 전처리:
export PYTHONPATH=./ python data/preprocess_retriever_data.py \ --query_file data/instruction/G1_query.json \ --index_file data/test_query_ids/G1_instruction_test_query_ids.json \ --dataset_name G1 \ --output_dir data/retrieval/G1
- 그런 다음 다음 명령을 실행하여 도구 검색기를 훈련합니다.
export PYTHONPATH=./ python toolbench/retrieval/train.py \ --data_path data/retrieval/G1/ \ --model_name bert-base-uncased \ --output_path retrieval_model \ --num_epochs 5 \ --train_batch_size 32 \ --learning_rate 2e-5 \ --warmup_steps 500 \ --max_seq_length 256
교육 도구LLaMA
교육 코드는 FastChat을 기반으로 합니다 . 다음 명령을 사용하여 데이터 링크 의 사전 처리된 데이터와 함께 2 x A100(80GB)으로 ToolLLaMA-7b를 교육할 수 있습니다 .
export PYTHONPATH=./ torchrun --nproc_per_node=2 --master_port=20001 toolbench/train/train_long_seq.py \ --model_name_or_path huggyllama/llama-7b \ --data_path data/toolllama_G123_dfs_train.json \ --eval_data_path data/toolllama_G123_dfs_eval.json \ --conv_template tool-llama-single-round \ --bf16 True \ --output_dir toolllama \ --num_train_epochs 2 \ --per_device_train_batch_size 2 \ --per_device_eval_batch_size 2 \ --gradient_accumulation_steps 8 \ --evaluation_strategy "epoch" \ --prediction_loss_only \ --save_strategy "epoch" \ --save_total_limit 8 \ --learning_rate 5e-5 \ --weight_decay 0. \ --warmup_ratio 0.04 \ --lr_scheduler_type "cosine" \ --logging_steps 1 \ --fsdp "full_shard auto_wrap" \ --fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \ --tf32 True \ --model_max_length 8192 \ --gradient_checkpointing True \ --lazy_preprocess True \ --report_to none
다음 명령을 사용하여 자신만의 방식으로 데이터를 사전 처리하고 분할할 수도 있습니다.
export PYTHONPATH=./ python preprocess/preprocess_toolllama_data.py \ --tool_data_dir data/answer/G1_answer \ --method DFS_woFilter_w2 \ --output_file data/answer/toolllama_G1_dfs.json
lora 버전을 훈련시키려면:
export PYTHONPATH=./ deepspeed --master_port=20001 toolbench/train/train_long_seq_lora.py \ --model_name_or_path huggyllama/llama-7b \ --data_path data/toolllama_G123_dfs_train.json \ --eval_data_path data/toolllama_G123_dfs_eval.json \ --conv_template tool-llama-single-round \ --bf16 True \ --output_dir toolllama_lora \ --num_train_epochs 5 \ --per_device_train_batch_size 4 \ --per_device_eval_batch_size 2 \ --gradient_accumulation_steps 2 \ --evaluation_strategy "epoch" \ --prediction_loss_only \ --save_strategy "epoch" \ --save_total_limit 8 \ --learning_rate 5e-5 \ --weight_decay 0. \ --warmup_ratio 0.04 \ --lr_scheduler_type "cosine" \ --logging_steps 1 \ --model_max_length 8192 \ --gradient_checkpointing True \ --lazy_preprocess True \ --deepspeed ds_configs/stage2.json \ --report_to none
추론
먼저 Rapidapi 키를 준비합니다.
export RAPIDAPIKEY="your_rapidapi_key"
그런 다음 다음 명령을 실행합니다.
export PYTHONPATH=./ python toolbench/inference/qa_pipeline.py \ --tool_root_dir data/toolenv/tools/ \ --backbone_model toolllama \ --model_path ToolBench/ToolLLaMA-7b \ --max_observation_length 1024 \ --method DFS_woFilter_w2 \ --input_query_file data/instruction/inference_query_demo.json \ --output_answer_file data/answer/toolllama_dfs \ --rapidapi_key $RAPIDAPIKEY
로라 버전 :
export PYTHONPATH=./ python toolbench/inference/qa_pipeline.py \ --tool_root_dir data/toolenv/tools/ \ --backbone_model toolllama \ --model_path huggyllama/llama-7b \ --lora \ --lora_path /path/to/your/downloaded/ToolLLaMA-7b-LoRA \ --max_observation_length 1024 \ --method DFS_woFilter_w2 \ --input_query_file data/instruction/inference_query_demo.json \ --output_answer_file data/answer/toolllama_lora_dfs \ --rapidapi_key $RAPIDAPIKEY
개방형 도메인 설정 에서 lora 버전의 경우 다음을 실행합니다.
export PYTHONPATH=./ python toolbench/inference/qa_pipeline_open_domain.py \ --tool_root_dir data/toolenv/tools/ \ --corpus_tsv_path data/retrieval/G1/corpus.tsv \ --retrieval_model_path /path/to/your/retrival_model \ --retrieved_api_nums 5 \ --backbone_model toolllama \ --model_path huggyllama/llama-7b \ --lora \ --lora_path /path/to/your/toolllama_lora \ --max_observation_length 1024 \ --method DFS_woFilter_w2 \ --input_query_file data/instruction/inference_query_demo_open_domain.json \ --output_answer_file data/answer/toolllama_lora_dfs_open_domain \ --rapidapi_key $RAPIDAPIKEY
인터페이스 설정 및 실행
ToolBench 에는 인터페이스에 도구 사용을 포함하도록 포크된 Chatbot UI 기반의 웹 UI가 포함되어 있습니다 . 백엔드 서버와 chatbot-ui-toolllama 두 부분으로 나뉩니다 . 다음은 비디오 데모 입니다 .
웹 UI
git clone https://github.com/lilbillybiscuit/chatbot-ui-toolllama cd chatbot-ui-toolllama npm install npm run dev
앱은 에서 사용할 수 있습니다.http://localhost:3000/
백엔드 서버
export PYTHONPATH=./ python toolbench/inference/toolbench_server.py \ --tool_root_dir data/toolenv/tools/ \ --corpus_tsv_path data/retrieval/G1/corpus.tsv \ --retrieval_model_path /path/to/your/retrival_model \ --retrieved_api_nums 5 \ --backbone_model toolllama \ --model_path huggyllama/llama-7b \ --lora \ --lora_path /path/to/your/toolllama_lora \ --max_observation_length 1024 \ --method DFS_woFilter_w2 \ --input_query_file data/instruction/inference_query_demo_open_domain.json \ --output_answer_file data/answer/toolllama_lora_dfs_open_domain \ --rapidapi_key $RAPIDAPIKEY
이 서버는 에서 사용할 수 있습니다 http://localhost:5000/
. 요청을 시작하려면 http://localhost:5000/stream
다음 필드가 있는 JSON 개체가 포함된 GET 또는 POST 요청으로 호출합니다.
{ "text": "What is the weather in New York today?", "top_k": 5, "method": "DFS_woFilter_w2" }