人工智能-function calling(函数调用)

文章目录

function calling(函数调用)是至关重要的一项能力。

示例

先设置环境变量MODELSCOPE_API_KEY,值为魔搭社区的token。

代码:

python 复制代码
import requests
import json
import os
import re

# ====================== 核心配置 ======================
API_KEY = os.getenv("MODELSCOPE_API_KEY", "YOUR_MODELSCOPE_TOKEN_HERE")
URL = "https://api-inference.modelscope.cn/v1/chat/completions"
MODEL_NAME = "Qwen/Qwen3.5-35B-A3B"

# ====================== 函数定义 ======================
functions = [
    {
        "name": "get_weather",
        "description": "查询指定城市的实时天气信息",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称,如北京、上海"},
                "date": {"type": "string", "description": "日期,格式YYYY-MM-DD"}
            },
            "required": ["city"]
        }
    }
]

# ====================== 真实函数 ======================
def get_weather(city: str, date: str = "2026-03-23") -> str:
    weather = {
        "北京": "多云转晴 5~19℃,轻度污染",
        "上海": "小雨 10~15℃",
        "广州": "晴 18~28℃"
    }
    return f"{date} {city}天气:{weather.get(city, '暂无数据')}"

# ====================== 调用模型 ======================
def run(question):
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }

    data = {
        "model": MODEL_NAME,
        "messages": [{"role": "user", "content": question}],
        "functions": functions,
        "function_call": "auto",
        "temperature": 0.0
    }

    resp = requests.post(URL, headers=headers, json=data, timeout=60)
    resp_data = resp.json()

    print("📌 模型返回:")
    print(json.dumps(resp_data, ensure_ascii=False, indent=2))

    # 读取 reasoning_content(Qwen3.5 把调用决策写在这里)
    message = resp_data["choices"][0]["message"]
    reasoning = message.get("reasoning_content", "")
    content = message.get("content", "")

    print("\n🧠 模型思考内容:", reasoning)

    # ====================== 关键:从自然语言 reasoning 里提取函数调用 ======================
    func_name = None
    city = None
    date = None

    if "get_weather" in reasoning:
        func_name = "get_weather"

        # 正则提取 city
        city_match = re.search(r'city[="\s]+([^"\s]+)', reasoning)
        if city_match:
            city = city_match.group(1).strip('"')

        # 正则提取 date
        date_match = re.search(r'\d{4}-\d{1,2}-\d{1,2}', reasoning)
        if date_match:
            date = date_match.group(0)

    # 如果识别到要调用天气函数
    if func_name == "get_weather" and city:
        print(f"\n✅ 成功识别函数调用:get_weather(city={city}, date={date})")
        result = get_weather(city=city, date=date or "2026-03-23")
        print("🌤 天气结果:", result)
        return

    # 否则直接输出回答
    print("\n💬 模型直接回答:", content)

# ====================== 测试 ======================
if __name__ == "__main__":
    print("===== 测试1:天气查询 =====")
    run("北京2026-03-23的天气怎么样")

    print("\n===== 测试2:纯聊天 =====")
    run("介绍一下Qwen3.5-35B-A3B")
示例-流程解读

1、用户提问 "北京的天气怎么样?"

2、代码调魔搭Qwen(传functions)

3、模型思考并写调用意图到reasoning

4、代码解析思考内容(可以用文本匹配来做,例如是否包含get_weather函数、包含必填参数city等)

5、执行本地函数

6、返回结果

相关推荐
CoderYanger7 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
wafrdggh9 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿10 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
许雪里10 小时前
XXL-AI v1.5.0 发布|AI应用开发平台
agent·ai编程
天诰12 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
龙腾AI白云13 小时前
仿真到现实(Sim-to-Real)迁移:跨越仿真与现实鸿沟
数据库·机器学习·plotly·知识图谱·tornado
ikoala15 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
ikoala15 小时前
AI 写页面像说明书,修 Bug 像贴膏药?把这两句话写进 AGENTS.md
前端·javascript·ai编程
freejackman15 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
.痞老板.16 小时前
mysql初阶--增删改查操作
数据库·mysql