多function-calling 调用

我的AI学习 Function Calling 简单的解释一下:调用大模型中,tools是对外部方法的描述, 可多个方法,在后面根据名称执行不同的方法,如果大模型返回的Message中tool_calls中不为空,则根据名称比对调用哪一个函数,然后把结果再次传给大模型.所为的Function Calling就是函数调用,调用外部的函数,例如让大模型告诉我们我目前位置的坐标,大模型肯定不知道,此时让大模型调用指定的函数,获取信息后,再给到大模型,然后大模型再输出到外部给到用户。它表现出的逻辑、推理,是训练文本的统计规律,而不是真正的逻辑,所以有幻觉。 阅读详情

多function-calling 调用

接上一篇function-calling调用,本篇实现了一个多function-calling的调用。OpenAI会根据function的描述自己来判断应该调用哪个function。最终调用function的动作是由我们来决定的,当然你也可以不调对应的函数。

两个函数分别是:

  1. 根据POI名称查询经纬度坐标
  2. 搜索给定坐标附近的POI

下面上代码,代码中如有方法未找到,请翻看之前的文章:

import requests
## 这里的ampKey可以通过高德开发者平台免费注册一个,个人开发者可免费的少量调用
amap_key = "XXXX"

def get_location_coordinate(location, city):
    url = f"https://restapi.amap.com/v5/place/text?key={amap_key}&keywords={location}&region={city}"
    print(url)
    r = requests.get(url)
    result = r.json()
    if "pois" in result and result["pois"]:
        return result["pois"][0]
    return None


def search_nearby_pois(longitude, latitude, keyword):
    url = f"https://restapi.amap.com/v5/place/around?key={amap_key}&keywords={keyword}&location={longitude},{latitude}"
    print(url)
    r = requests.get(url)
    result = r.json()
    ans = ""
    if "pois" in result and result["pois"]:
        for i in range(min(3, len(result["pois"]))):
            name = result["pois"][i]["name"]
            address = result["pois"][i]["address"]
            distance = result["pois"][i]["distance"]
            ans += f"{name}\n{address}\n距离:{distance}米\n\n"
    return ans

# 定义tools和要调用的函数
def get_completion(messages, model="gpt-3.5-turbo"):
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,  # 模型输出的随机性,0 表示随机性最小
        seed=1024,      # 随机种子保持不变,temperature 和 prompt 不变的情况下,输出就会不变
        tool_choice="auto",  # 默认值,由 GPT 自主决定返回 function call 还是返回文字回复。也可以强制要求必须调用指定的函数,详见官方文档
        tools=[{
            "type": "function",
            "function": {
                "name": "get_location_coordinate",
                "description": "根据POI名称,获得POI的经纬度坐标",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "POI名称,必须是中文",
                        },
                        "city": {
                            "type": "string",
                            "description": "POI所在的城市名,必须是中文",
                        }
                    },
                    "required": ["location", "city"],
                }
            }
        },
            {
            "type": "function",
            "function": {
                "name": "search_nearby_pois",
                "description": "搜索给定坐标附近的poi",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "longitude": {
                            "type": "string",
                            "description": "中心点的经度",
                        },
                        "latitude": {
                            "type": "string",
                            "description": "中心点的纬度",
                        },
                        "keyword": {
                            "type": "string",
                            "description": "目标poi的关键字",
                        }
                    },
                    "required": ["longitude", "latitude", "keyword"],
                }
            }
        }],
    )
    return response.choices[0].message


prompt = "我想在北京三里屯附近喝咖啡,给我推荐几个"
# prompt = "我到北京出差,给我推荐北京三里屯附近的酒店,和北京三里屯附近的咖啡"

messages = [
    {"role": "system", "content": "你是一个地图通,你可以找到任何地址。"},
    {"role": "user", "content": prompt}
]
response = get_completion(messages)
messages.append(response)  # 把大模型的回复加入到对话中
print("=====GPT回复=====")
print_json(response)

while (response.tool_calls is not None):
    # 新版模型支持一次返回多个函数调用请求,所以要考虑到这种情况
    for tool_call in response.tool_calls:
        args = json.loads(tool_call.function.arguments)
        print("函数参数展开:")
        print_json(args)

        if (tool_call.function.name == "get_location_coordinate"):
            print("Call: get_location_coordinate")
            result = get_location_coordinate(**args)
        elif (tool_call.function.name == "search_nearby_pois"):
            print("Call: search_nearby_pois")
            result = search_nearby_pois(**args)

        print("=====函数返回=====")
        print_json(result)

        messages.append({
            "tool_call_id": tool_call.id,  # 用于标识函数调用的 ID
            "role": "tool",
            "name": tool_call.function.name,
            "content": str(result)  # 数值result 必须转成字符串
        })

    response = get_completion(messages)
    print(response)
    messages.append(response)  # 把大模型的回复加入到对话中

