首页 / 博客 / AI·大模型接入

大模型Function Calling在微信机器人中的应用

分类:AI·大模型接入 · 标签:微信机器人开发、Function Calling、个人微信API

前言

大模型横扫各行各业,但许多开发者发现,让 GPT / Claude 直接接管微信客服时,AI 只会"说话"却无法真正执行业务动作——查不了订单、发不了红包、拉不了群。这正是 Function Calling(工具调用)出现的原因:让大模型在合适时机主动调用外部接口,将"理解语义"和"执行动作"连接起来。本文结合 WechatApi 个人微信 HTTP API,手把手讲透这套架构的设计与落地细节。


一、什么是 Function Calling,为何微信场景特别需要它

1.1 Function Calling 原理速览

Function Calling 是 OpenAI、Anthropic 等主流大模型厂商提供的能力:开发者在请求大模型时,附带一份"工具描述清单"(JSON Schema 格式),模型在推理过程中如果判断需要调用某个工具,就会在响应里输出一段结构化的调用意图(而不是直接给出答案)。开发者程序收到后,执行真实的函数调用,将结果再传回模型,模型最终整合信息给出最终回复。

整个过程是多轮对话 + 工具编排,而非单次问答,这让大模型从"聊天机器人"升维为"智能体(Agent)"。

1.2 微信场景的特殊挑战

微信在国内的业务覆盖极广:客服接待、社群运营、SCRM 跟进、自动发圈……这些场景都要求机器人不只是回复文字,还需要能够:

纯靠 Prompt 工程,大模型顶多做到"说出该怎么做",实际操作仍需人工介入。而借助 Function Calling + 微信 API,整个闭环可以完全自动化。


二、整体架构设计

在动手写代码之前,先把系统分层想清楚,后续迭代才不会一团乱麻。

用户微信消息
      │
      ▼
  消息接收层(Webhook / 轮询)
      │
      ▼
  对话状态管理(session / history)
      │
      ▼
  大模型调用层(含 Function Calling 工具描述)
      │        │
      │        └──► 若模型返回 tool_call
      │                  │
      │                  ▼
      │           微信 API 执行层(WechatApi HTTP API)
      │                  │
      └──────────────────┘
      ▼
  最终回复 → 微信发送

核心模块分为四层:消息接收层、对话状态层、大模型层、API 执行层。其中 API 执行层对接 WechatApi 个人微信 API,通过标准 HTTP POST 调用完成所有微信侧动作。

2.1 工具描述(Tool Schema)设计原则

Function Calling 的精髓在于如何描述工具,让模型"知道什么时候该用它"。有几个关键点:

设计维度建议做法反例
名称动词+名词,语义清晰,如 send_text_messagefunc1tool_a
描述一句话说清楚触发时机,而不是参数说明把参数列表当描述
参数粒度一个工具只做一件事把发消息/拉群/踢人塞进一个工具
必填/选填required 字段务必精简,避免模型漏填把所有字段都标 required
枚举值有限选项一定用 enum,不要让模型自由发挥让模型自己填 "text"/"image"

三、工具函数定义实战

以"客服机器人"场景为例,我们定义三个核心工具:

