工具调用的分层测试方法
工具调用的分层测试方法大模型工具调用接入后端网关时测试不能只覆盖静态单元测试也不应直接在生产数据上做端到端试验。模型输出具有不确定性端到端测试应使用隔离账号、可回收数据和明确的权限范围。构建高可靠的 Function Calling 体系必须建立三层金字塔测试策略Testing Pyramid Strategy单元测试校验 Proxy 容错与 Pydantic 契约、集成测试验证 Tool-Match 准确率、端到端E2E沙盒测试验证完整链路。1. 分层测试策略的三个层级与原理推导在 Function Calling 测试工程推导中三层金字塔的职责拆解如下第一层静态 Schema 单元测试Unit Testing。在不调用任何大模型 API 的前提下通过注入包含了 Markdown 块、单引号、缺少 Key 或类型错乱的坏 JSON 字符串验证代理层Proxy的 Pydantic 校验与 Auto-Repair 中间件能否平滑拦截或修复确保应用主线程零崩溃。第二层Tool-Match 黄金用例集成测试Integration Testing。准备 100~200 个涵盖业务各领域的黄金 Prompt 样本集Golden Dataset自动化评测大模型在接收 Prompt 时能否精准选择正确的 Tool 名称以及提取正确的参数。第三层沙盒端到端测试E2E Testing。在连接了 Mock 数据库与 Mock 第三方 API 的沙盒环境中运行从用户 Prompt 输入 - 模型思考 - 工具调用 - 底层 API 执行 - 组装回答返回的全流程端到端测试。测试层级测试重点与目标运行频次与位置评估通过红线1. 单元测试Proxy 容错与 Pydantic 反序列化Git Pre-commit / 本地秒级0 Crash100% 格式拦截2. 集成测试Tool-Match 准确率与参数提取CI/CD 构建阶段 (每日)Tool 选择 Accuracy 95%3. 端到端 E2E链路通畅性与异常降级预发布 (Staging) 环境E2E 成功率 98%2. 生产级 Python Function Calling 分层测试套件实现以下展示基于 Python 实现的 Function Calling 分层测试与 Tool-Match 评测框架import logging from typing import Dict, Any, List, Callable from pydantic import BaseModel, Field, ValidationError logging.basicConfig(levellogging.INFO, format%(asctime)s [%(levelname)s] %(message)s) class UserQuerySchema(BaseModel): user_id: int Field(..., ge1) class FunctionCallingPyramidTester: Function Calling 分层测试套件 def __init__(self, schema_cls: Type[BaseModel]): self.schema_cls schema_cls def test_layer1_unit(self, bad_json_samples: List[str]) - bool: logging.info([Layer 1: 单元测试] 开始校验 Proxy 反序列化防线...) all_passed True for sample in bad_json_samples: try: # 尝试解析 data json.loads(sample) self.schema_cls(**data) except (json.JSONDecodeError, ValidationError): logging.info(f[Unit 成功拦截] 成功拦截坏输入: {sample[:30]}...) except Exception as e: logging.error(f[Unit 崩溃] 发生了未捕获的严重 Exception: {e}) all_passed False return all_passed def test_layer2_integration(self, golden_cases: List[Dict[str, Any]], mock_llm_func: Callable[[str], str]) - float: logging.info([Layer 2: 集成测试] 开始评估 Tool-Match 准确率...) correct 0 for case in golden_cases: selected mock_llm_func(case[prompt]) if selected case[expected_tool]: correct 1 acc correct / float(len(golden_cases)) if golden_cases else 0.0 logging.info(f[Integration 完成] Tool-Match 准确率: {acc*100:.1f}%) return acc if __name__ __main__: import json from typing import Type tester FunctionCallingPyramidTester(UserQuerySchema) # 1. 运行 Layer 1 单元测试 bad_samples [{user_id: invalid_string}, {wrong_key: 100}] unit_ok tester.test_layer1_unit(bad_samples) # 2. 运行 Layer 2 集成测试 cases [{prompt: 查用户 101, expected_tool: get_user}] acc tester.test_layer2_integration(cases, lambda p: get_user) print(f\n分层测试结果: Unit 通过{unit_ok}, Integration 准确率{acc*100}%)3. 分层测试的可观测指标function_calling_unit_test_pass_ratio: 单元测试通过率。function_calling_tool_match_accuracy: 集成测试准确率。4. 分层测试的工程原则第一单元测试保安全Unit Tests Protect Safety。确保所有的畸形 JSON 不会引发进程崩溃。第二构建黄金用例集Golden Dataset Required。将 100 典型真实 Prompt 纳入每日 CI 测试。