print("=====最终回复=====")
print(response.content)
print("=====对话历史=====")
print(messages)

运行结果:

=====GPT回复=====
{
    "content": null,
    "role": "assistant",
    "function_call": null,
    "tool_calls": [
        {
            "id": "call_C4xbz7ABvNOde510rStBhK8K",
            "function": {
                "arguments": "{\"location\":\"三里屯\",\"city\":\"北京\"}",
                "name": "get_location_coordinate"
            },
            "type": "function"
        }
    ]
}
函数参数展开:
{
    "location": "三里屯",
    "city": "北京"
}
Call: get_location_coordinate
https://restapi.amap.com/v5/place/text?key=59b58777beb50f8f180ac36ebe2159d9&keywords=三里屯&region=北京
=====函数返回=====
{
    "parent": "",
    "address": "朝阳区",
    "distance": "",
    "pcode": "110000",
    "adcode": "110105",
    "pname": "北京市",
    "cityname": "北京市",
    "type": "地名地址信息;热点地名;热点地名",
    "typecode": "190700",
    "adname": "朝阳区",
    "citycode": "010",
    "name": "三里屯",
    "location": "116.455294,39.937492",
    "id": "B0FFF5BER7"
}
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_TZc2RkF2uKmRag6PI1s67RKw', function=Function(arguments='{"longitude":"116.455294","latitude":"39.937492","keyword":"咖啡"}', name='search_nearby_pois'), type='function')])
函数参数展开:
{
    "longitude": "116.455294",
    "latitude": "39.937492",
    "keyword": "咖啡"
}
Call: search_nearby_pois
https://restapi.amap.com/v5/place/around?key=59b58777beb50f8f180ac36ebe2159d9&keywords=咖啡&location=116.455294,39.937492
=====函数返回=====
星巴克(北京三里屯三点三大厦店)
三里屯路33号3.3大厦1层1010号
距离:52米

内山咖啡店(3·3大厦店)
三里屯路33号3·3大厦B1层
距离:82米

春丽咖啡(3·3大厦店)
三里屯路33号3.3大厦东门1层1099
距离:93米


ChatCompletionMessage(content='以下是在北京三里屯附近的几家咖啡店推荐:\n\n1. 星巴克(北京三里屯三点三大厦店)\n   地址:三里屯路33号3.3大厦1层1010号\n   距离:52米\n\n2. 内山咖啡店(3·3大厦店)\n   地址:三里屯路33号3·3大厦B1层\n   距离:82米\n\n3. 春丽咖啡(3·3大厦店)\n   地址:三里屯路33号3.3大厦东门1层1099\n   距离:93米\n\n您可以选择其中一家前往享受咖啡时光。祝您喝咖啡愉快!', role='assistant', function_call=None, tool_calls=None)
=====最终回复=====
以下是在北京三里屯附近的几家咖啡店推荐:

1. 星巴克(北京三里屯三点三大厦店)
   地址:三里屯路33号3.3大厦1层1010号
   距离:52米

2. 内山咖啡店(3·3大厦店)
   地址:三里屯路33号3·3大厦B1层
   距离:82米

3. 春丽咖啡(3·3大厦店)
   地址:三里屯路33号3.3大厦东门1层1099
   距离:93米

