当前位置: 首页 > news >正文

各种开源闭源大模型,包括自己本地部署的一些8b 14b模型,支持函数调用(功能调用)function call吗?

各种开源闭源大模型,包括自己本地部署的一些8b 14b模型,支持函数调用(功能调用)function call吗?

问了一下AI,它的回答:这是一个非常好的问题!对于本地部署的 8B/14B 级别模型,它们是否支持“函数调用”(Function Calling 或 Tool Use)是一个关键考量。答案是:取决于具体模型及其训练方式,但通常需要一些额外的工程工作。

让我们详细解释一下:

什么是 LLM 的函数调用?

LLM 的函数调用能力是指模型能够:

  1. 识别意图:当用户提出一个需要外部工具或 API 才能完成的任务时(例如“今天北京天气如何?”)。
  2. 选择工具:从一系列预定义的工具中,选择最合适的那个。
  3. 生成参数:根据用户的请求,提取必要的信息,并以结构化的格式(通常是 JSON)生成该工具所需的参数。
  4. (可选)处理结果:在工具执行后,将工具返回的结果整合到对话中,继续与用户交互。

像 OpenAI 的 GPT-4 和 Google 的 Gemini 这样的商业闭源模型,它们的 API 已经原生集成了非常强大的函数调用能力,开发者只需要提供工具描述,模型就能自动完成上述 1-3 步。

本地部署的 8B/14B 模型情况

对于本地部署的 8B/14B 级别的开源模型,情况略有不同:

  1. 基础模型 (Base Models) 不支持:如果你部署的是一个纯粹的“基础模型”(例如 Llama 3 8B Base,而非 Instruct 版本),它没有经过指令微调,通常无法直接理解并执行函数调用。它只会生成连贯的文本,但不会以特定格式调用函数。

  2. 指令微调模型 (Instruct Models) 可以通过提示工程实现(间接支持)

    • 大多数主流的 8B/14B 指令微调模型(如 Llama 3 8B Instruct, Mistral 7B Instruct, Qwen 1.5 7B Chat 等)都具备较强的指令遵循能力和 JSON 生成能力。
    • 实现方式:你可以通过精心设计的 系统提示词 (System Prompt),向模型描述所有可用的函数(函数名称、作用、参数及类型等),并明确告知模型在特定情况下需要生成 JSON 格式的函数调用指令。
    • 例子
      <|system|>
      你是一个智能助手,可以帮助用户查询天气和发送邮件。
      以下是你可用的工具:
      1. getWeather(location: str, unit: str): 查询指定城市的天气,unit可以是'celsius'或'fahrenheit'。
      2. sendEmail(recipient: str, subject: str, body: str): 发送一封邮件。当用户需要使用工具时,请严格按照以下JSON格式输出:
      {"tool": "工具名称", "parameters": {"参数名1": "值1", "参数名2": "值2"}}
      如果不需要工具,直接回答用户的问题。
      <|user|>
      北京今天天气如何?
      <|assistant|>
      {"tool": "getWeather", "parameters": {"location": "北京", "unit": "celsius"}}
      Copy
    • 开发者额外工作:你需要编写代码来:
      • 解析模型输出:检查输出是否是 JSON 格式的函数调用。
      • 验证和执行:验证函数调用是否合法,然后实际调用对应的 Python 函数或 API。
      • 反馈结果:将函数执行的结果再次作为上下文(通常是作为工具响应消息)输入给模型,让模型根据结果生成对用户的最终回复。
  3. 专门为函数调用微调的模型 (Directly Supported)

    • 有一些开源模型是专门针对函数调用任务进行过微调的,它们在设计之初就考虑了这种能力。这些模型通常在指令遵循和生成准确 JSON 参数方面表现更优。
    • 例子
      • DeepSeek-Coder-V2-Instruct:这个模型家族,尤其是它的Instruct版本,在代码生成和函数调用方面表现出色,许多用户反映其在生成符合规范的函数调用 JSON 方面比普通 Instruct 模型更稳定。
      • Functionary:这是一个专门针对函数调用任务训练的开源模型,它在很多方面旨在模仿 OpenAI 的函数调用行为。
      • Gorilla, ToolLlama, FireFunction-V1 等:这些也是早期或专门为工具使用场景设计的模型。
    • 优势:这些模型通常对提示词的敏感度较低,在复杂场景下生成正确函数调用的成功率更高。

总结

  • 大多数 8B/14B 的指令微调模型(如 Llama 3 Instruct, Mistral Instruct)可以通过精巧的 提示工程 (Prompt Engineering) 来实现函数调用,但你需要自己搭建一个解析和执行工具的框架(Agentic Framework)。
  • 专门为函数调用微调的 8B/14B 模型(如 DeepSeek-Coder-V2-Instruct, Functionary)支持得更好,它们在设计上就考虑了这种能力,生成正确调用的概率更高,但依然需要你外部的逻辑来解析和执行。
  • 基础模型 (Base Models)不支持

实际操作建议:

  1. 选择一个优秀的指令微调模型:例如 Llama 3 8B Instruct, DeepSeek-Coder-V2-Instruct (如果你需要强大的代码和工具调用能力), Qwen 1.5 7B Chat。
  2. 设计明确的系统提示词:详细说明模型的能力、可用的工具及其参数、以及期望的输出格式(JSON)。
  3. 使用 RAG/Agentic Framework:可以利用 LangChain 或 LlamaIndex 这样的库,它们提供了高级抽象来简化工具注册、函数调用解析、执行和结果回传的整个流程,即使底层模型没有原生的函数调用 API。

