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

AI函数调用技术:并行与多函数调用

一、并行函数调用

(一)核心概念

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

(二)代码示例与逻辑图

from openai import OpenAI
import json

client = OpenAI()

def query_by_product_name(product_name):
    products = [
        ('001', '足球', '高品质职业比赛用球', '圆形, 直径22 cm', '职业比赛、学校体育课', '耐克', 120.0, 50),
        ('002', '羽毛球拍', '轻量级, 适合初中级选手,提供优秀的击球感受', '碳纤维材质, 重量85 g', '业余比赛、家庭娱乐', '尤尼克斯', 300.0, 30),
        ('003', '篮球', '室内外可用,耐磨耐用, 适合各种天气条件', '皮质,标准7号球', '学校、社区运动场', '斯伯丁', 200.0, 40),
        ('004', '跑步鞋', '适合长距离跑步, 舒适透气,提供良好的足弓支撑', '多种尺码, 透气网布', '长跑、日常训练', '阿迪达斯', 500.0, 20),
        ('008', '乒乓球拍套装', '包括两只拍子和三个球,适合家庭娱乐和业余训练', '标准尺寸, 拍面防滑处理', '家庭、社区', '双鱼', 160.0, 35)
    ]
    return [prod for prod in products if product_name in prod[1]]

tools = [
    {
        "type": "function",
        "function": {
            "name": "query_by_product_name",
            "description": "Query the database to retrieve a list of products that match or contain the given product name.",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_name": {"type": "string"}
                },
                "required": ["product_name"]
            }
        }
    }
]

messages = []
while True:
    prompt = input('\n提出一个问题:')
    if prompt.lower() == "退出":
        break
    messages.append({'role': 'user', 'content': prompt})
    
    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=messages,
        tools=tools
    )
    
    response = completion.choices[0].message
    tool_calls = response.tool_calls

    if tool_calls:
        messages.append(response)
        #重点关注
        for tool_call in tool_calls:
            args = json.loads(tool_call.function.arguments)
            res = query_by_product_name(args["product_name"])
            messages.append({
                "role": "tool",
                "name": "query_by_product_name",
                "content": str(res),
                "tool_call_id": tool_call.id
            })
        
        final_response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages
        ).choices[0].message.content
        messages.append({'role': 'assistant', 'content': final_response})
        print(final_response)
    else:
        print(response.content)
        messages.append({'role': 'assistant', 'content': response.content})

(三)代码逻辑图

用户输入
添加到消息列表
调用OpenAI API
有工具调用?
添加原始响应
直接输出响应
遍历每个tool_call
解析参数并调用函数
添加工具调用结果
再次调用API生成最终回复
输出最终回复

二、多函数调用

(一)核心概念

多函数调用允许在一个系统中定义多个不同功能的函数,并让大模型根据用户需求自动选择和调用合适的函数。实现多函数调用主要通过定义新函数、添加其Json Schema表述并加入工具列表,以及在支持函数列表中增加对应键值对等步骤。

(二)代码示例与逻辑图

from openai import OpenAI
import json

client = OpenAI()

def query_by_product_name(product_name):
    products = [
        ('001', '足球', '高品质职业比赛用球', '圆形, 直径22 cm', '职业比赛、学校体育课', '耐克', 120.0, 50),
        ('002', '羽毛球拍', '轻量级, 适合初中级选手,提供优秀的击球感受', '碳纤维材质, 重量85 g', '业余比赛、家庭娱乐', '尤尼克斯', 300.0, 30),
        ('003', '篮球', '室内外可用,耐磨耐用, 适合各种天气条件', '皮质,标准7号球', '学校、社区运动场', '斯伯丁', 200.0, 40),
        ('004', '跑步鞋', '适合长距离跑步, 舒适透气,提供良好的足弓支撑', '多种尺码, 透气网布', '长跑、日常训练', '阿迪达斯', 500.0, 20),
        ('008', '乒乓球拍套装', '包括两只拍子和三个球,适合家庭娱乐和业余训练', '标准尺寸, 拍面防滑处理', '家庭、社区', '双鱼', 160.0, 35)
    ]
    return [prod for prod in products if product_name in prod[1]]

def read_store_promotions(product_name):
    file_path = 'store_promotions.txt'
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            promotions = file.readlines()
        return "".join([line for line in promotions if product_name in line]) or "无相关优惠"
    except Exception as e:
        return f"查询失败: {str(e)}"

#修改一
tools = [
    {
        "type": "function",
        "function": {
            "name": "query_by_product_name",
            "description": "Query the database to retrieve a list of products that match or contain the given product name.",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_name": {"type": "string"}
                },
                "required": ["product_name"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "read_store_promotions",
            "description": "Read the store's promotion document to find specific promotions related to the given product name.",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_name": {"type": "string"}
                },
                "required": ["product_name"]
            }
        }
    }
]

#修改二
available_functions = {
    "query_by_product_name": query_by_product_name,
    "read_store_promotions": read_store_promotions
}