您可以选择其中一家前往享受咖啡时光。祝您喝咖啡愉快!
=====对话历史=====
[{'role': 'system', 'content': '你是一个地图通,你可以找到任何地址。'}, {'role': 'user', 'content': '我想在北京三里屯附近喝咖啡,给我推荐几个'}, ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_C4xbz7ABvNOde510rStBhK8K', function=Function(arguments='{"location":"三里屯","city":"北京"}', name='get_location_coordinate'), type='function')]), {'tool_call_id': 'call_C4xbz7ABvNOde510rStBhK8K', 'role': 'tool', 'name': 'get_location_coordinate', 'content': "{'parent': '', 'address': '朝阳区', 'distance': '', 'pcode': '110000', 'adcode': '110105', 'pname': '北京市', 'cityname': '北京市', 'type': '地名地址信息;热点地名;热点地名', 'typecode': '190700', 'adname': '朝阳区', 'citycode': '010', 'name': '三里屯', 'location': '116.455294,39.937492', 'id': 'B0FFF5BER7'}"}, ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_TZc2RkF2uKmRag6PI1s67RKw', function=Function(arguments='{"longitude":"116.455294","latitude":"39.937492","keyword":"咖啡"}', name='search_nearby_pois'), type='function')]), {'tool_call_id': 'call_TZc2RkF2uKmRag6PI1s67RKw', 'role': 'tool', 'name': 'search_nearby_pois', 'content': '星巴克(北京三里屯三点三大厦店)\n三里屯路33号3.3大厦1层1010号\n距离:52米\n\n内山咖啡店(3·3大厦店)\n三里屯路33号3·3大厦B1层\n距离:82米\n\n春丽咖啡(3·3大厦店)\n三里屯路33号3.3大厦东门1层1099\n距离:93米\n\n'}, ChatCompletionMessage(content='以下是在北京三里屯附近的几家咖啡店推荐:\n\n1. 星巴克(北京三里屯三点三大厦店)\n   地址:三里屯路33号3.3大厦1层1010号\n   距离:52米\n\n2. 内山咖啡店(3·3大厦店)\n   地址:三里屯路33号3·3大厦B1层\n   距离:82米\n\n3. 春丽咖啡(3·3大厦店)\n   地址:三里屯路33号3.3大厦东门1层1099\n   距离:93米\n\n您可以选择其中一家前往享受咖啡时光。祝您喝咖啡愉快!', role='assistant', function_call=None, tool_calls=None)]
深入解析大语言模型的 Function Call 实现—— 以 Qwen2.5为例 通常,大语言模型的输入输出都是字符串,但 Function Call 允许模型在对话过程中识别特定的函数调用需求,并以结构化数据格式返回调用参数。 阅读详情

相关推荐

【AI大模型应用开发】Function Calling连接外部世界 - 入门与实战(1)

以Python内置的sum函数为例,假设我们想让大模型使用这个函数。这里我们需要定义自己的本地函数,不再使用Python的库函数了。下面的代码,我们定义了两个函数。get_location_coordinate用于查询某个地点的地理坐标。search_nearby_pois用于查询地理坐标附近的某些信息(取决于用户输入的Keyword)python复制代码def get_location_coordinate(location, city=“北京”):print(url)

梅花寺 1018

LLM技术揭秘:Qwen的Function Calling实现解析

Function Calling 是一种让 Chat Completion 模型调用外部函数的能力,可以让模型不仅仅根据自身的数据库知识进行回答,而是可以额外挂载一个函数库,然后根据用户提问去函数库检索,按照实际需求调用外部函数并获取函数运行结果,再基于函数运行结果进行回答,或者是通过函数调用来调用工具。Qwen 官方给出的 Function Calling 方法是基于 openai 接口的,这篇文章就从如何利用 Qwen 仿 OpenAI 接口开始写起。

m0_65555479的博客 4735

开源模型应用落地-qwen模型小试-function call(十)

学习如何使用在qwen1.5-7b-chat模型下,实现Function Call的功能

以微薄之力,予他人些许温暖. 2万+

Qwen学习笔记1:Qwen模型使用ReAct原理实现function calling,增强模型能力

本文记录使用Qwen模型基于ReAct原理实现的函数调用功能,并附带记录一些代码。

weixin_42118737的博客 5404

【3d打印】基于Klipper的3d打印远程上位机系统(Qt),klipper源码,通信解析,打印参数设置

基于Klipper的3d打印远程上位机系统(Qt),klipper源码,通信解析,打印参数设置(启庞Kp3s V1)

共享IT之美,共创机器未来 3193

INCA软件操作指南:手把手教你生成和解析DCM标定数据文件

本文详细介绍了INCA软件在汽车ECU开发中生成和解析DCM标定数据文件的全流程。从A2L文件导入到DCM文件生成,再到HEX文件导出,手把手教你掌握标定数据处理的实用技巧,包括参数标定、曲线标定和常见问题排查,帮助工程师提升工作效率。

weixin_29271053的博客 1058

LLM代码实现-Qwen(Function Calling)

