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 使用函数调用完成加法计算

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("=====GPT回复=====")
        print(get_completion(messages).content)

相关推荐

  1. LLM调研笔记

    2024-04-01 10:40:02       57 阅读
  2. 拷贝函数调用时机

    2024-04-01 10:40:02       48 阅读
  3. Android调用C++函数

    2024-04-01 10:40:02       32 阅读
  4. 函数调用约定

    2024-04-01 10:40:02       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 10:40:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 10:40:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 10:40:02       82 阅读
  4. Python语言-面向对象

    2024-04-01 10:40:02       91 阅读

热门阅读

  1. ZooKeeper 负载均衡和 Nginx 负载均衡的区别

    2024-04-01 10:40:02       36 阅读
  2. Docker Swarm入门

    2024-04-01 10:40:02       38 阅读
  3. Redis 的常见问题及解决方案

    2024-04-01 10:40:02       43 阅读
  4. Meme币如何赋能Web3社交?

    2024-04-01 10:40:02       38 阅读
  5. 价值投资已死,MEME币永生?

    2024-04-01 10:40:02       38 阅读
  6. 证券市场概述

    2024-04-01 10:40:02       36 阅读
  7. ctf题目

    ctf题目

    2024-04-01 10:40:02      37 阅读
  8. TS全栈开发(React+Next.js+Nest.js+UniApp/Vue)项目

    2024-04-01 10:40:02       33 阅读