当前位置:   article > 正文

AI全栈大模型工程师(九)Function Calling 的机制_大模型function call

大模型function call

Function Calling 的机制

Function Calling 示例 1:加法计算器

需求:用户输入任意可以用加法解决的问题,都能得到计算结果。


# 加载环境变量

import openai
import os
import json

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # 读取本地 .env 文件,里面定义了 OPENAI_API_KEY

openai.api_key = os.getenv('OPENAI_API_KEY')


def get_completion(messages, model="gpt-3.5-turbo"):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0,  # 模型输出的随机性,0 表示随机性最小
        functions=[{  # 用 JSON 描述函数。可以定义多个,但是只有一个会被调用,也可能都不会被调用
            "name": "sum",
            "description": "计算数组中所有数字的和",
            "parameters": {
                "type": "object",
                "properties": {
                    "numbers": {
                        "type": "array",
                        "items": {
                            "type": "number"
                        }
                    }
                }
            },
        }],
    )
    return response.choices[0].message



# prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10."

prompt = "桌上有 2 个苹果,四个桃子和 3 本书,一共有几个水果?"
#prompt = "1+2+3+4+...+99+100=?"
messages = [
    {"role": "system", "content": "你是一个小学数学老师,你要教学生加法"},
    {"role": "user", "content": prompt}
]
response = get_completion(messages)
messages.append(response)  # 把大模型的回复加入到对话中
print(response)

# 如果返回的是函数调用结果,则打印出来

if (response.get("function_call")):

    # 是否要调用 sum

​    if (response["function_call"]["name"] == "sum"):
​        args = json.loads(response["function_call"]["arguments"])
​        result = sum(args["numbers"])
​        print(result)
​        messages.append(
​            {"role": "function", "name": "sum", "content": str(result)})  # 整数 result,必须转成字符串
​        print(get_completion(messages).content)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

Function Calling 实例 2:四则混合运算计算器

def get_completion(messages, model="gpt-4"):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0,  # 模型输出的随机性,0 表示随机性最小
        functions=[  # 用 JSON 描述函数。可以定义多个,但是只有一个会被调用,也可能都不会被调用
            {
                "name": "sum",
                "description": "计算数组中所有数字的和",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "numbers": {
                            "type": "array",
                            "items": {
                                "type": "number",
                                "description": "必须是数值类型"
                            }
                        }
                    }
                },
            },
            {
                "name": "subtract",
                "description": "计算 a - b 的值",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "a": {
                            "type": "number",
                            "description": "被减数,必须是数值类型"
                        },
                        "b": {
                            "type": "number",
                            "description": "减数,必须是数值类型"
                        }
                    }
                },
            },
            {
                "name": "multiply",
                "description": "计算数组中所有数字的积",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "numbers": {
                            "type": "array",
                            "items": {
                                "type": "number",
                                "description": "必须是数值类型"
                            }
                        }
                    }
                },
            },
            {
                "name": "divide",
                "description": "计算 a/b 的值",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "a": {
                            "type": "number",
                            "description": "被除数,必须是数值类型"
                        },
                        "b": {
                            "type": "number",
                            "description": "除数,必须是数值类型"
                        }
                    }
                },
            }
        ],
    )
    return response.choices[0].message


prompt = "6 * 3 / (4+2) = ?"

# prompt = "桌上有 2 个苹果,四个桃子和 3 本书,水果比书多多少?"

# prompt = """

# 让我们一步步计算:小明在一家水果店买水果。他买了X斤苹果,每斤10元;4斤香蕉,每斤5元;

# 和3斤橙子,每斤8元。他手头有100元。请问小明买完这些水果后,他还剩下多少钱?

#"""

messages = [
    {"role": "system", "content": "你是一个小学数学老师,你要教学生四则混合运算"},
    {"role": "user", "content": prompt}
]

response = get_completion(messages)
messages.append(response)  # 把大模型的回复加入到对话中。非常重要!
print(response)
while (response.get("function_call")):
    # 是否要调用 sum
    args = json.loads(response["function_call"]["arguments"])
    function_name = response["function_call"]["name"]

    if (function_name == "sum"):
        result = sum(args["numbers"])
    elif (function_name == "subtract"):
        result = args["a"] - args["b"]
    elif (function_name == "multiply"):
        result = 1
        for number in args["numbers"]:
            result *= number
    elif (function_name == "divide"):
        result = args["a"] / args["b"]
    else:
        result = "Unknown function"
    
    print(result)
    messages.append(
        {"role": "function", "name": function_name, "content": str(result)})
    response = get_completion(messages)
    messages.append(response)  # 把大模型的回复加入到对话中
    print(response)

print(response.content)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125

后记

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/200084
推荐阅读
相关标签