双十一凌晨,某电商平台的 AI 客服系统正在经历一场没有硝烟的战争。历史峰值 5 倍的咨询量涌入,服务器在崩溃边缘挣扎。当用户问"我的订单到哪了",传统 RAG 系统可能给出通用回复;但一个设计良好的 Tool Calling 系统,却能在 200ms 内查询物流、核对库存、计算预计送达时间,给出精准的一站式答案。

本文将带你从零构建一套基于 HolySheep AI 的 Tool Calling 架构,重点讲解如何设计高质量的 function schema,让你的 AI Agent 从"能说话"进化到"会做事"。

为什么 Tool Calling 是 AI Agent 的核心能力

Function Calling(函数调用)让大语言模型从"纯文本生成器"升级为"任务执行者"。它解决了三个关键问题:

HolySheheep AI API 支持完整的 Tool Calling 能力,国内直连延迟 <50ms,非常适合高并发场景。以 DeepSeek V3.2 为例,其 output 价格仅 $0.42/MTok,是 Claude Sonnet 4.5 的 1/36,成本优势显著。

Function Schema 的核心结构

一个标准的 function schema 包含四个关键组成部分:

1. 函数名称(name)

应使用蛇形命名法(snake_case),名称需精确描述功能,避免歧义。

2. 参数描述(parameters)

采用 JSON Schema 格式,每个参数需要:

3. 返回值说明(不写在此处,但需在代码中处理)

4. 错误处理策略

高质量 Schema 设计实战

以下是一个电商客服场景的完整实现,涵盖查询订单、查询物流、取消订单三个核心工具:

import requests
import json

HolySheheep AI API 配置

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = "YOUR_HOLYSHEEP_API_KEY"

定义 Tool Calling 函数