pythonTOOLS = [
    {
        "type": "function",
        "function": {
            "name": "send_wechat_text",
            "description": "向指定微信用户或群组发送文本消息。当需要回复用户、告知查询结果或执行通知时调用。",
            "parameters": {
                "type": "object",
                "properties": {
                    "to_wxid": {
                        "type": "string",
                        "description": "接收方的微信ID(个人wxid或群chatroom ID)"
                    },
                    "content": {
                        "type": "string",
                        "description": "要发送的文本内容,支持换行符"
                    }
                },
                "required": ["to_wxid", "content"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "query_order_status",
            "description": "根据订单号查询订单状态和物流信息。用户询问订单进度时调用。",
            "parameters": {
                "type": "object",
                "properties": {
                    "order_id": {
                        "type": "string",
                        "description": "订单号,通常由字母和数字组成"
                    }
                },
                "required": ["order_id"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "transfer_to_human",
            "description": "将当前对话转接给人工客服。当用户情绪激动、问题超出AI能力范围或用户主动要求时调用。",
            "parameters": {
                "type": "object",
                "properties": {
                    "reason": {
                        "type": "string",
                        "description": "转人工的原因,将显示在客服工作台"
                    },
                    "priority": {
                        "type": "string",
                        "enum": ["normal", "urgent"],
                        "description": "优先级,urgent 表示紧急"
                    }
                },
                "required": ["reason"]
            }
        }
    }
]

工具定义完成后,每次调用大模型时将 TOOLS 作为 tools 参数传入即可。


四、与 WechatApi 对接:消息收发的具体实现

WechatApi 采用 iPad 协议,稳定性远高于 Hook 注入类方案,接口风格统一为 HTTP POST + JSON,鉴权使用请求头 VideosApi-token,业务参数必带 appId(设备 ID),返回体固定为:

json{
  "ret": 200,
  "msg": "操作成功",
  "data": {
    "msgId": "示意消息ID-xxxxxx"
  }
}

4.1 接收微信消息(Webhook 模式)

在控制台配置回调地址后,WechatApi 会将收到的消息以 POST 推送到你的服务,消息体示意如下:

json{
  "appId": "your-device-app-id",
  "type": 1,
  "fromWxId": "wxid_abcdefg",
  "toWxId": "wxid_robot",
  "content": "我的订单 ORD20240601001 到哪里了?",
  "msgId": "示意消息ID-yyyyyy",
  "timestamp": 1717200000
}

4.2 发送文本消息

当 Function Calling 返回 send_wechat_text 调用意图时,执行层构造如下请求:

pythonimport requests

def send_wechat_text(to_wxid: str, content: str) -> dict:
    """调用 WechatApi 发送文本消息"""
    url = "https://api.wechatapi.net/v1/message/sendText"  # 示意路径
    headers = {
        "Content-Type": "application/json",
        "VideosApi-token": "your-api-token-here"   # 实际token在控制台获取
    }
    payload = {
        "appId": "your-device-app-id",   # 设备ID,在控制台绑定设备后获得
        "toWxId": to_wxid,
        "content": content
    }
    resp = requests.post(url, json=payload, headers=headers, timeout=10)
    result = resp.json()
    if result.get("ret") == 200:
        return {"success": True, "msgId": result["data"]["msgId"]}
    else:
        return {"success": False, "error": result.get("msg", "未知错误")}

注意:appId 是设备 ID(每台登录微信的手机/iPad 对应一个),而不是微信的 AppID。这是初次接触 WechatApi 最容易混淆的概念。


五、多轮对话闭环:Function Calling 完整调用链

下面展示从接收消息到最终回复的完整 Python 伪代码,是整个方案的核心骨架:

pythonimport json
from openai import OpenAI

client = OpenAI(api_key="your-llm-api-key")

# 工具执行路由
def execute_tool(tool_name: str, tool_args: dict, context: dict) -> str:
    if tool_name == "send_wechat_text":
        result = send_wechat_text(
            to_wxid=context["from_wxid"],
            content=tool_args["content"]
        )
        return json.dumps(result, ensure_ascii=False)
    elif tool_name == "query_order_status":
        # 调用内部订单系统
        order_info = query_order_from_db(tool_args["order_id"])
        return json.dumps(order_info, ensure_ascii=False)
    elif tool_name == "transfer_to_human":
        notify_human_agent(context["from_wxid"], tool_args)
        return json.dumps({"success": True, "message": "已通知人工客服"})
    return json.dumps({"error": "未知工具"})


def handle_wechat_message(webhook_payload: dict):
    from_wxid = webhook_payload["fromWxId"]
    user_content = webhook_payload["content"]

    # 从 session 取历史消息(生产中用 Redis/DB 存储)
    messages = get_session_history(from_wxid)
    messages.append({"role": "user", "content": user_content})

    context = {"from_wxid": from_wxid}

    # 多轮循环,直到模型不再发起工具调用
    while True:
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
            tools=TOOLS,
            tool_choice="auto"
        )
        msg = response.choices[0].message
        messages.append(msg)  # 将模型回复加入历史

        # 没有工具调用 → 直接回复用户
        if not msg.tool_calls:
            final_reply = msg.content
            send_wechat_text(from_wxid, final_reply)
            break

        # 有工具调用 → 执行并将结果送回
        for tool_call in msg.tool_calls:
            tool_result = execute_tool(
                tool_call.function.name,
                json.loads(tool_call.function.arguments),
                context
            )
            messages.append({
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": tool_result
            })
        # 继续循环,让模型整合工具结果

    # 持久化更新后的对话历史
    save_session_history(from_wxid, messages)

这个循环结构是 Function Calling 的精髓:只要模型还有工具调用需求,就继续执行;直到模型确认信息足够,才生成最终文本回复用户。


六、进阶场景:群管理机器人的工具编排

微信群管理机器人 场景比客服更复杂,需要多工具协同。以"自动清理不活跃群成员"为例:

  1. 定时触发:每日凌晨调度任务触发;
  2. 获取群成员列表:调用 WechatApi get_group_members 工具;
  3. 筛选不活跃成员:大模型结合活跃度数据做判断,或直接走业务规则;
  4. 踢出并通知:调用 remove_group_member,同时 send_text 记录日志到管理群。

整个流程中,大模型扮演"决策者"角色——它看到数据后判断是否需要进一步查询,或直接发起踢人动作。这种"推理→行动"的循环,正是 Agent 与普通聊天机器人的本质区别。

6.1 工具编排的优先级控制

当多个工具可能同时适用时,用 System Prompt 明确优先级:

你是一个群管理助手。处理请求时,优先顺序如下:
1. 先查询信息(get_group_members、query_user_profile),再决策;
2. 执行敏感操作(remove_group_member)前,必须先确认 priority 字段;
3. 任何修改操作完成后,必须调用 send_wechat_text 通知管理员群。
禁止在没有充分信息的情况下直接执行删除、踢人等不可逆操作。

通过 System Prompt 约束行为边界,比在代码层硬编码更灵活、更易调整。


七、常见问题与避坑指南

7.1 模型"幻觉式工具调用"

有时模型会用错误的参数格式调用工具(比如把 to_wxid 填成昵称而非 wxid)。解决方案:

7.2 对话历史过长导致费用飙升

Function Calling 场景下,每次工具调用都会产生额外 Token 消耗(工具描述 + 工具结果都计入 Token)。优化策略:

7.3 微信消息并发处理

微信消息可能并发到来(群消息尤为明显),同一用户的多条消息同时触发模型调用会导致 session 竞争。推荐方案:对每个 from_wxid 使用队列串行处理,避免 session 污染。

7.4 appId 与设备状态管理

WechatApi 基于 个人微信 iPad 协议 运行,每个登录设备对应一个 appId。需要注意:


八、从机器人到 SCRM:Function Calling 的延伸价值

Function Calling 架构一旦搭好,扩展到 微信 SCRM 场景几乎是顺水推舟:只需增加 CRM 相关工具(create_customeradd_tagupdate_follow_record),大模型就能在对话过程中同步维护客户画像,实现真正意义上的"对话即录入"。

举个实际案例:销售助手机器人在和潜在客户聊天时,自动识别出对方提到的意向产品和预算区间,调用 add_customer_tagupdate_crm_note 实时写入 CRM,销售主管在后台打开客户详情,所有关键信息已经自动整理好,无需再手动录入跟进记录。

这种"无感知数据采集"在传统 Webhook 机器人时代几乎不可能实现,因为没有大模型的语义理解,你无从知道聊天内容里哪句话是"意向信号"。


小结

Function Calling 是打通大模型与微信业务系统的关键桥梁:大模型负责语义理解和决策,WechatApi 负责微信侧动作的可靠执行,二者通过标准化的 HTTP API 解耦,让整个系统既灵活又易于维护。核心要点回顾:

如果你正在评估微信 API 接入方案,欢迎访问 WechatApi 控制台 免费试用,或查阅 开发文档 了解完整接口列表。

想动手试试?

WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,注册后几分钟跑通。

立即免费注册查看开发文档

相关产品页

🔗 个人微信API(产品页)🔗 微信二次开发(产品页)🔗 微信机器人开发(产品页)

相关文章

微信接入通义千问做智能客服(国产大模型)微信机器人接入知识库 RAG,做企业专属智能问答微信 AI 机器人多轮对话与上下文管理实战微信 AI 客服意图识别与智能转人工方案
© 2025 WechatApi · 企业级微信智能机器人接入平台
官网价格帮助文档博客
苏ICP备2024128799号 · 苏ICP备2023038368号