文章目录
1. BFCL介绍
Berkeley Function Call Leaderboard 是一个用于评估和比较不同函数调用性能的排行榜系统。它是由加州大学伯克利分校的研究人员开发的,旨在帮助研究人员和开发者了解不同函数调用实现的性能表现。
当前已经到 v3 版本,bfcl 的官方资料如下:
- 排行榜:https://gorilla.cs.berkeley.edu/leaderboard
- v1版本:https://gorilla.cs.berkeley.edu/blogs/8_berkeley_function_calling_leaderboard.html
- v2版本:https://gorilla.cs.berkeley.edu/blogs/12_bfcl_v2_live.html
- v3版本:https://gorilla.cs.berkeley.edu/blogs/13_bfcl_v3_multi_turn.html
- github:https://github.com/ShishirPatil/gorilla/tree/main/berkeley-function-call-leaderboard
v1 版本数据组成:
v2 版本新增 live 数据组成:
v3 新增多轮多步(multi turn):
2. 主要构成
2.1 架构图
BFCL-v3官方提供的架构图如下:
整体而言,BFCL框架可以根据模块划分为以下两块内容:
其中:
其中:
- 左边黄色框中表示模型根据提供的评测数据集输出推理的结果
- 右边绿色框中表示对模型的推理结果进行评估,计算准确率
2.2 代码组成
berkeley-function-call-leaderboard/
├── bfcl/
│ ├── eval_checker/ # Evaluation modules
│ │ ├── ast_eval/ # AST-based evaluation
│ │ ├── executable_eval/ # Evaluation by execution
│ │ ├── multi_turn_eval/ # Multi-turn evaluation
│ ├── model_handler/ # All model-specific handlers
│ │ ├── oss_model/ # Handlers for locally-hosted models
│ │ │ ├── base_oss_handler.py # Base handler for OSS models
│ │ │ ├── llama_fc.py # Example: LLaMA (FC mode)
│ │ │ ├── deepseek_coder.py # Example: DeepSeek Coder
│ │ │ ├── ...
│ │ ├── proprietary_model/ # Handlers for API-based models
│ │ │ ├── openai.py # Example: OpenAI models
│ │ │ ├── claude.py # Example: Claude models
│ │ │ ├── ...
│ │ ├── parser/ # Parsing utilities for Java/JavaScript
│ │ ├── base_handler.py # Base handler blueprint
│ │ ├── handler_map.py # Maps model names to handler classes
├── data/ # Datasets
├── result/ # Model responses
├── score/ # Evaluation results
├── utils/ # Helper scripts2. 数据类型
2.2 数据类型
- all:包含全部的评测数据集;
- multi_turn。仅包含多轮对话的评测数据集,v3版本新增;
- single_turn。仅包含单轮对话的评测数据集,v1+v2版本的数据集;
- live。仅包含 live 的评测数据集,live 是指用户提供的、定期更新的,非原官方自带的;
- non_live。除live评测数据集之外的,可以理解为官方提供的;
- ast:本地函数调用,包含 live/non_live,评测函数名+函数参数,除去 live 的内容是此前 v1 版本主要的评测内容;
- executable:需要执行出函数结果,包含本地执行+API调用;
- non_python:除去 python 函数,包含 java、javascript等函数的;
- python:只包含 python 函数调用的;
- python_ast:python 中仅包含 ast 类别的
3. 评测本地模型
用 bfcl 评测你的模型,需要先做好以下准备工作:
- 下载 bfcl 代码,https://github.com/ShishirPatil/gorilla/tree/main/berkeley-function-call-leaderboard
- 进入到 berkeley-function-call-leaderboard-v3 目录下,进行下面章节的代码配置工作
- 用 vllm 服务拉起你的模型
3.1 增加 handler
handler 是用于控制具体模型的代码细节的,继承代码中的 Base Handler:bfcl/model_handler/base_handler.py
,下面代码是官方已经实现的openai模型的handler代码:
import json
import os
import time
from bfcl.model_handler.base_handler import BaseHandler
from bfcl.model_handler.constant import GORILLA_TO_OPENAPI
from bfcl.model_handler.model_style import ModelStyle
from bfcl.model_handler.utils import (
combine_consecutive_user_prompts,
convert_system_prompt_into_user_prompt,
convert_to_function_call,
convert_to_tool,
default_decode_ast_prompting,
default_decode_execute_prompting,
format_execution_results_prompting,
func_doc_language_specific_pre_processing,
retry_with_backoff,
system_prompt_pre_processing_chat_model,
)
from openai import OpenAI, RateLimitError
class OpenAIHandler(BaseHandler):
def __init__(self, model_name, temperature) -> None:
super().__init__(model_name, temperature)
self.model_style = ModelStyle.OpenAI
self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def decode_ast(self, result, language="Python"):
if "FC" in self.model_name or self.is_fc_model:
decoded_output = []
for invoked_function in result:
name = list(invoked_function.keys())[0]
params = json.loads(invoked_function[name])
decoded_output.append({
name: params})
return decoded_output
else:
return default_decode_ast_prompting(result, language)
def decode_execute(self, result):
if "FC" in self.model_name or self.is_fc_model:
return convert_to_function_call(result)
else