Function Calling 是一种让 Chat Completion 模型调用外部函数的能力,可以让模型不仅仅根据自身的数据库知识进行回答,而是可以额外挂载一个函数库,然后根据用户提问去函数库检索,按照实际需求调用外部函数并获取函数运行结果,再基于函数运行结果进行回答,或者是通过函数调用来调用工具。Qwen 官方给出的 Function Calling 方法是基于 openai 接口的,这篇文章就从如何利用 Qwen 仿 OpenAI 接口开始写起。

m0_65555479的博客 2395

别再傻傻分不清:PX4、Pixhawk、ArduPilot、APM到底啥关系?一张图给你讲明白

本文全面解析开源飞控领域核心概念,厘清PX4、Pixhawk、ArduPilot与APM的定位与关系。通过硬件平台演进史和飞行控制软件对比,帮助开发者理解开源飞控生态,并提供新项目开发建议与特殊需求考量,助力无人机开发中的明智选择。

weixin_32770423的博客 413

大模型Function Calling并行调用和多函数调用的应用方法(附代码)

自2023年11月后发布的GPT系列模型,在Function Calling架构下支持并行函数调用,可在单个响应中生成多个函数调用,适用于处理涉及多个实体触发函数调用或函数执行时间长的场景,以此提升效率。

qq_43588095的博客 2318

HFSS实战:手把手教你设计微带发夹线滤波器(附完整参数计算流程)

本文详细介绍了使用HFSS设计微带发夹线滤波器的完整流程,包括参数计算、HFSS建模和优化策略。通过实战案例,帮助读者掌握微波滤波器设计的核心技巧,特别是奇偶模阻抗计算和HFSS仿真中的关键设置,适用于通信系统设计和射频工程应用。

weixin_29251567的博客 441

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2900

Agent工具调用实战:从Function Calling到多工具编排的关键细节

大模型驱动的人工智能体(Agent)要想从“能聊天”进化为“能干活”,离不开工具调用这一核心能力。工具调用本质上是让模型通过结构化描述理解外部接口,并以生成JSON的方式表达调用意图,再由程序真实执行。Function Calling、Actions等机制将函数注册、参数校验、结果回传封装成语义清晰的协议,使模型可以在多轮对话中稳定地调用API、数据库或业务服务。良好的工具描述与编排策略能显著提升任务完成率,而安全边界、超时控制和失败恢复则是生产落地不可忽视的工程要点。无论是个人助理、客服机器人还是企业内部

weixin_29090677的博客 209

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

大模型工具调用与 Function Calling 技术深度解析:从 JSON Schema 定义到多工具并行调度的 AI Agent 交互范式

工具定义告诉 LLM 三件事 -> 工具叫什么名字(name)-> 工具做什么(description)-> 工具需要什么参数(parameters + JSON Schema)三大厂商工具定义格式对比(text 树):三大厂商工具定义格式对比│ ├── 位置: tools[] 数组中每个元素│ ├── 结构: { type: "function", function: { name, description, parameters } }

我的博客 362

基于 STM32 的校园电动车充电桩智能计费与过载保护系统设计与实现

本系统基于 STM32F103 主控,通过 HLW8032 电能计量芯片实现精准计费,配合继电器实现过载保护,RC522 模块完成刷卡身份识别,整体方案成本低、可靠性高,适合校园电动车集中充电场景的批量部署。软件采用状态机设计,逻辑清晰,可扩展多路充电口、远程监控等功能。

weixin_42300449的博客 58

运放+MOS恒流源电路仿真分析

利用运放设计一个恒流源

HW-BASE的博客 4097

Function Calling比Agent更可靠的工具调用,踩了4个坑才知道差别有多大

Function Calling(函数调用)是大语言模型(LLM)的一项核心能力,允许模型根据用户的自然语言需求,自动判断是否需要调用外部工具(如API、数据库、计算器等),并按照指定格式生成工具调用指令,待工具返回结果后,再将结果整合为自然语言回答反馈给用户。

专注 Java / Python 开发,AI 大模型应用学习,持续输出源码教程,实战项目案例,学习笔记,拒绝空话,只写能直接跑的代码与可落地方案,关注我,一起少走弯路。 673

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OpenAI的多函数调用(Multiple Function Calling)简介

