BFCL介绍以及本地模型评测大致流程


1. BFCL介绍

Berkeley Function Call Leaderboard 是一个用于评估和比较不同函数调用性能的排行榜系统。它是由加州大学伯克利分校的研究人员开发的,旨在帮助研究人员和开发者了解不同函数调用实现的性能表现。

当前已经到 v3 版本,bfcl 的官方资料如下:

v1 版本数据组成:
在这里插入图片描述

v2 版本新增 live 数据组成:
在这里插入图片描述

v3 新增多轮多步(multi turn):
在这里插入图片描述

2. 主要构成

2.1 架构图

BFCL-v3官方提供的架构图如下:
在这里插入图片描述

整体而言,BFCL框架可以根据模块划分为以下两块内容:
其中:
在这里插入图片描述
其中:

  1. 左边黄色框中表示模型根据提供的评测数据集输出推理的结果
  2. 右边绿色框中表示对模型的推理结果进行评估,计算准确率

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 数据类型

  1. all:包含全部的评测数据集;
  2. multi_turn。仅包含多轮对话的评测数据集,v3版本新增;
  3. single_turn。仅包含单轮对话的评测数据集,v1+v2版本的数据集;
  4. live。仅包含 live 的评测数据集,live 是指用户提供的、定期更新的,非原官方自带的;
  5. non_live。除live评测数据集之外的,可以理解为官方提供的;
  6. ast:本地函数调用,包含 live/non_live,评测函数名+函数参数,除去 live 的内容是此前 v1 版本主要的评测内容;
  7. executable:需要执行出函数结果,包含本地执行+API调用;
  8. non_python:除去 python 函数,包含 java、javascript等函数的;
  9. python:只包含 python 函数调用的;
  10. python_ast:python 中仅包含 ast 类别的

3. 评测本地模型

用 bfcl 评测你的模型,需要先做好以下准备工作:

  1. 下载 bfcl 代码,https://github.com/ShishirPatil/gorilla/tree/main/berkeley-function-call-leaderboard
  2. 进入到 berkeley-function-call-leaderboard-v3 目录下,进行下面章节的代码配置工作
  3. 用 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
OpenHarmony Arkts是一个开源的操作系统内核和服务框架,用于构建安全、高效、易移植的物联网设备和应用平台。在OpenHarmony中,获取MAC地址通常是在网络设备驱动程序或者相关的网络服务模块中完成的。 如果你想通过API在Arkts环境中获取MAC地址,可以参考`netlink`或`network`的相关接口,它们可能会提供函数来查询本地网络适配器的物理地址。具体的步骤可能会涉及到底层的网络操作,例如检查网卡信息或者读取sysfs目录下的相关文件。 以下是简化的示例代码片段,假设有一个名为`NetUtils`的类: ```java import android.net.wifi.WifiManager; import android.os.SystemProperties; public class NetUtils { public static String getMacAddress() { try { // 从硬件直接读取MAC地址 byte[] macBytes = getHardwareMac(); if (macBytes != null) { return bytesToHex(macBytes); } // 如果硬件没提供,尝试从Android系统属性中获取 String macString = SystemProperties.get("ro.product.board.mac"); if (!macString.isEmpty()) { return macString; } // 或者尝试获取Wi-Fi接口的MAC地址 WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); NetworkInfo networkInfo = wifiManager.getConnectionInfo(); if (networkInfo != null && networkInfo.getMacAddress() != null) { return networkInfo.getMacAddress(); } } catch (Exception e) { e.printStackTrace(); } // 返回空字符串表示无法获取MAC地址 return ""; } private static byte[] getHardwareMac() { // 这里需要实现具体的操作,可能需要JNI或者JNI本地库来访问硬件数据 // ... (未提供具体代码) } private static String bytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte b : bytes) { int n = b & 0xff; result.append(HEX_DIGITS[n >>> 4]); result.append(HEX_DIGITS[n & 0x0f]); } return result.toString().toUpperCase(); } // HEX_DIGITS常量表示16进制数字的映射表 private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值