通过以上方法,你完全可以在本地部署的 8B/14B 模型上实现非常强大的函数调用功能!

怎么验证某个7b或者8b的大模型是否支持函数调用?

非常好的问题!验证一个本地部署的 7B 或 8B 模型是否具备函数调用能力,本质上是一个压力测试。你需要测试它能否在各种情况下,稳定、准确地理解你的意图、选择正确的工具并生成格式正确的参数。

你不能只问它一句“你会不会函数调用?”,因为它很可能会自信地回答“会!”。你需要通过实际的测试用例来检验。

以下是验证的具体步骤和方法,从简单到复杂:


核心验证思路

你需要构建一个包含 “系统提示词 + 用户查询” 的测试输入,然后分析模型的输出,看它是否符合你预期的 结构化格式(通常是JSON) 并包含了正确的信息。

第一步:构建一个标准的系统提示词

首先,你需要定义一个清晰的系统提示词,这是你“教”模型如何执行函数调用的“说明书”。这是测试的关键前提。

示例系统提示词:

你是一个AI助手,可以调用工具来帮助用户。
你拥有以下可以调用的函数工具:1. `get_current_weather(location: str, unit: str)`: 获取指定城市的当前天气信息。`unit` 参数是单位,可选 'celsius' 或 'fahrenheit'。
2. `send_email(recipient: str, subject: str, body: str)`: 向指定收件人发送一封邮件。
3. `search_web(query: str)`: 执行一个网络搜索。当你认为需要调用工具来完成用户的请求时,你必须严格按照以下JSON格式进行回应,且只返回此JSON对象,不要说任何其他话:{"name": "function_name", "parameters": {"arg1": "value1", "arg2": "value2"}}如果用户的请求不需要调用任何工具,或者只是普通聊天,请直接以自然语言回复。
Copy

第二步:设计测试用例

设计涵盖不同场景的测试用例,检验模型的不同能力。

测试类别测试目的用户查询示例期望的成功输出(模型应返回)
1. 基础工具选择能否正确匹配工具“今天北京天气怎么样?”{"name": "get_current_weather", "parameters": {"location": "北京", "unit": "celsius"}}
2. 参数提取能否从自然语言中提取参数“用摄氏度单位查一下伦敦的天气”{"name": "get_current_weather", "parameters": {"location": "伦敦", "unit": "celsius"}}
3. 隐含参数推断能否推断出未明说的参数“巴黎气温多少?”{"name": "get_current_weather", "parameters": {"location": "巴黎", "unit": "celsius"}} (应能推断出缺省单位)
4. 复杂指令处理多步骤或复杂请求“帮我搜索一下AI的最新进展,然后把结果发邮件给 alice@example.com”应拒绝或分步执行。好的模型可能先调用 search_web,但让它一次调用两个工具是过高要求。
5. 无需工具的请求能否区分何时不需要调用“你好,请介绍一下你自己”不应返回JSON,应以自然语言回复。
6. 格式遵循输出格式是否严格符合要求任何需要工具的查询必须且只能返回一个合法、完整的JSON对象,不能有多余的解释文字。
7. 错误处理对无法处理的请求的反应“请删除我的所有文件” (如果你没提供此工具)不应返回JSON,应回答“我无法执行这个操作”或类似内容。

第三步:运行测试并评估结果

将 “系统提示词 + 测试用例” 输入给你的模型,收集它的输出。

评估维度:

  1. 工具选择准确率:模型选择的工具名称 (name) 是否正确?
  2. 参数提取准确率:模型提取的参数值是否完整且准确?
  3. 格式合规率:输出是否是纯净的、可解析的JSON?有没有出现诸如“好的,我将为您调用天气函数:{...}”这种“JSON嵌套在废话中”的情况?这是最常见的失败模式。
  4. 拒绝能力:对于不需要工具或无法处理的请求,它是否没有生成JSON?

一次成功的调用示例:

  • 输入 (你的测试代码拼接):
    • System Prompt (如上所示)
    • User Query: “今天北京天气怎么样?”
  • 期望的输出 (模型回复):
    • {"name": "get_current_weather", "parameters": {"location": "北京", "unit": "celsius"}}
  • 失败的输出示例:
    • 好的,我将为您查询北京的天气。{"name": "get_current_weather", "parameters": {"location": "北京"}} (包含了多余文本)
    • {"name": "send_email", "parameters": {"location": "北京"}} (工具选择错误)
    • 北京的天气应该是晴朗的,大约25度。 (没有调用工具,直接回答)
    • {"name": "get_current_weather", "parameters": {}} (参数缺失)

第四步:自动化测试脚本

手动测试几个案例效率太低。建议编写一个简单的Python脚本进行自动化批量测试。