就在上周,OpenAI在开发者大会上,升级了函数调用的功能,在新的gpt-3.5和gpt-4模型中,可以在单轮对话中调用多个函数了,而且在python SDK中也提供了并发函数调用相关的接口,无疑这将大幅减少大语言模型和现实世界之间交互的开发复杂度,接下来就让我用一个具体的示例,带你了解下OpenAI的新特性。这里额外说下,上面的三个函数调用是串行调用,如果每个函数都比较耗时的话,会增加整体的调用时长,而在最新的assistant api中增加了并行执行函数的api,这个我们放到下篇文章中讲解。

xindoo 5549

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用阿里的千文大模型实现function-calling并且尝试使用了并行操作,以及多函数调用。(但并不支持并行操作)

【代码】使用阿里的千文大模型实现function-calling并且尝试使用了并行操作,以及多函数调用。(但并不支持并行操作)

m0_74213046的博客 587

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大模型工具调用实战:从Function Calling到多工具调度

在传统开发里,API调用通常是代码中写死的逻辑,由程序发起HTTP请求获取数据。而大模型工具调用(Function Calling)颠覆了这种模式:模型本身只会生成文字,但借助工具清单与结构化参数,它可以自主决策该调用哪个函数、传什么值,从而真正接触外部世界。这一机制通过JSON Schema建立模型与代码之间的契约,让意图理解不再依赖硬编码的分支判断,而是交给模型的语言能力。它的核心价值在于把API变成模型可调用的工具,支撑天气查询、日程管理、业务系统操作等Agent应用。实践中常见的模型不调用工具或工具

weixin_29053695的博客 244

一文搞懂MCP、Function_Calling和A2A

单纯的大模型,只能对话和生成文本,是“思想的巨人,行动的矮子”。配上Agent的大模型,能感知环境、使用工具、执行任务,成为“万能助手”。MCP、Function Calling 和 A2A。这三项技术,并不是有你无我的排斥关系,而是可以通力协作的互补关系。大模型通过 Prompt 学习工具使用,实现非结构化任务处理,克服传统规则的“刚性”,使得AGI(Artificial General Intelligence,通用人工智能)成为可能。

HJS123456780的博客 1264

一文搞懂MCP、Function Calling和A2A

发现:客户端从 /.well-known/agent.json 获取 Agent Card,了解智能体的能力。启动处理:服务器处理任务,可能涉及流式更新或直接返回结果。交互(可选):若任务状态为 input-required,客户端可发送更多消息,使用相同 Task ID 提供输入。完成:任务达到终端状态(如 completed、failed 或 canceled)。单纯的大模型,只能对话和生成文本,是“思想的巨人,行动的矮子”。配上Agent的大模型,能感知环境、使用工具、执行任务,成为“万能助手”。

HUANGXIN9898的博客 916

【收藏】揭秘大模型“行动力“:MCP、Function Calling与A2A三大技术详解

本文解析了AI Agent如何让大模型从"思想的巨人"转变为"万能助手"。重点介绍三大技术:MCP(Agent与工具协议)、Function Calling(Agent与模型工具调用协议)和A2A(Agent间协作协议)。这些技术使大模型能感知环境、使用工具执行实际任务。文章通过实例和代码解释协议工作原理及其在Context Engineering中的应用,展示了Agent技术如何赋予大模型真正的行动能力。

2401_85325726的博客 1267

一文搞懂MCP、Function_Calling和A2A(超详细)从零基础入门到精通,看这一篇就够了!

单纯的大模型,只能对话和生成文本,是“思想的巨人,行动的矮子”。配上Agent的大模型,能感知环境、使用工具、执行任务,成为“万能助手”。MCP、Function Calling 和 A2A。这三项技术,并不是有你无我的排斥关系,而是可以通力协作的互补关系。大模型通过 Prompt 学习工具使用,实现非结构化任务处理,克服传统规则的“刚性”,使得AGI(Artificial General Intelligence,通用人工智能)成为可能。

xiaoganbuaiuk的博客 1200

AI大模型架构终极指南!MCP、A2A、Function Calling,看懂这11张图就够了!

MCP(Model Context Protocol)的热度还未消散,新的 Agent 接口标准 A2A(Agent2Agent)又悄然登场。 就在上周,Google 在 Cloud Next 大会上正式推出了 Agent2Agent(A2A)开放协议。简单来说,A2A 旨在为 Agent 之间的通信提供一个开放标准,促进不同 Agent 之间的协作与交互。

m0_59235945的博客 782
上一篇: Function Calling学习
下一篇: redis面试知识点
null.equals()
博客等级 码龄12年 209粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值