messages = []
while True:
    prompt = input('\n提出一个问题:')
    if prompt.lower() == "退出":
        break
    messages.append({'role': 'user', 'content': prompt})
    
    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=messages,
        tools=tools,
        parallel_tool_calls=False
    )
    
    response = completion.choices[0].message
    tool_calls = response.tool_calls

    if tool_calls:
        messages.append(response)
        for tool_call in tool_calls:
            #关键
            func_name = tool_call.function.name
            args = json.loads(tool_call.function.arguments)
            res = available_functions[func_name](**args)
            messages.append({
                "role": "tool",
                "name": func_name,
                "content": str(res),
                "tool_call_id": tool_call.id
            })
        
        final_response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages
        ).choices[0].message.content
        messages.append({'role': 'assistant', 'content': final_response})
        print(final_response)
    else:
        print(response.content)
        messages.append({'role': 'assistant', 'content': response.content})

(三)代码逻辑图

query_by_product_name
read_store_promotions
用户输入
添加到消息列表
调用OpenAI API
有工具调用?
添加原始响应
直接输出响应
遍历每个tool_call
解析函数名和参数
调用哪个函数?
查询产品信息
查询优惠政策
添加工具调用结果
再次调用API生成最终回复
输出最终回复

三、Function Calling的局限与AI Agent的需求

面对复杂任务需求(如一条文本涉及多个复杂需求,且工具调用存在顺序依赖或前后输出依赖)时,Function Calling无法满足,需要借助AI Agent框架来实现自主决策和复杂任务处理。OpenAI通过Assistant API实现智能代理功能,后续课程将详细介绍。React理念不仅适用于OpenAI的GPT模型,也是主流AI Agent框架的技术变种,掌握其原理和源码实现思想十分必要,下节课将基于React基础理论和进阶案例,帮助理解复杂文本生成和工作流场景下的应用。

<think>好的,用户现在想了解如何通过函数调用的方式与大型语言模型进行交互,也就是Function Calling方法示例。首先,我需要回忆一下相关的知识,确保信息准确。Function Calling允许大模型执行外部函数,比如获取实时数据或与数据库交互,这扩展了模型的能力。 首先,应该解释Function Calling的基本概念,可能引用已有的参考资料,比如用户提供的引用[1][2]。然后,分步骤说明如何实现,比如定义函数、构建提示、解析响应执行函数。用户可能需要具体的示例,所以需要准备一个代码示例,比如获取天气的函数。要注意代码的正确性,使用Python,并且语法正确。 另外,用户的问题可能还涉及到应用场景注意事项,比如错误处理、权限控制等。需要确保回答结构清晰,分点说明,每个步骤都有例子或说明。同时,生成的相关问题要围绕Function Calling的扩展,比如优化方法、安全措施等。 检查是否遵循了系统级指令,比如数学公式的格式是否正确,使用中文回答,引用标识是否正确添加。最后,确保回答真实可靠,没有编造的信息,引用来源正确。</think>### 通过函数调用大模型交互的方法 #### 1. **核心原理** 函数调用Function Calling)通过将外部工具能力与大模型结合,扩展其功能边界。大模型根据用户输入**自动判断何时调用函数**,并将自然语言参数转换为结构化请求,例如: - 用户输入:“北京今天气温少?” - 模型响应:触发`get_weather(location: str)`函数调用,参数为`{"location": "北京"}`[^2] #### 2. **实现步骤** ##### 步骤1:定义函数清单 ```python functions = [ { "name": "get_stock_price", "description": "获取指定股票实时价格", "parameters": { "type": "object", "properties": { "symbol": {"type": "string", "description": "股票代码,如 AAPL"} }, "required": ["symbol"] } } ] ``` ##### 步骤2:构建提示词 系统提示需包含函数描述: ``` 你是一个财经助手,可以调用以下功能: - get_stock_price:输入股票代码,返回实时价格 ``` ##### 步骤3:解析模型响应 当模型返回函数调用请求时,提取结构化参数: ```json { "function_call": { "name": "get_stock_price", "arguments": "{\"symbol\": \"AAPL\"}" } } ``` ##### 步骤4:执行函数并反馈 ```python def execute_function(function_name, arguments): if function_name == "get_stock_price": return fetch_api(f"https://api.stocks.com/{arguments['symbol']}") ``` #### 3. **完整交互示例** ```python import openai response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "苹果公司当前股价是少?"}], functions=functions, function_call="auto" ) if response.choices[0].message.get("function_call"): func_args = json.loads(response.choices[0].message.function_call.arguments) result = execute_function(response.function_call.name, func_args) # 将结果返回给模型生成最终回复 ``` #### 4. **关键应用场景** - **实时数据查询**:股票/天气/交通信息 - **业务系统集成**:CRM系统客户数据查询 - **复杂计算委托**:将微积分计算交给SymPy等数学库 - **模态扩展**:调用图像生成API实现文生图 #### 5. **注意事项** - **错误处理**:需捕获API调用超时/参数错误 - **权限控制**:敏感函数需进行身份验证 - **成本优化**:通过函数描述压缩减少token消耗 - **参数校验**:对模型输出的参数进行类型检查 $$ \text{交互流程} = \text{用户输入} \rightarrow \text{模型解析} \rightarrow \text{函数调用} \rightarrow \text{结果反馈} \rightarrow \text{最终输出} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值