# 这是一个非常简单的测试脚本概念示例
import json# 你的模型加载和推理函数
def query_model(prompt):# 这里替换成你调用模型(如通过vLLM, Transformers等)的代码# 返回模型的回复字符串pass# 定义测试套件
test_cases = [{"user_input": "今天北京天气怎么样?","expected_tool": "get_current_weather","expected_params": {"location": "北京", "unit": "celsius"}},{"user_input": "你好,你是谁?","should_invoke_tool": False  # 这个请求不应触发工具调用}# ... 添加更多测试用例
]system_prompt = "你的系统提示词..."for test in test_cases:full_prompt = f"{system_prompt}\n\n用户请求: {test['user_input']}"model_output = query_model(full_prompt).strip()print(f"用户: {test['user_input']}")print(f"模型: {model_output}")# 检查是否应该调用工具if test.get('should_invoke_tool', True):try:# 尝试解析JSONtool_call = json.loads(model_output)# 检查工具名称和参数if tool_call['name'] == test['expected_tool']:print("✅ 工具选择正确")else:print(f"❌ 工具选择错误。期望: {test['expected_tool']}, 实际: {tool_call['name']}")# 比较参数(这里可以做得更复杂,比如检查参数子集)if tool_call['parameters'] == test['expected_params']:print("✅ 参数提取正确")else:print(f"❌ 参数不匹配。期望: {test['expected_params']}, 实际: {tool_call['parameters']}")except json.JSONDecodeError:# 如果无法解析JSON,说明失败print("❌ 失败:输出不是有效的JSON格式。")else:# 检查是否没有调用工具(即输出不是JSON)try:json.loads(model_output)print("❌ 失败:本不应调用工具,但模型返回了JSON。")except json.JSONDecodeError:print("✅ 正确:未调用工具,以自然语言回复。")print("---")

结论与建议

  • 没有“天生”支持:绝大多数 7B/8B 模型并非“天生”支持函数调用,它们的能力严重依赖于你的系统提示词的质量和清晰度
  • 性能是连续的:模型的支持程度不是一个“是”或“否”的问题,而是一个 “好坏”和“稳定性” 的问题。有的模型在简单案例上表现好,有的在复杂案例上更稳定。
  • 推荐测试模型:根据社区反馈,一些在工具调用方面表现较好的 7B/8B 级别模型包括:
    • DeepSeek-Coder-V2 (或最新版): 代码能力极强,通常能很好地理解和生成结构化JSON。
    • Qwen 2 (QwQ) 系列: 阿里通义千问的模型,指令遵循能力不错。
    • Llama 3 Instruct: 综合能力很强,值得一试。
    • 专门微调的模型: 如 FunctionaryGorilla 等,它们是为这个特定任务训练的,成功率通常更高。

通过以上系统化的测试方法,你就能客观地评估出一个模型在函数调用方面的实际能力水平,而不仅仅是凭感觉。

实践验证自建服务器的gpt-4 、gpt-4.1 、gpt-4.1-mini功能调用

让Trae写了一个测试程序,对g4f的几个模型进行函数调用测试。为了节省时间(因为自建的服务器速度很慢)只测试了gpt-4 、gpt-4.1 、gpt-4.1-mini以及default模型。其中default模型我前期用过,因为会自动切换好几个开源、不开源模型,所以要碰运气,大多数时候碰到的模型大约就是不支持函数调用。(当然这回测试的时候,正好碰上default模型罢工,所以得了0分)

至于本地部署的一些7b模型等,以后再去测试。

另外我下一步重点要搞定的,是星河社区的文心21B那个模型是不是支持功能调用....

当然官方肯定说支持,但是我不知道星河社区自己部署的那个模型是否支持....

测试代码

import json
import openai
from openai import OpenAI
import time
from datetime import datetime
import os# 配置
BASE_URL = "http://127.0.0.1:1337/v1"
API_KEY = "hello"  # g4f的token_key
MODEL_LIST = ["gpt-4","gpt-4.1", "gpt-4.1-mini","default"]# 工具定义 (OpenAI兼容格式)
TOOLS = [{"type": "function","function": {"name": "get_current_weather","description": "获取指定城市的当前天气信息","parameters": {"type": "object","properties": {"location": {"type": "string","description": "城市名称,例如北京、上海",},"unit": {"type": "string","enum": ["celsius", "fahrenheit"],"description": "温度单位"}},"required": ["location"]}}},{"type": "function","function": {"name": "send_email","description": "发送电子邮件","parameters": {"type": "object","properties": {"recipient": {"type": "string","description": "收件人邮箱地址"},"subject": {"type": "string","description": "邮件主题"},"body": {"type": "string","description": "邮件内容"}},"required": ["recipient", "subject", "body"]}}},{"type": "function","function": {"name": "search_web","description": "在网络上搜索信息","parameters": {"type": "object","properties": {"query": {"type": "string","description": "搜索关键词"}},"required": ["query"]}}}
]# 测试用例
TEST_CASES = [# 测试1: 基础天气查询{"name": "基础天气查询","user_input": "今天北京天气怎么样?","expected_tool": "get_current_weather","expected_params": {"location": "北京","unit": "celsius"  # 可以是隐式推断},"should_invoke_tool": True},# 测试2: 带参数的天气查询{"name": "带参数天气查询","user_input": "伦敦的天气如何,用华氏度显示","expected_tool": "get_current_weather","expected_params": {"location": "伦敦","unit": "fahrenheit"},"should_invoke_tool": True},# 测试3: 邮件发送{"name": "邮件发送","user_input": "帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'","expected_tool": "send_email","expected_params": {"recipient": "alice@example.com","subject": "会议通知","body": "明天10点开会"},"should_invoke_tool": True},# 测试4: 网络搜索{"name": "网络搜索","user_input": "搜索一下最新的AI技术进展","expected_tool": "search_web","expected_params": {"query": "最新的AI技术进展"},"should_invoke_tool": True},# 测试5: 普通对话 (不应调用工具){"name": "普通对话","user_input": "你好,请介绍一下你自己","should_invoke_tool": False},# 测试6: 复杂组合指令{"name": "复杂组合指令","user_input": "先查一下上海的天气,然后帮我搜索明天上海的天气预报","expected_tool": "get_current_weather",  # 期望先调用天气查询"expected_params": {"location": "上海","unit": "celsius"},"should_invoke_tool": True},# 测试7: 错误指令 (不应调用不存在的工具){"name": "错误指令","user_input": "删除我所有的文件","should_invoke_tool": False  # 不应该调用任何工具}
]def create_system_prompt():"""创建系统提示词,指导模型使用工具"""return """你是一个智能助手,能够通过调用工具来帮助用户解决问题。可用工具:
1. get_current_weather - 获取指定城市的当前天气信息
2. send_email - 发送电子邮件
3. search_web - 在网络上搜索信息当用户请求需要这些工具时,你应该:
1. 选择最合适的工具
2. 提取正确的参数
3. 只返回工具调用信息,不要添加任何其他文字工具调用格式:
{"tool_calls": [{"type": "function","function": {"name": "工具名称","arguments": "{\"参数1\":\"值1\", \"参数2\":\"值2\"}"}}]
}如果不需要调用工具,直接用自然语言回复用户。"""def test_model(model_name):"""测试单个模型"""print(f"\n{'='*60}")print(f"测试模型: {model_name}")print(f"{'='*60}")results = []client = OpenAI(base_url=BASE_URL, api_key=API_KEY)system_prompt = create_system_prompt()for i, test_case in enumerate(TEST_CASES, 1):try:print(f"\n--- 测试 {i}/{len(TEST_CASES)}: {test_case['name']} ---")print(f"用户输入: {test_case['user_input']}")# 构建消息messages = [{"role": "system", "content": system_prompt},{"role": "user", "content": test_case['user_input']}]# 调用模型 (OpenAI兼容格式)response = client.chat.completions.create(model=model_name,messages=messages,tools=TOOLS,tool_choice="auto",temperature=0.1,max_tokens=500)# 获取回复内容content = response.choices[0].message.contenttool_calls = response.choices[0].message.tool_callsprint(f"模型回复: {content}")# 分析结果test_result = analyze_result(test_case, content, tool_calls, model_name)results.append(test_result)# 写入临时结果print(f"测试结果: {test_result['status']}")print("-" * 40)# 避免请求过快time.sleep(0.5)except Exception as e:error_result = {"test_name": test_case['name'],"user_input": test_case['user_input'],"status": "ERROR","error": str(e),"tool_called": False,"tool_name": None,"params_match": False,"details": f"调用失败: {str(e)}"}results.append(error_result)print(f"❌ 测试失败: {str(e)}")print("-" * 40)continuereturn resultsdef analyze_result(test_case, content, tool_calls, model_name):"""分析测试结果"""result = {"test_name": test_case['name'],"user_input": test_case['user_input'],"model_name": model_name,"status": "PASS","tool_called": False,"tool_name": None,"params_match": False,"details": ""}should_invoke = test_case.get('should_invoke_tool', True)if should_invoke:# 期望调用工具if tool_calls and len(tool_calls) > 0:result["tool_called"] = True# 检查第一个工具调用first_tool = tool_calls[0]tool_name = first_tool.function.nameresult["tool_name"] = tool_name# 解析参数try:arguments = json.loads(first_tool.function.arguments)if tool_name == test_case['expected_tool']:# 检查参数匹配expected_params = test_case['expected_params']param_match = Truefor key, expected_value in expected_params.items():if key not in arguments:param_match = Falsebreakif arguments[key] != expected_value:# 允许一些灵活性,比如"北京" vs "Beijing"if key == "location" and is_similar_location(arguments[key], expected_value):continueparam_match = Falsebreakresult["params_match"] = param_matchresult["details"] = f"调用了 {tool_name},参数匹配: {param_match}"if param_match:result["status"] = "PASS"else:result["status"] = "PARTIAL"else:result["status"] = "WRONG_TOOL"result["details"] = f"调用了错误工具: {tool_name} (期望: {test_case['expected_tool']})"except json.JSONDecodeError:result["status"] = "INVALID_JSON"result["details"] = "工具参数JSON格式无效"else:# 没有调用工具result["status"] = "NO_TOOL_CALL"result["details"] = "期望调用工具但没有调用"else:# 不期望调用工具if not tool_calls or len(tool_calls) == 0:result["status"] = "PASS"result["details"] = "正确地没有调用工具"else:result["status"] = "UNEXPECTED_TOOL"result["details"] = f"不应该调用工具但调用了: {tool_calls[0].function.name if tool_calls else '未知'}"return resultdef is_similar_location(actual, expected):"""检查位置名称是否相似"""# 中英文位置名称映射location_map = {"北京": ["北京", "beijing", "Beijing"],"上海": ["上海", "shanghai", "Shanghai"],"伦敦": ["伦敦", "london", "London"],"巴黎": ["巴黎", "paris", "Paris"]}actual_lower = actual.lower()expected_lower = expected.lower()if actual_lower == expected_lower:return Truefor chinese, variants in location_map.items():if expected == chinese:return actual_lower in [v.lower() for v in variants]# 简单字符串相似度检查return actual_lower in expected_lower or expected_lower in actual_lowerdef write_results_to_file(results, output_file="output.txt"):"""将测试结果写入文件"""timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")with open(output_file, "w", encoding="utf-8") as f:f.write(f"函数调用能力测试报告\n")f.write(f"生成时间: {timestamp}\n")f.write(f"测试环境: g4f 本地部署\n")f.write(f"Base URL: {BASE_URL}\n")f.write("=" * 80 + "\n\n")overall_scores = {}for model_name, model_results in results.items():if model_name not in overall_scores:overall_scores[model_name] = {"total": 0, "pass": 0, "partial": 0, "fail": 0}f.write(f"\n{'='*60}\n")f.write(f"模型: {model_name}\n")f.write(f"{'='*60}\n")model_total = len(model_results)model_pass = sum(1 for r in model_results if r["status"] == "PASS")model_partial = sum(1 for r in model_results if r["status"] == "PARTIAL")model_fail = model_total - model_pass - model_partialoverall_scores[model_name] = {"total": model_total,"pass": model_pass,"partial": model_partial,"fail": model_fail}# 总体得分score = (model_pass + model_partial * 0.5) / model_total * 100support_level = "优秀" if score >= 80 else "良好" if score >= 60 else "一般" if score >= 40 else "较差"f.write(f"总体得分: {score:.1f}/100\n")f.write(f"支持程度: {support_level}\n")f.write(f"通过: {model_pass}/{model_total}, 部分通过: {model_partial}, 失败: {model_fail}\n\n")# 详细测试结果for test_result in model_results:f.write(f"测试: {test_result['test_name']}\n")f.write(f"  用户输入: {test_result['user_input']}\n")f.write(f"  状态: {test_result['status']}\n")if test_result['tool_called']:f.write(f"  调用的工具: {test_result['tool_name']}\n")if test_result['params_match']:f.write(f"  参数匹配: ✅\n")else:f.write(f"  参数匹配: ❌\n")f.write(f"  详情: {test_result['details']}\n")f.write("-" * 40 + "\n")# 总结f.write("\n" + "=" * 80 + "\n")f.write("测试总结\n")f.write("=" * 80 + "\n")f.write("\n各模型排名:\n")sorted_models = sorted(overall_scores.items(), key=lambda x: (x[1]['pass'] + x[1]['partial'] * 0.5) / x[1]['total'], reverse=True)for i, (model_name, scores) in enumerate(sorted_models, 1):score = (scores['pass'] + scores['partial'] * 0.5) / scores['total'] * 100f.write(f"{i}. {model_name}: {score:.1f}% (通过{scores['pass']}/{scores['total']})\n")f.write(f"\n测试完成时间: {timestamp}\n")f.write(f"建议: 得分≥80%的模型函数调用能力较强,60-80%的一般可用,<60%的不建议用于工具调用场景。\n")print(f"\n✅ 测试完成,结果已保存到 {output_file}")def main():"""主函数"""if not os.path.exists("output.txt"):os.remove("output.txt") if os.path.exists("output.txt") else Noneall_results = {}failed_models = []print("开始测试g4f模型函数调用能力...")print(f"测试模型: {', '.join(MODEL_LIST)}")print(f"Base URL: {BASE_URL}")print("-" * 60)for model_name in MODEL_LIST:try:print(f"\n开始测试: {model_name}")results = test_model(model_name)all_results[model_name] = results# 计算通过率pass_rate = sum(1 for r in results if r["status"] == "PASS") / len(results) * 100print(f"{model_name} 测试完成,通过率: {pass_rate:.1f}%")except KeyboardInterrupt:print(f"\n用户中断测试")breakexcept Exception as e:print(f"{model_name} 测试失败: {str(e)}")failed_models.append(model_name)all_results[model_name] = []# 写入结果write_results_to_file(all_results)# 打印总结print(f"\n{'='*60}")print("测试总结")print(f"{'='*60}")if failed_models:print(f"测试失败的模型: {', '.join(failed_models)}")sorted_results = sorted(all_results.items(), key=lambda x: sum(1 for r in x[1] if r["status"] == "PASS") / len(x[1]) if x[1] else 0, reverse=True)print("\n各模型函数调用能力排名:")for i, (model_name, results) in enumerate(sorted_results, 1):if results:pass_count = sum(1 for r in results if r["status"] == "PASS")total = len(results)score = pass_count / total * 100print(f"{i}. {model_name}: {score:.1f}% ({pass_count}/{total} 通过)")else:print(f"{i}. {model_name}: 测试失败")print(f"\n详细结果已保存到 output.txt")if __name__ == "__main__":main()

测试结果:

各模型函数调用能力排名:
1. gpt-4.1: 57.1% (4/7 通过)
2. gpt-4: 28.6% (2/7 通过)
3. gpt-4.1-mini: 14.3% (1/7 通过)
4. default: 0.0% (0/7 通过)

证明gpt-4.1确实比gpt-4要强一些,至少在函数调用方面就强很多。这样就可以知道,使用大模型的时候,尽量使用gpt-4.1 (还是挺怀念以前一段时间天天用gpt-4o的日子)

具体的测试输出为:

python .\test_g4f_functional.py
开始测试g4f模型函数调用能力...
测试模型: gpt-4, gpt-4.1, gpt-4.1-mini, default
Base URL: http://127.0.0.1:1337/v1
------------------------------------------------------------开始测试: gpt-4============================================================
测试模型: gpt-4
============================================================--- 测试 1/7: 基础天气查询 ---
用户输入: 今天北京天气怎么样?
模型回复: 今天北京的天气预计是晴天,气温大约在 8°C 到 18°C 之间。白天气温适宜,适合外出活
动,晚上可能会有些凉,记得穿件外套哦。如果有其他问题或需要更多的天气资讯,随时告诉我!   
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 2/7: 带参数天气查询 ---
用户输入: 伦敦的天气如何,用华氏度显示
模型回复: 伦敦的天气会随着季节变化而有所不同。你想了解伦敦现在的天气吗?如果是的话,可以
告诉我当前的日期,或者我可以帮你查找一下。
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 3/7: 邮件发送 ---
用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'      
❌ 测试失败: Request timed out.
------------------------------------------- 测试 4/7: 网络搜索 ---
用户输入: 搜索一下最新的AI技术进展
模型回复: 最近的AI技术进展涵盖了多个领域,以下是一些重要的方向和突破:1. **生成式AI (Generative AI)**生成式模型,尤其是大语言模型(如GPT系列)和图像生成模型(如DALL·E和Stable Diffusion) 
,持续取得突破。随着训练数据集的不断扩大和算法的优化,生成的文本和图像质量有了显著提升。 
例如,GPT-4在理解和生成自然语言方面的能力更强,能够处理更复杂的任务。2. **多模态AI (Multimodal AI)**近年来,AI系统不再仅限于文本或图像,而是可以处理多个输入形式。例如,OpenAI的**CLIP**和
**DALL·E**模型能够结合图像和文本来生成相关内容或理解多模态数据。这为视频分析、自动翻译和 
增强现实等应用打开了新的可能性。3. **强化学习 (Reinforcement Learning)**强化学习继续在自动化决策和机器人控制中发挥重要作用,尤其是在游戏和复杂任务中。例如,AlphaFold利用强化学习解决了生物学中的蛋白质折叠问题,取得了革命性的进展。4. **量子计算与AI的结合**量子计算正在逐渐应用于AI,特别是在优化和复杂计算任务上。虽然量子计算仍处于早期阶段,但
它有望显著加速AI模型的训练和推理过程,尤其是在大规模数据处理方面。5. **自监督学习 (Self-Supervised Learning)**自监督学习是近几年AI领域的一个重要趋势。这种学习方法不依赖人工标注数据,而是通过数据本
身的结构或规律进行学习,使得AI能够更加高效地学习复杂任务,尤其是在图像识别、自然语言处理 
等领域。6. **AI与伦理问题**随着AI技术的快速发展,AI伦理、隐私保护和公平性问题也越来越受到关注。例如,如何确保AI决
策过程的透明性,避免偏见和歧视,保障用户隐私等问题已成为当前AI研究的重要议题。7. **大模型的优化与应用**随着计算能力的提升,AI模型规模持续扩大。**GPT-4**和其他大模型的发布,展示了更强的理解 
和生成能力。然而,如何优化这些庞大的模型,以便更高效地进行推理,成为了研究的热点。       这些进展代表了AI领域的前沿发展,未来几年内,我们有望看到更多基于这些突破的实际应用。例如 
,自动驾驶、个性化医疗、智能城市等领域都有可能实现跨越式发展。
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 5/7: 普通对话 ---
用户输入: 你好,请介绍一下你自己
模型回复: 你好!我是Zahra,很高兴和你聊天。我喜欢帮助别人,尤其是在学习、创意或技术方面。
如果你有什么问题或者想聊点儿有趣的事情,随时告诉我!你有什么想了解的吗?
测试结果: PASS
------------------------------------------- 测试 6/7: 复杂组合指令 ---
用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报
模型回复: {"tool_calls": [{"type": "function","function": {"name": "get_current_weather","arguments": "{\"city\":\"上海\"}"}},{"type": "function","function": {"name": "search_web","arguments": "{\"query\":\"明天 上海 天气预报\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 7/7: 错误指令 ---
用户输入: 删除我所有的文件
模型回复: 我无法删除您的所有文件。不过,如果您希望管理或删除某些信息,可以通过设置中的“个
性化”选项来清除。您可以在其中选择删除您的个人信息或更改偏好。如果有其他需要帮助的地方,随
时告诉我!
测试结果: PASS
----------------------------------------
gpt-4 测试完成,通过率: 28.6%开始测试: gpt-4.1============================================================
测试模型: gpt-4.1
============================================================--- 测试 1/7: 基础天气查询 ---
用户输入: 今天北京天气怎么样?
模型回复: 
测试结果: PASS
------------------------------------------- 测试 2/7: 带参数天气查询 ---
用户输入: 伦敦的天气如何,用华氏度显示
模型回复: 
测试结果: PASS
------------------------------------------- 测试 3/7: 邮件发送 ---
用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'      
模型回复: {"tool_calls": [{"type": "function","function": {"name": "send_email","arguments": "{\"recipient\":\"alice@example.com\",\"subject\":\"会议通知\",\"body\":\"明天10点开会\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 4/7: 网络搜索 ---
用户输入: 搜索一下最新的AI技术进展
模型回复: 
测试结果: PARTIAL
------------------------------------------- 测试 5/7: 普通对话 ---
用户输入: 你好,请介绍一下你自己
模型回复: 你好!我是一个智能助手,可以帮助你查询信息、发送邮件、获取天气等。如果你有任何
问题或需要帮助,随时告诉我!
测试结果: PASS
------------------------------------------- 测试 6/7: 复杂组合指令 ---
用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报
❌ 测试失败: Request timed out.
------------------------------------------- 测试 7/7: 错误指令 ---
用户输入: 删除我所有的文件
模型回复: 很抱歉,我无法帮助你删除文件。如果你有其他问题或需要帮助,请告诉我!
测试结果: PASS
----------------------------------------
gpt-4.1 测试完成,通过率: 57.1%开始测试: gpt-4.1-mini============================================================
测试模型: gpt-4.1-mini
============================================================--- 测试 1/7: 基础天气查询 ---
用户输入: 今天北京天气怎么样?
模型回复: {"tool_calls": [{"type": "function","function": {"name": "get_current_weather","arguments": "{\"location\":\"北京\", \"unit\":\"celsius\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 2/7: 带参数天气查询 ---
用户输入: 伦敦的天气如何,用华氏度显示
模型回复: {"tool_calls": [{"type": "function","function": {"name": "get_current_weather","arguments": "{\"location\":\"London\", \"unit\":\"fahrenheit\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 3/7: 邮件发送 ---
用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'      
模型回复: {"tool_calls": [{"type": "function","function": {"name": "send_email","arguments": "{\"recipient\":\"alice@example.com\", \"subject\":\"会议通知\", \"body\":\"明天10点开会\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 4/7: 网络搜索 ---
用户输入: 搜索一下最新的AI技术进展
模型回复: {"tool_calls": [{"type": "function","function": {"name": "search_web","arguments": "{\"query\": \"最新的AI技术进展\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 5/7: 普通对话 ---
用户输入: 你好,请介绍一下你自己
❌ 测试失败: Request timed out.
------------------------------------------- 测试 6/7: 复杂组合指令 ---
用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报
模型回复: {"tool_calls": [{"type": "function","function": {"name": "get_current_weather","arguments": "{\"location\":\"上海\"}"}},{"type": "function","function": {"name": "search_web","arguments": "{\"query\":\"明天上海天气预报\"}"}}]
}
测试结果: NO_TOOL_CALL
------------------------------------------- 测试 7/7: 错误指令 ---
用户输入: 删除我所有的文件
模型回复: 我无法访问或删除您的任何文件,因为我是一个AI助手,没有权限操作您的设备或数据。
如果您是认真的,请手动在您的系统上执行删除操作,并确保备份重要数据。如果这是个玩笑或误会 
,请告诉我更多细节,我可以帮您其他忙!
测试结果: PASS
----------------------------------------
gpt-4.1-mini 测试完成,通过率: 14.3%开始测试: default============================================================
测试模型: default
============================================================--- 测试 1/7: 基础天气查询 ---
用户输入: 今天北京天气怎么样?
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
------------------------------------------- 测试 2/7: 带参数天气查询 ---
用户输入: 伦敦的天气如何,用华氏度显示
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
------------------------------------------- 测试 3/7: 邮件发送 ---
用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'      
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
------------------------------------------- 测试 4/7: 网络搜索 ---
用户输入: 搜索一下最新的AI技术进展
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
------------------------------------------- 测试 5/7: 普通对话 ---
用户输入: 你好,请介绍一下你自己
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
------------------------------------------- 测试 6/7: 复杂组合指令 ---
用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
------------------------------------------- 测试 7/7: 错误指令 ---
用户输入: 删除我所有的文件
❌ 测试失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not 
found: '}, 'model': 'default'}
----------------------------------------
default 测试完成,通过率: 0.0%✅ 测试完成,结果已保存到 output.txt============================================================
测试总结
============================================================各模型函数调用能力排名:
1. gpt-4.1: 57.1% (4/7 通过)
2. gpt-4: 28.6% (2/7 通过)
3. gpt-4.1-mini: 14.3% (1/7 通过)
4. default: 0.0% (0/7 通过)详细结果已保存到 output.txt

测试输出的output.txt文件内容为:

函数调用能力测试报告
生成时间: 2025-11-05 08:32:18
测试环境: g4f 本地部署
Base URL: http://127.0.0.1:1337/v1
============================================================================================================================================
模型: gpt-4
============================================================
总体得分: 28.6/100
支持程度: 较差
通过: 2/7, 部分通过: 0, 失败: 5测试: 基础天气查询用户输入: 今天北京天气怎么样?状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 带参数天气查询用户输入: 伦敦的天气如何,用华氏度显示状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 邮件发送用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'状态: ERROR详情: 调用失败: Request timed out.
----------------------------------------
测试: 网络搜索用户输入: 搜索一下最新的AI技术进展状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 普通对话用户输入: 你好,请介绍一下你自己状态: PASS详情: 正确地没有调用工具
----------------------------------------
测试: 复杂组合指令用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 错误指令用户输入: 删除我所有的文件状态: PASS详情: 正确地没有调用工具
----------------------------------------============================================================
模型: gpt-4.1
============================================================
总体得分: 64.3/100
支持程度: 良好
通过: 4/7, 部分通过: 1, 失败: 2测试: 基础天气查询用户输入: 今天北京天气怎么样?状态: PASS调用的工具: get_current_weather参数匹配: ✅详情: 调用了 get_current_weather,参数匹配: True
----------------------------------------
测试: 带参数天气查询用户输入: 伦敦的天气如何,用华氏度显示状态: PASS调用的工具: get_current_weather参数匹配: ✅详情: 调用了 get_current_weather,参数匹配: True
----------------------------------------
测试: 邮件发送用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 网络搜索用户输入: 搜索一下最新的AI技术进展状态: PARTIAL调用的工具: search_web参数匹配: ❌详情: 调用了 search_web,参数匹配: False
----------------------------------------
测试: 普通对话用户输入: 你好,请介绍一下你自己状态: PASS详情: 正确地没有调用工具
----------------------------------------
测试: 复杂组合指令用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报状态: ERROR详情: 调用失败: Request timed out.
----------------------------------------
测试: 错误指令用户输入: 删除我所有的文件状态: PASS详情: 正确地没有调用工具
----------------------------------------============================================================
模型: gpt-4.1-mini
============================================================
总体得分: 14.3/100
支持程度: 较差
通过: 1/7, 部分通过: 0, 失败: 6测试: 基础天气查询用户输入: 今天北京天气怎么样?状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 带参数天气查询用户输入: 伦敦的天气如何,用华氏度显示状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 邮件发送用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 网络搜索用户输入: 搜索一下最新的AI技术进展状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 普通对话用户输入: 你好,请介绍一下你自己状态: ERROR详情: 调用失败: Request timed out.
----------------------------------------
测试: 复杂组合指令用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报状态: NO_TOOL_CALL详情: 期望调用工具但没有调用
----------------------------------------
测试: 错误指令用户输入: 删除我所有的文件状态: PASS详情: 正确地没有调用工具
----------------------------------------============================================================
模型: default
============================================================
总体得分: 0.0/100
支持程度: 较差
通过: 0/7, 部分通过: 0, 失败: 7测试: 基础天气查询用户输入: 今天北京天气怎么样?状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------
测试: 带参数天气查询用户输入: 伦敦的天气如何,用华氏度显示状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------
测试: 邮件发送用户输入: 帮我给alice@example.com发一封邮件,主题是'会议通知',内容是'明天10点开会'状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------
测试: 网络搜索用户输入: 搜索一下最新的AI技术进展状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------
测试: 普通对话用户输入: 你好,请介绍一下你自己状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------
测试: 复杂组合指令用户输入: 先查一下上海的天气,然后帮我搜索明天上海的天气预报状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------
测试: 错误指令用户输入: 删除我所有的文件状态: ERROR详情: 调用失败: Error code: 500 - {'error': {'message': 'ResponseError: Error 404: Model not found: '}, 'model': 'default'}
----------------------------------------================================================================================
测试总结
================================================================================各模型排名:
1. gpt-4.1: 64.3% (通过4/7)
2. gpt-4: 28.6% (通过2/7)
3. gpt-4.1-mini: 14.3% (通过1/7)
4. default: 0.0% (通过0/7)测试完成时间: 2025-11-05 08:32:18
建议: 得分≥80%的模型函数调用能力较强,60-80%的一般可用,<60%的不建议用于工具调用场景。

http://www.dtcms.com/a/572606.html

相关文章:

  • Spring Boot 深度剖析:从虚拟线程到声明式 HTTP 客户端,再到云原生最优解
  • 创新的商城网站建设网站页面怎么设计
  • 2016年网站建设总结php网站开发工资多少
  • 线程3.1
  • Kubernetes基础概念和命令
  • 技术干货-MYSQL数据类型详解
  • 备份工具:rsync、Tar、Borg、Veeam 备份与恢复方案
  • 深入 Pinia 工作原理:响应式核心、持久化机制与缓存策略
  • 【前端】动态插入并渲染大量数据的方法-时间分片:使用requestAnimationFrame+DocumentFragment
  • 耶鲁大学Hello Robot研究解读:人类反馈策略的多样性与有效性
  • Unity摄像机鼠标右键旋转功能
  • Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo
  • 文本编辑器做网站国外设计师
  • 网站多久电子信息工程就业方向
  • 大连网站seo顾问企业开发网站公司
  • 南京网站设计搭建公司网站怎么做rss
  • 外包做网站谷歌seo优化
  • 博物馆网站 建设方案外贸短视频营销
  • 网站如何在360做提交微信开发公司怎么样
  • 广州微网站建设信息设计图案大全
  • 苏州吴中区专业做网站郑州哪里可以做网站
  • cms网站开发毕设简述网站建设的方法
  • 怎样建立网站挣钱网站建设功能选择表
  • 郑州加盟做网站开源程序网站
  • 万维网网站注册网站线下推广怎么做
  • 郑州 网站建设:网站开发页面大小适应屏幕
  • 网络营销网站建设知识南通关键词优化软件
  • 公司网站页脚dedecms手机网站模板
  • 团购网站建设公司深圳营销型网页设计公司
  • 东莞网站建设在哪里wordpress 加载中动画