LLM:函数调用(Function Calling)

1 函数调用

虽然大模型能解决很多问题,但大模型并不能知晓一切。比如,大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月,GPT-4 是 2023 年12月)。另外,大模型没有"真逻辑"。它表现出的逻辑、推理,是训练文本的统计规律,而不是真正的逻辑,所以有幻觉。所以大模型需要连接真实世界,并对接真逻辑系统。这就需要用到"函数调用"。

函数调用(Function Calling)可以**使LLM具有与外部API交互的能力。**让用户能够使用高效的外部工具、与外部API进行交互。其使用机制如下:

关于function calling,有以下几点需要注意:

  • 在最新版本的OpenAI API中,可以使用tools参数对函数进行描述。并让大模型智能地选择输出包含函数参数的JSON对象来调用一个或多个函数。
  • 最新的GPT模型(gpt-3.5-turbo-0125 and gpt-4-turbo-preview)可以自动检测何时应该调用函数(还有一个相关的参数tool_choice,一般不用自己设置),还可以输出更加符合函数签名的JSON串。
  • GPT不负责调用和执行外部函数,需要用户自己完成。

2 使用GPT进行函数调用

在使用GPT模型进行函数调用时,需要用到tools参数进行函数声明,关于该参数有以下几点需要说明:

2.1 使用函数调用完成加法计算

大模型可以做加法是因为大模型记住了简单加法的统计规律,但大模型无法保证每次都能得到正确的加法计算结果。这里我们使用函数调用来完成加法计算。具体代码如下:

python 复制代码
from openai import OpenAI
from dotenv import load_dotenv,find_dotenv
import json
from math import *

_=load_dotenv(find_dotenv())
client=OpenAI()

def get_completion(messages,model="gpt-3.5-turbo"):
    response=client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0.7,
        tools=[{
            "type":"function",
            "function":{
                "name":"sum",
                "description":"加法器,计算一组数的和",
                "parameters":{
                    "type":"object",
                    "properties":{
                        "numbers":{
                            "type":"array",
                            "items":{"type":"number"}
                        }
                    }
                }
            }
        }],
    )
    return response.choices[0].message

prompt="计算这些数据的和:345,2313,89,632."
messages=[
    {"role":"system","content":"你是一个数学家"},
    {"role":"user","content":prompt}
]
response=get_completion(messages)
print(response)
#GPT模型第一次的回复中有关于函数调用信息,包括GPT生成的函数调用的参数,所以这些信息需要返回给GPT模型。
messages.append(response)
if response.tool_calls is not None:
    tool_call=response.tool_calls[0]
    if tool_call.function.name=="sum":
        args=json.loads(tool_call.function.arguments)
        result=sum(args["numbers"])
        messages.append({
            "tool_call_id":tool_call.id,
            "role":"tool",
            "name":"sum",
            "content":str(result) 
        })
        print(get_completion(messages).content)

其结果如下:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_vYramfrhZX7kLZLYhqDiFVHP', function=Function(arguments='{"numbers":[345,2313,89,632]}', name='sum'), type='function')])

这些数据的和是3379.

2.2 同时启动多个函数调用

借助上述加法函数的代码,可以一次启动同一个函数的多次调用,具体代码如下:

python 复制代码
from openai import OpenAI 
import json
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client=OpenAI()
def run_conversation(prompt,model='gpt-3.5-turbo'):
    messages=[{"role":"user","content":prompt}]
    tools=[{ 
            "type": "function",
            "function": {
                "name": "sum",
                "description": "加法器,计算一组数的和",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "numbers": {"type": "array", "items": { "type": "number"}}
                    }
                }
            }
        }
    ]
    response=client.chat.completions.create(
        model=model,
        messages=messages,
        tools=tools,
        tool_choice="auto",
    )
    response_message=response.choices[0].message
    messages.append(response_message)
    print(response_message)
    tool_calls=response_message.tool_calls
    if tool_calls:
        for tool_call in tool_calls:
            function_name=tool_call.function.name
            function_args=json.loads(tool_call.function.arguments)
            function_response=sum(function_args.get("numbers"))
            messages.append(
                {"tool_call_id":tool_call.id,
                "role":"tool",
                "name":function_name,
                "content":str(function_response)}
            )
        second_response=client.chat.completions.create(
            model=model,
            messages=messages,
        )
        return second_response.choices[0].message.content
if __name__=="__main__":
    prompt="小明第一天买了5本书2个苹果,第二天买了3本书4个橘子,第三天买了7个梨和10本书,那么小明总共买了多个水果和多少本书?"
    print(prompt)
    print("====GPT回复====")
    print(run_conversation(prompt))

其执行结果如下:

小明第一天买了5本书2个苹果,第二天买了3本书4个橘子,第三天买了7个梨和10本书,那么小明总共买了多个水果和多少本书?

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_XB4SBFVfhMtyeo4zRu1lvpim', function=Function(arguments='{"numbers": [2, 4, 7]}', name='sum'), type='function'), ChatCompletionMessageToolCall(id='call_d0B4e1j7Fhi1OPxxH9skJRAi', function=Function(arguments='{"numbers": [5, 3, 10]}', name='sum'), type='function')])

GPT回复: 小明总共买了13个水果和18本书。

相关推荐
向量引擎12 小时前
[架构师级] 压榨GPT-5.2与Sora 2的极限性能:从单体调用到高并发多模态Agent集群的演进之路(附全套Python源码与性能调优方案)
开发语言·人工智能·python·gpt·ai·ai写作·api调用
workflower14 小时前
Gpt 5 mini自动识别用例
gpt·测试用例·集成测试·需求分析·软件需求·结对编程
百***78751 天前
Gemini 3.0 Pro与2.5深度对比:技术升级与开发实战指南
开发语言·python·gpt
@我们的天空1 天前
【AI应用】学习和实践基于 LangChain/LangGraph 的链(Chain)构建、Agent 工具调用以及多轮对话流程的实现
人工智能·gpt·学习·语言模型·chatgpt·langchain·aigc
星云POLOAPI2 天前
【2025实测】10大AI模型API中转/聚合平台横评:一键集成GPT/Claude/文心一言,拒绝重复造轮子
人工智能·gpt·文心一言
百***24373 天前
Gemini 3.0 Pro 对决 GPT-5.2:编程场景深度横评与选型指南
gpt
return19994 天前
gpt进行修改润色 不要和原来的一样
gpt·深度学习
百***07454 天前
Claude Opus 4.5 场景化实战指南:全链路赋能开发,提升效率翻倍
人工智能·gpt·开源
大得3695 天前
gpt-oss:20b大模型知识库,ai大模型
人工智能·python·gpt
蹦蹦跳跳真可爱5895 天前
Python----大模型(GPT-2模型训练加速,训练策略)
人工智能·pytorch·python·gpt·embedding