functions = [ { "type": "function", "function": { "name": "查询订单状态", "description": "根据订单号查询电商订单的当前状态,包括支付、发货、收货等阶段", "parameters": { "type": "object", "properties": { "order_id": { "type": "string", "description": "订单号,格式为字母+数字组合,如 ORD20231111001", "pattern": "^ORD[A-Z0-9]{8,}$" }, "include_details": { "type": "boolean", "description": "是否包含商品明细,true 返回完整商品列表", "default": False } }, "required": ["order_id"] } } }, { "type": "function", "function": { "name": "查询物流信息", "description": "追踪订单的物流配送进度,返回快递公司和实时位置", "parameters": { "type": "object", "properties": { "tracking_number": { "type": "string", "description": "快递单号,支持顺丰/中通/圆通/韵达" }, "carrier": { "type": "string", "description": "快递公司代码", "enum": ["SF", "ZTO", "YTO", "YD", "EMS"] } }, "required": ["tracking_number"] } } }, { "type": "function", "function": { "name": "取消订单", "description": "取消未发货的订单并触发退款流程,仅在订单状态为待发货时可执行", "parameters": { "type": "object", "properties": { "order_id": { "type": "string", "description": "待取消的订单号" }, "cancel_reason": { "type": "string", "description": "取消原因", "enum": ["不想要了", "价格太贵", "重复下单", "商品缺货", "其他"] } }, "required": ["order_id", "cancel_reason"] } } } ] def call_holysheep_api(messages, tools): """调用 HolySheheep AI API 执行 Tool Calling""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": "deepseek-chat", "messages": messages, "tools": tools, "temperature": 0.3, # 降低随机性,提高工具选择准确性 "tool_choice": "auto" # 让模型自行决定调用哪个工具 } response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload, timeout=30 ) return response.json()

模拟工具执行函数

def execute_tool(tool_name, arguments): """执行被调用的工具""" if tool_name == "查询订单状态": return { "status": "shipped", "stage": "配送中", "items": ["iPhone 15 Pro 256G 钛金色"], "total_amount": 8999.00 } elif tool_name == "查询物流信息": return { "carrier": "顺丰速运", "status": "派送中", "location": "北京市朝阳区XX营业部", "eta": "今日 18:00 前" } elif tool_name == "取消订单": return { "success": True, "refund_amount": 8999.00, "refund_time": "1-3个工作日" } return {"error": "未知工具"}

对话流程示例

messages = [ {"role": "system", "content": "你是电商平台的智能客服,请根据用户问题调用相应工具查询信息。"}, {"role": "user", "content": "我的订单 ORD20231111001 现在到哪了?"} ] result = call_holysheep_api(messages, functions) print(json.dumps(result, ensure_ascii=False, indent=2))

当模型识别到需要调用工具时,返回的响应会包含 tool_calls 字段。接下来我们需要处理工具执行并获取结果:

def process_tool_calls(response):
    """
    处理模型返回的 Tool Calling 请求
    返回包含工具结果的对话消息
    """
    if "choices" not in response:
        return None
    
    choice = response["choices"][0]
    
    # 检查是否有工具调用
    if choice.get("finish_reason") != "tool_calls":
        return response
    
    message = choice["message"]
    tool_calls = message.get("tool_calls", [])
    
    if not tool_calls:
        return response
    
    # 执行每个工具调用
    tool_results = []
    for tool_call in tool_calls:
        tool_name = tool_call["function"]["name"]
        arguments = json.loads(tool_call["function"]["arguments"])
        tool_call_id = tool_call["id"]
        
        # 调用业务逻辑
        result = execute_tool(tool_name, arguments)
        
        tool_results.append({
            "role": "tool",
            "tool_call_id": tool_call_id,
            "name": tool_name,
            "content": json.dumps(result, ensure_ascii=False)
        })
    
    return tool_results

完整对话流程

def chat_with_tools(user_message): """完整的 Tool Calling 对话流程""" messages = [ {"role": "system", "content": "你是电商平台智能客服,专业、耐心、简洁。"}, {"role": "user", "content": user_message} ] while True: # 第一步:让模型决定是否调用工具 response = call_holysheep_api(messages, functions) # 检查是否需要工具调用 choice = response["choices"][0] if choice.get("finish_reason") != "tool_calls": # 无需工具,直接返回回复 return choice["message"]["content"] # 提取消息(用于后续对话上下文) assistant_msg = choice["message"] messages.append(assistant_msg) # 执行工具调用 tool_results = process_tool_calls(response) # 将工具结果添加到对话中 for result in tool_results: messages.append(result) # 继续对话,让模型根据工具结果生成回复 # (在实际应用中可能需要限制循环次数)

测试完整流程

user_input = "查一下 ORD20231111001 的物流进度,麻烦了" reply = chat_with_tools(user_input) print(f"AI 回复: {reply}")

Schema 设计的最佳实践

1. 参数命名要语义化

避免 user_id,使用 customer_idbuyer_id 明确角色。避免 date,使用 start_date/end_date/delivery_date 明确语义。

2. 使用正则表达式约束格式

"order_id": {
    "type": "string",
    "description": "10位订单号,格式:日期(8位)+序号(2位)",
    "pattern": "^[0-9]{10}$"
},
"phone": {
    "type": "string", 
    "description": "中国大陆手机号",
    "pattern": "^1[3-9][0-9]{9}$"
},
"email": {
    "type": "string",
    "description": "有效的电子邮件地址",
    "format": "email"
}

3. 为复杂对象提供嵌套示例

"shipping_address": {
    "type": "object",
    "description": "收货地址信息",
    "properties": {
        "province": {"type": "string", "description": "省份,如:北京市"},
        "city": {"type": "string", "description": "城市,如:朝阳区"},
        "district": {"type": "string", "description": "区县,如:望京街道"},
        "detail": {"type": "string", "description": "详细地址(不含省市区)"},
        "recipient": {"type": "string", "description": "收货人姓名"},
        "phone": {"type": "string", "description": "手机号"}
    },
    "required": ["province", "city", "detail", "recipient", "phone"],
    "additionalProperties": False
}

4. 合理使用 Enum 限制选项

对于有限选项,使用 enum 而非自由文本:

"order_status": {
    "type": "string",
    "description": "订单状态",
    "enum": ["pending_payment", "paid", "shipped", "delivered", "completed", "cancelled", "refunded"]
},
"payment_method": {
    "type": "string", 
    "description": "支付方式",
    "enum": ["wechat", "alipay", "unionpay", "credit_card", "balance"]
}

常见报错排查

报错 1:tool_calls 返回空但 finish_reason 是 stop

原因:模型判断问题不需要工具调用,或 prompt 引导不足。

解决方案

# 修复示例:在 system prompt 中强化工具调用要求
system_prompt = """你是电商客服助手。规则:
1. 用户询问订单、物流、退款时,必须调用相应工具查询
2. 禁止凭记忆回复,必须查询实时数据
3. 回复前确认已获取所有必要信息"""

messages = [
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": user_message}
]

报错 2:Invalid parameter: tools[0].function.parameters

原因:parameters 字段格式不符合 JSON Schema 规范。

解决方案

报错 3:工具返回结果后模型仍调用同一工具

原因:工具执行结果未正确注入对话上下文,或结果格式不符合模型预期。

解决方案

# 正确格式
tool_result_message = {
    "role": "tool",
    "tool_call_id": "call_abc123",  # 必须与原始调用ID匹配
    "name": "查询订单状态",
    "content": json.dumps({"status": "shipped", "items": [...]})
}

messages.append(tool_result_message)  # 正确添加到上下文

报错 4:Tool timeout 或调用频率过高

原因:工具执行时间过长,或并发调用过多。

解决方案

报错 5:模型选择了不存在的工具名称

原因:schema 描述不够精确,或模型产生幻觉。

解决方案

性能优化:HolySheheep API 的实测表现

在实际电商促销场景中(1000 QPS 并发),我们使用 HolySheheep API 的表现:

配合微信/支付宝充值和 ¥1=$1 的汇率优势,中小企业的 AI 客服成本可控制在每月几百元以内。

总结:Schema 设计的检查清单